@keystrokehq/platform 0.0.171 → 0.0.172
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/dist/run.cjs +1 -1
- package/dist/run.mjs +1 -1
- package/dist/{start-avYKDymy.mjs → start-CCSEG2WQ.mjs} +26 -2
- package/dist/start-CCSEG2WQ.mjs.map +1 -0
- package/dist/{start-uYyPk7oF.cjs → start-CfZfvlbY.cjs} +26 -2
- package/dist/start-CfZfvlbY.cjs.map +1 -0
- package/dist/start.cjs +1 -1
- package/dist/start.d.cts +11 -4
- package/dist/start.d.mts +11 -4
- package/dist/start.mjs +1 -1
- package/package.json +1 -1
- package/dist/start-avYKDymy.mjs.map +0 -1
- package/dist/start-uYyPk7oF.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-CCSEG2WQ.mjs","names":["decodeBase64URL","jwk.isJWK","jwk.isSecretJWK","invalidKeyInput","jwk.isPrivateJWK","jwk.isPublicJWK","b64u","#jwks","#cached","jwksCache","#url","#timeoutDuration","#cooldownDuration","#cacheMaxAge","#headers","#customFetch","#cache","#jwksTimestamp","#local","#pendingFetch","z","resolveResendApiKey","envValue","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","DEFAULT_PRESIGN_TTL_SECONDS","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","listOrganizations","checkOrganizationSlugAvailability","getOrganization","updateOrganization","getOrganizationSidebarBranding","updateOrganizationSidebarBranding","presignOrganizationSidebarLogo","listOrganizationInvitations","acceptOrganizationInvitation","declineOrganizationInvitation","getUserAvatar","presignUserAvatar","updateUserAvatar","getUserPreferences","updateUserPreferences","listApps","listOrganizationMembers","inviteOrganizationMembers","updateOrganizationMember","removeOrganizationMember","listApiKeys","createApiKey","revokeApiKey","listAgents","getAgent","listWorkflows","getWorkflow","listSkills","getSkill","listRecents","listHistory","submitTeamRequest","getHistoryRun","cancelWorkflowRun","cancelAgentSession","listCredentials","createCredentials","getCredential","updateCredential","listProjects","checkProjectSlugAvailabilityRoute","listProjectMetrics","createProject","getProject","updateProject","deleteProject","getProjectSettings","updateProjectSettings","listProjectMembers","inviteProjectMembers","updateProjectMember","removeProjectMember","leaveProject","listProjectFiles","getProjectFileContent","listProjectDeployments","downloadActiveProjectArtifact","createProjectArtifact","completeProjectArtifact","presignProjectArtifactSource","uploadProjectArtifactSourceManifest","fromGatewayMode","fromGatewayMode"],"sources":["../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/buffer_utils.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/base64.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/util/base64url.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/crypto_key.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/invalid_key_input.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/util/errors.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/is_key_like.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/helpers.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/type_checks.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/signing.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/jwk_to_key.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/normalize_key.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/key/import.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/validate_crit.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/validate_algorithms.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/check_key_type.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/jws/flattened/verify.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/jws/compact/verify.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/lib/jwt_claims_set.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/jwt/verify.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/jwks/local.js","../../../node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/jwks/remote.js","../../../packages/auth/dist/jwt-BVJ7dVm9.mjs","../../../packages/platform-database/dist/schema/auth/index.mjs","../../../packages/auth/dist/index.mjs","../../../packages/projects/dist/index.mjs","../src/auth/mount.ts","../../../packages/access-control/dist/index.mjs","../src/auth/access-context.ts","../src/auth/responses.ts","../src/auth/authorize.ts","../src/auth/authorize-payload.ts","../src/auth/resolve-org-id.ts","../src/auth/require-organization.ts","../src/auth/require-organization-param.ts","../src/auth/require-project.ts","../src/auth/require-project-membership.ts","../src/auth/require-session.ts","../src/routes/account/lib/request-background-tasks.ts","../src/middleware/with-organization-project-database.ts","../src/routes/account/users/me/avatar/GET.ts","../src/lib/user-avatar-content-type.ts","../src/routes/account/users/me/avatar/presign/POST.ts","../src/lib/stored-image.ts","../src/routes/account/users/me/avatar/PATCH.ts","../src/routes/account/users/me/preferences/GET.ts","../src/routes/account/users/me/preferences/PATCH.ts","../src/routes/account/organizations/GET.ts","../src/services/create-organization.ts","../src/routes/account/organizations/slug-errors.ts","../src/routes/account/organizations/POST.ts","../src/routes/account/organizations/slug-available/GET.ts","../src/routes/account/organizations/[organizationId]/GET.ts","../src/routes/account/organizations/[organizationId]/PATCH.ts","../src/routes/account/organizations/[organizationId]/branding/GET.ts","../src/routes/account/organizations/[organizationId]/branding/PATCH.ts","../src/routes/account/organizations/[organizationId]/branding/logo/presign/POST.ts","../src/auth/project-access.ts","../src/routes/account/history/enrich.ts","../src/routes/account/history/GET.ts","../src/routes/account/history/[runId]/GET.ts","../src/routes/account/resources/common.ts","../src/routes/account/resources/agents.ts","../src/routes/account/agents/GET.ts","../src/routes/account/lib/touch-resource-activity.ts","../src/routes/account/agents/[agentId]/GET.ts","../src/lib/project-scheduler.ts","../src/routes/account/history/cancel-run.ts","../src/routes/account/agents/sessions/[sessionId]/cancel/POST.ts","../src/routes/account/resources/workflows.ts","../src/routes/account/workflows/GET.ts","../src/routes/account/workflows/[workflowId]/GET.ts","../src/routes/account/workflows/runs/[runId]/cancel/POST.ts","../src/routes/account/resources/skills.ts","../src/routes/account/skills/GET.ts","../src/routes/account/skills/[skillId]/GET.ts","../src/routes/account/resources/recents.ts","../src/routes/account/recents/GET.ts","../src/routes/account/projects/GET.ts","../src/routes/account/projects/metrics/merge-project-list-metrics.ts","../src/routes/account/projects/metrics/GET.ts","../src/routes/account/projects/POST.ts","../src/routes/account/projects/slug-available/GET.ts","../src/routes/account/projects/[projectId]/GET.ts","../src/routes/account/projects/[projectId]/PATCH.ts","../src/routes/account/projects/[projectId]/DELETE.ts","../src/routes/account/projects/[projectId]/deployments/GET.ts","../src/routes/account/projects/[projectId]/artifacts/POST.ts","../src/routes/account/projects/[projectId]/artifacts/active/download/GET.ts","../src/routes/account/projects/[projectId]/artifacts/[artifactId]/complete/POST.ts","../src/routes/account/projects/[projectId]/artifacts/[artifactId]/source/presign/POST.ts","../src/routes/account/projects/[projectId]/artifacts/[artifactId]/source/manifest/POST.ts","../src/routes/account/projects/[projectId]/files/GET.ts","../src/routes/account/projects/[projectId]/artifacts/[artifactId]/files/content/GET.ts","../src/routes/account/projects/[projectId]/reachability/GET.ts","../src/routes/account/projects/[projectId]/members/GET.ts","../src/routes/account/projects/[projectId]/members/POST.ts","../src/routes/account/projects/[projectId]/members/[userId]/PATCH.ts","../src/routes/account/projects/[projectId]/members/[userId]/DELETE.ts","../src/routes/account/projects/[projectId]/members/me/DELETE.ts","../src/routes/account/projects/[projectId]/settings/GET.ts","../src/routes/account/projects/[projectId]/settings/PATCH.ts","../src/routes/account/credentials/enrich.ts","../src/routes/account/credentials/GET.ts","../src/routes/account/credentials/POST.ts","../src/routes/account/credentials/[credentialId]/GET.ts","../src/routes/account/credentials/[credentialId]/PATCH.ts","../src/lib/mcp-entity.ts","../src/routes/account/credentials/[credentialId]/DELETE.ts","../src/routes/account/members/GET.ts","../src/email/organization-invite-email.ts","../src/routes/account/members/invitations/POST.ts","../src/routes/account/members/[userId]/PATCH.ts","../src/routes/account/members/[userId]/DELETE.ts","../src/routes/account/invitations/GET.ts","../src/routes/account/invitations/[invitationId]/accept/POST.ts","../src/routes/account/invitations/[invitationId]/decline/POST.ts","../src/routes/account/apps/catalog.ts","../src/routes/account/apps/GET.ts","../src/routes/account/api-keys/GET.ts","../src/routes/account/api-keys/POST.ts","../src/routes/account/api-keys/[apiKeyId]/DELETE.ts","../src/lib/team-request-slack.ts","../src/routes/account/team-requests/POST.ts","../src/routes/account/mount.ts","../src/lib/resolve-keystroke-instance.ts","../src/lib/platform-origin.ts","../src/routes/account/mcp/schemas.ts","../src/routes/internal/mcp-gateway.ts","../src/routes/account/mcp/public.ts","../src/routes/account/mcp/mount.ts","../src/middleware/require-worker-token.ts","../src/routes/internal/web-search-proxy.ts","../src/routes/internal/mount.ts","../src/middleware/with-organization-database.ts","../src/middleware/with-project-runtime.ts","../src/routes/runtime/handlers/agent-prompt.ts","../src/routes/runtime/channels/gateway-source.ts","../src/routes/runtime/channels/serialize.ts","../src/routes/runtime/channels/load-connections.ts","../src/routes/runtime/handlers/channels.ts","../src/routes/runtime/handlers/workflow-run.ts","../src/routes/runtime/mount.ts","../src/lib/slack-gateway-ingress.ts","../src/lib/slack-gateway-routing.ts","../src/routes/gateways/slack-webhook.ts","../src/routes/gateways/mount.ts","../src/middleware/resolve-public-project.ts","../src/middleware/with-public-project-runtime.ts","../src/routes/runtime/handlers/webhook-ingress.ts","../src/routes/runtime/handlers/hook-resume.ts","../src/routes/webhooks/mount.ts","../src/app.ts","../src/start.ts"],"sourcesContent":["export const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\nexport function encode(string) {\n const bytes = new Uint8Array(string.length);\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code > 127) {\n throw new TypeError('non-ASCII string encountered in encode()');\n }\n bytes[i] = code;\n }\n return bytes;\n}\n","export function encodeBase64(input) {\n if (Uint8Array.prototype.toBase64) {\n return input.toBase64();\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < input.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n}\nexport function decodeBase64(encoded) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(encoded);\n }\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nimport { encodeBase64, decodeBase64 } from '../lib/base64.js';\nexport function decode(input) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(typeof input === 'string' ? input : decoder.decode(input), {\n alphabet: 'base64url',\n });\n }\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n}\nexport function encode(input) {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n if (Uint8Array.prototype.toBase64) {\n return unencoded.toBase64({ alphabet: 'base64url', omitPadding: true });\n }\n return encodeBase64(unencoded).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","const unusable = (name, prop = 'algorithm.name') => new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);\nconst isAlgorithm = (algorithm, name) => algorithm.name === name;\nfunction getHashLength(hash) {\n return parseInt(hash.name.slice(4), 10);\n}\nfunction checkHashLength(algorithm, expected) {\n const actual = getHashLength(algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n}\nfunction getNamedCurve(alg) {\n switch (alg) {\n case 'ES256':\n return 'P-256';\n case 'ES384':\n return 'P-384';\n case 'ES512':\n return 'P-521';\n default:\n throw new Error('unreachable');\n }\n}\nfunction checkUsage(key, usage) {\n if (usage && !key.usages.includes(usage)) {\n throw new TypeError(`CryptoKey does not support this operation, its usages must include ${usage}.`);\n }\n}\nexport function checkSigCryptoKey(key, alg, usage) {\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512': {\n if (!isAlgorithm(key.algorithm, 'HMAC'))\n throw unusable('HMAC');\n checkHashLength(key.algorithm, parseInt(alg.slice(2), 10));\n break;\n }\n case 'RS256':\n case 'RS384':\n case 'RS512': {\n if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))\n throw unusable('RSASSA-PKCS1-v1_5');\n checkHashLength(key.algorithm, parseInt(alg.slice(2), 10));\n break;\n }\n case 'PS256':\n case 'PS384':\n case 'PS512': {\n if (!isAlgorithm(key.algorithm, 'RSA-PSS'))\n throw unusable('RSA-PSS');\n checkHashLength(key.algorithm, parseInt(alg.slice(2), 10));\n break;\n }\n case 'Ed25519':\n case 'EdDSA': {\n if (!isAlgorithm(key.algorithm, 'Ed25519'))\n throw unusable('Ed25519');\n break;\n }\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87': {\n if (!isAlgorithm(key.algorithm, alg))\n throw unusable(alg);\n break;\n }\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n if (!isAlgorithm(key.algorithm, 'ECDSA'))\n throw unusable('ECDSA');\n const expected = getNamedCurve(alg);\n const actual = key.algorithm.namedCurve;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.namedCurve');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usage);\n}\nexport function checkEncCryptoKey(key, alg, usage) {\n switch (alg) {\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM': {\n if (!isAlgorithm(key.algorithm, 'AES-GCM'))\n throw unusable('AES-GCM');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (!isAlgorithm(key.algorithm, 'AES-KW'))\n throw unusable('AES-KW');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'ECDH': {\n switch (key.algorithm.name) {\n case 'ECDH':\n case 'X25519':\n break;\n default:\n throw unusable('ECDH or X25519');\n }\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW':\n if (!isAlgorithm(key.algorithm, 'PBKDF2'))\n throw unusable('PBKDF2');\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))\n throw unusable('RSA-OAEP');\n checkHashLength(key.algorithm, parseInt(alg.slice(9), 10) || 1);\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usage);\n}\n","function message(msg, actual, ...types) {\n types = types.filter(Boolean);\n if (types.length > 2) {\n const last = types.pop();\n msg += `one of type ${types.join(', ')}, or ${last}.`;\n }\n else if (types.length === 2) {\n msg += `one of type ${types[0]} or ${types[1]}.`;\n }\n else {\n msg += `of type ${types[0]}.`;\n }\n if (actual == null) {\n msg += ` Received ${actual}`;\n }\n else if (typeof actual === 'function' && actual.name) {\n msg += ` Received function ${actual.name}`;\n }\n else if (typeof actual === 'object' && actual != null) {\n if (actual.constructor?.name) {\n msg += ` Received an instance of ${actual.constructor.name}`;\n }\n }\n return msg;\n}\nexport const invalidKeyInput = (actual, ...types) => message('Key must be ', actual, ...types);\nexport const withAlg = (alg, actual, ...types) => message(`Key for the ${alg} algorithm must be `, actual, ...types);\n","export class JOSEError extends Error {\n static code = 'ERR_JOSE_GENERIC';\n code = 'ERR_JOSE_GENERIC';\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nexport class JWTClaimValidationFailed extends JOSEError {\n static code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JWTExpired extends JOSEError {\n static code = 'ERR_JWT_EXPIRED';\n code = 'ERR_JWT_EXPIRED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JOSEAlgNotAllowed extends JOSEError {\n static code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n}\nexport class JOSENotSupported extends JOSEError {\n static code = 'ERR_JOSE_NOT_SUPPORTED';\n code = 'ERR_JOSE_NOT_SUPPORTED';\n}\nexport class JWEDecryptionFailed extends JOSEError {\n static code = 'ERR_JWE_DECRYPTION_FAILED';\n code = 'ERR_JWE_DECRYPTION_FAILED';\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n }\n}\nexport class JWEInvalid extends JOSEError {\n static code = 'ERR_JWE_INVALID';\n code = 'ERR_JWE_INVALID';\n}\nexport class JWSInvalid extends JOSEError {\n static code = 'ERR_JWS_INVALID';\n code = 'ERR_JWS_INVALID';\n}\nexport class JWTInvalid extends JOSEError {\n static code = 'ERR_JWT_INVALID';\n code = 'ERR_JWT_INVALID';\n}\nexport class JWKInvalid extends JOSEError {\n static code = 'ERR_JWK_INVALID';\n code = 'ERR_JWK_INVALID';\n}\nexport class JWKSInvalid extends JOSEError {\n static code = 'ERR_JWKS_INVALID';\n code = 'ERR_JWKS_INVALID';\n}\nexport class JWKSNoMatchingKey extends JOSEError {\n static code = 'ERR_JWKS_NO_MATCHING_KEY';\n code = 'ERR_JWKS_NO_MATCHING_KEY';\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n [Symbol.asyncIterator];\n static code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSTimeout extends JOSEError {\n static code = 'ERR_JWKS_TIMEOUT';\n code = 'ERR_JWKS_TIMEOUT';\n constructor(message = 'request timed out', options) {\n super(message, options);\n }\n}\nexport class JWSSignatureVerificationFailed extends JOSEError {\n static code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n }\n}\n","export function assertCryptoKey(key) {\n if (!isCryptoKey(key)) {\n throw new Error('CryptoKey instance expected');\n }\n}\nexport const isCryptoKey = (key) => {\n if (key?.[Symbol.toStringTag] === 'CryptoKey')\n return true;\n try {\n return key instanceof CryptoKey;\n }\n catch {\n return false;\n }\n};\nexport const isKeyObject = (key) => key?.[Symbol.toStringTag] === 'KeyObject';\nexport const isKeyLike = (key) => isCryptoKey(key) || isKeyObject(key);\n","import { decode } from '../util/base64url.js';\nexport const unprotected = Symbol();\nexport function assertNotSet(value, name) {\n if (value) {\n throw new TypeError(`${name} can only be called once`);\n }\n}\nexport function decodeBase64url(value, label, ErrorClass) {\n try {\n return decode(value);\n }\n catch {\n throw new ErrorClass(`Failed to base64url decode the ${label}`);\n }\n}\nexport async function digest(algorithm, data) {\n const subtleDigest = `SHA-${algorithm.slice(-3)}`;\n return new Uint8Array(await crypto.subtle.digest(subtleDigest, data));\n}\n","const isObjectLike = (value) => typeof value === 'object' && value !== null;\nexport function isObject(input) {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n}\nexport function isDisjoint(...headers) {\n const sources = headers.filter(Boolean);\n if (sources.length === 0 || sources.length === 1) {\n return true;\n }\n let acc;\n for (const header of sources) {\n const parameters = Object.keys(header);\n if (!acc || acc.size === 0) {\n acc = new Set(parameters);\n continue;\n }\n for (const parameter of parameters) {\n if (acc.has(parameter)) {\n return false;\n }\n acc.add(parameter);\n }\n }\n return true;\n}\nexport const isJWK = (key) => isObject(key) && typeof key.kty === 'string';\nexport const isPrivateJWK = (key) => key.kty !== 'oct' &&\n ((key.kty === 'AKP' && typeof key.priv === 'string') || typeof key.d === 'string');\nexport const isPublicJWK = (key) => key.kty !== 'oct' && key.d === undefined && key.priv === undefined;\nexport const isSecretJWK = (key) => key.kty === 'oct' && typeof key.k === 'string';\n","import { JOSENotSupported } from '../util/errors.js';\nimport { checkSigCryptoKey } from './crypto_key.js';\nimport { invalidKeyInput } from './invalid_key_input.js';\nexport function checkKeyLength(alg, key) {\n if (alg.startsWith('RS') || alg.startsWith('PS')) {\n const { modulusLength } = key.algorithm;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);\n }\n }\n}\nfunction subtleAlgorithm(alg, algorithm) {\n const hash = `SHA-${alg.slice(-3)}`;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n return { hash, name: 'HMAC' };\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { hash, name: 'RSA-PSS', saltLength: parseInt(alg.slice(-3), 10) >> 3 };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { hash, name: 'RSASSA-PKCS1-v1_5' };\n case 'ES256':\n case 'ES384':\n case 'ES512':\n return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };\n case 'Ed25519':\n case 'EdDSA':\n return { name: 'Ed25519' };\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n return { name: alg };\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n}\nasync function getSigKey(alg, key, usage) {\n if (key instanceof Uint8Array) {\n if (!alg.startsWith('HS')) {\n throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);\n }\n checkSigCryptoKey(key, alg, usage);\n return key;\n}\nexport async function sign(alg, key, data) {\n const cryptoKey = await getSigKey(alg, key, 'sign');\n checkKeyLength(alg, cryptoKey);\n const signature = await crypto.subtle.sign(subtleAlgorithm(alg, cryptoKey.algorithm), cryptoKey, data);\n return new Uint8Array(signature);\n}\nexport async function verify(alg, key, signature, data) {\n const cryptoKey = await getSigKey(alg, key, 'verify');\n checkKeyLength(alg, cryptoKey);\n const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);\n try {\n return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);\n }\n catch {\n return false;\n }\n}\n","import { JOSENotSupported } from '../util/errors.js';\nconst unsupportedAlg = 'Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value';\nfunction subtleMapping(jwk) {\n let algorithm;\n let keyUsages;\n switch (jwk.kty) {\n case 'AKP': {\n switch (jwk.alg) {\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n algorithm = { name: jwk.alg };\n keyUsages = jwk.priv ? ['sign'] : ['verify'];\n break;\n default:\n throw new JOSENotSupported(unsupportedAlg);\n }\n break;\n }\n case 'RSA': {\n switch (jwk.alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`,\n };\n keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey'];\n break;\n default:\n throw new JOSENotSupported(unsupportedAlg);\n }\n break;\n }\n case 'EC': {\n switch (jwk.alg) {\n case 'ES256':\n case 'ES384':\n case 'ES512':\n algorithm = {\n name: 'ECDSA',\n namedCurve: { ES256: 'P-256', ES384: 'P-384', ES512: 'P-521' }[jwk.alg],\n };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: 'ECDH', namedCurve: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported(unsupportedAlg);\n }\n break;\n }\n case 'OKP': {\n switch (jwk.alg) {\n case 'Ed25519':\n case 'EdDSA':\n algorithm = { name: 'Ed25519' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported(unsupportedAlg);\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"kty\" (Key Type) Parameter value');\n }\n return { algorithm, keyUsages };\n}\nexport async function jwkToKey(jwk) {\n if (!jwk.alg) {\n throw new TypeError('\"alg\" argument is required when \"jwk.alg\" is not present');\n }\n const { algorithm, keyUsages } = subtleMapping(jwk);\n const keyData = { ...jwk };\n if (keyData.kty !== 'AKP') {\n delete keyData.alg;\n }\n delete keyData.use;\n return crypto.subtle.importKey('jwk', keyData, algorithm, jwk.ext ?? (jwk.d || jwk.priv ? false : true), jwk.key_ops ?? keyUsages);\n}\n","import { isJWK } from './type_checks.js';\nimport { decode } from '../util/base64url.js';\nimport { jwkToKey } from './jwk_to_key.js';\nimport { isCryptoKey, isKeyObject } from './is_key_like.js';\nconst unusableForAlg = 'given KeyObject instance cannot be used for this algorithm';\nlet cache;\nconst handleJWK = async (key, jwk, alg, freeze = false) => {\n cache ||= new WeakMap();\n let cached = cache.get(key);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const cryptoKey = await jwkToKey({ ...jwk, alg });\n if (freeze)\n Object.freeze(key);\n if (!cached) {\n cache.set(key, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nconst handleKeyObject = (keyObject, alg) => {\n cache ||= new WeakMap();\n let cached = cache.get(keyObject);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const isPublic = keyObject.type === 'public';\n const extractable = isPublic ? true : false;\n let cryptoKey;\n if (keyObject.asymmetricKeyType === 'x25519') {\n switch (alg) {\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n break;\n default:\n throw new TypeError(unusableForAlg);\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, isPublic ? [] : ['deriveBits']);\n }\n if (keyObject.asymmetricKeyType === 'ed25519') {\n if (alg !== 'EdDSA' && alg !== 'Ed25519') {\n throw new TypeError(unusableForAlg);\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [\n isPublic ? 'verify' : 'sign',\n ]);\n }\n switch (keyObject.asymmetricKeyType) {\n case 'ml-dsa-44':\n case 'ml-dsa-65':\n case 'ml-dsa-87': {\n if (alg !== keyObject.asymmetricKeyType.toUpperCase()) {\n throw new TypeError(unusableForAlg);\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [\n isPublic ? 'verify' : 'sign',\n ]);\n }\n }\n if (keyObject.asymmetricKeyType === 'rsa') {\n let hash;\n switch (alg) {\n case 'RSA-OAEP':\n hash = 'SHA-1';\n break;\n case 'RS256':\n case 'PS256':\n case 'RSA-OAEP-256':\n hash = 'SHA-256';\n break;\n case 'RS384':\n case 'PS384':\n case 'RSA-OAEP-384':\n hash = 'SHA-384';\n break;\n case 'RS512':\n case 'PS512':\n case 'RSA-OAEP-512':\n hash = 'SHA-512';\n break;\n default:\n throw new TypeError(unusableForAlg);\n }\n if (alg.startsWith('RSA-OAEP')) {\n return keyObject.toCryptoKey({\n name: 'RSA-OAEP',\n hash,\n }, extractable, isPublic ? ['encrypt'] : ['decrypt']);\n }\n cryptoKey = keyObject.toCryptoKey({\n name: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5',\n hash,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (keyObject.asymmetricKeyType === 'ec') {\n const nist = new Map([\n ['prime256v1', 'P-256'],\n ['secp384r1', 'P-384'],\n ['secp521r1', 'P-521'],\n ]);\n const namedCurve = nist.get(keyObject.asymmetricKeyDetails?.namedCurve);\n if (!namedCurve) {\n throw new TypeError(unusableForAlg);\n }\n const expectedCurve = { ES256: 'P-256', ES384: 'P-384', ES512: 'P-521' };\n if (expectedCurve[alg] && namedCurve === expectedCurve[alg]) {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDSA',\n namedCurve,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (alg.startsWith('ECDH-ES')) {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDH',\n namedCurve,\n }, extractable, isPublic ? [] : ['deriveBits']);\n }\n }\n if (!cryptoKey) {\n throw new TypeError(unusableForAlg);\n }\n if (!cached) {\n cache.set(keyObject, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nexport async function normalizeKey(key, alg) {\n if (key instanceof Uint8Array) {\n return key;\n }\n if (isCryptoKey(key)) {\n return key;\n }\n if (isKeyObject(key)) {\n if (key.type === 'secret') {\n return key.export();\n }\n if ('toCryptoKey' in key && typeof key.toCryptoKey === 'function') {\n try {\n return handleKeyObject(key, alg);\n }\n catch (err) {\n if (err instanceof TypeError) {\n throw err;\n }\n }\n }\n let jwk = key.export({ format: 'jwk' });\n return handleJWK(key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k) {\n return decode(key.k);\n }\n return handleJWK(key, key, alg, true);\n }\n throw new Error('unreachable');\n}\n","import { decode as decodeBase64URL } from '../util/base64url.js';\nimport { fromSPKI, fromPKCS8, fromX509 } from '../lib/asn1.js';\nimport { jwkToKey } from '../lib/jwk_to_key.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport { isObject } from '../lib/type_checks.js';\nexport async function importSPKI(spki, alg, options) {\n if (typeof spki !== 'string' || spki.indexOf('-----BEGIN PUBLIC KEY-----') !== 0) {\n throw new TypeError('\"spki\" must be SPKI formatted string');\n }\n return fromSPKI(spki, alg, options);\n}\nexport async function importX509(x509, alg, options) {\n if (typeof x509 !== 'string' || x509.indexOf('-----BEGIN CERTIFICATE-----') !== 0) {\n throw new TypeError('\"x509\" must be X.509 formatted string');\n }\n return fromX509(x509, alg, options);\n}\nexport async function importPKCS8(pkcs8, alg, options) {\n if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {\n throw new TypeError('\"pkcs8\" must be PKCS#8 formatted string');\n }\n return fromPKCS8(pkcs8, alg, options);\n}\nexport async function importJWK(jwk, alg, options) {\n if (!isObject(jwk)) {\n throw new TypeError('JWK must be an object');\n }\n let ext;\n alg ??= jwk.alg;\n ext ??= options?.extractable ?? jwk.ext;\n switch (jwk.kty) {\n case 'oct':\n if (typeof jwk.k !== 'string' || !jwk.k) {\n throw new TypeError('missing \"k\" (Key Value) Parameter value');\n }\n return decodeBase64URL(jwk.k);\n case 'RSA':\n if ('oth' in jwk && jwk.oth !== undefined) {\n throw new JOSENotSupported('RSA JWK \"oth\" (Other Primes Info) Parameter value is not supported');\n }\n return jwkToKey({ ...jwk, alg, ext });\n case 'AKP': {\n if (typeof jwk.alg !== 'string' || !jwk.alg) {\n throw new TypeError('missing \"alg\" (Algorithm) Parameter value');\n }\n if (alg !== undefined && alg !== jwk.alg) {\n throw new TypeError('JWK alg and alg option value mismatch');\n }\n return jwkToKey({ ...jwk, ext });\n }\n case 'EC':\n case 'OKP':\n return jwkToKey({ ...jwk, alg, ext });\n default:\n throw new JOSENotSupported('Unsupported \"kty\" (Key Type) Parameter value');\n }\n}\n","import { JOSENotSupported, JWEInvalid, JWSInvalid } from '../util/errors.js';\nexport function validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {\n if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be integrity protected');\n }\n if (!protectedHeader || protectedHeader.crit === undefined) {\n return new Set();\n }\n if (!Array.isArray(protectedHeader.crit) ||\n protectedHeader.crit.length === 0 ||\n protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be an array of non-empty strings when present');\n }\n let recognized;\n if (recognizedOption !== undefined) {\n recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);\n }\n else {\n recognized = recognizedDefault;\n }\n for (const parameter of protectedHeader.crit) {\n if (!recognized.has(parameter)) {\n throw new JOSENotSupported(`Extension Header Parameter \"${parameter}\" is not recognized`);\n }\n if (joseHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" is missing`);\n }\n if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" MUST be integrity protected`);\n }\n }\n return new Set(protectedHeader.crit);\n}\n","export function validateAlgorithms(option, algorithms) {\n if (algorithms !== undefined &&\n (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {\n throw new TypeError(`\"${option}\" option must be an array of strings`);\n }\n if (!algorithms) {\n return undefined;\n }\n return new Set(algorithms);\n}\n","import { withAlg as invalidKeyInput } from './invalid_key_input.js';\nimport { isKeyLike } from './is_key_like.js';\nimport * as jwk from './type_checks.js';\nconst tag = (key) => key?.[Symbol.toStringTag];\nconst jwkMatchesOp = (alg, key, usage) => {\n if (key.use !== undefined) {\n let expected;\n switch (usage) {\n case 'sign':\n case 'verify':\n expected = 'sig';\n break;\n case 'encrypt':\n case 'decrypt':\n expected = 'enc';\n break;\n }\n if (key.use !== expected) {\n throw new TypeError(`Invalid key for this operation, its \"use\" must be \"${expected}\" when present`);\n }\n }\n if (key.alg !== undefined && key.alg !== alg) {\n throw new TypeError(`Invalid key for this operation, its \"alg\" must be \"${alg}\" when present`);\n }\n if (Array.isArray(key.key_ops)) {\n let expectedKeyOp;\n switch (true) {\n case usage === 'sign' || usage === 'verify':\n case alg === 'dir':\n case alg.includes('CBC-HS'):\n expectedKeyOp = usage;\n break;\n case alg.startsWith('PBES2'):\n expectedKeyOp = 'deriveBits';\n break;\n case /^A\\d{3}(?:GCM)?(?:KW)?$/.test(alg):\n if (!alg.includes('GCM') && alg.endsWith('KW')) {\n expectedKeyOp = usage === 'encrypt' ? 'wrapKey' : 'unwrapKey';\n }\n else {\n expectedKeyOp = usage;\n }\n break;\n case usage === 'encrypt' && alg.startsWith('RSA'):\n expectedKeyOp = 'wrapKey';\n break;\n case usage === 'decrypt':\n expectedKeyOp = alg.startsWith('RSA') ? 'unwrapKey' : 'deriveBits';\n break;\n }\n if (expectedKeyOp && key.key_ops?.includes?.(expectedKeyOp) === false) {\n throw new TypeError(`Invalid key for this operation, its \"key_ops\" must include \"${expectedKeyOp}\" when present`);\n }\n }\n return true;\n};\nconst symmetricTypeCheck = (alg, key, usage) => {\n if (key instanceof Uint8Array)\n return;\n if (jwk.isJWK(key)) {\n if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK \"kty\" (Key Type) equal to \"oct\" and the JWK \"k\" (Key Value) present`);\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key', 'Uint8Array'));\n }\n if (key.type !== 'secret') {\n throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type \"secret\"`);\n }\n};\nconst asymmetricTypeCheck = (alg, key, usage) => {\n if (jwk.isJWK(key)) {\n switch (usage) {\n case 'decrypt':\n case 'sign':\n if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation must be a private JWK`);\n case 'encrypt':\n case 'verify':\n if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation must be a public JWK`);\n }\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n if (key.type === 'secret') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type \"secret\"`);\n }\n if (key.type === 'public') {\n switch (usage) {\n case 'sign':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type \"private\"`);\n case 'decrypt':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type \"private\"`);\n }\n }\n if (key.type === 'private') {\n switch (usage) {\n case 'verify':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type \"public\"`);\n case 'encrypt':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type \"public\"`);\n }\n }\n};\nexport function checkKeyType(alg, key, usage) {\n switch (alg.substring(0, 2)) {\n case 'A1':\n case 'A2':\n case 'di':\n case 'HS':\n case 'PB':\n symmetricTypeCheck(alg, key, usage);\n break;\n default:\n asymmetricTypeCheck(alg, key, usage);\n }\n}\n","import { decode as b64u } from '../../util/base64url.js';\nimport { verify } from '../../lib/signing.js';\nimport { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { concat, encoder, decoder, encode } from '../../lib/buffer_utils.js';\nimport { decodeBase64url } from '../../lib/helpers.js';\nimport { isDisjoint } from '../../lib/type_checks.js';\nimport { isObject } from '../../lib/type_checks.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { validateAlgorithms } from '../../lib/validate_algorithms.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nexport async function flattenedVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('Flattened JWS must be an object');\n }\n if (jws.protected === undefined && jws.header === undefined) {\n throw new JWSInvalid('Flattened JWS must have either of the \"protected\" or \"header\" members');\n }\n if (jws.protected !== undefined && typeof jws.protected !== 'string') {\n throw new JWSInvalid('JWS Protected Header incorrect type');\n }\n if (jws.payload === undefined) {\n throw new JWSInvalid('JWS Payload missing');\n }\n if (typeof jws.signature !== 'string') {\n throw new JWSInvalid('JWS Signature missing or incorrect type');\n }\n if (jws.header !== undefined && !isObject(jws.header)) {\n throw new JWSInvalid('JWS Unprotected Header incorrect type');\n }\n let parsedProt = {};\n if (jws.protected) {\n try {\n const protectedHeader = b64u(jws.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWSInvalid('JWS Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jws.header)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jws.header,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = parsedProt.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n const algorithms = options && validateAlgorithms('algorithms', options.algorithms);\n if (algorithms && !algorithms.has(alg)) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (b64) {\n if (typeof jws.payload !== 'string') {\n throw new JWSInvalid('JWS Payload must be a string');\n }\n }\n else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {\n throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jws);\n resolvedKey = true;\n }\n checkKeyType(alg, key, 'verify');\n const data = concat(jws.protected !== undefined ? encode(jws.protected) : new Uint8Array(), encode('.'), typeof jws.payload === 'string'\n ? b64\n ? encode(jws.payload)\n : encoder.encode(jws.payload)\n : jws.payload);\n const signature = decodeBase64url(jws.signature, 'signature', JWSInvalid);\n const k = await normalizeKey(key, alg);\n const verified = await verify(alg, k, signature, data);\n if (!verified) {\n throw new JWSSignatureVerificationFailed();\n }\n let payload;\n if (b64) {\n payload = decodeBase64url(jws.payload, 'payload', JWSInvalid);\n }\n else if (typeof jws.payload === 'string') {\n payload = encoder.encode(jws.payload);\n }\n else {\n payload = jws.payload;\n }\n const result = { payload };\n if (jws.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jws.header !== undefined) {\n result.unprotectedHeader = jws.header;\n }\n if (resolvedKey) {\n return { ...result, key: k };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactVerify(jws, key, options) {\n if (jws instanceof Uint8Array) {\n jws = decoder.decode(jws);\n }\n if (typeof jws !== 'string') {\n throw new JWSInvalid('Compact JWS must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');\n if (length !== 3) {\n throw new JWSInvalid('Invalid Compact JWS');\n }\n const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);\n const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { JWTClaimValidationFailed, JWTExpired, JWTInvalid } from '../util/errors.js';\nimport { encoder, decoder } from './buffer_utils.js';\nimport { isObject } from './type_checks.js';\nconst epoch = (date) => Math.floor(date.getTime() / 1000);\nconst minute = 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst week = day * 7;\nconst year = day * 365.25;\nconst REGEX = /^(\\+|\\-)? ?(\\d+|\\d+\\.\\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;\nexport function secs(str) {\n const matched = REGEX.exec(str);\n if (!matched || (matched[4] && matched[1])) {\n throw new TypeError('Invalid time period format');\n }\n const value = parseFloat(matched[2]);\n const unit = matched[3].toLowerCase();\n let numericDate;\n switch (unit) {\n case 'sec':\n case 'secs':\n case 'second':\n case 'seconds':\n case 's':\n numericDate = Math.round(value);\n break;\n case 'minute':\n case 'minutes':\n case 'min':\n case 'mins':\n case 'm':\n numericDate = Math.round(value * minute);\n break;\n case 'hour':\n case 'hours':\n case 'hr':\n case 'hrs':\n case 'h':\n numericDate = Math.round(value * hour);\n break;\n case 'day':\n case 'days':\n case 'd':\n numericDate = Math.round(value * day);\n break;\n case 'week':\n case 'weeks':\n case 'w':\n numericDate = Math.round(value * week);\n break;\n default:\n numericDate = Math.round(value * year);\n break;\n }\n if (matched[1] === '-' || matched[4] === 'ago') {\n return -numericDate;\n }\n return numericDate;\n}\nfunction validateInput(label, input) {\n if (!Number.isFinite(input)) {\n throw new TypeError(`Invalid ${label} input`);\n }\n return input;\n}\nconst normalizeTyp = (value) => {\n if (value.includes('/')) {\n return value.toLowerCase();\n }\n return `application/${value.toLowerCase()}`;\n};\nconst checkAudiencePresence = (audPayload, audOption) => {\n if (typeof audPayload === 'string') {\n return audOption.includes(audPayload);\n }\n if (Array.isArray(audPayload)) {\n return audOption.some(Set.prototype.has.bind(new Set(audPayload)));\n }\n return false;\n};\nexport function validateClaimsSet(protectedHeader, encodedPayload, options = {}) {\n let payload;\n try {\n payload = JSON.parse(decoder.decode(encodedPayload));\n }\n catch {\n }\n if (!isObject(payload)) {\n throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');\n }\n const { typ } = options;\n if (typ &&\n (typeof protectedHeader.typ !== 'string' ||\n normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {\n throw new JWTClaimValidationFailed('unexpected \"typ\" JWT header value', payload, 'typ', 'check_failed');\n }\n const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options;\n const presenceCheck = [...requiredClaims];\n if (maxTokenAge !== undefined)\n presenceCheck.push('iat');\n if (audience !== undefined)\n presenceCheck.push('aud');\n if (subject !== undefined)\n presenceCheck.push('sub');\n if (issuer !== undefined)\n presenceCheck.push('iss');\n for (const claim of new Set(presenceCheck.reverse())) {\n if (!(claim in payload)) {\n throw new JWTClaimValidationFailed(`missing required \"${claim}\" claim`, payload, claim, 'missing');\n }\n }\n if (issuer &&\n !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {\n throw new JWTClaimValidationFailed('unexpected \"iss\" claim value', payload, 'iss', 'check_failed');\n }\n if (subject && payload.sub !== subject) {\n throw new JWTClaimValidationFailed('unexpected \"sub\" claim value', payload, 'sub', 'check_failed');\n }\n if (audience &&\n !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {\n throw new JWTClaimValidationFailed('unexpected \"aud\" claim value', payload, 'aud', 'check_failed');\n }\n let tolerance;\n switch (typeof options.clockTolerance) {\n case 'string':\n tolerance = secs(options.clockTolerance);\n break;\n case 'number':\n tolerance = options.clockTolerance;\n break;\n case 'undefined':\n tolerance = 0;\n break;\n default:\n throw new TypeError('Invalid clockTolerance option type');\n }\n const { currentDate } = options;\n const now = epoch(currentDate || new Date());\n if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {\n throw new JWTClaimValidationFailed('\"iat\" claim must be a number', payload, 'iat', 'invalid');\n }\n if (payload.nbf !== undefined) {\n if (typeof payload.nbf !== 'number') {\n throw new JWTClaimValidationFailed('\"nbf\" claim must be a number', payload, 'nbf', 'invalid');\n }\n if (payload.nbf > now + tolerance) {\n throw new JWTClaimValidationFailed('\"nbf\" claim timestamp check failed', payload, 'nbf', 'check_failed');\n }\n }\n if (payload.exp !== undefined) {\n if (typeof payload.exp !== 'number') {\n throw new JWTClaimValidationFailed('\"exp\" claim must be a number', payload, 'exp', 'invalid');\n }\n if (payload.exp <= now - tolerance) {\n throw new JWTExpired('\"exp\" claim timestamp check failed', payload, 'exp', 'check_failed');\n }\n }\n if (maxTokenAge) {\n const age = now - payload.iat;\n const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);\n if (age - tolerance > max) {\n throw new JWTExpired('\"iat\" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed');\n }\n if (age < 0 - tolerance) {\n throw new JWTClaimValidationFailed('\"iat\" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed');\n }\n }\n return payload;\n}\nexport class JWTClaimsBuilder {\n #payload;\n constructor(payload) {\n if (!isObject(payload)) {\n throw new TypeError('JWT Claims Set MUST be an object');\n }\n this.#payload = structuredClone(payload);\n }\n data() {\n return encoder.encode(JSON.stringify(this.#payload));\n }\n get iss() {\n return this.#payload.iss;\n }\n set iss(value) {\n this.#payload.iss = value;\n }\n get sub() {\n return this.#payload.sub;\n }\n set sub(value) {\n this.#payload.sub = value;\n }\n get aud() {\n return this.#payload.aud;\n }\n set aud(value) {\n this.#payload.aud = value;\n }\n set jti(value) {\n this.#payload.jti = value;\n }\n set nbf(value) {\n if (typeof value === 'number') {\n this.#payload.nbf = validateInput('setNotBefore', value);\n }\n else if (value instanceof Date) {\n this.#payload.nbf = validateInput('setNotBefore', epoch(value));\n }\n else {\n this.#payload.nbf = epoch(new Date()) + secs(value);\n }\n }\n set exp(value) {\n if (typeof value === 'number') {\n this.#payload.exp = validateInput('setExpirationTime', value);\n }\n else if (value instanceof Date) {\n this.#payload.exp = validateInput('setExpirationTime', epoch(value));\n }\n else {\n this.#payload.exp = epoch(new Date()) + secs(value);\n }\n }\n set iat(value) {\n if (value === undefined) {\n this.#payload.iat = epoch(new Date());\n }\n else if (value instanceof Date) {\n this.#payload.iat = validateInput('setIssuedAt', epoch(value));\n }\n else if (typeof value === 'string') {\n this.#payload.iat = validateInput('setIssuedAt', epoch(new Date()) + secs(value));\n }\n else {\n this.#payload.iat = validateInput('setIssuedAt', value);\n }\n }\n}\n","import { compactVerify } from '../jws/compact/verify.js';\nimport { validateClaimsSet } from '../lib/jwt_claims_set.js';\nimport { JWTInvalid } from '../util/errors.js';\nexport async function jwtVerify(jwt, key, options) {\n const verified = await compactVerify(jwt, key, options);\n if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n const payload = validateClaimsSet(verified.protectedHeader, verified.payload, options);\n const result = { payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { importJWK } from '../key/import.js';\nimport { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';\nimport { isObject } from '../lib/type_checks.js';\nfunction getKtyFromAlg(alg) {\n switch (typeof alg === 'string' && alg.slice(0, 2)) {\n case 'RS':\n case 'PS':\n return 'RSA';\n case 'ES':\n return 'EC';\n case 'Ed':\n return 'OKP';\n case 'ML':\n return 'AKP';\n default:\n throw new JOSENotSupported('Unsupported \"alg\" value for a JSON Web Key Set');\n }\n}\nfunction isJWKSLike(jwks) {\n return (jwks &&\n typeof jwks === 'object' &&\n Array.isArray(jwks.keys) &&\n jwks.keys.every(isJWKLike));\n}\nfunction isJWKLike(key) {\n return isObject(key);\n}\nclass LocalJWKSet {\n #jwks;\n #cached = new WeakMap();\n constructor(jwks) {\n if (!isJWKSLike(jwks)) {\n throw new JWKSInvalid('JSON Web Key Set malformed');\n }\n this.#jwks = structuredClone(jwks);\n }\n jwks() {\n return this.#jwks;\n }\n async getKey(protectedHeader, token) {\n const { alg, kid } = { ...protectedHeader, ...token?.header };\n const kty = getKtyFromAlg(alg);\n const candidates = this.#jwks.keys.filter((jwk) => {\n let candidate = kty === jwk.kty;\n if (candidate && typeof kid === 'string') {\n candidate = kid === jwk.kid;\n }\n if (candidate && (typeof jwk.alg === 'string' || kty === 'AKP')) {\n candidate = alg === jwk.alg;\n }\n if (candidate && typeof jwk.use === 'string') {\n candidate = jwk.use === 'sig';\n }\n if (candidate && Array.isArray(jwk.key_ops)) {\n candidate = jwk.key_ops.includes('verify');\n }\n if (candidate) {\n switch (alg) {\n case 'ES256':\n candidate = jwk.crv === 'P-256';\n break;\n case 'ES384':\n candidate = jwk.crv === 'P-384';\n break;\n case 'ES512':\n candidate = jwk.crv === 'P-521';\n break;\n case 'Ed25519':\n case 'EdDSA':\n candidate = jwk.crv === 'Ed25519';\n break;\n }\n }\n return candidate;\n });\n const { 0: jwk, length } = candidates;\n if (length === 0) {\n throw new JWKSNoMatchingKey();\n }\n if (length !== 1) {\n const error = new JWKSMultipleMatchingKeys();\n const _cached = this.#cached;\n error[Symbol.asyncIterator] = async function* () {\n for (const jwk of candidates) {\n try {\n yield await importWithAlgCache(_cached, jwk, alg);\n }\n catch { }\n }\n };\n throw error;\n }\n return importWithAlgCache(this.#cached, jwk, alg);\n }\n}\nasync function importWithAlgCache(cache, jwk, alg) {\n const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk);\n if (cached[alg] === undefined) {\n const key = await importJWK({ ...jwk, ext: true }, alg);\n if (key instanceof Uint8Array || key.type !== 'public') {\n throw new JWKSInvalid('JSON Web Key Set members must be public keys');\n }\n cached[alg] = key;\n }\n return cached[alg];\n}\nexport function createLocalJWKSet(jwks) {\n const set = new LocalJWKSet(jwks);\n const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(localJWKSet, {\n jwks: {\n value: () => structuredClone(set.jwks()),\n enumerable: false,\n configurable: false,\n writable: false,\n },\n });\n return localJWKSet;\n}\n","import { JOSEError, JWKSNoMatchingKey, JWKSTimeout } from '../util/errors.js';\nimport { createLocalJWKSet } from './local.js';\nimport { isObject } from '../lib/type_checks.js';\nfunction isCloudflareWorkers() {\n return (typeof WebSocketPair !== 'undefined' ||\n (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') ||\n (typeof EdgeRuntime !== 'undefined' && EdgeRuntime === 'vercel'));\n}\nlet USER_AGENT;\nif (typeof navigator === 'undefined' || !navigator.userAgent?.startsWith?.('Mozilla/5.0 ')) {\n const NAME = 'jose';\n const VERSION = 'v6.2.3';\n USER_AGENT = `${NAME}/${VERSION}`;\n}\nexport const customFetch = Symbol();\nasync function fetchJwks(url, headers, signal, fetchImpl = fetch) {\n const response = await fetchImpl(url, {\n method: 'GET',\n signal,\n redirect: 'manual',\n headers,\n }).catch((err) => {\n if (err.name === 'TimeoutError') {\n throw new JWKSTimeout();\n }\n throw err;\n });\n if (response.status !== 200) {\n throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response');\n }\n try {\n return await response.json();\n }\n catch {\n throw new JOSEError('Failed to parse the JSON Web Key Set HTTP response as JSON');\n }\n}\nexport const jwksCache = Symbol();\nfunction isFreshJwksCache(input, cacheMaxAge) {\n if (typeof input !== 'object' || input === null) {\n return false;\n }\n if (!('uat' in input) || typeof input.uat !== 'number' || Date.now() - input.uat >= cacheMaxAge) {\n return false;\n }\n if (!('jwks' in input) ||\n !isObject(input.jwks) ||\n !Array.isArray(input.jwks.keys) ||\n !Array.prototype.every.call(input.jwks.keys, isObject)) {\n return false;\n }\n return true;\n}\nclass RemoteJWKSet {\n #url;\n #timeoutDuration;\n #cooldownDuration;\n #cacheMaxAge;\n #jwksTimestamp;\n #pendingFetch;\n #headers;\n #customFetch;\n #local;\n #cache;\n constructor(url, options) {\n if (!(url instanceof URL)) {\n throw new TypeError('url must be an instance of URL');\n }\n this.#url = new URL(url.href);\n this.#timeoutDuration =\n typeof options?.timeoutDuration === 'number' ? options?.timeoutDuration : 5000;\n this.#cooldownDuration =\n typeof options?.cooldownDuration === 'number' ? options?.cooldownDuration : 30000;\n this.#cacheMaxAge = typeof options?.cacheMaxAge === 'number' ? options?.cacheMaxAge : 600000;\n this.#headers = new Headers(options?.headers);\n if (USER_AGENT && !this.#headers.has('User-Agent')) {\n this.#headers.set('User-Agent', USER_AGENT);\n }\n if (!this.#headers.has('accept')) {\n this.#headers.set('accept', 'application/json');\n this.#headers.append('accept', 'application/jwk-set+json');\n }\n this.#customFetch = options?.[customFetch];\n if (options?.[jwksCache] !== undefined) {\n this.#cache = options?.[jwksCache];\n if (isFreshJwksCache(options?.[jwksCache], this.#cacheMaxAge)) {\n this.#jwksTimestamp = this.#cache.uat;\n this.#local = createLocalJWKSet(this.#cache.jwks);\n }\n }\n }\n pendingFetch() {\n return !!this.#pendingFetch;\n }\n coolingDown() {\n return typeof this.#jwksTimestamp === 'number'\n ? Date.now() < this.#jwksTimestamp + this.#cooldownDuration\n : false;\n }\n fresh() {\n return typeof this.#jwksTimestamp === 'number'\n ? Date.now() < this.#jwksTimestamp + this.#cacheMaxAge\n : false;\n }\n jwks() {\n return this.#local?.jwks();\n }\n async getKey(protectedHeader, token) {\n if (!this.#local || !this.fresh()) {\n await this.reload();\n }\n try {\n return await this.#local(protectedHeader, token);\n }\n catch (err) {\n if (err instanceof JWKSNoMatchingKey) {\n if (this.coolingDown() === false) {\n await this.reload();\n return this.#local(protectedHeader, token);\n }\n }\n throw err;\n }\n }\n async reload() {\n if (this.#pendingFetch && isCloudflareWorkers()) {\n this.#pendingFetch = undefined;\n }\n this.#pendingFetch ||= fetchJwks(this.#url.href, this.#headers, AbortSignal.timeout(this.#timeoutDuration), this.#customFetch)\n .then((json) => {\n this.#local = createLocalJWKSet(json);\n if (this.#cache) {\n this.#cache.uat = Date.now();\n this.#cache.jwks = json;\n }\n this.#jwksTimestamp = Date.now();\n this.#pendingFetch = undefined;\n })\n .catch((err) => {\n this.#pendingFetch = undefined;\n throw err;\n });\n await this.#pendingFetch;\n }\n}\nexport function createRemoteJWKSet(url, options) {\n const set = new RemoteJWKSet(url, options);\n const remoteJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(remoteJWKSet, {\n coolingDown: {\n get: () => set.coolingDown(),\n enumerable: true,\n configurable: false,\n },\n fresh: {\n get: () => set.fresh(),\n enumerable: true,\n configurable: false,\n },\n reload: {\n value: () => set.reload(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n reloading: {\n get: () => set.pendingFetch(),\n enumerable: true,\n configurable: false,\n },\n jwks: {\n value: () => set.jwks(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return remoteJWKSet;\n}\n","import { createRemoteJWKSet, jwtVerify } from \"jose\";\n//#region src/constants.ts\n/** OAuth device-flow client id for `keystroke auth login`. */\nconst CLI_CLIENT_ID = \"keystroke-cli\";\n//#endregion\n//#region src/jwt.ts\nconst jwksCache = /* @__PURE__ */ new Map();\nfunction getRemoteJwks(jwksUrl) {\n\tconst cached = jwksCache.get(jwksUrl);\n\tif (cached) return cached;\n\tconst jwks = createRemoteJWKSet(new URL(jwksUrl));\n\tjwksCache.set(jwksUrl, jwks);\n\treturn jwks;\n}\nfunction payloadToUser(payload) {\n\tconst id = typeof payload.id === \"string\" ? payload.id : payload.sub;\n\tconst email = typeof payload.email === \"string\" ? payload.email : void 0;\n\tconst name = typeof payload.name === \"string\" && payload.name.length > 0 ? payload.name : email?.split(\"@\")[0];\n\tif (!id || !email || !name) return null;\n\treturn {\n\t\tid,\n\t\temail,\n\t\tname,\n\t\timage: typeof payload.image === \"string\" ? payload.image : null,\n\t\temailVerified: typeof payload.emailVerified === \"boolean\" ? payload.emailVerified : void 0\n\t};\n}\nfunction createJwtVerifier(options) {\n\tconst audience = options.audience ?? options.issuer;\n\tlet jwks;\n\treturn { verify: async (token) => {\n\t\ttry {\n\t\t\tjwks ??= getRemoteJwks(options.jwksUrl);\n\t\t\tconst { payload } = await jwtVerify(token, jwks, {\n\t\t\t\tissuer: options.issuer,\n\t\t\t\taudience\n\t\t\t});\n\t\t\treturn payloadToUser(payload);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t} };\n}\nfunction extractBearerToken(headers) {\n\tconst authorization = headers.get(\"authorization\");\n\tif (!authorization?.startsWith(\"Bearer \")) return null;\n\tconst token = authorization.slice(7).trim();\n\treturn token.length > 0 ? token : null;\n}\nfunction looksLikeJwt(token) {\n\treturn token.split(\".\").length === 3;\n}\nfunction userFromJwt(jwtUser) {\n\treturn {\n\t\tid: jwtUser.id,\n\t\temail: jwtUser.email,\n\t\tname: jwtUser.name,\n\t\timage: jwtUser.image ?? null,\n\t\temailVerified: jwtUser.emailVerified ?? true,\n\t\tcreatedAt: /* @__PURE__ */ new Date(),\n\t\tupdatedAt: /* @__PURE__ */ new Date()\n\t};\n}\nfunction sessionFromJwt(jwtUser, token) {\n\treturn {\n\t\tid: jwtUser.id,\n\t\tuserId: jwtUser.id,\n\t\ttoken,\n\t\texpiresAt: new Date(Date.now() + 900 * 1e3),\n\t\tcreatedAt: /* @__PURE__ */ new Date(),\n\t\tupdatedAt: /* @__PURE__ */ new Date()\n\t};\n}\nasync function resolveRequestAuth(jwtVerifier, headers) {\n\tconst bearerToken = extractBearerToken(headers);\n\tif (!bearerToken || !jwtVerifier || !looksLikeJwt(bearerToken)) return null;\n\tconst jwtUser = await jwtVerifier.verify(bearerToken);\n\tif (!jwtUser) return null;\n\treturn {\n\t\tuser: userFromJwt(jwtUser),\n\t\tsession: sessionFromJwt(jwtUser, bearerToken)\n\t};\n}\n/** Auth API origin for JWT verification — platform URL when auth is mounted there. */\nfunction resolveAuthApiBaseUrl() {\n\treturn (process.env.PUBLIC_PLATFORM_URL ?? process.env.PUBLIC_WEB_URL ?? \"\").replace(/\\/+$/, \"\");\n}\nfunction createDefaultAuthJwtVerifier() {\n\treturn createAuthJwtVerifier(resolveAuthApiBaseUrl());\n}\nfunction createAuthJwtVerifier(authBaseUrl) {\n\tconst normalizedBaseUrl = authBaseUrl.replace(/\\/+$/, \"\");\n\tif (!normalizedBaseUrl) return;\n\treturn createJwtVerifier({\n\t\tissuer: normalizedBaseUrl,\n\t\taudience: normalizedBaseUrl,\n\t\tjwksUrl: `${normalizedBaseUrl}/api/auth/jwks`\n\t});\n}\nasync function fetchJwtWithSession(authBaseUrl, sessionCredential) {\n\tconst headers = new Headers();\n\tif (sessionCredential.cookie) headers.set(\"cookie\", sessionCredential.cookie);\n\tif (sessionCredential.bearerToken) headers.set(\"authorization\", `Bearer ${sessionCredential.bearerToken}`);\n\tconst normalizedBaseUrl = authBaseUrl.replace(/\\/+$/, \"\");\n\tconst response = await fetch(`${normalizedBaseUrl}/api/auth/token`, { headers });\n\tif (!response.ok) return null;\n\tconst body = await response.json();\n\treturn typeof body.token === \"string\" ? body.token : null;\n}\n//#endregion\nexport { fetchJwtWithSession as a, CLI_CLIENT_ID as c, extractBearerToken as i, createDefaultAuthJwtVerifier as n, resolveAuthApiBaseUrl as o, createJwtVerifier as r, resolveRequestAuth as s, createAuthJwtVerifier as t };\n\n//# sourceMappingURL=jwt-BVJ7dVm9.mjs.map","import { a as authAccounts, i as authDeviceCodes, n as authSessions, o as users, r as authJwks, s as getDatabaseHandle, t as authVerifications } from \"../../auth-verifications-BW9x8xPa.mjs\";\nimport { drizzleAdapter } from \"@better-auth/drizzle-adapter\";\n//#region src/schema/auth/options.ts\nfunction authSchemaFor() {\n\treturn {\n\t\tusers,\n\t\tsession: authSessions,\n\t\taccount: authAccounts,\n\t\tverification: authVerifications,\n\t\tdeviceCode: authDeviceCodes,\n\t\tjwks: authJwks\n\t};\n}\nfunction authDatabaseAdapterOptions() {\n\treturn {\n\t\tprovider: \"pg\",\n\t\tschema: authSchemaFor()\n\t};\n}\n//#endregion\n//#region src/schema/auth/adapter.ts\n/** Better Auth database adapter wired to the active Drizzle handle. */\nfunction createAuthDatabaseAdapter() {\n\tconst { db } = getDatabaseHandle();\n\tconst { provider, schema } = authDatabaseAdapterOptions();\n\treturn drizzleAdapter(db, {\n\t\tprovider,\n\t\tschema\n\t});\n}\n//#endregion\nexport { authAccounts, authDatabaseAdapterOptions, authSchemaFor, authSessions, authVerifications, createAuthDatabaseAdapter, users };\n\n//# sourceMappingURL=index.mjs.map","import { a as fetchJwtWithSession, c as CLI_CLIENT_ID, i as extractBearerToken, n as createDefaultAuthJwtVerifier, o as resolveAuthApiBaseUrl, r as createJwtVerifier, s as resolveRequestAuth, t as createAuthJwtVerifier } from \"./jwt-BVJ7dVm9.mjs\";\nimport { n as decodeJwtExpiryMs, t as createJwtTokenCache } from \"./jwt-cache-4YqHn3jM.mjs\";\nimport { createAuthDatabaseAdapter } from \"@keystrokehq/platform-database/auth-schema\";\nimport { betterAuth } from \"better-auth\";\nimport { bearer } from \"better-auth/plugins/bearer\";\nimport { deviceAuthorization } from \"better-auth/plugins/device-authorization\";\nimport { jwt, lastLoginMethod } from \"better-auth/plugins\";\nimport { normalizeUserEmail, selectUserByNormalizedEmail, selectUserOrganizationMembership } from \"@keystrokehq/platform-database\";\nimport { APIError, createAuthEndpoint, getSessionFromCtx } from \"better-auth/api\";\nimport * as z from \"zod\";\nimport { magicLink } from \"better-auth/plugins/magic-link\";\nimport { Resend } from \"resend\";\n//#region src/cli-device-organization.ts\nfunction normalizeUserCode(userCode) {\n\treturn userCode.replace(/-/g, \"\");\n}\nfunction createCliDeviceOrganizationPlugin() {\n\treturn {\n\t\tid: \"cli-device-organization\",\n\t\tendpoints: { attachOrganization: createAuthEndpoint(\"/device/attach-organization\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: z.object({\n\t\t\t\tuserCode: z.string(),\n\t\t\t\torganizationId: z.string()\n\t\t\t}),\n\t\t\trequireHeaders: true\n\t\t}, async (ctx) => {\n\t\t\tconst session = await getSessionFromCtx(ctx);\n\t\t\tif (!session) throw new APIError(\"UNAUTHORIZED\", {\n\t\t\t\terror: \"unauthorized\",\n\t\t\t\terror_description: \"Authentication required\"\n\t\t\t});\n\t\t\tconst organizationId = ctx.body.organizationId.trim();\n\t\t\tif (!organizationId) throw new APIError(\"BAD_REQUEST\", {\n\t\t\t\terror: \"invalid_request\",\n\t\t\t\terror_description: \"Organization id is required\"\n\t\t\t});\n\t\t\tif (!await selectUserOrganizationMembership(session.user.id, organizationId)) throw new APIError(\"FORBIDDEN\", {\n\t\t\t\terror: \"access_denied\",\n\t\t\t\terror_description: \"You are not a member of this organization\"\n\t\t\t});\n\t\t\tconst cleanUserCode = normalizeUserCode(ctx.body.userCode);\n\t\t\tconst deviceCodeRecord = await ctx.context.adapter.findOne({\n\t\t\t\tmodel: \"deviceCode\",\n\t\t\t\twhere: [{\n\t\t\t\t\tfield: \"userCode\",\n\t\t\t\t\tvalue: cleanUserCode\n\t\t\t\t}]\n\t\t\t});\n\t\t\tif (!deviceCodeRecord) throw new APIError(\"BAD_REQUEST\", {\n\t\t\t\terror: \"invalid_request\",\n\t\t\t\terror_description: \"Invalid device user code\"\n\t\t\t});\n\t\t\tif (deviceCodeRecord.expiresAt < /* @__PURE__ */ new Date()) throw new APIError(\"BAD_REQUEST\", {\n\t\t\t\terror: \"expired_token\",\n\t\t\t\terror_description: \"Device user code has expired\"\n\t\t\t});\n\t\t\tif (deviceCodeRecord.status !== \"pending\") throw new APIError(\"BAD_REQUEST\", {\n\t\t\t\terror: \"invalid_request\",\n\t\t\t\terror_description: \"Device authorization has already been processed\"\n\t\t\t});\n\t\t\tif (deviceCodeRecord.clientId && deviceCodeRecord.clientId !== \"keystroke-cli\") throw new APIError(\"BAD_REQUEST\", {\n\t\t\t\terror: \"invalid_request\",\n\t\t\t\terror_description: \"Invalid device client\"\n\t\t\t});\n\t\t\tif (!deviceCodeRecord.userId) throw new APIError(\"BAD_REQUEST\", {\n\t\t\t\terror: \"invalid_request\",\n\t\t\t\terror_description: \"Device authorization has not been claimed yet\"\n\t\t\t});\n\t\t\tif (deviceCodeRecord.userId !== session.user.id) throw new APIError(\"FORBIDDEN\", {\n\t\t\t\terror: \"access_denied\",\n\t\t\t\terror_description: \"You are not authorized to update this device authorization\"\n\t\t\t});\n\t\t\tawait ctx.context.adapter.update({\n\t\t\t\tmodel: \"deviceCode\",\n\t\t\t\twhere: [{\n\t\t\t\t\tfield: \"id\",\n\t\t\t\t\tvalue: deviceCodeRecord.id\n\t\t\t\t}],\n\t\t\t\tupdate: { scope: organizationId }\n\t\t\t});\n\t\t\treturn ctx.json({ success: true });\n\t\t}) }\n\t};\n}\n//#endregion\n//#region src/magic-link-email.ts\nfunction envValue$1(name) {\n\treturn process.env[name]?.trim() || void 0;\n}\nfunction resolveAuthEmailFrom() {\n\treturn envValue$1(\"AUTH_EMAIL_FROM\") ?? \"Keystroke <signin@auth.keystroke.ai>\";\n}\nfunction isMagicLinkSignInConfigured() {\n\treturn envValue$1(\"RESEND_API_KEY\") !== void 0;\n}\nfunction resolveResendApiKey() {\n\tconst apiKey = envValue$1(\"RESEND_API_KEY\");\n\tif (!apiKey) throw new Error(\"[auth] RESEND_API_KEY is required for magic link sign-in. Add it to Infisical dev/prod.\");\n\treturn apiKey;\n}\nfunction buildMagicLinkEmailHtml(payload) {\n\treturn `<!DOCTYPE html>\n<html>\n <body style=\"font-family: system-ui, sans-serif; line-height: 1.5; color: #111;\">\n <p>Sign in to Keystroke as <strong>${payload.email.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\")}</strong>.</p>\n <p><a href=\"${payload.url}\" style=\"display: inline-block; padding: 10px 16px; background: #111; color: #fff; text-decoration: none; border-radius: 8px;\">Sign in</a></p>\n <p>Or enter this code on the sign-in page:</p>\n <p style=\"font-size: 20px; font-weight: 600; letter-spacing: 0.2em;\">${payload.token}</p>\n <p style=\"color: #666; font-size: 13px;\">This link and code expire in a few minutes. If you did not request this, you can ignore this email.</p>\n </body>\n</html>`;\n}\nasync function sendAuthMagicLinkEmail(payload, resend = new Resend(resolveResendApiKey())) {\n\tconst { error } = await resend.emails.send({\n\t\tfrom: resolveAuthEmailFrom(),\n\t\tto: payload.email,\n\t\tsubject: \"Sign in to Keystroke\",\n\t\thtml: buildMagicLinkEmailHtml(payload)\n\t});\n\tif (error) throw new Error(`[auth] Failed to send magic link email: ${error.message}`);\n}\n//#endregion\n//#region src/magic-link.ts\nfunction createMagicLinkPlugin() {\n\tif (!isMagicLinkSignInConfigured()) return null;\n\treturn magicLink({ sendMagicLink: async ({ email, url, token }) => {\n\t\tawait sendAuthMagicLinkEmail({\n\t\t\temail,\n\t\t\turl,\n\t\t\ttoken\n\t\t});\n\t} });\n}\n//#endregion\n//#region src/social-login.ts\nfunction envValue(name) {\n\treturn process.env[name]?.trim() || void 0;\n}\nfunction resolveLoginOAuthCredentials(config) {\n\tconst authClientId = envValue(config.authClientIdEnv);\n\tconst authClientSecret = envValue(config.authClientSecretEnv);\n\tif (authClientId && authClientSecret) return {\n\t\tclientId: authClientId,\n\t\tclientSecret: authClientSecret\n\t};\n\tconst clientId = envValue(config.fallbackClientIdEnv);\n\tconst clientSecret = envValue(config.fallbackClientSecretEnv);\n\tif (clientId && clientSecret) return {\n\t\tclientId,\n\t\tclientSecret\n\t};\n\tif (authClientId || authClientSecret) console.warn(`[auth] Incomplete ${config.providerLabel} login OAuth env — set both ${config.authClientIdEnv} and ${config.authClientSecretEnv}.`);\n}\nconst GOOGLE_LOGIN_OAUTH_ENV = {\n\tproviderLabel: \"Google\",\n\tauthClientIdEnv: \"GOOGLE_AUTH_CLIENT_ID\",\n\tauthClientSecretEnv: \"GOOGLE_AUTH_CLIENT_SECRET\",\n\tfallbackClientIdEnv: \"GOOGLE_CLIENT_ID\",\n\tfallbackClientSecretEnv: \"GOOGLE_CLIENT_SECRET\"\n};\nconst GITHUB_LOGIN_OAUTH_ENV = {\n\tproviderLabel: \"GitHub\",\n\tauthClientIdEnv: \"GITHUB_AUTH_CLIENT_ID\",\n\tauthClientSecretEnv: \"GITHUB_AUTH_CLIENT_SECRET\",\n\tfallbackClientIdEnv: \"GITHUB_CLIENT_ID\",\n\tfallbackClientSecretEnv: \"GITHUB_CLIENT_SECRET\"\n};\n/** True when Better Auth Google login OAuth is configured. */\nfunction isGoogleSignInConfigured() {\n\treturn resolveLoginOAuthCredentials(GOOGLE_LOGIN_OAUTH_ENV) !== void 0;\n}\n/** True when Better Auth GitHub login OAuth is configured. */\nfunction isGitHubSignInConfigured() {\n\treturn resolveLoginOAuthCredentials(GITHUB_LOGIN_OAUTH_ENV) !== void 0;\n}\nfunction resolveSocialProviders() {\n\tconst googleCredentials = resolveLoginOAuthCredentials(GOOGLE_LOGIN_OAUTH_ENV);\n\tconst githubCredentials = resolveLoginOAuthCredentials(GITHUB_LOGIN_OAUTH_ENV);\n\tconst providers = {};\n\tif (googleCredentials) providers.google = {\n\t\t...googleCredentials,\n\t\tprompt: \"select_account\"\n\t};\n\tif (githubCredentials) providers.github = githubCredentials;\n\treturn Object.keys(providers).length > 0 ? providers : void 0;\n}\n//#endregion\n//#region src/user-create-hook.ts\nasync function linkUserCreateBeforeHook(user) {\n\tconst email = normalizeUserEmail(user.email);\n\tconst existing = await selectUserByNormalizedEmail(email);\n\tif (existing) return {\n\t\tdata: {\n\t\t\t...user,\n\t\t\tid: existing.id,\n\t\t\temail: existing.email,\n\t\t\tname: user.name?.trim() ? user.name : existing.name,\n\t\t\temailVerified: existing.emailVerified || user.emailVerified\n\t\t},\n\t\tforceAllowId: true\n\t};\n\treturn { data: {\n\t\t...user,\n\t\temail\n\t} };\n}\n//#endregion\n//#region src/server.ts\nconst AUTH_API_PATH = \"/api/auth/*\";\nfunction createAuthInstance(options) {\n\tconst socialProviders = resolveSocialProviders();\n\tconst magicLinkPlugin = createMagicLinkPlugin();\n\tconst advanced = options.crossSubDomainCookieDomain ? { crossSubDomainCookies: {\n\t\tenabled: true,\n\t\tdomain: options.crossSubDomainCookieDomain\n\t} } : void 0;\n\treturn betterAuth({\n\t\tsecret: options.secret,\n\t\tbaseURL: options.baseURL,\n\t\ttrustedOrigins: options.trustedOrigins,\n\t\t...advanced ? { advanced } : {},\n\t\taccount: { accountLinking: {\n\t\t\tenabled: true,\n\t\t\ttrustedProviders: [\"google\", \"github\"],\n\t\t\trequireLocalEmailVerified: false\n\t\t} },\n\t\tdatabase: createAuthDatabaseAdapter(),\n\t\tdatabaseHooks: { user: { create: { before: linkUserCreateBeforeHook } } },\n\t\t...socialProviders ? { socialProviders } : {},\n\t\tuser: { modelName: \"users\" },\n\t\tplugins: [\n\t\t\t...magicLinkPlugin ? [magicLinkPlugin] : [],\n\t\t\tlastLoginMethod({ customResolveMethod: (ctx) => {\n\t\t\t\tif (ctx.path?.startsWith(\"/magic-link/verify\")) return \"email\";\n\t\t\t\treturn null;\n\t\t\t} }),\n\t\t\tdeviceAuthorization({\n\t\t\t\tverificationUri: options.verificationUri ?? \"/device\",\n\t\t\t\tvalidateClient: (clientId) => clientId === CLI_CLIENT_ID,\n\t\t\t\tinterval: \"1s\",\n\t\t\t\tschema: {}\n\t\t\t}),\n\t\t\tcreateCliDeviceOrganizationPlugin(),\n\t\t\tbearer(),\n\t\t\tjwt({ jwt: { definePayload: ({ user }) => ({\n\t\t\t\tid: user.id,\n\t\t\t\temail: user.email,\n\t\t\t\tname: user.name,\n\t\t\t\timage: user.image,\n\t\t\t\temailVerified: user.emailVerified\n\t\t\t}) } })\n\t\t]\n\t});\n}\n/** Returns undefined when no secret is configured (auth disabled). */\nfunction createAuth(options = {}) {\n\tconst secret = options.secret ?? process.env.BETTER_AUTH_SECRET;\n\tif (!secret) return;\n\tconst baseURL = options.baseURL ?? process.env.PUBLIC_PLATFORM_URL?.replace(/\\/+$/, \"\") ?? process.env.PUBLIC_WEB_URL;\n\tif (!baseURL) throw new Error(\"PUBLIC_PLATFORM_URL or PUBLIC_WEB_URL is required when auth is enabled\");\n\treturn createAuthInstance({\n\t\t...options,\n\t\tsecret,\n\t\tbaseURL\n\t});\n}\nfunction handleAuthRequest(auth, request) {\n\treturn auth.handler(request);\n}\n//#endregion\n//#region src/cross-subdomain-cookie-domain.ts\n/** Shared parent domain for Better Auth cross-subdomain cookies (e.g. keystroke.ai). */\nfunction resolveCrossSubDomainCookieDomain(webUrl, platformUrl) {\n\ttry {\n\t\tconst webHost = new URL(webUrl).hostname;\n\t\tconst platformHost = new URL(platformUrl).hostname;\n\t\tif (webHost === platformHost) return;\n\t\tif (webHost === \"localhost\" || platformHost === \"localhost\" || webHost === \"127.0.0.1\" || platformHost === \"127.0.0.1\") return;\n\t\tconst webParts = webHost.split(\".\");\n\t\tconst platformParts = platformHost.split(\".\");\n\t\tif (webParts.length < 2 || platformParts.length < 2) return;\n\t\tconst webParent = webParts.slice(1).join(\".\");\n\t\tif (webParent !== platformParts.slice(1).join(\".\")) return;\n\t\treturn webParent;\n\t} catch {\n\t\treturn;\n\t}\n}\n//#endregion\n//#region src/webhook-api-key.ts\nfunction extractWebhookApiKeyFromRequest(request) {\n\tconst url = new URL(request.url);\n\tconst queryToken = url.searchParams.get(\"token\") ?? url.searchParams.get(\"api_key\");\n\tif (queryToken?.trim()) return queryToken.trim();\n\tconst authorization = request.headers.get(\"authorization\");\n\tif (authorization?.startsWith(\"Bearer \")) {\n\t\tconst bearer = authorization.slice(7).trim();\n\t\tif (bearer) return bearer;\n\t}\n\treturn request.headers.get(\"x-api-key\")?.trim() || null;\n}\n//#endregion\nexport { AUTH_API_PATH, CLI_CLIENT_ID, createAuth, createAuthJwtVerifier, createDefaultAuthJwtVerifier, createJwtTokenCache, createJwtVerifier, decodeJwtExpiryMs, extractBearerToken, extractWebhookApiKeyFromRequest, fetchJwtWithSession, handleAuthRequest, isGitHubSignInConfigured, isGoogleSignInConfigured, isMagicLinkSignInConfigured, resolveAuthApiBaseUrl, resolveAuthEmailFrom, resolveCrossSubDomainCookieDomain, resolveRequestAuth };\n\n//# sourceMappingURL=index.mjs.map","import { runWithProjectDatabase, runWithProjectScope, selectEphemeralTriggerAttachments } from \"@keystrokehq/database\";\nimport { ensureWebhookApiKeys, promoteProjectArtifact, resolveOrgDatabaseUrl, selectOrganizationById, selectProjectArtifactById, selectProjectById, updateProjectActive, updateProjectArtifactManifest, updateProjectFailed } from \"@keystrokehq/platform-database\";\nimport { extractWebhookRoutesFromManifest, syncRegistryFromStoredManifest } from \"@keystrokehq/server\";\nimport { webhookRouteFromEndpoint } from \"@keystrokehq/manifest\";\nimport { parseStoredRouteManifest } from \"@keystrokehq/shared\";\nimport { RouteManifestNotFoundError, extractRouteManifestFromArtifact } from \"@keystrokehq/storage\";\nimport { createJobQueue, defaultSchedulerPlugin, resolveSchedulerPluginFromEnv } from \"@keystrokehq/scheduler\";\n//#region src/management/start-project.ts\nasync function startProject(input) {\n\ttry {\n\t\tconst result = await input.runtime.start({\n\t\t\tprojectId: input.projectId,\n\t\t\tname: input.name,\n\t\t\tartifactId: input.artifactId,\n\t\t\tartifactUrl: input.artifactUrl,\n\t\t\tdatabase: input.database\n\t\t});\n\t\tawait input.onSuccess(result);\n\t} catch (error) {\n\t\tawait input.onFailure(error instanceof Error ? error : new Error(String(error)));\n\t}\n}\n//#endregion\n//#region src/promote-project-deploy.ts\nasync function resolveDeployManifest(input) {\n\tif (input.artifactManifest != null) return parseStoredRouteManifest(input.artifactManifest);\n\treturn parseStoredRouteManifest(extractRouteManifestFromArtifact(input.artifactBytes));\n}\n/** Cut over activeArtifactId, then sync org project registry from the artifact manifest. */\nasync function promoteProjectDeploy(input) {\n\tconst project = await selectProjectById(input.projectId);\n\tif (!project) throw new Error(`Project ${input.projectId} not found`);\n\tconst artifact = await selectProjectArtifactById(input.artifactId);\n\tif (!artifact || artifact.projectId !== input.projectId) throw new Error(`Artifact ${input.artifactId} not found for project ${input.projectId}`);\n\tconst organization = await selectOrganizationById(project.organizationId);\n\tif (!organization) throw new Error(`Organization not found for project ${input.projectId}`);\n\tif (!input.artifactBytes && artifact.manifestJson == null) throw new RouteManifestNotFoundError(\"Artifact has no stored route manifest; rebuild and redeploy\");\n\tconst manifest = await resolveDeployManifest({\n\t\tartifactId: input.artifactId,\n\t\tartifactManifest: artifact.manifestJson,\n\t\tartifactBytes: input.artifactBytes ?? Buffer.alloc(0)\n\t});\n\tif (artifact.manifestJson == null) await updateProjectArtifactManifest({\n\t\tartifactId: input.artifactId,\n\t\tmanifestJson: manifest\n\t});\n\tif (project.pendingArtifactId === input.artifactId) await promoteProjectArtifact({\n\t\tprojectId: input.projectId,\n\t\tartifactId: input.artifactId\n\t});\n\telse if (project.activeArtifactId !== input.artifactId) throw new Error(`Artifact ${input.artifactId} is not the pending deploy for project ${input.projectId}`);\n\tconst ephemeralRoutes = [];\n\tawait runWithProjectDatabase({\n\t\turl: resolveOrgDatabaseUrl(organization),\n\t\tsearchPath: organization.dbSchema\n\t}, async () => runWithProjectScope(project.id, async () => {\n\t\tawait syncRegistryFromStoredManifest(manifest);\n\t\tconst byRoute = /* @__PURE__ */ new Map();\n\t\tfor (const row of await selectEphemeralTriggerAttachments()) {\n\t\t\tif (row.source.kind !== \"webhook\") continue;\n\t\t\tconst route = webhookRouteFromEndpoint(row.source.endpoint);\n\t\t\tbyRoute.set(route, [...byRoute.get(route) ?? [], row.slug]);\n\t\t}\n\t\tfor (const [route, attachmentKeys] of byRoute) ephemeralRoutes.push({\n\t\t\troute,\n\t\t\tattachmentKeys\n\t\t});\n\t}));\n\tconst webhookRoutes = [...extractWebhookRoutesFromManifest(manifest), ...ephemeralRoutes];\n\tif (webhookRoutes.length > 0) await ensureWebhookApiKeys(project.id, webhookRoutes, project.id);\n}\n//#endregion\n//#region src/resolve-runtime-artifact.ts\n/** Decide whether a pg-boss job should start runtime, skip as stale, or fail. */\nfunction resolveRuntimeArtifact(project, jobArtifactId) {\n\tif (jobArtifactId && project.pendingArtifactId && jobArtifactId !== project.pendingArtifactId) return { action: \"skip\" };\n\tif (jobArtifactId && !project.pendingArtifactId && project.activeArtifactId && jobArtifactId !== project.activeArtifactId) return { action: \"skip\" };\n\tconst artifactId = jobArtifactId ?? project.pendingArtifactId ?? project.activeArtifactId ?? null;\n\tif (!artifactId) return {\n\t\taction: \"error\",\n\t\tmessage: `Project ${project.id} has no pending artifact`\n\t};\n\tif (!project.pendingArtifactId && project.activeArtifactId === artifactId && project.status === \"active\" && project.baseUrl && project.runtimeId) return { action: \"skip\" };\n\treturn {\n\t\taction: \"run\",\n\t\tartifactId\n\t};\n}\nlet runtimeQueue;\nlet runtimeQueueInit;\nasync function getProjectRuntimeQueue() {\n\tif (runtimeQueue) return runtimeQueue;\n\tif (!runtimeQueueInit) runtimeQueueInit = (async () => {\n\t\tconst queue = await createJobQueue({\n\t\t\tscope: \"platform\",\n\t\t\tplugin: await resolveSchedulerPluginFromEnv(process.env) ?? defaultSchedulerPlugin()\n\t\t});\n\t\truntimeQueue = queue;\n\t\treturn queue;\n\t})();\n\treturn runtimeQueueInit;\n}\nfunction toProjectRuntimeJob(payload) {\n\tconst job = payload.payload;\n\tif (!job?.projectId || !job.name || !job.artifactId) throw new Error(\"Invalid project runtime job payload\");\n\treturn {\n\t\tprojectId: job.projectId,\n\t\tname: job.name,\n\t\tartifactId: job.artifactId\n\t};\n}\nasync function enqueueProjectRuntime(job) {\n\treturn (await getProjectRuntimeQueue()).enqueue({\n\t\tkind: \"runtime\",\n\t\ttargetId: job.projectId,\n\t\trunId: job.artifactId,\n\t\ttrigger: \"api\",\n\t\tpayload: job,\n\t\tmaxAttempts: 5,\n\t\tdedupeKey: job.projectId\n\t});\n}\nasync function destroyProjectRuntime(runtime, input, runtimeId) {\n\tif (!runtime.destroy) return;\n\ttry {\n\t\tawait runtime.destroy({\n\t\t\truntimeId,\n\t\t\thosting: input.hosting\n\t\t});\n\t} catch (destroyError) {\n\t\tconsole.error(`[project.runtime] failed to destroy runtime ${runtimeId}`, destroyError);\n\t}\n}\nasync function handleProjectRuntimeJob(runtime, resolveStartInput, payload) {\n\tif (payload.kind !== \"runtime\") return;\n\tconst job = toProjectRuntimeJob(payload);\n\ttry {\n\t\tconst project = await selectProjectById(job.projectId);\n\t\tif (!project) throw new Error(`Project ${job.projectId} not found`);\n\t\tconst resolved = resolveRuntimeArtifact(project, job.artifactId);\n\t\tif (resolved.action === \"skip\") return;\n\t\tif (resolved.action === \"error\") throw new Error(resolved.message);\n\t\tconst input = await resolveStartInput({\n\t\t\t...job,\n\t\t\tartifactId: resolved.artifactId\n\t\t});\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await runtime.start(input);\n\t\t\tawait promoteProjectDeploy({\n\t\t\t\tprojectId: job.projectId,\n\t\t\t\tartifactId: resolved.artifactId,\n\t\t\t\tbaseUrl: result.baseUrl\n\t\t\t});\n\t\t\tawait updateProjectActive(job.projectId, result);\n\t\t\tif (input.previousRuntimeId) await destroyProjectRuntime(runtime, input, input.previousRuntimeId);\n\t\t} catch (error) {\n\t\t\tif (result) await destroyProjectRuntime(runtime, input, result.runtimeId);\n\t\t\tthrow error;\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(`[project.runtime] ${job.projectId} failed`, error);\n\t\tif (payload.exhaustedRetries) await updateProjectFailed(job.projectId, \"Project runtime failed after retries\");\n\t\tthrow error;\n\t}\n}\nasync function startProjectRuntimeWorker(runtime, options = {}) {\n\tconst queue = await getProjectRuntimeQueue();\n\tconst resolveStartInput = options.resolveStartInput ?? (async (job) => {\n\t\tthrow new Error(`Project runtime for ${job.projectId} requires resolveStartInput with database credentials`);\n\t});\n\tawait queue.startWorker(async (payload) => {\n\t\tawait handleProjectRuntimeJob(runtime, resolveStartInput, payload);\n\t});\n}\n/** @deprecated Runtime queues are created via the configured scheduler plugin. */\nasync function ensureProjectRuntimeQueues() {\n\tawait getProjectRuntimeQueue();\n}\n/** @internal Reset cached runtime queue between tests. */\nfunction resetProjectRuntimeQueueForTests() {\n\truntimeQueue = void 0;\n\truntimeQueueInit = void 0;\n}\n//#endregion\nexport { enqueueProjectRuntime, ensureProjectRuntimeQueues, promoteProjectDeploy, resetProjectRuntimeQueueForTests, resolveRuntimeArtifact, startProject, startProjectRuntimeWorker };\n\n//# sourceMappingURL=index.mjs.map","import { AUTH_API_PATH, handleAuthRequest, type Auth } from \"@keystrokehq/auth\";\nimport type { Env, Hono } from \"hono\";\n\nexport function mountAuth<E extends Env>(app: Hono<E>, auth: Auth): void {\n app.on([\"POST\", \"GET\"], AUTH_API_PATH, (c) => handleAuthRequest(auth, c.req.raw));\n}\n","//#region src/api-keys/grants.ts\nconst apiKeysActions = {\n\tread: \"apiKeys:read\",\n\tcreate: \"apiKeys:create\"\n};\nconst apiKeysGrants = Object.values(apiKeysActions);\nconst apiKeysRoleGrants = {\n\towner: [apiKeysActions.read, apiKeysActions.create],\n\tadmin: [apiKeysActions.read, apiKeysActions.create],\n\tbuilder: [apiKeysActions.create]\n};\n//#endregion\n//#region src/organization/grants.ts\nconst organizationActions = {\n\tupdate: \"organization:update\",\n\tdelete: \"organization:delete\"\n};\nconst organizationGrants = Object.values(organizationActions);\nconst organizationRoleGrants = {\n\towner: [organizationActions.update, organizationActions.delete],\n\tadmin: [organizationActions.update],\n\tbuilder: []\n};\n//#endregion\n//#region src/users/grants.ts\nconst userActions = {\n\tmanage: \"users:manage\",\n\tinvite: \"users:invite\"\n};\nconst userGrants = Object.values(userActions);\nconst userRoleGrants = {\n\towner: [userActions.manage, userActions.invite],\n\tadmin: [userActions.manage, userActions.invite],\n\tbuilder: [userActions.invite]\n};\n/** Role ceiling: which roles each inviter may grant. Owner is never invitable (shared schema). */\nconst invitableRolesByRole = {\n\towner: [\"admin\", \"builder\"],\n\tadmin: [\"admin\", \"builder\"],\n\tbuilder: [\"builder\"]\n};\nfunction canInviteRole(inviter, invited) {\n\treturn invitableRolesByRole[inviter].includes(invited);\n}\n//#endregion\n//#region src/policy.ts\nfunction mergeRoleGrants(role) {\n\treturn [\n\t\t...organizationRoleGrants[role],\n\t\t...userRoleGrants[role],\n\t\t...apiKeysRoleGrants[role]\n\t];\n}\nconst orgRolePermissions = {\n\towner: mergeRoleGrants(\"owner\"),\n\tadmin: mergeRoleGrants(\"admin\"),\n\tbuilder: mergeRoleGrants(\"builder\")\n};\n//#endregion\n//#region src/projects/grants.ts\nconst projectActions = {\n\tread: \"project:read\",\n\tdeploy: \"project:deploy\",\n\tupdate: \"project:update\",\n\tdelete: \"project:delete\",\n\tmanageMembers: \"project:manage-members\",\n\tinvite: \"project:invite\"\n};\nconst projectGrants = Object.values(projectActions);\nconst projectRoleGrants = {\n\tadmin: Object.values(projectActions),\n\tbuilder: [projectActions.read, projectActions.deploy]\n};\n//#endregion\n//#region src/check-permission.ts\nconst orgAdminRoles = new Set([\"owner\", \"admin\"]);\nconst projectActionSet = new Set(projectGrants);\nfunction isProjectAction(action) {\n\treturn projectActionSet.has(action);\n}\nfunction checkPermission(action, ctx) {\n\tif (isProjectAction(action)) {\n\t\tif (orgAdminRoles.has(ctx.orgRole)) return true;\n\t\treturn ctx.projectRole != null && projectRoleGrants[ctx.projectRole].includes(action);\n\t}\n\treturn orgRolePermissions[ctx.orgRole].includes(action);\n}\n//#endregion\n//#region src/projects/visibility.ts\nfunction projectListScope(ctx) {\n\treturn checkPermission(projectActions.read, ctx) ? { kind: \"all\" } : { kind: \"member-only\" };\n}\nfunction canReadProject(ctx, hasMembership) {\n\treturn checkPermission(projectActions.read, ctx) || hasMembership;\n}\n//#endregion\n//#region src/agents/visibility.ts\nconst agentListScope = projectListScope;\nconst canAccessAgent = canReadProject;\n//#endregion\n//#region src/api-keys/can-revoke-api-key.ts\nfunction canRevokeApiKey(ctx, input) {\n\treturn input.userId === input.createdByUserId || checkPermission(userActions.manage, ctx);\n}\n//#endregion\n//#region src/api-keys/visibility.ts\nfunction apiKeyListScope(ctx) {\n\treturn checkPermission(apiKeysActions.read, ctx) ? { kind: \"all\" } : { kind: \"creator-only\" };\n}\nfunction canReadApiKey(ctx, input) {\n\treturn checkPermission(apiKeysActions.read, ctx) || input.userId === input.createdByUserId;\n}\n//#endregion\n//#region src/actions.ts\nconst actions = [\n\t...organizationGrants,\n\t...userGrants,\n\t...apiKeysGrants,\n\t...projectGrants\n];\n//#endregion\n//#region src/labels.ts\nconst ORG_ROLE_LABELS = {\n\towner: \"Owner\",\n\tadmin: \"Admin\",\n\tbuilder: \"Builder\"\n};\nconst PROJECT_ROLE_LABELS = {\n\tadmin: \"Project admin\",\n\tbuilder: \"Builder\"\n};\n//#endregion\n//#region src/history/visibility.ts\nconst historyListScope = projectListScope;\nconst canAccessHistoryRun = canReadProject;\n//#endregion\n//#region src/projects/can-invite-to-project.ts\nfunction canInviteToProject(ctx, settings, invitedRole) {\n\tif (!(checkPermission(projectActions.invite, ctx) || settings.invitePermission === \"all\" && ctx.projectRole === \"builder\")) return false;\n\tif (checkPermission(projectActions.manageMembers, ctx)) return true;\n\treturn invitedRole === \"builder\";\n}\n//#endregion\n//#region src/recents/visibility.ts\nconst recentsListScope = projectListScope;\nconst canAccessRecentResource = canReadProject;\n//#endregion\n//#region src/skills/visibility.ts\nconst skillListScope = projectListScope;\nconst canAccessSkill = canReadProject;\n//#endregion\n//#region src/workflows/visibility.ts\nconst workflowListScope = projectListScope;\nconst canAccessWorkflow = canReadProject;\n//#endregion\nexport { ORG_ROLE_LABELS, PROJECT_ROLE_LABELS, actions, agentListScope, apiKeyListScope, apiKeysActions, apiKeysGrants, apiKeysRoleGrants, canAccessAgent, canAccessHistoryRun, canAccessRecentResource, canAccessSkill, canAccessWorkflow, canInviteRole, canInviteToProject, canReadApiKey, canReadProject, canRevokeApiKey, checkPermission, historyListScope, invitableRolesByRole, orgRolePermissions, organizationActions, organizationGrants, organizationRoleGrants, projectActions, projectGrants, projectListScope, projectRoleGrants, recentsListScope, skillListScope, userActions, userGrants, userRoleGrants, workflowListScope };\n\n//# sourceMappingURL=index.mjs.map","import type { AccessContext } from \"@keystrokehq/access-control\";\nimport type { ProjectInvitePermission } from \"@keystrokehq/shared\";\nimport type { Context } from \"hono\";\n\nimport type { ProjectMemberContext } from \"./types\";\n\nexport function accessContext(c: Context): AccessContext {\n const organization = c.get(\"organization\");\n const projectMember = c.get(\"projectMember\") as ProjectMemberContext | undefined;\n\n return {\n orgRole: organization.role,\n projectRole: projectMember?.role,\n };\n}\n\nexport function getProjectInvitePermission(c: Context): ProjectInvitePermission {\n const project = c.get(\"project\") as { invitePermission: ProjectInvitePermission };\n return project.invitePermission;\n}\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport type { Context } from \"hono\";\n\nexport function forbidden(c: Context) {\n return c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403);\n}\n\nexport function notFound(c: Context, message = \"Not found\") {\n return c.json(ErrorResponseSchema.parse({ error: message }), 404);\n}\n","import { checkPermission, type Action } from \"@keystrokehq/access-control\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport { accessContext } from \"./access-context\";\nimport { forbidden } from \"./responses\";\nimport type { OrganizationVariables } from \"./types\";\n\nexport function authorize(action: Action): MiddlewareHandler<{ Variables: OrganizationVariables }> {\n return async (c, next) => {\n if (!checkPermission(action, accessContext(c))) {\n return forbidden(c);\n }\n\n await next();\n };\n}\n","import { type AccessContext } from \"@keystrokehq/access-control\";\nimport type { Context } from \"hono\";\nimport type { MiddlewareHandler } from \"hono\";\nimport type { ZodType } from \"zod\";\n\nimport { accessContext } from \"./access-context\";\nimport { forbidden } from \"./responses\";\nimport type { OrganizationVariables } from \"./types\";\n\nexport function authorizePayload<T>(\n schema: ZodType<T>,\n allow: (input: { c: Context; ctx: AccessContext; body: T }) => boolean,\n): MiddlewareHandler<{ Variables: OrganizationVariables }> {\n return async (c, next) => {\n const parsed = schema.safeParse(await c.req.json().catch(() => null));\n\n if (parsed.success && !allow({ c, ctx: accessContext(c), body: parsed.data })) {\n return forbidden(c);\n }\n\n await next();\n };\n}\n","import { ACTIVE_ORG_HEADER } from \"@keystrokehq/shared\";\nimport type { Context } from \"hono\";\n\nimport type { SessionVariables } from \"./types\";\n\nexport function resolveActiveOrganizationId(c: Context): string | undefined {\n const header = c.req.header(ACTIVE_ORG_HEADER)?.trim();\n if (header) {\n return header;\n }\n\n // Org-platform API keys pin the org, so callers need not send the active-org header.\n const apiKeyAuth = c.get(\"apiKeyAuth\") as SessionVariables[\"apiKeyAuth\"] | undefined;\n return apiKeyAuth?.organizationId;\n}\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { selectUserOrganizationMembership } from \"@keystrokehq/platform-database\";\nimport type { Context } from \"hono\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport { resolveActiveOrganizationId } from \"./resolve-org-id\";\nimport type { OrganizationContext, OrganizationVariables } from \"./types\";\nimport type { SessionVariables } from \"./types\";\n\ntype OrganizationResolution =\n | { ok: true; organization: OrganizationContext }\n | { ok: false; response: Response };\n\nexport async function resolveOrganizationContext(c: Context): Promise<OrganizationResolution> {\n const organizationId = resolveActiveOrganizationId(c);\n\n if (!organizationId) {\n return {\n ok: false,\n response: c.json(\n ErrorResponseSchema.parse({\n error: \"Select an organization to continue\",\n code: \"needs_org_selection\",\n }),\n 409,\n ),\n };\n }\n\n const apiKeyAuth = c.get(\"apiKeyAuth\") as SessionVariables[\"apiKeyAuth\"] | undefined;\n if (apiKeyAuth && apiKeyAuth.organizationId !== organizationId) {\n return {\n ok: false,\n response: c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403),\n };\n }\n\n const user = c.get(\"user\");\n const membership = await selectUserOrganizationMembership(user.id, organizationId);\n\n if (!membership) {\n return {\n ok: false,\n response: c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403),\n };\n }\n\n return {\n ok: true,\n organization: {\n organizationId: membership.organization.id,\n organizationName: membership.organization.name,\n role: membership.role,\n },\n };\n}\n\nexport function requireOrganization(): MiddlewareHandler<{ Variables: OrganizationVariables }> {\n return async (c, next) => {\n const resolved = await resolveOrganizationContext(c);\n if (!resolved.ok) {\n return resolved.response;\n }\n\n c.set(\"organization\", resolved.organization);\n await next();\n };\n}\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { selectUserOrganizationMembership } from \"@keystrokehq/platform-database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { OrganizationVariables } from \"./types\";\n\nexport function requireOrganizationParam(): MiddlewareHandler<{\n Variables: OrganizationVariables;\n}> {\n return async (c, next) => {\n const organizationId = c.req.param(\"organizationId\")?.trim();\n\n if (!organizationId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization id is required\" }), 400);\n }\n\n const user = c.get(\"user\");\n const membership = await selectUserOrganizationMembership(user.id, organizationId);\n\n if (!membership) {\n return c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403);\n }\n\n c.set(\"organization\", {\n organizationId: membership.organization.id,\n organizationName: membership.organization.name,\n role: membership.role,\n });\n\n await next();\n };\n}\n","import { ErrorResponseSchema, mapProject } from \"@keystrokehq/shared\";\nimport {\n runWithWorkspaceContext,\n selectOrganizationById,\n selectProjectForOrganization,\n} from \"@keystrokehq/platform-database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { ProjectRouteVariables } from \"./types\";\n\nexport function requireProject(): MiddlewareHandler<{ Variables: ProjectRouteVariables }> {\n return async (c, next) => {\n const organization = c.get(\"organization\");\n const projectId = c.req.param(\"projectId\")?.trim();\n\n if (!projectId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project id is required\" }), 400);\n }\n\n const [project, organizationRow] = await Promise.all([\n selectProjectForOrganization(organization.organizationId, projectId),\n selectOrganizationById(organization.organizationId),\n ]);\n\n if (!project) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n }\n\n if (!organizationRow) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n c.set(\"project\", project);\n\n await runWithWorkspaceContext(\n {\n organizationId: organization.organizationId,\n role: organization.role,\n projectId: project.id,\n dbSchema: organizationRow.dbSchema,\n },\n () => next(),\n );\n };\n}\n\nexport function routeProject(project: ProjectRouteVariables[\"project\"]) {\n return mapProject(project);\n}\n","import { checkPermission, projectActions } from \"@keystrokehq/access-control\";\nimport { selectUserProjectMembership } from \"@keystrokehq/platform-database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport { notFound } from \"./responses\";\nimport type { ProjectRouteVariables } from \"./types\";\n\nexport function requireProjectMembership(): MiddlewareHandler<{\n Variables: ProjectRouteVariables;\n}> {\n return async (c, next) => {\n const { role: orgRole } = c.get(\"organization\");\n const project = c.get(\"project\");\n\n // Org owners/admins read every project via the policy bypass; everyone else\n // needs an explicit project membership.\n if (checkPermission(projectActions.read, { orgRole })) {\n await next();\n return;\n }\n\n const membership = await selectUserProjectMembership(c.get(\"user\").id, project.id);\n if (!membership) {\n return notFound(c, \"Project not found\");\n }\n\n c.set(\"projectMember\", { role: membership.role });\n await next();\n };\n}\n","import {\n createDefaultAuthJwtVerifier,\n extractWebhookApiKeyFromRequest,\n resolveRequestAuth,\n type JwtVerifier,\n} from \"@keystrokehq/auth\";\nimport {\n loadOrgPlatformApiKeyUser,\n verifyOrgPlatformApiKeySecret,\n} from \"@keystrokehq/platform-database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { SessionVariables } from \"./types\";\n\nfunction sessionFromApiKeyUser(\n user: NonNullable<Awaited<ReturnType<typeof loadOrgPlatformApiKeyUser>>>,\n token: string,\n): SessionVariables {\n return {\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n image: user.image ?? null,\n emailVerified: user.emailVerified,\n createdAt: user.createdAt,\n updatedAt: user.updatedAt,\n },\n session: {\n id: user.id,\n userId: user.id,\n token,\n expiresAt: new Date(Date.now() + 15 * 60 * 1000),\n createdAt: new Date(),\n updatedAt: new Date(),\n },\n };\n}\n\nexport function requireSession(\n jwtVerifier?: JwtVerifier,\n): MiddlewareHandler<{ Variables: SessionVariables }> {\n const verifier = jwtVerifier ?? createDefaultAuthJwtVerifier();\n\n return async (c, next) => {\n const result = await resolveRequestAuth(verifier, c.req.raw.headers);\n\n if (result) {\n c.set(\"user\", result.user);\n c.set(\"session\", result.session);\n await next();\n return;\n }\n\n // Org platform keys accept bearer, x-api-key, or ?token=/api_key= (same as webhooks).\n const apiKeySecret = extractWebhookApiKeyFromRequest(c.req.raw);\n if (apiKeySecret) {\n const verified = await verifyOrgPlatformApiKeySecret(apiKeySecret);\n if (verified) {\n const user = await loadOrgPlatformApiKeyUser(verified.userId);\n if (user) {\n const session = sessionFromApiKeyUser(user, apiKeySecret);\n c.set(\"user\", session.user);\n c.set(\"session\", session.session);\n c.set(\"apiKeyAuth\", {\n apiKeyId: verified.apiKeyId,\n organizationId: verified.organizationId,\n });\n await next();\n return;\n }\n }\n }\n\n return c.json({ error: \"Unauthorized\" }, 401);\n };\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nconst requestBackgroundTasks = new AsyncLocalStorage<Promise<unknown>[]>();\n\nexport function runWithRequestBackgroundTasks<T>(fn: () => Promise<T>): Promise<T> {\n return requestBackgroundTasks.run([], fn);\n}\n\nexport function deferRequestBackgroundTask(task: Promise<unknown>): void {\n const tasks = requestBackgroundTasks.getStore();\n if (!tasks) {\n return;\n }\n\n tasks.push(task);\n}\n\nexport async function flushRequestBackgroundTasks(): Promise<void> {\n const tasks = requestBackgroundTasks.getStore() ?? [];\n await Promise.allSettled(tasks);\n}\n","import {\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport { runWithProjectDatabase, runWithTenantScope } from \"@keystrokehq/database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { OrganizationVariables } from \"../auth/types\";\nimport {\n flushRequestBackgroundTasks,\n runWithRequestBackgroundTasks,\n} from \"../routes/account/lib/request-background-tasks\";\n\n/** Bind the org's shared Postgres schema (all projects in the org use this DB). */\nexport function withOrganizationProjectDatabase(): MiddlewareHandler<{\n Variables: OrganizationVariables;\n}> {\n return async (c, next) => {\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const url = resolveOrgDatabaseUrl(organization);\n\n await runWithOrganizationScope(organizationId, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, () =>\n runWithTenantScope(organizationId, () =>\n runWithRequestBackgroundTasks(async () => {\n await next();\n await flushRequestBackgroundTasks();\n }),\n ),\n ),\n );\n };\n}\n","import { UserAvatarSchema, ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { selectUserById } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const dbUser = await selectUserById(user.id);\n if (!dbUser) {\n return c.json(ErrorResponseSchema.parse({ error: \"User not found\" }), 404);\n }\n\n return c.json(UserAvatarSchema.parse({ url: dbUser.image ?? null }));\n};\n","const ALLOWED_AVATAR_CONTENT_TYPES = {\n \"image/jpeg\": \"jpg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/webp\": \"webp\",\n \"image/gif\": \"gif\",\n} as const;\n\nexport type AllowedAvatarContentType = keyof typeof ALLOWED_AVATAR_CONTENT_TYPES;\n\nexport function avatarExtensionForContentType(contentType: string): string | null {\n const normalized = contentType.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n return ALLOWED_AVATAR_CONTENT_TYPES[normalized as AllowedAvatarContentType] ?? null;\n}\n\nexport function isAllowedAvatarContentType(contentType: string): boolean {\n return avatarExtensionForContentType(contentType) !== null;\n}\n","import {\n ErrorResponseSchema,\n PresignUserAvatarRequestSchema,\n PresignUserAvatarResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { createAssetsStorageClient, userAvatarStorageKey } from \"@keystrokehq/storage\";\n\nimport { avatarExtensionForContentType } from \"../../../../../../lib/user-avatar-content-type\";\nimport type { AccountRouteHandler } from \"../../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const parsed = PresignUserAvatarRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid avatar upload request\" }), 400);\n }\n\n const extension = avatarExtensionForContentType(parsed.data.contentType);\n if (!extension) {\n return c.json(ErrorResponseSchema.parse({ error: \"Unsupported image type\" }), 400);\n }\n\n const user = c.get(\"user\");\n const storageKey = userAvatarStorageKey(user.id, extension);\n const storage = createAssetsStorageClient();\n const uploadUrl = await storage.presignPut({\n key: storageKey,\n contentType: parsed.data.contentType,\n });\n\n return c.json(\n PresignUserAvatarResponseSchema.parse({\n uploadUrl,\n storageKey,\n }),\n );\n};\n","import type { StorageClient } from \"@keystrokehq/storage\";\n\nexport async function finalizeStoredImageUpload(input: {\n storage: StorageClient;\n storageKey: string;\n isValidStorageKey: (key: string) => boolean;\n buildPublicUrl: (key: string) => string;\n}): Promise<{ ok: true; publicUrl: string } | { ok: false; error: string }> {\n if (!input.isValidStorageKey(input.storageKey)) {\n return { ok: false, error: \"Invalid storage key\" };\n }\n\n const head = await input.storage.headObject(input.storageKey);\n if (!head || head.contentLength <= 0) {\n return { ok: false, error: \"Upload not found\" };\n }\n\n return { ok: true, publicUrl: input.buildPublicUrl(input.storageKey) };\n}\n\nexport async function deleteStoredImageIfOwned(input: {\n storage: StorageClient;\n url: string | null | undefined;\n isOwnedPublicUrl: (url: string) => boolean;\n keyFromPublicUrl: (url: string) => string | null;\n}): Promise<void> {\n if (!input.url || !input.isOwnedPublicUrl(input.url)) {\n return;\n }\n\n const key = input.keyFromPublicUrl(input.url);\n if (!key) {\n return;\n }\n\n await input.storage.deleteObject(key).catch(() => undefined);\n}\n","import { ErrorResponseSchema, UserAvatarPatchSchema, UserAvatarSchema } from \"@keystrokehq/shared\";\nimport { selectUserById, updateUserById } from \"@keystrokehq/platform-database\";\nimport {\n createAssetsStorageClient,\n isKeystrokeAssetsAvatarPublicUrl,\n isUserAvatarStorageKey,\n keystrokeAssetsAvatarKeyFromPublicUrl,\n publicKeystrokeAssetsObjectUrl,\n} from \"@keystrokehq/storage\";\n\nimport {\n deleteStoredImageIfOwned,\n finalizeStoredImageUpload,\n} from \"../../../../../lib/stored-image\";\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const parsed = UserAvatarPatchSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid avatar update\" }), 400);\n }\n\n const user = c.get(\"user\");\n const dbUser = await selectUserById(user.id);\n if (!dbUser) {\n return c.json(ErrorResponseSchema.parse({ error: \"User not found\" }), 404);\n }\n\n const storage = createAssetsStorageClient();\n const { storageKey } = parsed.data;\n\n if (storageKey === null) {\n await deleteStoredImageIfOwned({\n storage,\n url: dbUser.image,\n isOwnedPublicUrl: isKeystrokeAssetsAvatarPublicUrl,\n keyFromPublicUrl: keystrokeAssetsAvatarKeyFromPublicUrl,\n });\n await updateUserById(user.id, { image: null, updatedAt: new Date() });\n return c.json(UserAvatarSchema.parse({ url: null }));\n }\n\n const finalized = await finalizeStoredImageUpload({\n storage,\n storageKey,\n isValidStorageKey: (key) => isUserAvatarStorageKey(key, user.id),\n buildPublicUrl: publicKeystrokeAssetsObjectUrl,\n });\n\n if (!finalized.ok) {\n return c.json(ErrorResponseSchema.parse({ error: finalized.error }), 400);\n }\n\n if (dbUser.image && dbUser.image !== finalized.publicUrl) {\n await deleteStoredImageIfOwned({\n storage,\n url: dbUser.image,\n isOwnedPublicUrl: isKeystrokeAssetsAvatarPublicUrl,\n keyFromPublicUrl: keystrokeAssetsAvatarKeyFromPublicUrl,\n });\n }\n\n await updateUserById(user.id, { image: finalized.publicUrl, updatedAt: new Date() });\n return c.json(UserAvatarSchema.parse({ url: finalized.publicUrl }));\n};\n","import {\n ErrorResponseSchema,\n normalizeUserPreferences,\n UserPreferencesSchema,\n} from \"@keystrokehq/shared\";\nimport { selectUserById } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const dbUser = await selectUserById(user.id);\n if (!dbUser) {\n return c.json(ErrorResponseSchema.parse({ error: \"User not found\" }), 404);\n }\n\n return c.json(UserPreferencesSchema.parse(normalizeUserPreferences(dbUser.preferences)));\n};\n","import {\n ErrorResponseSchema,\n mergeUserPreferences,\n normalizeUserPreferences,\n UserPreferencesPatchSchema,\n UserPreferencesSchema,\n} from \"@keystrokehq/shared\";\nimport { selectUserById, updateUserById } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const parsed = UserPreferencesPatchSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid preferences update\" }), 400);\n }\n\n const user = c.get(\"user\");\n const dbUser = await selectUserById(user.id);\n if (!dbUser) {\n return c.json(ErrorResponseSchema.parse({ error: \"User not found\" }), 404);\n }\n\n const current = normalizeUserPreferences(dbUser.preferences);\n const next = mergeUserPreferences(current, parsed.data);\n\n await updateUserById(user.id, {\n preferences: next,\n updatedAt: new Date(),\n });\n\n return c.json(UserPreferencesSchema.parse(next));\n};\n","import { ListOrganizationsResponseSchema, mapUserOrganization } from \"@keystrokehq/shared\";\nimport { selectUserOrganizations } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const memberships = await selectUserOrganizations(user.id);\n\n return c.json(\n ListOrganizationsResponseSchema.parse({\n organizations: memberships.map(mapUserOrganization),\n }),\n );\n};\n","import { seedOAuthAppsFromEnvForOrganization } from \"@keystrokehq/server\";\nimport type { HostingPlugin } from \"@keystrokehq/hosting\";\nimport type { OrganizationStorageResult, StoragePlugin } from \"@keystrokehq/storage\";\nimport {\n createOrganizationForUser,\n encryptCredentialPayload,\n isOrganizationStorageBucketInUse,\n OrganizationSlugTakenError,\n resolveNewOrganizationIdentity,\n type UserOrganizationMembership,\n} from \"@keystrokehq/platform-database\";\n\nexport type CreateOrganizationDependencies = {\n hosting: HostingPlugin;\n storage: StoragePlugin;\n};\n\nexport async function createOrganizationWithHosting(\n deps: CreateOrganizationDependencies,\n userId: string,\n name: string,\n preferredSlug?: string,\n): Promise<UserOrganizationMembership> {\n const { hosting, storage } = deps;\n const identity = await resolveNewOrganizationIdentity(name, preferredSlug);\n let hostedAppName: string | undefined;\n let provisionedStorage: OrganizationStorageResult | undefined;\n let organizationPersisted = false;\n\n try {\n if (hosting.provisionOrganization) {\n const hosted = await hosting.provisionOrganization({\n organizationId: identity.organizationId,\n name: name.trim(),\n });\n hostedAppName = hosted.appName;\n }\n\n provisionedStorage = await storage.provisionOrganization({\n organizationId: identity.organizationId,\n name: name.trim(),\n });\n\n const membership = await createOrganizationForUser(userId, name, preferredSlug, {\n organizationId: identity.organizationId,\n slug: identity.slug,\n hostingAppName: hostedAppName ?? null,\n storage: {\n bucket: provisionedStorage.bucket,\n endpoint: provisionedStorage.endpoint,\n accessKeyIdCiphertext: encryptCredentialPayload(provisionedStorage.accessKeyId),\n secretAccessKeyCiphertext: encryptCredentialPayload(provisionedStorage.secretAccessKey),\n region: provisionedStorage.region ?? null,\n forcePathStyle: provisionedStorage.forcePathStyle ?? null,\n },\n });\n organizationPersisted = true;\n await seedOAuthAppsFromEnvForOrganization(identity.organizationId);\n return membership;\n } catch (error) {\n if (provisionedStorage && !organizationPersisted) {\n const bucketInUse = await isOrganizationStorageBucketInUse(provisionedStorage.bucket);\n if (!bucketInUse) {\n await storage.deprovisionOrganization(provisionedStorage).catch(() => undefined);\n }\n }\n if (hostedAppName && hosting.deprovisionOrganization) {\n await hosting.deprovisionOrganization({ appName: hostedAppName }).catch(() => undefined);\n }\n\n throw error;\n }\n}\n\nexport { OrganizationSlugTakenError };\n","import { OrganizationSlugTakenError } from \"@keystrokehq/platform-database\";\nimport type { OrganizationSlugErrorCode } from \"@keystrokehq/shared\";\nimport { organizationSlugErrorCodeFromMessage } from \"@keystrokehq/shared\";\nimport { ZodError } from \"zod\";\n\nexport function organizationSlugErrorBody(error: OrganizationSlugTakenError | ZodError): {\n error: string;\n code: OrganizationSlugErrorCode;\n} {\n if (error instanceof OrganizationSlugTakenError) {\n return { error: error.message, code: \"slug_taken\" };\n }\n\n const message = error.issues[0]?.message ?? \"Invalid organization slug\";\n return {\n error: message,\n code: organizationSlugErrorCodeFromMessage(message),\n };\n}\n","import {\n CreateOrganizationRequestSchema,\n CreateOrganizationResponseSchema,\n ErrorResponseSchema,\n mapUserOrganization,\n} from \"@keystrokehq/shared\";\nimport type { CreateOrganizationDependencies } from \"../../../services/create-organization\";\nimport { ZodError } from \"zod\";\n\nimport type { AccountRouteHandler } from \"../../types\";\nimport {\n createOrganizationWithHosting,\n OrganizationSlugTakenError,\n} from \"../../../services/create-organization\";\nimport { organizationSlugErrorBody } from \"./slug-errors\";\n\nexport function createOrganizationHandler(\n deps: CreateOrganizationDependencies,\n): AccountRouteHandler {\n return async (c) => {\n const user = c.get(\"user\");\n const body = await c.req.json().catch(() => null);\n const parsed = CreateOrganizationRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid organization request\" }), 400);\n }\n\n try {\n const membership = await createOrganizationWithHosting(\n deps,\n user.id,\n parsed.data.name,\n parsed.data.slug,\n );\n\n return c.json(\n CreateOrganizationResponseSchema.parse({\n organization: mapUserOrganization(membership),\n }),\n 201,\n );\n } catch (error) {\n if (error instanceof OrganizationSlugTakenError) {\n return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 409);\n }\n\n if (error instanceof ZodError) {\n return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 400);\n }\n\n throw error;\n }\n };\n}\n","import {\n ErrorResponseSchema,\n SlugAvailabilityQuerySchema,\n SlugAvailabilityResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { checkOrganizationSlugAvailability } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const parsed = SlugAvailabilityQuerySchema.safeParse({\n slug: c.req.query(\"slug\"),\n excludeOrganizationId: c.req.query(\"excludeOrganizationId\"),\n });\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid slug query\" }), 400);\n }\n\n const availability = await checkOrganizationSlugAvailability(\n parsed.data.slug,\n parsed.data.excludeOrganizationId,\n );\n\n return c.json(SlugAvailabilityResponseSchema.parse(availability));\n};\n","import { ActiveOrganizationResponseSchema, mapUserOrganization } from \"@keystrokehq/shared\";\nimport { selectUserOrganizationMembership } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const user = c.get(\"user\");\n const membership = await selectUserOrganizationMembership(user.id, organizationId);\n\n if (!membership) {\n throw new Error(`Organization membership missing after param guard: ${organizationId}`);\n }\n\n return c.json(\n ActiveOrganizationResponseSchema.parse({\n organization: mapUserOrganization(membership),\n }),\n );\n};\n","import {\n ActiveOrganizationResponseSchema,\n ErrorResponseSchema,\n mapUserOrganization,\n UpdateOrganizationRequestSchema,\n validationErrorResponse,\n} from \"@keystrokehq/shared\";\nimport {\n OrganizationSlugTakenError,\n updateOrganizationName,\n updateOrganizationSlug,\n type OrganizationRow,\n} from \"@keystrokehq/platform-database\";\nimport { ZodError } from \"zod\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { organizationSlugErrorBody } from \"../slug-errors\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateOrganizationRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n const errorBody = parsed.error.issues.some((issue) => issue.path[0] === \"slug\")\n ? organizationSlugErrorBody(parsed.error)\n : validationErrorResponse(parsed.error, \"Invalid organization update\");\n\n return c.json(ErrorResponseSchema.parse(errorBody), 400);\n }\n\n try {\n let updated: OrganizationRow | undefined;\n\n if (parsed.data.name !== undefined) {\n updated = await updateOrganizationName(organization.organizationId, parsed.data.name);\n }\n\n if (parsed.data.slug !== undefined) {\n updated = await updateOrganizationSlug(organization.organizationId, parsed.data.slug);\n }\n\n if (!updated) {\n throw new Error(`Organization update produced no result: ${organization.organizationId}`);\n }\n\n return c.json(\n ActiveOrganizationResponseSchema.parse({\n organization: mapUserOrganization({\n organization: updated,\n role: organization.role,\n }),\n }),\n );\n } catch (error) {\n if (error instanceof OrganizationSlugTakenError) {\n return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 409);\n }\n\n if (error instanceof ZodError) {\n return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 400);\n }\n\n throw error;\n }\n};\n","import { ErrorResponseSchema, OrganizationSidebarBrandingSchema } from \"@keystrokehq/shared\";\nimport {\n organizationRowToSidebarBranding,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n return c.json(\n OrganizationSidebarBrandingSchema.parse(organizationRowToSidebarBranding(organization)),\n );\n};\n","import {\n ErrorResponseSchema,\n OrganizationSidebarBrandingPatchSchema,\n OrganizationSidebarBrandingSchema,\n type OrganizationLogoVariant,\n} from \"@keystrokehq/shared\";\nimport {\n organizationRowToSidebarBranding,\n selectOrganizationById,\n updateOrganizationSidebarBranding,\n type UpdateOrganizationSidebarBrandingInput,\n} from \"@keystrokehq/platform-database\";\nimport {\n createAssetsStorageClient,\n isKeystrokeAssetsOrgLogoPublicUrl,\n isOrgLogoStorageKey,\n keystrokeAssetsOrgLogoKeyFromPublicUrl,\n publicKeystrokeAssetsObjectUrl,\n} from \"@keystrokehq/storage\";\n\nimport {\n deleteStoredImageIfOwned,\n finalizeStoredImageUpload,\n} from \"../../../../../lib/stored-image\";\nimport type { OrganizationRouteHandler } from \"../../../../types\";\n\nconst LOGO_VARIANTS = [\n {\n variant: \"light\" as const,\n storageKeyField: \"logoLightStorageKey\" as const,\n urlField: \"logoLightUrl\" as const,\n },\n {\n variant: \"dark\" as const,\n storageKeyField: \"logoDarkStorageKey\" as const,\n urlField: \"logoDarkUrl\" as const,\n },\n];\n\nasync function finalizeOrgLogoVariant(input: {\n organizationId: string;\n variant: OrganizationLogoVariant;\n storageKey: string | null;\n currentUrl: string | null;\n}): Promise<{ ok: true; publicUrl: string | null } | { ok: false; error: string }> {\n const storage = createAssetsStorageClient();\n\n if (input.storageKey === null) {\n await deleteStoredImageIfOwned({\n storage,\n url: input.currentUrl,\n isOwnedPublicUrl: isKeystrokeAssetsOrgLogoPublicUrl,\n keyFromPublicUrl: keystrokeAssetsOrgLogoKeyFromPublicUrl,\n });\n return { ok: true, publicUrl: null };\n }\n\n const finalized = await finalizeStoredImageUpload({\n storage,\n storageKey: input.storageKey,\n isValidStorageKey: (key) => isOrgLogoStorageKey(key, input.organizationId, input.variant),\n buildPublicUrl: publicKeystrokeAssetsObjectUrl,\n });\n\n if (!finalized.ok) {\n return finalized;\n }\n\n if (input.currentUrl && input.currentUrl !== finalized.publicUrl) {\n await deleteStoredImageIfOwned({\n storage,\n url: input.currentUrl,\n isOwnedPublicUrl: isKeystrokeAssetsOrgLogoPublicUrl,\n keyFromPublicUrl: keystrokeAssetsOrgLogoKeyFromPublicUrl,\n });\n }\n\n return { ok: true, publicUrl: finalized.publicUrl };\n}\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const parsed = OrganizationSidebarBrandingPatchSchema.safeParse(\n await c.req.json().catch(() => null),\n );\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid branding update\" }), 400);\n }\n\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const dbUpdate: UpdateOrganizationSidebarBrandingInput = {\n customLogoEnabled: parsed.data.customLogoEnabled,\n customLogoExplicitlyDisabled: parsed.data.customLogoExplicitlyDisabled,\n logoHeightPx: parsed.data.logoHeightPx,\n };\n\n for (const { variant, storageKeyField, urlField } of LOGO_VARIANTS) {\n const storageKey = parsed.data[storageKeyField];\n if (storageKey === undefined) {\n continue;\n }\n\n const result = await finalizeOrgLogoVariant({\n organizationId,\n variant,\n storageKey,\n currentUrl: organization[urlField],\n });\n if (!result.ok) {\n return c.json(ErrorResponseSchema.parse({ error: result.error }), 400);\n }\n dbUpdate[urlField] = result.publicUrl;\n }\n\n const updated = await updateOrganizationSidebarBranding(organizationId, dbUpdate);\n return c.json(OrganizationSidebarBrandingSchema.parse(organizationRowToSidebarBranding(updated)));\n};\n","import {\n ErrorResponseSchema,\n PresignOrgLogoRequestSchema,\n PresignOrgLogoResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { createAssetsStorageClient, orgLogoStorageKey } from \"@keystrokehq/storage\";\n\nimport { avatarExtensionForContentType } from \"../../../../../../../lib/user-avatar-content-type\";\nimport type { OrganizationRouteHandler } from \"../../../../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const parsed = PresignOrgLogoRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid logo upload request\" }), 400);\n }\n\n const extension = avatarExtensionForContentType(parsed.data.contentType);\n if (!extension) {\n return c.json(ErrorResponseSchema.parse({ error: \"Unsupported image type\" }), 400);\n }\n\n const { organizationId } = c.get(\"organization\");\n const storageKey = orgLogoStorageKey(organizationId, parsed.data.variant, extension);\n const storage = createAssetsStorageClient();\n const uploadUrl = await storage.presignPut({\n key: storageKey,\n contentType: parsed.data.contentType,\n });\n\n return c.json(\n PresignOrgLogoResponseSchema.parse({\n uploadUrl,\n storageKey,\n }),\n );\n};\n","import type { AccessContext, ProjectListScope } from \"@keystrokehq/access-control\";\nimport { projectListScope } from \"@keystrokehq/access-control\";\nimport { selectProjectIdsForUser } from \"@keystrokehq/platform-database\";\nimport type { Context } from \"hono\";\n\nimport { accessContext } from \"./access-context\";\nimport type { OrganizationVariables } from \"./types\";\n\nexport type ListProjectIdsFilter = { projectIds?: string[] };\n\ntype OrganizationContext = Context<{ Variables: OrganizationVariables }>;\n\nexport function adminViewRequested(c: OrganizationContext): boolean {\n return c.req.query(\"admin\") === \"true\";\n}\n\n/** Capability from policy, narrowed by the caller's view preference. */\nexport function listScope(c: OrganizationContext, capability: ProjectListScope): ProjectListScope {\n return adminViewRequested(c) ? capability : { kind: \"member-only\" };\n}\n\nexport async function grantedProjectIds(\n c: OrganizationContext,\n scope: ProjectListScope,\n): Promise<string[] | undefined> {\n if (scope.kind === \"all\") {\n return undefined;\n }\n\n const { organizationId } = c.get(\"organization\");\n return selectProjectIdsForUser(organizationId, c.get(\"user\").id);\n}\n\nexport async function resolveListProjectIds(\n c: OrganizationContext,\n scope: ProjectListScope,\n requested?: string,\n): Promise<ListProjectIdsFilter | \"empty\"> {\n const granted = await grantedProjectIds(c, scope);\n const projectId = requested?.trim() || undefined;\n\n if (projectId) {\n if (granted !== undefined && !granted.includes(projectId)) {\n return \"empty\";\n }\n return { projectIds: [projectId] };\n }\n\n if (granted === undefined) {\n return {};\n }\n\n if (granted.length === 0) {\n return \"empty\";\n }\n\n return { projectIds: granted };\n}\n\nexport async function canAccessProjectId(\n c: OrganizationContext,\n projectId: string,\n check: (ctx: Pick<AccessContext, \"orgRole\">, hasMembership: boolean) => boolean,\n): Promise<boolean> {\n const ctx = accessContext(c);\n const granted = await grantedProjectIds(c, projectListScope(ctx));\n const hasMembership = granted === undefined ? false : granted.includes(projectId);\n return check(ctx, hasMembership);\n}\n","import type { HistoryRun, HistoryRunActor, HistoryRunDetail } from \"@keystrokehq/shared\";\nimport type { HistoryRunCore } from \"@keystrokehq/database\";\nimport { selectUserById } from \"@keystrokehq/platform-database\";\n\nexport async function resolveHistoryRunActor(\n ranByUserId: string | null,\n): Promise<HistoryRunActor | null> {\n if (!ranByUserId) {\n return null;\n }\n\n const user = await selectUserById(ranByUserId);\n if (!user) {\n return null;\n }\n\n return {\n userId: user.id,\n name: user.name,\n avatarUrl: user.image ?? null,\n };\n}\n\nexport async function enrichHistoryRun(\n run: HistoryRunCore,\n projectNameById: Map<string, string>,\n): Promise<HistoryRun> {\n const { ranByUserId, ...rest } = run;\n return {\n ...rest,\n projectName: projectNameById.get(run.projectId) ?? \"Project\",\n ranAs: await resolveHistoryRunActor(ranByUserId),\n };\n}\n\nexport async function enrichHistoryRuns(\n runs: HistoryRunCore[],\n projectNameById: Map<string, string>,\n): Promise<HistoryRun[]> {\n const actorByUserId = new Map<string, HistoryRunActor | null>();\n\n return Promise.all(\n runs.map(async (run) => {\n const { ranByUserId, ...rest } = run;\n let ranAs: HistoryRunActor | null = null;\n if (ranByUserId) {\n if (!actorByUserId.has(ranByUserId)) {\n actorByUserId.set(ranByUserId, await resolveHistoryRunActor(ranByUserId));\n }\n ranAs = actorByUserId.get(ranByUserId) ?? null;\n }\n\n return {\n ...rest,\n projectName: projectNameById.get(run.projectId) ?? \"Project\",\n ranAs,\n };\n }),\n );\n}\n\nexport async function attachRanAsToDetail<T extends HistoryRunDetail>(\n detail: T,\n ranByUserId: string | null,\n): Promise<T> {\n const ranAs = await resolveHistoryRunActor(ranByUserId);\n return {\n ...detail,\n ranAs,\n };\n}\n","import { historyListScope } from \"@keystrokehq/access-control\";\nimport { HistoryRunListQuerySchema, HistoryRunListResponseSchema } from \"@keystrokehq/shared\";\nimport { listHistoryRuns } from \"@keystrokehq/database\";\nimport { selectProjectsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { grantedProjectIds, listScope, resolveListProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { enrichHistoryRuns } from \"./enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const ctx = accessContext(c);\n const query = HistoryRunListQuerySchema.parse({\n project: c.req.query(\"project\")?.trim() || undefined,\n status: c.req.query(\"status\")?.trim() || undefined,\n kind: c.req.query(\"kind\")?.trim() || undefined,\n });\n\n const scope = listScope(c, historyListScope(ctx));\n const filter = await resolveListProjectIds(c, scope, query.project);\n if (filter === \"empty\") {\n return c.json(HistoryRunListResponseSchema.parse([]));\n }\n\n const runs = await listHistoryRuns({\n ...filter,\n ...(query.status ? { status: query.status } : {}),\n ...(query.kind ? { kind: query.kind } : {}),\n });\n\n const grantedProjectIdsList = await grantedProjectIds(c, scope);\n const projects = await selectProjectsByOrganizationId(organization.organizationId, {\n grantedProjectIds: grantedProjectIdsList,\n });\n const projectNameById = new Map(projects.map((project) => [project.id, project.name]));\n\n const historyRuns = await enrichHistoryRuns(runs, projectNameById);\n\n return c.json(HistoryRunListResponseSchema.parse(historyRuns));\n};\n","import { canAccessHistoryRun } from \"@keystrokehq/access-control\";\nimport { HistoryRunDetailResponseSchema } from \"@keystrokehq/shared\";\nimport {\n buildHistoryAgentSessionDetail,\n buildHistoryWorkflowRunDetail,\n findHistoryRunCore,\n runWithProjectScope,\n selectActiveAgentById,\n selectAgentSessionById,\n selectWorkflowRunById,\n} from \"@keystrokehq/database\";\n\nimport { canAccessProjectId } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { attachRanAsToDetail } from \"../enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const runId = c.req.param(\"runId\") ?? \"\";\n if (!runId) {\n return c.json(null, 404);\n }\n\n const core = await findHistoryRunCore(runId);\n if (!core || !(await canAccessProjectId(c, core.projectId, canAccessHistoryRun))) {\n return c.json(null, 404);\n }\n\n const detail = await runWithProjectScope(core.projectId, async () => {\n if (core.kind === \"workflow\") {\n const row = await selectWorkflowRunById(runId);\n if (!row) {\n return null;\n }\n\n return buildHistoryWorkflowRunDetail(row.workflowSlug, runId);\n }\n\n const session = await selectAgentSessionById(runId);\n if (!session) {\n return null;\n }\n\n const agent = await selectActiveAgentById(session.agentId);\n if (!agent) {\n return null;\n }\n\n return buildHistoryAgentSessionDetail(agent.slug, runId);\n });\n\n if (!detail) {\n return c.json(null, 404);\n }\n\n return c.json(\n HistoryRunDetailResponseSchema.parse(await attachRanAsToDetail(detail, core.ranByUserId)),\n );\n};\n","import { PLATFORM_RESOURCE_UNSUPPORTED_TEXT } from \"@keystrokehq/shared\";\n\n/** Derive a human display name from a resource slug when no explicit name is stored. */\nexport function titleCaseKey(slug: string): string {\n const normalized = slug\n .split(/[/_-]+/)\n .filter(Boolean)\n .join(\" \");\n\n if (!normalized) {\n return PLATFORM_RESOURCE_UNSUPPORTED_TEXT;\n }\n\n return normalized.replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n","import { AgentSummarySchema, type AgentSummary } from \"@keystrokehq/shared\";\nimport type { AgentRow } from \"@keystrokehq/database\";\n\nimport { titleCaseKey } from \"./common\";\n\nfunction formatModel(model: AgentRow[\"model\"]): string | undefined {\n if (!model) {\n return undefined;\n }\n\n return model;\n}\n\nexport function toAgentSummary(row: AgentRow, options?: { lastRunAt?: Date | null }): AgentSummary {\n return AgentSummarySchema.parse({\n id: row.id,\n slug: row.slug,\n name: row.name?.trim() || titleCaseKey(row.slug),\n description: row.description ?? undefined,\n projectId: row.projectId,\n updatedAt: row.updatedAt.toISOString(),\n sourcePath: row.moduleFile,\n model: formatModel(row.model),\n toolCount: row.toolCount ?? undefined,\n credentialCount: row.credentialCount ?? undefined,\n lastRunAt: options?.lastRunAt?.toISOString(),\n });\n}\n","import { agentListScope } from \"@keystrokehq/access-control\";\nimport { AgentSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { listActiveAgents, selectAgentLastRunAtByIds } from \"@keystrokehq/database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { listScope, resolveListProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { toAgentSummary } from \"../resources/agents\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const filter = await resolveListProjectIds(\n c,\n listScope(c, agentListScope(accessContext(c))),\n c.req.query(\"projectId\"),\n );\n if (filter === \"empty\") {\n return c.json(AgentSummaryListResponseSchema.parse([]));\n }\n\n const rows = await listActiveAgents(filter);\n const lastRunAtById = await selectAgentLastRunAtByIds(rows.map((row) => row.id));\n\n return c.json(\n AgentSummaryListResponseSchema.parse(\n rows.map((row) => toAgentSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null })),\n ),\n );\n};\n","import { touchResourceActivity, type ResourceActivityKind } from \"@keystrokehq/database\";\n\nimport { deferRequestBackgroundTask } from \"./request-background-tasks\";\n\nexport function touchResourceActivityBestEffort(options: {\n userId: string;\n projectId: string;\n resourceKind: ResourceActivityKind;\n resourceId: string;\n}): void {\n deferRequestBackgroundTask(\n touchResourceActivity(options).catch(() => {\n // Recents tracking must not block resource reads.\n }),\n );\n}\n","import { canAccessAgent } from \"@keystrokehq/access-control\";\nimport { AgentSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveAgentById, selectAgentLastRunAtByIds } from \"@keystrokehq/database\";\n\nimport { canAccessProjectId } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { touchResourceActivityBestEffort } from \"../../lib/touch-resource-activity\";\nimport { toAgentSummary } from \"../../resources/agents\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const agentId = c.req.param(\"agentId\") ?? \"\";\n const row = agentId ? await selectActiveAgentById(agentId) : undefined;\n\n if (!row || !(await canAccessProjectId(c, row.projectId, canAccessAgent))) {\n return c.json(AgentSummaryDetailResponseSchema.parse(null));\n }\n\n touchResourceActivityBestEffort({\n userId: c.get(\"user\").id,\n projectId: row.projectId,\n resourceKind: \"agent\",\n resourceId: row.id,\n });\n\n const lastRunAtById = await selectAgentLastRunAtByIds([row.id]);\n\n return c.json(\n AgentSummaryDetailResponseSchema.parse(\n toAgentSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null }),\n ),\n );\n};\n","import type { OrganizationRow } from \"@keystrokehq/platform-database\";\nimport { resolveOrgDatabaseUrl } from \"@keystrokehq/platform-database\";\nimport {\n createScheduler,\n resolveSchedulerPluginFromEnv,\n type Scheduler,\n} from \"@keystrokehq/scheduler\";\n\nconst schedulerByKey = new Map<string, Promise<Scheduler>>();\n\nexport async function getProjectScheduler(\n organization: OrganizationRow,\n projectId: string,\n): Promise<Scheduler> {\n const url = resolveOrgDatabaseUrl(organization);\n // Projects in one org share the same org Postgres URL but get their own\n // per-project queue, so the scheduler must be cached per (url, projectId).\n const key = `${url}::${projectId}`;\n let pending = schedulerByKey.get(key);\n if (!pending) {\n // The producer's queue backend is selected from the same env the platform\n // forwards to the container worker (KEYSTROKE_SCHEDULER_MODULE), so producer\n // and consumer never diverge. Falls back to the dialect default when unset.\n pending = (async () => {\n const plugin = await resolveSchedulerPluginFromEnv(process.env);\n return createScheduler({\n url,\n scope: \"project\",\n projectId,\n organizationId: organization.id,\n plugin,\n });\n })();\n schedulerByKey.set(key, pending);\n }\n\n return pending;\n}\n","import { canAccessHistoryRun, historyListScope } from \"@keystrokehq/access-control\";\nimport { HistoryRunCancelResponseSchema } from \"@keystrokehq/shared\";\nimport {\n findHistoryRunCore,\n runWithProjectScope,\n type HistoryRunCore,\n} from \"@keystrokehq/database\";\nimport {\n selectOrganizationById,\n selectProjectsByOrganizationId,\n} from \"@keystrokehq/platform-database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { canAccessProjectId, grantedProjectIds } from \"../../../auth/project-access\";\nimport { getProjectScheduler } from \"../../../lib/project-scheduler\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { enrichHistoryRun } from \"./enrich\";\n\ntype CancelKind = \"workflow\" | \"agent\";\ntype OrganizationRouteContext = Parameters<OrganizationRouteHandler>[0];\n\n/** Shared body for the workflow-run and agent-session cancel endpoints. */\nexport async function cancelHistoryRun(\n c: OrganizationRouteContext,\n kind: CancelKind,\n cancel: (id: string) => Promise<HistoryRunCore | null>,\n): Promise<Response> {\n const organizationContext = c.get(\"organization\");\n const id = c.req.param(kind === \"workflow\" ? \"runId\" : \"sessionId\") ?? \"\";\n if (!id) {\n return c.json(null, 404);\n }\n\n const core = await findHistoryRunCore(id);\n if (!core || core.kind !== kind) {\n return c.json(null, 404);\n }\n\n if (!(await canAccessProjectId(c, core.projectId, canAccessHistoryRun))) {\n return c.json(null, 404);\n }\n\n const run = await runWithProjectScope(core.projectId, () => cancel(id));\n if (!run) {\n return c.json(null, 404);\n }\n\n const organization = await selectOrganizationById(organizationContext.organizationId);\n if (!organization) {\n return c.json(null, 404);\n }\n\n const scheduler = await getProjectScheduler(organization, core.projectId);\n await scheduler.publishCancel(id);\n\n const grantedProjectIdsList = await grantedProjectIds(c, historyListScope(accessContext(c)));\n const projects = await selectProjectsByOrganizationId(organizationContext.organizationId, {\n grantedProjectIds: grantedProjectIdsList,\n });\n const projectNameById = new Map(projects.map((project) => [project.id, project.name]));\n\n const historyRun = await enrichHistoryRun(run, projectNameById);\n return c.json(HistoryRunCancelResponseSchema.parse(historyRun));\n}\n","import { cancelAgentSession } from \"@keystrokehq/database\";\n\nimport { cancelHistoryRun } from \"../../../../history/cancel-run\";\nimport type { OrganizationRouteHandler } from \"../../../../../types\";\n\nexport const handler: OrganizationRouteHandler = (c) =>\n cancelHistoryRun(c, \"agent\", cancelAgentSession);\n","import { WorkflowSummarySchema, type WorkflowSummary } from \"@keystrokehq/shared\";\nimport type { WorkflowRow } from \"@keystrokehq/database\";\n\nimport { titleCaseKey } from \"./common\";\n\nexport function toWorkflowSummary(\n row: WorkflowRow,\n options?: { lastRunAt?: Date | null },\n): WorkflowSummary {\n return WorkflowSummarySchema.parse({\n id: row.id,\n slug: row.slug,\n name: row.name?.trim() || titleCaseKey(row.slug),\n description: row.description ?? undefined,\n projectId: row.projectId,\n updatedAt: row.updatedAt.toISOString(),\n sourcePath: row.moduleFile,\n lastRunAt: options?.lastRunAt?.toISOString(),\n });\n}\n","import { workflowListScope } from \"@keystrokehq/access-control\";\nimport { WorkflowSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { listActiveWorkflows, selectWorkflowLastRunAtByIds } from \"@keystrokehq/database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { listScope, resolveListProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { toWorkflowSummary } from \"../resources/workflows\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const filter = await resolveListProjectIds(\n c,\n listScope(c, workflowListScope(accessContext(c))),\n c.req.query(\"projectId\"),\n );\n if (filter === \"empty\") {\n return c.json(WorkflowSummaryListResponseSchema.parse([]));\n }\n\n const rows = await listActiveWorkflows(filter);\n const lastRunAtById = await selectWorkflowLastRunAtByIds(rows.map((row) => row.id));\n\n return c.json(\n WorkflowSummaryListResponseSchema.parse(\n rows.map((row) => toWorkflowSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null })),\n ),\n );\n};\n","import { canAccessWorkflow } from \"@keystrokehq/access-control\";\nimport { WorkflowSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveWorkflowById, selectWorkflowLastRunAtByIds } from \"@keystrokehq/database\";\n\nimport { canAccessProjectId } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { touchResourceActivityBestEffort } from \"../../lib/touch-resource-activity\";\nimport { toWorkflowSummary } from \"../../resources/workflows\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const workflowId = c.req.param(\"workflowId\") ?? \"\";\n const row = workflowId ? await selectActiveWorkflowById(workflowId) : undefined;\n\n if (!row || !(await canAccessProjectId(c, row.projectId, canAccessWorkflow))) {\n return c.json(WorkflowSummaryDetailResponseSchema.parse(null));\n }\n\n touchResourceActivityBestEffort({\n userId: c.get(\"user\").id,\n projectId: row.projectId,\n resourceKind: \"workflow\",\n resourceId: row.id,\n });\n\n const lastRunAtById = await selectWorkflowLastRunAtByIds([row.id]);\n\n return c.json(\n WorkflowSummaryDetailResponseSchema.parse(\n toWorkflowSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null }),\n ),\n );\n};\n","import { cancelWorkflowRun } from \"@keystrokehq/database\";\n\nimport { cancelHistoryRun } from \"../../../../history/cancel-run\";\nimport type { OrganizationRouteHandler } from \"../../../../../types\";\n\nexport const handler: OrganizationRouteHandler = (c) =>\n cancelHistoryRun(c, \"workflow\", cancelWorkflowRun);\n","import { SkillSummarySchema, type SkillSummary } from \"@keystrokehq/shared\";\nimport type { SkillRow } from \"@keystrokehq/database\";\n\nimport { titleCaseKey } from \"./common\";\n\nexport function toSkillSummary(row: SkillRow): SkillSummary {\n return SkillSummarySchema.parse({\n id: row.id,\n slug: row.slug,\n name: row.name?.trim() || titleCaseKey(row.slug),\n description: row.description ?? undefined,\n projectId: row.projectId,\n updatedAt: row.updatedAt.toISOString(),\n sourcePath: row.moduleFile,\n });\n}\n","import { skillListScope } from \"@keystrokehq/access-control\";\nimport { SkillSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { listActiveSkills } from \"@keystrokehq/database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { listScope, resolveListProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { toSkillSummary } from \"../resources/skills\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const filter = await resolveListProjectIds(\n c,\n listScope(c, skillListScope(accessContext(c))),\n c.req.query(\"projectId\"),\n );\n if (filter === \"empty\") {\n return c.json(SkillSummaryListResponseSchema.parse([]));\n }\n\n const rows = await listActiveSkills(filter);\n\n return c.json(SkillSummaryListResponseSchema.parse(rows.map(toSkillSummary)));\n};\n","import { canAccessSkill } from \"@keystrokehq/access-control\";\nimport { SkillSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveSkillById } from \"@keystrokehq/database\";\n\nimport { canAccessProjectId } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { touchResourceActivityBestEffort } from \"../../lib/touch-resource-activity\";\nimport { toSkillSummary } from \"../../resources/skills\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const skillId = c.req.param(\"skillId\") ?? \"\";\n const row = skillId ? await selectActiveSkillById(skillId) : undefined;\n\n if (!row || !(await canAccessProjectId(c, row.projectId, canAccessSkill))) {\n return c.json(SkillSummaryDetailResponseSchema.parse(null));\n }\n\n touchResourceActivityBestEffort({\n userId: c.get(\"user\").id,\n projectId: row.projectId,\n resourceKind: \"skill\",\n resourceId: row.id,\n });\n\n return c.json(SkillSummaryDetailResponseSchema.parse(toSkillSummary(row)));\n};\n","import {\n RecentResourceSchema,\n type RecentResource,\n type RecentResourceKind,\n} from \"@keystrokehq/shared\";\nimport type { ResourceActivityRow } from \"@keystrokehq/database\";\n\nimport { titleCaseKey } from \"./common\";\n\ntype HydratedResource = {\n name: string;\n projectId: string;\n sourcePath: string;\n lastModifiedAt: Date;\n};\n\nexport function toRecentResource(\n activity: ResourceActivityRow,\n resource: HydratedResource,\n projectName: string,\n): RecentResource {\n return RecentResourceSchema.parse({\n id: activity.id,\n resourceKind: activity.resourceKind,\n resourceId: activity.resourceId,\n name: resource.name,\n projectId: resource.projectId,\n projectName,\n sourcePath: resource.sourcePath,\n source: \"owned\",\n lastOpenedAt: activity.lastOpenedAt.toISOString(),\n lastModifiedAt: resource.lastModifiedAt.toISOString(),\n });\n}\n\nexport function hydrateRecentResource(\n activity: ResourceActivityRow,\n lookup: Partial<Record<RecentResourceKind, Map<string, HydratedResource>>>,\n projectNameById: Map<string, string>,\n): RecentResource | null {\n const resourceKind = activity.resourceKind as RecentResourceKind;\n const resource = lookup[resourceKind]?.get(activity.resourceId);\n if (!resource) {\n return null;\n }\n\n const projectName = projectNameById.get(resource.projectId) ?? resource.projectId;\n return toRecentResource(activity, resource, projectName);\n}\n\nexport function hydratedResourceFromAgentRow(row: {\n slug: string;\n name?: string | null;\n projectId: string;\n moduleFile: string;\n updatedAt: Date;\n}): HydratedResource {\n return {\n name: row.name?.trim() || titleCaseKey(row.slug),\n projectId: row.projectId,\n sourcePath: row.moduleFile,\n lastModifiedAt: row.updatedAt,\n };\n}\n\nexport function latestRecentInteractionAt(recent: RecentResource): number {\n return Math.max(\n new Date(recent.lastOpenedAt).getTime(),\n new Date(recent.lastModifiedAt).getTime(),\n );\n}\n","import { RecentResourceListResponseSchema } from \"@keystrokehq/shared\";\nimport {\n listRecentResourceActivity,\n selectActiveAgentsByIds,\n selectActiveSkillsByIds,\n selectActiveWorkflowsByIds,\n} from \"@keystrokehq/database\";\nimport { selectProjectsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport { grantedProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport {\n hydratedResourceFromAgentRow,\n hydrateRecentResource,\n latestRecentInteractionAt,\n} from \"../resources/recents\";\n\nconst RECENTS_LIMIT = 50;\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const userId = c.get(\"user\").id;\n const organization = c.get(\"organization\");\n // Recents are always user-specific and scoped to the viewer's project memberships;\n // the admin visibility flag never widens them to the whole org.\n const grantedProjectIdsList = await grantedProjectIds(c, { kind: \"member-only\" });\n const activities = await listRecentResourceActivity(userId, RECENTS_LIMIT);\n const visibleActivities =\n grantedProjectIdsList === undefined\n ? activities\n : activities.filter((activity) => grantedProjectIdsList.includes(activity.projectId));\n\n const agentIds = visibleActivities\n .filter((activity) => activity.resourceKind === \"agent\")\n .map((activity) => activity.resourceId);\n const workflowIds = visibleActivities\n .filter((activity) => activity.resourceKind === \"workflow\")\n .map((activity) => activity.resourceId);\n const skillIds = visibleActivities\n .filter((activity) => activity.resourceKind === \"skill\")\n .map((activity) => activity.resourceId);\n\n const [agents, workflows, skills, projects] = await Promise.all([\n selectActiveAgentsByIds(agentIds),\n selectActiveWorkflowsByIds(workflowIds),\n selectActiveSkillsByIds(skillIds),\n selectProjectsByOrganizationId(organization.organizationId, {\n grantedProjectIds: grantedProjectIdsList,\n }),\n ]);\n\n const projectNameById = new Map(projects.map((project) => [project.id, project.name]));\n const lookup = {\n agent: new Map(agents.map((row) => [row.id, hydratedResourceFromAgentRow(row)] as const)),\n workflow: new Map(workflows.map((row) => [row.id, hydratedResourceFromAgentRow(row)] as const)),\n skill: new Map(skills.map((row) => [row.id, hydratedResourceFromAgentRow(row)] as const)),\n };\n\n const recents = visibleActivities\n .map((activity) => hydrateRecentResource(activity, lookup, projectNameById))\n .filter((recent) => recent !== null)\n .sort((left, right) => latestRecentInteractionAt(right) - latestRecentInteractionAt(left));\n\n return c.json(RecentResourceListResponseSchema.parse(recents));\n};\n","import { projectListScope } from \"@keystrokehq/access-control\";\nimport { selectProjectsByOrganizationId } from \"@keystrokehq/platform-database\";\nimport { ListProjectsResponseSchema, mapProject } from \"@keystrokehq/shared\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { grantedProjectIds, listScope } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const grantedProjectIdsList = await grantedProjectIds(\n c,\n listScope(c, projectListScope(accessContext(c))),\n );\n\n const projects = await selectProjectsByOrganizationId(organization.organizationId, {\n grantedProjectIds: grantedProjectIdsList,\n });\n\n return c.json(\n ListProjectsResponseSchema.parse({\n projects: projects.map(mapProject),\n }),\n );\n};\n","import type { ProjectListMetrics } from \"@keystrokehq/shared\";\nimport type { ProjectResourceCounts } from \"@keystrokehq/database\";\n\nexport function mergeProjectListMetrics(input: {\n resourceCounts: Record<string, ProjectResourceCounts>;\n lastDeploymentAtByProject: Record<string, Date>;\n}): Record<string, ProjectListMetrics> {\n const projectIds = new Set([\n ...Object.keys(input.resourceCounts),\n ...Object.keys(input.lastDeploymentAtByProject),\n ]);\n\n const metrics: Record<string, ProjectListMetrics> = {};\n\n for (const projectId of projectIds) {\n const counts = input.resourceCounts[projectId];\n const lastDeploymentAt = input.lastDeploymentAtByProject[projectId];\n\n metrics[projectId] = {\n agentCount: counts?.agentCount ?? 0,\n workflowCount: counts?.workflowCount ?? 0,\n skillCount: counts?.skillCount ?? 0,\n credentialCount: counts?.credentialCount ?? 0,\n lastDeploymentAt: lastDeploymentAt ? lastDeploymentAt.toISOString() : null,\n };\n }\n\n return metrics;\n}\n","import { projectListScope } from \"@keystrokehq/access-control\";\nimport { selectProjectResourceCounts } from \"@keystrokehq/database\";\nimport { selectLastDeploymentAtByProject } from \"@keystrokehq/platform-database\";\nimport { ListProjectMetricsResponseSchema } from \"@keystrokehq/shared\";\n\nimport { accessContext } from \"../../../../auth/access-context\";\nimport { grantedProjectIds, listScope } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { mergeProjectListMetrics } from \"./merge-project-list-metrics\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const grantedProjectIdsList = await grantedProjectIds(\n c,\n listScope(c, projectListScope(accessContext(c))),\n );\n\n const [resourceCounts, lastDeploymentAtByProject] = await Promise.all([\n selectProjectResourceCounts(\n grantedProjectIdsList !== undefined ? { projectIds: grantedProjectIdsList } : undefined,\n ),\n selectLastDeploymentAtByProject(organization.organizationId),\n ]);\n\n let metrics = mergeProjectListMetrics({ resourceCounts, lastDeploymentAtByProject });\n if (grantedProjectIdsList !== undefined) {\n const allowed = new Set(grantedProjectIdsList);\n metrics = Object.fromEntries(\n Object.entries(metrics).filter(([projectId]) => allowed.has(projectId)),\n );\n }\n\n return c.json(\n ListProjectMetricsResponseSchema.parse({\n metrics,\n }),\n );\n};\n","import {\n CreateProjectRequestSchema,\n CreateProjectResponseSchema,\n ErrorResponseSchema,\n mapProject,\n} from \"@keystrokehq/shared\";\nimport { createProjectForOrganization } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const user = c.get(\"user\");\n const body = await c.req.json().catch(() => null);\n const parsed = CreateProjectRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project name is required\" }), 400);\n }\n\n const project = await createProjectForOrganization(\n organization.organizationId,\n parsed.data.name,\n parsed.data.description,\n user.id,\n );\n\n return c.json(\n CreateProjectResponseSchema.parse({\n project: mapProject(project),\n }),\n 201,\n );\n};\n","import {\n ErrorResponseSchema,\n ProjectSlugAvailabilityQuerySchema,\n ProjectSlugAvailabilityResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { checkProjectSlugAvailability } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const parsed = ProjectSlugAvailabilityQuerySchema.safeParse({\n slug: c.req.query(\"slug\"),\n excludeProjectId: c.req.query(\"excludeProjectId\"),\n });\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid slug query\" }), 400);\n }\n\n const availability = await checkProjectSlugAvailability(\n organization.organizationId,\n parsed.data.slug,\n parsed.data.excludeProjectId,\n );\n\n return c.json(ProjectSlugAvailabilityResponseSchema.parse(availability));\n};\n","import { ProjectResponseSchema } from \"@keystrokehq/shared\";\n\nimport { routeProject } from \"../../../../auth/require-project\";\nimport type { ProjectRouteHandler } from \"../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n return c.json(\n ProjectResponseSchema.parse({\n project: routeProject(c.get(\"project\")),\n }),\n );\n};\n","import {\n ErrorResponseSchema,\n mapProject,\n PROJECT_SLUG_TAKEN_MESSAGE,\n ProjectResponseSchema,\n UpdateProjectRequestSchema,\n} from \"@keystrokehq/shared\";\nimport {\n ProjectSlugTakenError,\n updateProjectForOrganization,\n} from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const project = c.get(\"project\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateProjectRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid project update request\" }), 400);\n }\n\n let updated;\n try {\n updated = await updateProjectForOrganization(\n organization.organizationId,\n project.id,\n parsed.data,\n );\n } catch (error) {\n if (error instanceof ProjectSlugTakenError) {\n return c.json(ErrorResponseSchema.parse({ error: PROJECT_SLUG_TAKEN_MESSAGE }), 409);\n }\n throw error;\n }\n\n if (!updated) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n }\n\n return c.json(\n ProjectResponseSchema.parse({\n project: mapProject(updated),\n }),\n );\n};\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { deleteProjectForOrganization } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const project = c.get(\"project\");\n\n const deleted = await deleteProjectForOrganization(organization.organizationId, project.id);\n\n if (!deleted) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n }\n\n return c.body(null, 204);\n};\n","import { ListProjectDeploymentsResponseSchema, mapProjectDeployment } from \"@keystrokehq/shared\";\nimport { selectProjectDeployments } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const rows = await selectProjectDeployments(project.id);\n\n return c.json(\n ListProjectDeploymentsResponseSchema.parse({\n deployments: rows.map(mapProjectDeployment),\n }),\n );\n};\n","import { CreateProjectArtifactResponseSchema, mapProjectArtifact } from \"@keystrokehq/shared\";\nimport {\n createOrgStorageClient,\n insertProjectArtifact,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport { projectArtifactKey } from \"@keystrokehq/storage\";\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nconst DEFAULT_PRESIGN_TTL_SECONDS = 900;\nconst ARTIFACT_CONTENT_TYPE = \"application/gzip\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const artifactId = crypto.randomUUID();\n const storageKey = projectArtifactKey(project.id, artifactId);\n const storage = createOrgStorageClient(organization);\n\n const artifact = await insertProjectArtifact({\n id: artifactId,\n projectId: project.id,\n storageKey,\n createdByUserId: c.get(\"user\").id,\n });\n\n const uploadUrl = await storage.presignPut({\n key: storageKey,\n contentType: ARTIFACT_CONTENT_TYPE,\n expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS,\n });\n\n return c.json(\n CreateProjectArtifactResponseSchema.parse({\n artifact: mapProjectArtifact(artifact),\n uploadUrl,\n expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS,\n }),\n 201,\n );\n};\n","import { DownloadActiveProjectArtifactResponseSchema } from \"@keystrokehq/shared\";\nimport {\n createOrgStorageClient,\n selectActiveProjectArtifactForProject,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport type { ProjectRouteHandler } from \"../../../../../../types\";\n\nconst DEFAULT_PRESIGN_TTL_SECONDS = 900;\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const artifact = await selectActiveProjectArtifactForProject(project.id);\n if (!artifact) {\n return c.json({ error: \"No active artifact for project\" }, 404);\n }\n\n const storage = createOrgStorageClient(organization);\n const downloadUrl = await storage.presignGet({\n key: artifact.storageKey,\n expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS,\n });\n\n return c.json(\n DownloadActiveProjectArtifactResponseSchema.parse({\n artifactId: artifact.id,\n downloadUrl,\n expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS,\n }),\n );\n};\n","import {\n CompleteProjectArtifactResponseSchema,\n ErrorResponseSchema,\n mapProject,\n mapProjectArtifact,\n parseStoredRouteManifest,\n} from \"@keystrokehq/shared\";\nimport {\n completeProjectArtifact,\n createOrgStorageClient,\n selectOrganizationById,\n selectProjectArtifactForProject,\n} from \"@keystrokehq/platform-database\";\nimport { enqueueProjectRuntime } from \"@keystrokehq/projects\";\nimport { extractRouteManifestFromArtifact } from \"@keystrokehq/storage\";\nimport type { ProjectRouteHandler } from \"../../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const artifactId = c.req.param(\"artifactId\");\n if (!artifactId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact id is required\" }), 400);\n }\n\n const existing = await selectProjectArtifactForProject(artifactId, project.id);\n if (!existing) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact not found\" }), 404);\n }\n\n if (existing.status === \"ready\") {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact already completed\" }), 409);\n }\n\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const storage = createOrgStorageClient(organization);\n const head = await storage.headObject(existing.storageKey);\n if (!head || head.contentLength <= 0) {\n return c.json(\n ErrorResponseSchema.parse({ error: \"Artifact upload not found in storage\" }),\n 400,\n );\n }\n\n try {\n const artifactBytes = await storage.getObject(existing.storageKey);\n if (!artifactBytes || artifactBytes.byteLength <= 0) {\n return c.json(\n ErrorResponseSchema.parse({ error: \"Artifact upload not found in storage\" }),\n 400,\n );\n }\n\n const manifestJson = parseStoredRouteManifest(\n extractRouteManifestFromArtifact(Buffer.from(artifactBytes)),\n );\n\n const result = await completeProjectArtifact({\n artifactId,\n projectId: project.id,\n manifestJson,\n });\n\n await enqueueProjectRuntime({\n projectId: project.id,\n name: project.name,\n artifactId,\n });\n\n return c.json(\n CompleteProjectArtifactResponseSchema.parse({\n artifact: mapProjectArtifact(result.artifact),\n project: mapProject(result.project),\n }),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to complete artifact\";\n return c.json(ErrorResponseSchema.parse({ error: message }), 400);\n }\n};\n","import {\n ErrorResponseSchema,\n PresignProjectSourceRequestSchema,\n PresignProjectSourceResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n createOrgStorageClient,\n selectOrganizationById,\n selectProjectArtifactForProject,\n} from \"@keystrokehq/platform-database\";\nimport { projectSourceBlobKey } from \"@keystrokehq/storage\";\n\nimport type { ProjectRouteHandler } from \"../../../../../../../types\";\n\nconst SOURCE_BLOB_CONTENT_TYPE = \"text/plain; charset=utf-8\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const artifactId = c.req.param(\"artifactId\");\n if (!artifactId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact id is required\" }), 400);\n }\n\n const artifact = await selectProjectArtifactForProject(artifactId, project.id);\n if (!artifact) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact not found\" }), 404);\n }\n\n const parsed = PresignProjectSourceRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid blob list\" }), 400);\n }\n\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const storage = createOrgStorageClient(organization);\n\n // De-dupe requested hashes, then presign PUTs only for blobs not already\n // stored so unchanged files are never re-uploaded across deploys.\n const hashes = [...new Set(parsed.data.blobs.map((blob) => blob.hash))];\n const uploads = await Promise.all(\n hashes.map(async (hash) => {\n const key = projectSourceBlobKey(project.id, hash);\n const head = await storage.headObject(key);\n if (head && head.contentLength > 0) {\n return null;\n }\n const url = await storage.presignPut({ key, contentType: SOURCE_BLOB_CONTENT_TYPE });\n return { hash, url };\n }),\n );\n\n return c.json(\n PresignProjectSourceResponseSchema.parse({\n uploads: uploads.filter((upload): upload is { hash: string; url: string } => upload !== null),\n }),\n );\n};\n","import {\n ErrorResponseSchema,\n StoredProjectSourceManifestSchema,\n UploadProjectSourceManifestRequestSchema,\n UploadProjectSourceResponseSchema,\n projectFileId,\n} from \"@keystrokehq/shared\";\nimport {\n selectProjectArtifactForProject,\n updateProjectArtifactSourceManifest,\n} from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const artifactId = c.req.param(\"artifactId\");\n if (!artifactId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact id is required\" }), 400);\n }\n\n const artifact = await selectProjectArtifactForProject(artifactId, project.id);\n if (!artifact) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact not found\" }), 404);\n }\n\n const parsed = UploadProjectSourceManifestRequestSchema.safeParse(\n await c.req.json().catch(() => null),\n );\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid source manifest\" }), 400);\n }\n\n const manifest = StoredProjectSourceManifestSchema.parse({\n files: parsed.data.files.map((file) => ({\n id: projectFileId(file.path),\n path: file.path,\n hash: file.hash,\n })),\n generatedAt: new Date().toISOString(),\n });\n\n await updateProjectArtifactSourceManifest({\n artifactId,\n projectId: project.id,\n sourceManifestJson: manifest,\n });\n\n return c.json(\n UploadProjectSourceResponseSchema.parse({ ok: true, fileCount: manifest.files.length }),\n 201,\n );\n};\n","import {\n ListProjectFilesResponseSchema,\n ProjectSourceResourcesSchema,\n StoredProjectSourceManifestSchema,\n} from \"@keystrokehq/shared\";\nimport { listActiveAgents, listActiveSkills, listActiveWorkflows } from \"@keystrokehq/database\";\nimport { selectActiveArtifactSourceManifestForProject } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\n/**\n * Resolve registry moduleFile values to paths in the deploy source snapshot.\n *\n * New deploys store project-root-relative source paths (`src/agents/support.ts`),\n * matched exactly. Rows synced by older runtimes hold module-dir-relative values\n * (`support.ts` under `src/agents/`), matched by suffix. Resources without a\n * match are dropped rather than emitting paths clients can't find in the tree.\n */\nexport function resolveSourcePaths(\n rows: Array<{ slug: string; moduleFile: string }>,\n kindDir: string,\n filePaths: string[],\n): Array<{ slug: string; path: string }> {\n return rows.flatMap((row) => {\n const suffix = `${kindDir}/${row.moduleFile}`;\n const path =\n filePaths.find((filePath) => filePath === row.moduleFile) ??\n filePaths.find((filePath) => filePath === suffix || filePath.endsWith(`/${suffix}`));\n return path ? [{ slug: row.slug, path }] : [];\n });\n}\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const active = await selectActiveArtifactSourceManifestForProject(project.id);\n\n if (!active || !active.sourceManifestJson) {\n return c.json(\n ListProjectFilesResponseSchema.parse({ artifactId: active?.artifactId ?? null, files: [] }),\n );\n }\n\n const manifest = StoredProjectSourceManifestSchema.parse(active.sourceManifestJson);\n const [agents, workflows, skills] = await Promise.all([\n listActiveAgents({ projectIds: [project.id] }),\n listActiveWorkflows({ projectIds: [project.id] }),\n listActiveSkills({ projectIds: [project.id] }),\n ]);\n\n const filePaths = manifest.files.map((file) => file.path);\n const resources = ProjectSourceResourcesSchema.parse({\n agents: resolveSourcePaths(agents, \"agents\", filePaths),\n workflows: resolveSourcePaths(workflows, \"workflows\", filePaths),\n // Skill moduleFile values are already project-root-relative source paths.\n skills: skills.map((row) => ({ slug: row.slug, path: row.moduleFile })),\n });\n\n return c.json(\n ListProjectFilesResponseSchema.parse({\n artifactId: active.artifactId,\n files: manifest.files.map((file) => ({ id: file.id, path: file.path, hash: file.hash })),\n resources,\n }),\n );\n};\n","import { ErrorResponseSchema, StoredProjectSourceManifestSchema } from \"@keystrokehq/shared\";\nimport {\n createOrgStorageClient,\n selectOrganizationById,\n selectProjectArtifactForProject,\n} from \"@keystrokehq/platform-database\";\nimport { projectSourceBlobKey } from \"@keystrokehq/storage\";\n\nimport type { ProjectRouteHandler } from \"../../../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const artifactId = c.req.param(\"artifactId\");\n if (!artifactId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact id is required\" }), 400);\n }\n\n const path = c.req.query(\"path\");\n if (!path) {\n return c.json(ErrorResponseSchema.parse({ error: \"File path is required\" }), 400);\n }\n\n const artifact = await selectProjectArtifactForProject(artifactId, project.id);\n if (!artifact || !artifact.sourceManifestJson) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact not found\" }), 404);\n }\n\n // Resolve path -> hash via the manifest so we only ever serve files that\n // belong to this deploy (no arbitrary blob access).\n const manifest = StoredProjectSourceManifestSchema.parse(artifact.sourceManifestJson);\n const file = manifest.files.find((entry) => entry.path === path);\n if (!file) {\n return c.json(ErrorResponseSchema.parse({ error: \"File not found\" }), 404);\n }\n\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const storage = createOrgStorageClient(organization);\n let bytes: Uint8Array;\n try {\n bytes = await storage.getObject(projectSourceBlobKey(project.id, file.hash));\n } catch {\n return c.json(ErrorResponseSchema.parse({ error: \"File contents not found\" }), 404);\n }\n\n // Browser/CDN caching (immutable hash-addressed responses) is intentionally\n // deferred to a follow-up PR.\n c.header(\"Content-Type\", \"text/plain; charset=utf-8\");\n return c.body(new TextDecoder().decode(bytes));\n};\n","import { ProjectReachabilityResponseSchema } from \"@keystrokehq/shared\";\nimport { pingProjectTarget } from \"@keystrokehq/hosting\";\n\nimport type { HostingPlugin } from \"@keystrokehq/hosting\";\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport function createProjectReachabilityHandler(hosting: HostingPlugin): ProjectRouteHandler {\n return async (c) => {\n const project = c.get(\"project\");\n\n if (project.status !== \"active\") {\n return c.json(ProjectReachabilityResponseSchema.parse({ reachable: false }));\n }\n\n const reachable = await pingProjectTarget(\n {\n baseUrl: project.baseUrl,\n runtimeId: project.runtimeId,\n },\n { plugin: hosting },\n );\n\n return c.json(ProjectReachabilityResponseSchema.parse({ reachable }));\n };\n}\n","import { ListProjectMembersResponseSchema, mapProjectMember } from \"@keystrokehq/shared\";\nimport { selectProjectMembers } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const currentUserId = c.get(\"user\").id;\n const members = await selectProjectMembers(project.id);\n\n return c.json(\n ListProjectMembersResponseSchema.parse({\n members: members.map((member) =>\n mapProjectMember(member, { isCurrentUser: member.id === currentUserId }),\n ),\n }),\n );\n};\n","import {\n ErrorResponseSchema,\n InviteProjectMembersRequestSchema,\n InviteProjectMembersResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { inviteProjectMembers } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const project = c.get(\"project\");\n const body = await c.req.json().catch(() => null);\n const parsed = InviteProjectMembersRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid invite request\" }), 400);\n }\n\n const results = await inviteProjectMembers({\n projectId: project.id,\n organizationId: organization.organizationId,\n emails: parsed.data.emails,\n role: parsed.data.role,\n });\n\n return c.json(InviteProjectMembersResponseSchema.parse({ results }));\n};\n","import {\n ErrorResponseSchema,\n mapProjectMember,\n UpdateProjectMemberRequestSchema,\n UpdateProjectMemberResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n ProjectMemberNotFoundError,\n updateProjectMemberRole,\n} from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const userId = c.req.param(\"userId\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateProjectMemberRequestSchema.safeParse(body);\n\n if (!userId) {\n return c.json(ErrorResponseSchema.parse({ error: \"User id is required\" }), 400);\n }\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid member update request\" }), 400);\n }\n\n try {\n const member = await updateProjectMemberRole(project.id, userId, parsed.data.role);\n return c.json(\n UpdateProjectMemberResponseSchema.parse({\n member: mapProjectMember(member),\n }),\n );\n } catch (error) {\n if (error instanceof ProjectMemberNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n throw error;\n }\n};\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { ProjectMemberNotFoundError, removeProjectMember } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const userId = c.req.param(\"userId\");\n\n if (!userId) {\n return c.json(ErrorResponseSchema.parse({ error: \"User id is required\" }), 400);\n }\n\n try {\n await removeProjectMember(project.id, userId);\n return c.body(null, 204);\n } catch (error) {\n if (error instanceof ProjectMemberNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n throw error;\n }\n};\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { ProjectMemberNotFoundError, removeProjectMember } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const userId = c.get(\"user\").id;\n\n try {\n await removeProjectMember(project.id, userId);\n return c.body(null, 204);\n } catch (error) {\n if (error instanceof ProjectMemberNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n throw error;\n }\n};\n","import { ProjectSettingsResponseSchema, mapProjectSettings } from \"@keystrokehq/shared\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n\n return c.json(\n ProjectSettingsResponseSchema.parse({\n settings: mapProjectSettings(project),\n }),\n );\n};\n","import {\n ErrorResponseSchema,\n ProjectSettingsResponseSchema,\n UpdateProjectSettingsRequestSchema,\n mapProjectSettings,\n} from \"@keystrokehq/shared\";\nimport { updateProjectSettings } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const project = c.get(\"project\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateProjectSettingsRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid project settings request\" }), 400);\n }\n\n const updated = await updateProjectSettings(organization.organizationId, project.id, {\n description: parsed.data.description,\n defaultMemberRole: parsed.data.defaultRole,\n invitePermission: parsed.data.invitePermission,\n });\n\n if (!updated) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n }\n\n return c.json(\n ProjectSettingsResponseSchema.parse({\n settings: mapProjectSettings(updated),\n }),\n );\n};\n","import type { AppCredentialScope, AppCredentialSummary } from \"@keystrokehq/shared\";\nimport { displayCredentialAppName } from \"@keystrokehq/shared\";\nimport { runWithProjectScope, type CredentialInstanceRow } from \"@keystrokehq/database\";\nimport {\n selectOAuthConnectionsByIds,\n selectProjectsByOrganizationId,\n selectUsersByIds,\n type OAuthConnectionRow,\n type UserRow,\n} from \"@keystrokehq/platform-database\";\nimport { readCredentialInstanceSecret } from \"@keystrokehq/secrets\";\n\nconst APP_CREDENTIAL_SCOPES: readonly string[] = [\"user\", \"project\", \"organization\"];\n\nexport function toAppCredentialScope(scopeType: string): AppCredentialScope | null {\n return APP_CREDENTIAL_SCOPES.includes(scopeType) ? (scopeType as AppCredentialScope) : null;\n}\n\n/** Run `fn` with the row's project scope bound (no-op for org/user rows). */\nexport function withCredentialRowScope<T>(\n row: Pick<CredentialInstanceRow, \"scopeType\" | \"projectId\">,\n fn: () => Promise<T>,\n): Promise<T> {\n if (row.scopeType === \"project\") {\n return runWithProjectScope(row.projectId, fn);\n }\n return fn();\n}\n\n/** User-scoped credentials are only manageable by their owner. */\nexport function canManageCredential(\n row: Pick<CredentialInstanceRow, \"scopeType\" | \"scopeId\">,\n userId: string | undefined,\n): boolean {\n if (row.scopeType === \"user\") {\n return userId !== undefined && row.scopeId === userId;\n }\n return true;\n}\n\n/** Display name derived from the credential key (e.g. `google-drive` → `Google Drive`). */\nfunction displayAppName(appId: string): string {\n return displayCredentialAppName(appId);\n}\n\n/** Masked preview of a secret — last 4 chars revealed, the rest masked. Plaintext never returned. */\nfunction maskSecretPreview(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length <= 4) {\n return \"•\".repeat(Math.max(trimmed.length, 4));\n }\n return `${\"•\".repeat(Math.min(trimmed.length - 4, 20))}${trimmed.slice(-4)}`;\n}\n\nasync function readSecretKeyPreviews(\n instanceId: string,\n): Promise<{ credentialKeys: string[]; keyPreviews: Record<string, string> } | null> {\n // List/get decrypt every api-key secret to build masked previews (hot-path decryption).\n const payload = await readCredentialInstanceSecret(instanceId);\n if (!payload) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n\n const keyPreviews: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed)) {\n keyPreviews[key] = maskSecretPreview(typeof value === \"string\" ? value : JSON.stringify(value));\n }\n\n const credentialKeys = Object.keys(keyPreviews);\n return credentialKeys.length > 0 ? { credentialKeys, keyPreviews } : null;\n}\n\nfunction ownerFields(owner: UserRow | undefined): Partial<AppCredentialSummary> {\n if (!owner) {\n return {};\n }\n return {\n ownerUserId: owner.id,\n ownerName: owner.name,\n ...(owner.image && URL.canParse(owner.image) ? { ownerAvatarUrl: owner.image } : {}),\n };\n}\n\ntype CredentialLookups = {\n projectNameById: Map<string, string>;\n ownersById: Map<string, UserRow>;\n connectionsById: Map<string, OAuthConnectionRow>;\n};\n\nfunction uniqueIds(\n rows: CredentialInstanceRow[],\n pick: (row: CredentialInstanceRow) => string | null,\n): string[] {\n return [...new Set(rows.map(pick).filter((id): id is string => Boolean(id)))];\n}\n\n/** Cross-database lookups: instances live in the org DB; projects/users/connections in the platform DB. */\nasync function loadCredentialLookups(\n rows: CredentialInstanceRow[],\n organizationId: string,\n): Promise<CredentialLookups> {\n const [projects, owners, connections] = await Promise.all([\n selectProjectsByOrganizationId(organizationId),\n selectUsersByIds(uniqueIds(rows, (row) => (row.scopeType === \"user\" ? row.scopeId : null))),\n selectOAuthConnectionsByIds(\n uniqueIds(rows, (row) => (row.authKind === \"oauth_managed\" ? row.connectionId : null)),\n ),\n ]);\n\n return {\n projectNameById: new Map(projects.map((project) => [project.id, project.name])),\n ownersById: new Map(owners.map((owner) => [owner.id, owner])),\n connectionsById: new Map(connections.map((connection) => [connection.id, connection])),\n };\n}\n\nasync function toCredentialSummary(\n row: CredentialInstanceRow,\n scope: AppCredentialScope,\n lookups: CredentialLookups,\n): Promise<AppCredentialSummary> {\n const isOAuth = row.authKind === \"oauth_managed\";\n const isKeystroke = row.authKind === \"keystroke\";\n const appName = displayAppName(row.slug);\n const connection = row.connectionId ? lookups.connectionsById.get(row.connectionId) : undefined;\n const secretKeys = isOAuth || isKeystroke ? null : await readSecretKeyPreviews(row.id);\n const projectId = scope === \"project\" ? (row.scopeId ?? row.projectId) : undefined;\n const projectName = projectId ? lookups.projectNameById.get(projectId) : undefined;\n\n return {\n id: row.id,\n appId: row.slug,\n label: row.label ?? appName,\n scope,\n lastRefreshedAt: isOAuth ? (connection?.updatedAt.toISOString() ?? null) : null,\n appName,\n ...(projectId ? { projectId } : {}),\n ...(projectName ? { projectName } : {}),\n status: isOAuth && !connection ? \"Disconnected\" : \"Active\",\n createdAt: row.createdAt.toISOString(),\n lastUsedAt: null,\n isDefault: Boolean(row.isDefault),\n connectionKind: isOAuth ? \"oauth\" : isKeystroke ? \"oauth\" : \"manual\",\n ...(scope === \"user\" && row.scopeId ? ownerFields(lookups.ownersById.get(row.scopeId)) : {}),\n ...(connection?.grantedScopes?.length ? { grantedScopes: connection.grantedScopes } : {}),\n ...(secretKeys ?? {}),\n ...(connection?.accessTokenExpiresAt\n ? { expiresAt: connection.accessTokenExpiresAt.toISOString() }\n : {}),\n };\n}\n\n/** Build `AppCredentialSummary` rows from org-database instances plus platform lookups. */\nexport async function enrichCredentialInstances(\n rows: CredentialInstanceRow[],\n organizationId: string,\n): Promise<AppCredentialSummary[]> {\n const visible = rows.filter((row) => toAppCredentialScope(row.scopeType) !== null);\n const lookups = await loadCredentialLookups(visible, organizationId);\n\n const summaries = await Promise.all(\n visible.map((row) => toCredentialSummary(row, toAppCredentialScope(row.scopeType)!, lookups)),\n );\n\n return summaries.sort(\n (a, b) => new Date(b.createdAt ?? 0).getTime() - new Date(a.createdAt ?? 0).getTime(),\n );\n}\n","import { ListCredentialsResponseSchema } from \"@keystrokehq/shared\";\nimport { listAllCredentialInstances } from \"@keystrokehq/database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { enrichCredentialInstances } from \"./enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const rows = await listAllCredentialInstances();\n const credentials = await enrichCredentialInstances(rows, organization.organizationId);\n return c.json(ListCredentialsResponseSchema.parse({ credentials }));\n};\n","import {\n CreateCredentialsRequestSchema,\n CreateCredentialsResponseSchema,\n buildCredentialInstanceLabel,\n displayCredentialAppName,\n resolveUniqueCredentialInstanceLabel,\n} from \"@keystrokehq/shared\";\nimport {\n getServerTenantScopeId,\n runWithProjectScope,\n selectCredentialInstanceById,\n selectCredentialInstancesForScope,\n type CredentialInstanceRow,\n} from \"@keystrokehq/database\";\nimport { selectProjectForOrganizationBySlug } from \"@keystrokehq/platform-database\";\nimport { setCredentialInstanceSecret } from \"@keystrokehq/secrets\";\nimport type { CredentialScopeType } from \"@keystrokehq/shared\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { enrichCredentialInstances } from \"./enrich\";\n\ntype CreateTarget = {\n scopeType: CredentialScopeType;\n scopeId: string;\n /** Project scope to bind while reading/writing rows for this target. */\n projectScope?: string;\n projectName?: string;\n};\n\nfunction withTargetScope<T>(target: CreateTarget, fn: () => Promise<T>): Promise<T> {\n if (target.projectScope) {\n return runWithProjectScope(target.projectScope, fn);\n }\n return fn();\n}\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const user = c.get(\"user\");\n\n const parsed = CreateCredentialsRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n const message = parsed.error.issues[0]?.message ?? \"Invalid request body\";\n return c.json({ error: message }, 400);\n }\n const input = parsed.data;\n\n const resolvedProjects: Array<{ id: string; name: string }> = [];\n for (const slug of input.projects) {\n const project = await selectProjectForOrganizationBySlug(organization.organizationId, slug);\n if (!project) {\n return c.json({ error: `Project \"${slug}\" not found` }, 400);\n }\n resolvedProjects.push({ id: project.id, name: project.name });\n }\n\n const targets: CreateTarget[] = [\n ...resolvedProjects.map((project) => ({\n scopeType: \"project\" as const,\n scopeId: project.id,\n projectScope: project.id,\n projectName: project.name,\n })),\n ...(input.createOrganizationCredential\n ? [{ scopeType: \"organization\" as const, scopeId: getServerTenantScopeId() }]\n : []),\n ...(input.createUserProvidedCredential\n ? [{ scopeType: \"user\" as const, scopeId: user.id }]\n : []),\n ];\n\n const appName = displayCredentialAppName(input.appId);\n\n // Pre-check every target before writing anything so a conflict can't leave partial fan-out.\n const siblingCounts = new Map<CreateTarget, number>();\n for (const target of targets) {\n const siblings = await withTargetScope(target, () =>\n selectCredentialInstancesForScope(input.appId, target.scopeType, target.scopeId),\n );\n siblingCounts.set(target, siblings.length);\n }\n\n const value = input.value;\n\n const createdIds: string[] = [];\n for (const target of targets) {\n const siblings = await withTargetScope(target, () =>\n selectCredentialInstancesForScope(input.appId, target.scopeType, target.scopeId),\n );\n const baseLabel = buildCredentialInstanceLabel({\n scopeType: target.scopeType,\n appName,\n projectName: target.projectName,\n });\n const label = resolveUniqueCredentialInstanceLabel({\n baseLabel,\n takenLabels: siblings.map((row) => row.label),\n });\n\n const id = crypto.randomUUID();\n await withTargetScope(target, () =>\n setCredentialInstanceSecret({\n id,\n key: input.appId,\n scopeType: target.scopeType,\n scopeId: target.scopeId,\n label,\n isDefault: (siblingCounts.get(target) ?? 0) === 0,\n value,\n }),\n );\n createdIds.push(id);\n }\n\n const rows: CredentialInstanceRow[] = [];\n for (const id of createdIds) {\n const row = await selectCredentialInstanceById(id);\n if (row) {\n rows.push(row);\n }\n }\n\n const credentials = await enrichCredentialInstances(rows, organization.organizationId);\n return c.json(CreateCredentialsResponseSchema.parse({ credentials }), 201);\n};\n","import { GetCredentialResponseSchema } from \"@keystrokehq/shared\";\nimport { selectCredentialInstanceById } from \"@keystrokehq/database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { enrichCredentialInstances, toAppCredentialScope } from \"../enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n\n const credentialId = c.req.param(\"credentialId\") ?? \"\";\n const row = credentialId ? await selectCredentialInstanceById(credentialId) : undefined;\n if (!row || toAppCredentialScope(row.scopeType) === null) {\n return c.json({ error: \"Credential not found\" }, 404);\n }\n\n const [credential] = await enrichCredentialInstances([row], organization.organizationId);\n return c.json(GetCredentialResponseSchema.parse({ credential }));\n};\n","import { GetCredentialResponseSchema, UpdateCredentialRequestSchema } from \"@keystrokehq/shared\";\nimport {\n clearCredentialInstanceDefaults,\n selectCredentialInstanceById,\n selectCredentialInstancesForScope,\n upsertCredentialInstance,\n} from \"@keystrokehq/database\";\nimport { setCredentialInstanceSecret } from \"@keystrokehq/secrets\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport {\n canManageCredential,\n enrichCredentialInstances,\n toAppCredentialScope,\n withCredentialRowScope,\n} from \"../enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const user = c.get(\"user\");\n\n const credentialId = c.req.param(\"credentialId\") ?? \"\";\n const existing = credentialId ? await selectCredentialInstanceById(credentialId) : undefined;\n if (!existing || toAppCredentialScope(existing.scopeType) === null) {\n return c.json({ error: \"Credential not found\" }, 404);\n }\n\n if (!canManageCredential(existing, user.id)) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n\n const parsed = UpdateCredentialRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n const message = parsed.error.issues[0]?.message ?? \"Invalid request body\";\n return c.json({ error: message }, 400);\n }\n\n if (parsed.data.value && existing.authKind !== \"api_key\") {\n return c.json({ error: \"Only api-key credentials support secret rotation\" }, 400);\n }\n\n const label = parsed.data.label !== undefined ? parsed.data.label : existing.label;\n const isDefault =\n parsed.data.isDefault !== undefined ? parsed.data.isDefault : Boolean(existing.isDefault);\n\n if (label !== existing.label) {\n const siblings = await withCredentialRowScope(existing, () =>\n selectCredentialInstancesForScope(existing.slug, existing.scopeType, existing.scopeId),\n );\n if (siblings.some((row) => row.id !== credentialId && (row.label ?? null) === label)) {\n return c.json({ error: \"A credential with this label already exists\" }, 409);\n }\n }\n\n await withCredentialRowScope(existing, async () => {\n if (parsed.data.value) {\n await setCredentialInstanceSecret({\n id: existing.id,\n key: existing.slug,\n scopeType: existing.scopeType,\n scopeId: existing.scopeId,\n label,\n isDefault,\n value: parsed.data.value,\n });\n return;\n }\n\n if (isDefault) {\n await clearCredentialInstanceDefaults({\n slug: existing.slug,\n scopeType: existing.scopeType,\n scopeId: existing.scopeId,\n exceptId: credentialId,\n });\n }\n\n await upsertCredentialInstance({\n id: existing.id,\n slug: existing.slug,\n scopeType: existing.scopeType,\n scopeId: existing.scopeId,\n label,\n isDefault,\n authKind: existing.authKind,\n ciphertext: existing.ciphertext,\n connectionId: existing.connectionId,\n createdAt: existing.createdAt,\n updatedAt: new Date(),\n });\n });\n\n const updated = await selectCredentialInstanceById(credentialId);\n const [credential] = await enrichCredentialInstances(\n updated ? [updated] : [],\n organization.organizationId,\n );\n return c.json(GetCredentialResponseSchema.parse({ credential }));\n};\n","import type { CredentialInstanceRow } from \"@keystrokehq/database\";\nimport { getServerTenantScopeId } from \"@keystrokehq/database\";\nimport { mcpEntityId } from \"@keystrokehq/shared\";\n\nexport function resolveMcpEntityId(row: CredentialInstanceRow): string {\n const scopeId = row.scopeType === \"organization\" ? getServerTenantScopeId() : (row.scopeId ?? \"\");\n if (!scopeId) {\n throw new Error(`Credential instance ${row.id} is missing scope id`);\n }\n\n return mcpEntityId(row.scopeType, scopeId);\n}\n\nexport function resolveMcpEntityIdFromScope(\n scopeType: CredentialInstanceRow[\"scopeType\"],\n scopeId: string | null,\n): string {\n const resolvedScopeId = scopeType === \"organization\" ? getServerTenantScopeId() : (scopeId ?? \"\");\n if (!resolvedScopeId) {\n throw new Error(\"Scope id is required for MCP entity resolution\");\n }\n\n return mcpEntityId(scopeType, resolvedScopeId);\n}\n","import {\n deleteCredentialInstanceById,\n listCredentialInstancesByConnectionId,\n selectCredentialInstanceById,\n} from \"@keystrokehq/database\";\nimport { deleteOAuthConnectionById } from \"@keystrokehq/platform-database\";\nimport { deleteCredentialInstanceSecret } from \"@keystrokehq/secrets\";\n\nimport type { McpProviderPlugin } from \"../../../../mcp-provider-plugin\";\nimport { resolveMcpEntityId } from \"../../../../lib/mcp-entity\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { canManageCredential, toAppCredentialScope } from \"../enrich\";\n\ntype DeleteCredentialHandlerOptions = {\n mcp?: McpProviderPlugin;\n};\n\nexport function createDeleteCredentialHandler(\n options: DeleteCredentialHandlerOptions = {},\n): OrganizationRouteHandler {\n return async (c) => {\n const user = c.get(\"user\");\n\n const credentialId = c.req.param(\"credentialId\") ?? \"\";\n const existing = credentialId ? await selectCredentialInstanceById(credentialId) : undefined;\n if (!existing || toAppCredentialScope(existing.scopeType) === null) {\n return c.json({ error: \"Credential not found\" }, 404);\n }\n\n if (!canManageCredential(existing, user.id)) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n\n if (existing.authKind === \"oauth_managed\") {\n // Revoke the underlying connection when this is its last credential instance.\n if (existing.connectionId) {\n const references = await listCredentialInstancesByConnectionId(existing.connectionId);\n if (references.every((row) => row.id === existing.id)) {\n await deleteOAuthConnectionById(existing.connectionId);\n }\n }\n } else if (existing.authKind === \"keystroke\") {\n if (existing.connectionId) {\n const references = await listCredentialInstancesByConnectionId(existing.connectionId);\n if (references.every((row) => row.id === existing.id)) {\n if (!options.mcp) {\n return c.json({ error: \"mcp_unconfigured\" }, 501);\n }\n\n await options.mcp.revokeConnection(resolveMcpEntityId(existing), existing.connectionId);\n }\n }\n } else {\n await deleteCredentialInstanceSecret(existing.id);\n }\n\n await deleteCredentialInstanceById(credentialId);\n return c.body(null, 204);\n };\n}\n","import { ListOrganizationMembersResponseSchema, mapOrganizationMember } from \"@keystrokehq/shared\";\nimport { selectOrganizationMembers } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const members = await selectOrganizationMembers(organizationId);\n\n return c.json(\n ListOrganizationMembersResponseSchema.parse({\n members: members.map(mapOrganizationMember),\n }),\n );\n};\n","import { resolveAuthEmailFrom } from \"@keystrokehq/auth\";\nimport { organizationInvitationAcceptPath } from \"@keystrokehq/shared\";\nimport { Resend } from \"resend\";\n\nexport type OrganizationInviteEmailPayload = {\n email: string;\n organizationName: string;\n invitationId: string;\n inviterName?: string;\n};\n\nfunction envValue(name: string): string | undefined {\n const value = process.env[name]?.trim();\n return value || undefined;\n}\n\nexport function resolveOrganizationInviteUrl(invitationId: string): string {\n const base = envValue(\"PUBLIC_WEB_URL\") ?? \"http://localhost:3000\";\n return `${base.replace(/\\/$/, \"\")}${organizationInvitationAcceptPath(invitationId)}`;\n}\n\nexport function isOrganizationInviteEmailConfigured(): boolean {\n return envValue(\"RESEND_API_KEY\") !== undefined;\n}\n\nfunction resolveResendApiKey(): string | undefined {\n return envValue(\"RESEND_API_KEY\");\n}\n\nfunction buildOrganizationInviteEmailHtml(payload: OrganizationInviteEmailPayload): string {\n const inviteUrl = resolveOrganizationInviteUrl(payload.invitationId);\n const escapedOrg = payload.organizationName.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\");\n const inviterLine = payload.inviterName\n ? `<p>${payload.inviterName.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\")} invited you to join <strong>${escapedOrg}</strong> on Keystroke.</p>`\n : `<p>You have been invited to join <strong>${escapedOrg}</strong> on Keystroke.</p>`;\n\n return `<!DOCTYPE html>\n<html>\n <body style=\"font-family: system-ui, sans-serif; line-height: 1.5; color: #111;\">\n ${inviterLine}\n <p><a href=\"${inviteUrl}\" style=\"display: inline-block; padding: 10px 16px; background: #111; color: #fff; text-decoration: none; border-radius: 8px;\">View invitation</a></p>\n <p style=\"color: #666; font-size: 13px;\">Sign in with this email address to accept the invitation.</p>\n </body>\n</html>`;\n}\n\nexport async function sendOrganizationInviteEmail(\n payload: OrganizationInviteEmailPayload,\n resend?: Resend,\n): Promise<boolean> {\n const apiKey = resolveResendApiKey();\n if (!apiKey) {\n console.warn(\"[platform] RESEND_API_KEY not set; organization invite email skipped\");\n return false;\n }\n\n const client = resend ?? new Resend(apiKey);\n const { error } = await client.emails.send({\n from: resolveAuthEmailFrom(),\n to: payload.email,\n subject: `Invitation to join ${payload.organizationName} on Keystroke`,\n html: buildOrganizationInviteEmailHtml(payload),\n });\n\n if (error) {\n console.warn(`[platform] Failed to send organization invite email: ${error.message}`);\n return false;\n }\n\n return true;\n}\n","import {\n ErrorResponseSchema,\n InviteOrganizationMembersRequestSchema,\n InviteOrganizationMembersResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { inviteOrganizationMembers, selectUserById } from \"@keystrokehq/platform-database\";\n\nimport { sendOrganizationInviteEmail } from \"../../../../email/organization-invite-email\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const organization = c.get(\"organization\");\n const body = await c.req.json().catch(() => null);\n const parsed = InviteOrganizationMembersRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid invite request\" }), 400);\n }\n\n const results = await inviteOrganizationMembers({\n organizationId: organization.organizationId,\n invitedByUserId: user.id,\n emails: parsed.data.emails,\n role: parsed.data.role,\n });\n\n const inviter = await selectUserById(user.id);\n for (const result of results) {\n if (!result.invitationId || (result.status !== \"sent\" && result.status !== \"pending\")) {\n continue;\n }\n\n await sendOrganizationInviteEmail({\n email: result.email,\n organizationName: organization.organizationName,\n invitationId: result.invitationId,\n inviterName: inviter?.name,\n });\n }\n\n return c.json(InviteOrganizationMembersResponseSchema.parse({ results }));\n};\n","import {\n ErrorResponseSchema,\n mapOrganizationMember,\n UpdateOrganizationMemberRequestSchema,\n UpdateOrganizationMemberResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n CannotModifyOwnerError,\n OrganizationMemberNotFoundError,\n updateOrganizationMemberRole,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const userId = c.req.param(\"userId\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateOrganizationMemberRequestSchema.safeParse(body);\n\n if (!userId) {\n return c.json(ErrorResponseSchema.parse({ error: \"User id is required\" }), 400);\n }\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid member update request\" }), 400);\n }\n\n try {\n const member = await updateOrganizationMemberRole(organizationId, userId, parsed.data.role);\n\n return c.json(\n UpdateOrganizationMemberResponseSchema.parse({\n member: mapOrganizationMember(member),\n }),\n );\n } catch (error) {\n if (\n error instanceof CannotModifyOwnerError ||\n error instanceof OrganizationMemberNotFoundError\n ) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n\n throw error;\n }\n};\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport {\n CannotModifyOwnerError,\n OrganizationMemberNotFoundError,\n removeOrganizationMember,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const userId = c.req.param(\"userId\");\n\n if (!userId) {\n return c.json(ErrorResponseSchema.parse({ error: \"User id is required\" }), 400);\n }\n\n try {\n await removeOrganizationMember(organizationId, userId);\n return c.body(null, 204);\n } catch (error) {\n if (\n error instanceof CannotModifyOwnerError ||\n error instanceof OrganizationMemberNotFoundError\n ) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n\n throw error;\n }\n};\n","import {\n ListOrganizationInvitationsResponseSchema,\n mapOrganizationInvitation,\n} from \"@keystrokehq/shared\";\nimport { selectPendingInvitationsForUser } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const invitations = await selectPendingInvitationsForUser(user.id);\n\n return c.json(\n ListOrganizationInvitationsResponseSchema.parse({\n invitations: invitations.map(mapOrganizationInvitation),\n }),\n );\n};\n","import {\n AcceptOrganizationInvitationResponseSchema,\n ErrorResponseSchema,\n mapUserOrganization,\n} from \"@keystrokehq/shared\";\nimport {\n acceptInvitation,\n OrganizationInvitationExpiredError,\n OrganizationInvitationForbiddenError,\n OrganizationInvitationNotFoundError,\n} from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const invitationId = c.req.param(\"invitationId\");\n\n if (!invitationId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invitation id is required\" }), 400);\n }\n\n try {\n const membership = await acceptInvitation(invitationId, user.id);\n\n return c.json(\n AcceptOrganizationInvitationResponseSchema.parse({\n organization: mapUserOrganization(membership),\n }),\n );\n } catch (error) {\n if (error instanceof OrganizationInvitationNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);\n }\n\n if (error instanceof OrganizationInvitationForbiddenError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 403);\n }\n\n if (error instanceof OrganizationInvitationExpiredError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 410);\n }\n\n throw error;\n }\n};\n","import {\n DeclineOrganizationInvitationResponseSchema,\n ErrorResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n declineInvitation,\n OrganizationInvitationForbiddenError,\n OrganizationInvitationNotFoundError,\n} from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const invitationId = c.req.param(\"invitationId\");\n\n if (!invitationId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invitation id is required\" }), 400);\n }\n\n try {\n await declineInvitation(invitationId, user.id);\n\n return c.json(DeclineOrganizationInvitationResponseSchema.parse({ success: true }));\n } catch (error) {\n if (error instanceof OrganizationInvitationNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);\n }\n\n if (error instanceof OrganizationInvitationForbiddenError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 403);\n }\n\n throw error;\n }\n};\n","import { GOOGLE_OAUTH_SCOPES } from \"@keystrokehq/google\";\nimport { SLACK_OAUTH_SCOPES } from \"@keystrokehq/slack\";\nimport {\n ListAppsResponseSchema,\n type AppCatalogEntry,\n type OAuthScopeOption,\n} from \"@keystrokehq/shared\";\n\nconst GOOGLE_SCOPE_DESCRIPTIONS: Record<\n string,\n Pick<OAuthScopeOption, \"description\" | \"required\">\n> = {\n openid: {\n description: \"Authenticate with OpenID Connect.\",\n required: true,\n },\n email: {\n description: \"View your email address.\",\n required: true,\n },\n profile: {\n description: \"View your basic profile information.\",\n required: true,\n },\n \"https://mail.google.com/\": {\n description: \"Read, send, and manage Gmail messages.\",\n },\n \"https://www.googleapis.com/auth/calendar\": {\n description: \"View and manage Google Calendar events.\",\n },\n};\n\nconst SLACK_SCOPE_DESCRIPTIONS: Record<string, string> = {\n \"chat:write\": \"Send messages as the Keystroke Slack Bot.\",\n \"chat:write.customize\": \"Customize message appearance when posting to Slack.\",\n \"app_mentions:read\": \"View messages that mention the Keystroke Slack Bot.\",\n \"im:history\": \"View messages in direct message conversations.\",\n \"im:write\": \"Start and send direct messages in Slack.\",\n \"channels:history\":\n \"View messages and other content in public channels that the Slack Bot has been added to.\",\n \"groups:history\": \"View messages in private channels the bot has been added to.\",\n \"users:read\": \"View people in the Slack workspace.\",\n \"users:read.email\": \"View email addresses for people in the Slack workspace.\",\n};\n\nfunction buildOAuthScopes(\n scopeNames: readonly string[],\n descriptions: Record<string, Pick<OAuthScopeOption, \"description\" | \"required\"> | string>,\n): OAuthScopeOption[] {\n return scopeNames.map((name) => {\n const entry = descriptions[name];\n if (typeof entry === \"string\") {\n return { name, description: entry };\n }\n\n return {\n name,\n description: entry?.description ?? name,\n ...(entry?.required ? { required: true } : {}),\n };\n });\n}\n\nconst APP_CATALOG_ENTRIES: AppCatalogEntry[] = [\n {\n id: \"google\",\n name: \"Google\",\n description: \"Gmail and Calendar integration for email and scheduling workflows.\",\n category: \"Communication\",\n integrationDescription:\n \"Connect Google so agents can read, draft, send, and organize email and manage calendar events as part of a workflow. Use it for customer follow-ups, approval threads, inbound request triage, or any automation where the next step happens in Gmail or Calendar.\",\n authKind: \"oauth\",\n oauthScopes: buildOAuthScopes(GOOGLE_OAUTH_SCOPES, GOOGLE_SCOPE_DESCRIPTIONS),\n },\n {\n id: \"slack\",\n name: \"Slack\",\n description: \"Post messages and handle approvals via Slack channels.\",\n category: \"Communication\",\n integrationDescription:\n \"Connect Slack so agents can post updates, request approvals, and keep work moving from channel conversations. Use it for deployment approvals, triage alerts, support handoffs, or workflows that need a human decision in chat.\",\n authKind: \"oauth\",\n oauthScopes: buildOAuthScopes(SLACK_OAUTH_SCOPES, SLACK_SCOPE_DESCRIPTIONS),\n gateway: {\n capabilities: {\n mentions: true,\n reactions: \"full\",\n cards: \"full\",\n modals: true,\n streaming: \"native\",\n dms: true,\n },\n supportedModes: [\"mention\", \"all\", \"dm\"],\n resourceNoun: { singular: \"channel\", plural: \"channels\" },\n supportsChannelDirectory: true,\n webhookPathHint: \"/gateways/slack\",\n docsUrl: \"https://chat-sdk.dev/adapters/official/slack\",\n tagline: \"Respond in channels, threads, and DMs.\",\n },\n },\n {\n id: \"exa\",\n name: \"Exa\",\n description: \"Search the web and retrieve AI-ready research results.\",\n category: \"AI\",\n integrationDescription:\n \"Connect Exa so agents can search the web and retrieve AI-ready research results. Use it for market scans, company enrichment, competitive research, or workflows that need fresh external context before drafting or deciding.\",\n authKind: \"api_key\",\n oauthScopes: [],\n },\n];\n\nexport const APP_CATALOG: readonly AppCatalogEntry[] = Object.freeze(\n ListAppsResponseSchema.parse({ apps: APP_CATALOG_ENTRIES }).apps,\n);\n\nexport const LIST_APPS_RESPONSE = Object.freeze({ apps: APP_CATALOG });\n","import type { AccountRouteHandler } from \"../../types\";\nimport { LIST_APPS_RESPONSE } from \"./catalog\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n return c.json(LIST_APPS_RESPONSE);\n};\n","import { apiKeyListScope } from \"@keystrokehq/access-control\";\nimport { ListApiKeysResponseSchema } from \"@keystrokehq/shared\";\nimport {\n listOrgPlatformApiKeysForOrganization,\n listOrgPlatformApiKeysForUser,\n mapOrgPlatformApiKeyCreatorOrDeleted,\n selectUsersByIds,\n} from \"@keystrokehq/platform-database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const user = c.get(\"user\");\n const scope = apiKeyListScope(accessContext(c));\n const records =\n scope.kind === \"all\"\n ? await listOrgPlatformApiKeysForOrganization(organizationId)\n : await listOrgPlatformApiKeysForUser(organizationId, user.id);\n\n const creators = await selectUsersByIds([\n ...new Set(records.map((record) => record.createdByUserId)),\n ]);\n const creatorsById = new Map(creators.map((creator) => [creator.id, creator]));\n\n return c.json(\n ListApiKeysResponseSchema.parse({\n apiKeys: records.map((record) => ({\n id: record.id,\n name: record.name,\n keyPreview: record.keyPreview,\n createdAt: record.createdAt.toISOString(),\n createdBy: mapOrgPlatformApiKeyCreatorOrDeleted(\n record.createdByUserId,\n creatorsById.get(record.createdByUserId),\n ),\n isCreatedByCurrentUser: record.createdByUserId === user.id,\n })),\n }),\n );\n};\n","import { CreateApiKeyRequestSchema, CreateApiKeyResponseSchema } from \"@keystrokehq/shared\";\nimport {\n createOrgPlatformApiKey,\n loadOrgPlatformApiKeyUser,\n mapOrgPlatformApiKeyCreator,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const user = c.get(\"user\");\n const body = CreateApiKeyRequestSchema.parse(await c.req.json());\n const created = await createOrgPlatformApiKey({\n organizationId,\n userId: user.id,\n name: body.name,\n });\n const creator = await loadOrgPlatformApiKeyUser(user.id);\n\n if (!creator) {\n return c.json({ error: \"User not found\" }, 404);\n }\n\n return c.json(\n CreateApiKeyResponseSchema.parse({\n id: created.id,\n name: created.name,\n keyPreview: created.keyPreview,\n createdAt: created.createdAt.toISOString(),\n createdBy: mapOrgPlatformApiKeyCreator(creator),\n isCreatedByCurrentUser: true,\n secret: created.secret,\n }),\n 201,\n );\n};\n","import { canReadApiKey, canRevokeApiKey } from \"@keystrokehq/access-control\";\nimport { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport {\n OrgPlatformApiKeyNotFoundError,\n revokeOrgPlatformApiKey,\n selectOrgPlatformApiKeyForOrganization,\n} from \"@keystrokehq/platform-database\";\n\nimport { accessContext } from \"../../../../auth/access-context\";\nimport { forbidden } from \"../../../../auth/responses\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const user = c.get(\"user\");\n const apiKeyId = c.req.param(\"apiKeyId\");\n\n if (!apiKeyId) {\n return c.json(ErrorResponseSchema.parse({ error: \"API key id is required\" }), 400);\n }\n\n const apiKey = await selectOrgPlatformApiKeyForOrganization(apiKeyId, organizationId);\n if (!apiKey) {\n return c.json(ErrorResponseSchema.parse({ error: \"API key not found\" }), 404);\n }\n\n if (\n !canReadApiKey(accessContext(c), {\n userId: user.id,\n createdByUserId: apiKey.createdByUserId,\n })\n ) {\n return c.json(ErrorResponseSchema.parse({ error: \"API key not found\" }), 404);\n }\n\n if (\n !canRevokeApiKey(accessContext(c), {\n userId: user.id,\n createdByUserId: apiKey.createdByUserId,\n })\n ) {\n return forbidden(c);\n }\n\n try {\n await revokeOrgPlatformApiKey(apiKeyId, organizationId);\n return c.body(null, 204);\n } catch (error) {\n if (error instanceof OrgPlatformApiKeyNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);\n }\n\n throw error;\n }\n};\n","import type { TeamRequestType } from \"@keystrokehq/shared\";\n\nexport type TeamRequestSlackUser = {\n id: string;\n name: string;\n email: string;\n};\n\nexport type TeamRequestSlackOrg = {\n id: string;\n name: string;\n slug: string;\n};\n\nexport type PostTeamRequestToSlackInput = {\n type: TeamRequestType;\n message?: string;\n user: TeamRequestSlackUser;\n org: TeamRequestSlackOrg;\n timestamp?: string;\n};\n\nconst TEAM_REQUEST_HEADINGS: Record<TeamRequestType, string> = {\n \"org-deletion\": \"Org deletion requested\",\n contact: \"Contact request\",\n \"enterprise-upgrade\": \"Enterprise upgrade requested\",\n};\n\nexport function buildTeamRequestSlackPayload(input: PostTeamRequestToSlackInput): {\n text: string;\n blocks: Array<Record<string, unknown>>;\n} {\n const timestamp = input.timestamp ?? new Date().toISOString();\n const heading = TEAM_REQUEST_HEADINGS[input.type];\n const summary = `${heading} from ${input.user.name} (${input.org.name})`;\n\n const fields = [\n { type: \"mrkdwn\", text: `*Request type:*\\n${input.type}` },\n { type: \"mrkdwn\", text: `*Timestamp:*\\n${timestamp}` },\n {\n type: \"mrkdwn\",\n text: `*User:*\\n${input.user.name}\\n${input.user.email}\\n\\`${input.user.id}\\``,\n },\n {\n type: \"mrkdwn\",\n text: `*Organization:*\\n${input.org.name}\\n\\`${input.org.slug}\\`\\n\\`${input.org.id}\\``,\n },\n ];\n\n const blocks: Array<Record<string, unknown>> = [\n {\n type: \"header\",\n text: { type: \"plain_text\", text: heading, emoji: true },\n },\n {\n type: \"section\",\n fields,\n },\n ];\n\n if (input.type === \"contact\" && input.message?.trim()) {\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*Message:*\\n${input.message.trim()}`,\n },\n });\n }\n\n return { text: summary, blocks };\n}\n\nexport async function postTeamRequestToSlack(input: PostTeamRequestToSlackInput): Promise<void> {\n const webhookUrl = process.env.TEAM_SLACK_WEBHOOK_URL?.trim();\n if (!webhookUrl) {\n console.warn(\"TEAM_SLACK_WEBHOOK_URL is not set; skipping team request Slack delivery\");\n return;\n }\n\n const payload = buildTeamRequestSlackPayload(input);\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(\n `Failed to deliver team request to Slack (${response.status})${body ? `: ${body}` : \"\"}`,\n );\n }\n}\n","import {\n SubmitTeamRequestRequestSchema,\n SubmitTeamRequestResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { selectOrganizationById } from \"@keystrokehq/platform-database\";\n\nimport { postTeamRequestToSlack } from \"../../../lib/team-request-slack\";\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const organizationContext = c.get(\"organization\");\n\n const parsed = SubmitTeamRequestRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n const message = parsed.error.issues[0]?.message ?? \"Invalid request body\";\n return c.json({ error: message }, 400);\n }\n\n const organization = await selectOrganizationById(organizationContext.organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n try {\n await postTeamRequestToSlack({\n type: parsed.data.type,\n message: parsed.data.message,\n user: {\n id: user.id,\n name: user.name,\n email: user.email,\n },\n org: {\n id: organization.id,\n name: organization.name,\n slug: organization.slug,\n },\n });\n } catch (error) {\n console.error(\"Failed to deliver team request to Slack\", error);\n return c.json({ error: \"Failed to deliver team request\" }, 502);\n }\n\n return c.json(SubmitTeamRequestResponseSchema.parse({ ok: true }), 200);\n};\n","import { createDefaultAuthJwtVerifier } from \"@keystrokehq/auth\";\nimport type { CreateOrganizationDependencies } from \"../../services/create-organization\";\nimport { Hono } from \"hono\";\n\nimport {\n canInviteRole,\n canInviteToProject,\n apiKeysActions,\n organizationActions,\n projectActions,\n userActions,\n} from \"@keystrokehq/access-control\";\nimport {\n InviteOrganizationMembersRequestSchema,\n InviteProjectMembersRequestSchema,\n} from \"@keystrokehq/shared\";\n\nimport { authorize } from \"../../auth/authorize\";\nimport { authorizePayload } from \"../../auth/authorize-payload\";\nimport { requireOrganization } from \"../../auth/require-organization\";\nimport { requireOrganizationParam } from \"../../auth/require-organization-param\";\nimport { requireProject } from \"../../auth/require-project\";\nimport { requireProjectMembership } from \"../../auth/require-project-membership\";\nimport { getProjectInvitePermission } from \"../../auth/access-context\";\nimport { requireSession } from \"../../auth/require-session\";\nimport { withOrganizationProjectDatabase } from \"../../middleware/with-organization-project-database\";\nimport type {\n OrganizationVariables,\n ProjectRouteVariables,\n SessionVariables,\n} from \"../../auth/types\";\nimport { handler as getUserAvatar } from \"./users/me/avatar/GET\";\nimport { handler as presignUserAvatar } from \"./users/me/avatar/presign/POST\";\nimport { handler as updateUserAvatar } from \"./users/me/avatar/PATCH\";\nimport { handler as getUserPreferences } from \"./users/me/preferences/GET\";\nimport { handler as updateUserPreferences } from \"./users/me/preferences/PATCH\";\nimport { handler as listOrganizations } from \"./organizations/GET\";\nimport { createOrganizationHandler } from \"./organizations/POST\";\nimport { handler as checkOrganizationSlugAvailability } from \"./organizations/slug-available/GET\";\nimport { handler as getOrganization } from \"./organizations/[organizationId]/GET\";\nimport { handler as updateOrganization } from \"./organizations/[organizationId]/PATCH\";\nimport { handler as getOrganizationSidebarBranding } from \"./organizations/[organizationId]/branding/GET\";\nimport { handler as updateOrganizationSidebarBranding } from \"./organizations/[organizationId]/branding/PATCH\";\nimport { handler as presignOrganizationSidebarLogo } from \"./organizations/[organizationId]/branding/logo/presign/POST\";\nimport { handler as listHistory } from \"./history/GET\";\nimport { handler as getHistoryRun } from \"./history/[runId]/GET\";\nimport { handler as listAgents } from \"./agents/GET\";\nimport { handler as getAgent } from \"./agents/[agentId]/GET\";\nimport { handler as cancelAgentSession } from \"./agents/sessions/[sessionId]/cancel/POST\";\nimport { handler as listWorkflows } from \"./workflows/GET\";\nimport { handler as getWorkflow } from \"./workflows/[workflowId]/GET\";\nimport { handler as cancelWorkflowRun } from \"./workflows/runs/[runId]/cancel/POST\";\nimport { handler as listSkills } from \"./skills/GET\";\nimport { handler as getSkill } from \"./skills/[skillId]/GET\";\nimport { handler as listRecents } from \"./recents/GET\";\nimport { handler as listProjects } from \"./projects/GET\";\nimport { handler as listProjectMetrics } from \"./projects/metrics/GET\";\nimport { handler as createProject } from \"./projects/POST\";\nimport { handler as checkProjectSlugAvailabilityRoute } from \"./projects/slug-available/GET\";\nimport { handler as getProject } from \"./projects/[projectId]/GET\";\nimport { handler as updateProject } from \"./projects/[projectId]/PATCH\";\nimport { handler as deleteProject } from \"./projects/[projectId]/DELETE\";\nimport { handler as listProjectDeployments } from \"./projects/[projectId]/deployments/GET\";\nimport { handler as createProjectArtifact } from \"./projects/[projectId]/artifacts/POST\";\nimport { handler as downloadActiveProjectArtifact } from \"./projects/[projectId]/artifacts/active/download/GET\";\nimport { handler as completeProjectArtifact } from \"./projects/[projectId]/artifacts/[artifactId]/complete/POST\";\nimport { handler as presignProjectArtifactSource } from \"./projects/[projectId]/artifacts/[artifactId]/source/presign/POST\";\nimport { handler as uploadProjectArtifactSourceManifest } from \"./projects/[projectId]/artifacts/[artifactId]/source/manifest/POST\";\nimport { handler as listProjectFiles } from \"./projects/[projectId]/files/GET\";\nimport { handler as getProjectFileContent } from \"./projects/[projectId]/artifacts/[artifactId]/files/content/GET\";\nimport { createProjectReachabilityHandler } from \"./projects/[projectId]/reachability/GET\";\nimport { handler as listProjectMembers } from \"./projects/[projectId]/members/GET\";\nimport { handler as inviteProjectMembers } from \"./projects/[projectId]/members/POST\";\nimport { handler as updateProjectMember } from \"./projects/[projectId]/members/[userId]/PATCH\";\nimport { handler as removeProjectMember } from \"./projects/[projectId]/members/[userId]/DELETE\";\nimport { handler as leaveProject } from \"./projects/[projectId]/members/me/DELETE\";\nimport { handler as getProjectSettings } from \"./projects/[projectId]/settings/GET\";\nimport { handler as updateProjectSettings } from \"./projects/[projectId]/settings/PATCH\";\nimport { handler as listCredentials } from \"./credentials/GET\";\nimport { handler as createCredentials } from \"./credentials/POST\";\nimport { handler as getCredential } from \"./credentials/[credentialId]/GET\";\nimport { handler as updateCredential } from \"./credentials/[credentialId]/PATCH\";\nimport { createDeleteCredentialHandler } from \"./credentials/[credentialId]/DELETE\";\nimport { handler as listOrganizationMembers } from \"./members/GET\";\nimport { handler as inviteOrganizationMembers } from \"./members/invitations/POST\";\nimport { handler as updateOrganizationMember } from \"./members/[userId]/PATCH\";\nimport { handler as removeOrganizationMember } from \"./members/[userId]/DELETE\";\nimport { handler as listOrganizationInvitations } from \"./invitations/GET\";\nimport { handler as acceptOrganizationInvitation } from \"./invitations/[invitationId]/accept/POST\";\nimport { handler as declineOrganizationInvitation } from \"./invitations/[invitationId]/decline/POST\";\nimport { handler as listApps } from \"./apps/GET\";\nimport { handler as listApiKeys } from \"./api-keys/GET\";\nimport { handler as createApiKey } from \"./api-keys/POST\";\nimport { handler as revokeApiKey } from \"./api-keys/[apiKeyId]/DELETE\";\nimport { handler as submitTeamRequest } from \"./team-requests/POST\";\n\nexport function mountAccountRoutes(\n options: CreateOrganizationDependencies & {\n mcp?: import(\"../../mcp-provider-plugin\").McpProviderPlugin;\n },\n): Hono<{ Variables: SessionVariables }> {\n const account = new Hono<{ Variables: SessionVariables }>();\n const orgScoped = new Hono<{ Variables: OrganizationVariables }>();\n const projectScoped = new Hono<{ Variables: ProjectRouteVariables }>();\n const jwtVerifier = createDefaultAuthJwtVerifier();\n const protect = requireSession(jwtVerifier);\n const deleteCredential = createDeleteCredentialHandler({ mcp: options.mcp });\n\n account.use(\"/*\", protect);\n orgScoped.use(\"/*\", protect);\n orgScoped.use(\"/*\", requireOrganization());\n projectScoped.use(\"/*\", protect);\n projectScoped.use(\"/*\", requireOrganization());\n\n const requireOrgUpdate = authorize(organizationActions.update);\n const requireUserManage = authorize(userActions.manage);\n const requireUserInvite = authorize(userActions.invite);\n const requireApiKeyCreate = authorize(apiKeysActions.create);\n const requireInvitableRole = authorizePayload(\n InviteOrganizationMembersRequestSchema,\n ({ ctx, body }) => canInviteRole(ctx.orgRole, body.role),\n );\n const requireProjectMember = requireProjectMembership();\n const requireProjectDeploy = authorize(projectActions.deploy);\n const requireProjectUpdate = authorize(projectActions.update);\n const requireProjectDelete = authorize(projectActions.delete);\n const requireProjectManageMembers = authorize(projectActions.manageMembers);\n const requireInvitableProjectRole = authorizePayload(\n InviteProjectMembersRequestSchema,\n ({ c, ctx, body }) =>\n canInviteToProject(ctx, { invitePermission: getProjectInvitePermission(c) }, body.role),\n );\n const requireOrgParam = requireOrganizationParam();\n\n account.get(\"/organizations\", listOrganizations);\n account.get(\"/organizations/slug-available\", checkOrganizationSlugAvailability);\n account.post(\"/organizations\", createOrganizationHandler(options));\n account.get(\"/organizations/:organizationId\", requireOrgParam, getOrganization);\n account.patch(\n \"/organizations/:organizationId\",\n requireOrgParam,\n requireOrgUpdate,\n updateOrganization,\n );\n\n account.get(\n \"/organizations/:organizationId/branding\",\n requireOrgParam,\n getOrganizationSidebarBranding,\n );\n account.patch(\n \"/organizations/:organizationId/branding\",\n requireOrgParam,\n requireOrgUpdate,\n updateOrganizationSidebarBranding,\n );\n account.post(\n \"/organizations/:organizationId/branding/logo/presign\",\n requireOrgParam,\n requireOrgUpdate,\n presignOrganizationSidebarLogo,\n );\n\n account.get(\"/invitations\", listOrganizationInvitations);\n account.post(\"/invitations/:invitationId/accept\", acceptOrganizationInvitation);\n account.post(\"/invitations/:invitationId/decline\", declineOrganizationInvitation);\n\n account.get(\"/users/me/avatar\", getUserAvatar);\n account.post(\"/users/me/avatar/presign\", presignUserAvatar);\n account.patch(\"/users/me/avatar\", updateUserAvatar);\n account.get(\"/users/me/preferences\", getUserPreferences);\n account.patch(\"/users/me/preferences\", updateUserPreferences);\n account.get(\"/apps\", listApps);\n\n orgScoped.get(\"/members\", listOrganizationMembers);\n orgScoped.post(\n \"/members/invitations\",\n requireUserInvite,\n requireInvitableRole,\n inviteOrganizationMembers,\n );\n orgScoped.patch(\"/members/:userId\", requireUserManage, updateOrganizationMember);\n orgScoped.delete(\"/members/:userId\", requireUserManage, removeOrganizationMember);\n\n orgScoped.get(\"/api-keys\", listApiKeys);\n orgScoped.post(\"/api-keys\", requireApiKeyCreate, createApiKey);\n orgScoped.delete(\"/api-keys/:apiKeyId\", revokeApiKey);\n\n const withOrgDb = withOrganizationProjectDatabase();\n\n orgScoped.get(\"/agents\", withOrgDb, listAgents);\n orgScoped.get(\"/agents/:agentId\", withOrgDb, getAgent);\n orgScoped.get(\"/workflows\", withOrgDb, listWorkflows);\n orgScoped.get(\"/workflows/:workflowId\", withOrgDb, getWorkflow);\n orgScoped.get(\"/skills\", withOrgDb, listSkills);\n orgScoped.get(\"/skills/:skillId\", withOrgDb, getSkill);\n orgScoped.get(\"/recents\", withOrgDb, listRecents);\n orgScoped.get(\"/history\", withOrgDb, listHistory);\n orgScoped.post(\"/team-requests\", submitTeamRequest);\n orgScoped.get(\"/history/:runId\", withOrgDb, getHistoryRun);\n orgScoped.post(\"/workflows/runs/:runId/cancel\", withOrgDb, cancelWorkflowRun);\n orgScoped.post(\"/agents/sessions/:sessionId/cancel\", withOrgDb, cancelAgentSession);\n\n orgScoped.get(\"/credentials\", withOrgDb, listCredentials);\n orgScoped.post(\"/credentials\", withOrgDb, createCredentials);\n // `/credentials/instances` (runtime mount) shares this prefix — fall through so the\n // param route doesn't shadow the instance list.\n orgScoped.get(\"/credentials/:credentialId\", withOrgDb, (c, next) =>\n c.req.param(\"credentialId\") === \"instances\" ? next() : getCredential(c, next),\n );\n orgScoped.patch(\"/credentials/:credentialId\", withOrgDb, updateCredential);\n orgScoped.delete(\"/credentials/:credentialId\", withOrgDb, deleteCredential);\n\n orgScoped.get(\"/projects\", listProjects);\n orgScoped.get(\"/projects/slug-available\", checkProjectSlugAvailabilityRoute);\n orgScoped.get(\"/projects/metrics\", withOrgDb, listProjectMetrics);\n orgScoped.post(\"/projects\", createProject);\n\n projectScoped.get(\"/:projectId\", requireProject(), requireProjectMember, getProject);\n projectScoped.patch(\n \"/:projectId\",\n requireProject(),\n requireProjectMember,\n requireProjectUpdate,\n updateProject,\n );\n projectScoped.delete(\n \"/:projectId\",\n requireProject(),\n requireProjectMember,\n requireProjectDelete,\n deleteProject,\n );\n projectScoped.get(\n \"/:projectId/settings\",\n requireProject(),\n requireProjectMember,\n getProjectSettings,\n );\n projectScoped.patch(\n \"/:projectId/settings\",\n requireProject(),\n requireProjectMember,\n requireProjectUpdate,\n updateProjectSettings,\n );\n projectScoped.get(\n \"/:projectId/members\",\n requireProject(),\n requireProjectMember,\n listProjectMembers,\n );\n projectScoped.post(\n \"/:projectId/members\",\n requireProject(),\n requireProjectMember,\n requireInvitableProjectRole,\n inviteProjectMembers,\n );\n projectScoped.patch(\n \"/:projectId/members/:userId\",\n requireProject(),\n requireProjectMember,\n requireProjectManageMembers,\n updateProjectMember,\n );\n projectScoped.delete(\n \"/:projectId/members/:userId\",\n requireProject(),\n requireProjectMember,\n requireProjectManageMembers,\n removeProjectMember,\n );\n projectScoped.delete(\n \"/:projectId/members/me\",\n requireProject(),\n requireProjectMember,\n leaveProject,\n );\n projectScoped.get(\n \"/:projectId/reachability\",\n requireProject(),\n requireProjectMember,\n createProjectReachabilityHandler(options.hosting),\n );\n projectScoped.get(\n \"/:projectId/files\",\n requireProject(),\n requireProjectMember,\n withOrgDb,\n listProjectFiles,\n );\n projectScoped.get(\n \"/:projectId/artifacts/:artifactId/files/content\",\n requireProject(),\n requireProjectMember,\n getProjectFileContent,\n );\n projectScoped.get(\n \"/:projectId/deployments\",\n requireProject(),\n requireProjectMember,\n listProjectDeployments,\n );\n projectScoped.get(\n \"/:projectId/artifacts/active/download\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n downloadActiveProjectArtifact,\n );\n projectScoped.post(\n \"/:projectId/artifacts\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n createProjectArtifact,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/complete\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n completeProjectArtifact,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/source/presign\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n presignProjectArtifactSource,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/source/manifest\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n uploadProjectArtifactSourceManifest,\n );\n\n orgScoped.route(\"/projects\", projectScoped);\n\n account.route(\"/\", orgScoped);\n\n return account;\n}\n","import { selectCredentialInstancesForScope } from \"@keystrokehq/database\";\n\n/** Resolve the keystroke credential instance for an app, preferring org scope, then user. */\nexport async function resolveKeystrokeInstanceIdByApp(\n app: string,\n options: { orgScopeId: string; userId: string },\n): Promise<string | undefined> {\n const scopes = [\n [\"organization\", options.orgScopeId],\n [\"user\", options.userId],\n ] as const;\n\n for (const [scopeType, scopeId] of scopes) {\n const rows = (await selectCredentialInstancesForScope(app, scopeType, scopeId)).filter(\n (row) => row.authKind === \"keystroke\" && row.connectionId,\n );\n const instance = rows.find((row) => row.isDefault) ?? rows[0];\n if (instance) {\n return instance.id;\n }\n }\n\n return undefined;\n}\n","const LOCAL_PLATFORM_ORIGIN = \"http://localhost:3002\";\n\n/** `PUBLIC_PLATFORM_URL` origin; falls back to localhost outside production. */\nexport function publicPlatformOrigin(): string | undefined {\n const fromEnv = process.env.PUBLIC_PLATFORM_URL?.replace(/\\/$/, \"\");\n if (fromEnv) {\n return fromEnv;\n }\n return process.env.NODE_ENV === \"production\" ? undefined : LOCAL_PLATFORM_ORIGIN;\n}\n\n/**\n * Provider-facing platform origin (OAuth redirect URIs, webhook intake URLs).\n *\n * When the platform runs on localhost but is also exposed through an HTTPS tunnel\n * (e.g. cloudflared), set `PUBLIC_PLATFORM_PROXY_URL` to the tunnel origin so external\n * providers (Slack, etc.) get reachable HTTPS URLs while `PUBLIC_PLATFORM_URL` stays on\n * localhost for browser auth/CORS. Falls back to `PUBLIC_PLATFORM_URL`.\n */\nexport function externalPlatformOrigin(): string | undefined {\n const proxy = process.env.PUBLIC_PLATFORM_PROXY_URL?.replace(/\\/$/, \"\");\n if (proxy) {\n return proxy;\n }\n return publicPlatformOrigin();\n}\n\n/** Webhook intake origin for a project: `<platform>/api/projects/<id>`. */\nexport function platformWebhookOrigin(\n projectId: string,\n platformOrigin: string | undefined,\n): string | undefined {\n if (!platformOrigin) {\n return undefined;\n }\n return `${platformOrigin}/api/projects/${encodeURIComponent(projectId)}`;\n}\n","import { z } from \"zod\";\n\nimport { CredentialTargetsFieldsSchema } from \"@keystrokehq/shared\";\n\nexport const StartKeystrokeConnectionInputSchema = CredentialTargetsFieldsSchema.extend({\n app: z.string().trim().min(1),\n});\n\nexport type StartKeystrokeConnectionInput = z.infer<typeof StartKeystrokeConnectionInputSchema>;\n\nexport const StartKeystrokeConnectionResultSchema = z.object({\n status: z.enum([\"redirecting\"]),\n authorizeUrl: z.string().url(),\n connectionId: z.string(),\n});\n\nexport type StartKeystrokeConnectionResult = z.infer<typeof StartKeystrokeConnectionResultSchema>;\n\nexport const ExecuteMcpToolBodySchema = z.object({\n instanceId: z.string().trim().min(1),\n toolSlug: z.string().trim().min(1),\n arguments: z.record(z.string(), z.unknown()).default({}),\n});\n\nexport const McpCallbackQuerySchema = z.object({\n entityId: z.string().trim().min(1),\n app: z.string().trim().min(1),\n status: z.string().trim().min(1).optional(),\n connected_account_id: z.string().trim().min(1).optional(),\n connectedAccountId: z.string().trim().min(1).optional(),\n projects: z.string().trim().min(1).optional(),\n org: z.string().trim().min(1).optional(),\n user: z.string().trim().min(1).optional(),\n organizationId: z.string().trim().min(1).optional(),\n});\n","import { selectCredentialInstanceById } from \"@keystrokehq/database\";\n\nimport { resolveMcpEntityId } from \"../../lib/mcp-entity\";\nimport type { McpProviderPlugin } from \"../../mcp-provider-plugin\";\nimport { ExecuteMcpToolBodySchema } from \"../account/mcp/schemas\";\n\nexport async function handleMcpToolExecute(\n mcp: McpProviderPlugin,\n instanceId: string,\n toolSlug: string,\n args: unknown,\n): Promise<Response> {\n const row = await selectCredentialInstanceById(instanceId);\n if (!row || row.authKind !== \"keystroke\" || !row.connectionId) {\n return Response.json(\n { error: \"not_found\", message: \"Keystroke credential not found.\" },\n { status: 404 },\n );\n }\n\n try {\n const entityId = resolveMcpEntityId(row);\n const result = await mcp.executeTool(entityId, row.connectionId, toolSlug, args);\n return Response.json({ ok: true, result });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to execute MCP tool.\";\n return Response.json({ error: \"mcp_execute_failed\", message }, { status: 500 });\n }\n}\n\nexport async function parseMcpToolExecuteBody(request: Request) {\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n return null;\n }\n\n return ExecuteMcpToolBodySchema.safeParse(body);\n}\n","import {\n ensureKeystrokeCredentialInstance,\n runWithProjectDatabase,\n runWithTenantScope,\n} from \"@keystrokehq/database\";\nimport {\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n selectProjectForOrganizationBySlug,\n} from \"@keystrokehq/platform-database\";\nimport { Hono } from \"hono\";\n\nimport type { McpProviderPlugin } from \"../../../mcp-provider-plugin\";\nimport { McpCallbackQuerySchema } from \"./schemas\";\n\nexport function mountPublicMcpRoutes(options: { mcp?: McpProviderPlugin }): Hono {\n const routes = new Hono();\n\n routes.get(\"/callback\", async (c) => {\n if (!options.mcp) {\n return c.json({ error: \"mcp_unconfigured\" }, 501);\n }\n\n const parsed = McpCallbackQuerySchema.safeParse({\n entityId: c.req.query(\"entityId\"),\n app: c.req.query(\"app\"),\n status: c.req.query(\"status\"),\n connected_account_id: c.req.query(\"connected_account_id\"),\n connectedAccountId: c.req.query(\"connectedAccountId\"),\n projects: c.req.query(\"projects\"),\n org: c.req.query(\"org\"),\n user: c.req.query(\"user\"),\n organizationId: c.req.query(\"organizationId\"),\n });\n\n if (!parsed.success) {\n return c.json({ error: \"Invalid callback query\" }, 400);\n }\n\n const connectionId =\n parsed.data.connected_account_id ?? parsed.data.connectedAccountId ?? undefined;\n if (!connectionId || parsed.data.status !== \"success\") {\n return c.json({ ok: false, status: parsed.data.status ?? \"unknown\" }, 400);\n }\n\n const organizationId = c.req.query(\"organizationId\")?.trim();\n if (!organizationId) {\n return c.json({ error: \"organizationId is required\" }, 400);\n }\n\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const projectSlugs =\n parsed.data.projects\n ?.split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean) ?? [];\n const resolvedProjectIds: string[] = [];\n const projectNamesById: Record<string, string> = {};\n for (const slug of projectSlugs) {\n const project = await selectProjectForOrganizationBySlug(organizationId, slug);\n if (!project) {\n return c.json({ error: `Project \"${slug}\" not found` }, 400);\n }\n resolvedProjectIds.push(project.id);\n projectNamesById[project.id] = project.name;\n }\n\n await runWithOrganizationScope(organizationId, () =>\n runWithProjectDatabase(\n { url: resolveOrgDatabaseUrl(organization), searchPath: organization.dbSchema },\n () =>\n runWithTenantScope(organizationId, async () => {\n await ensureKeystrokeCredentialInstance({\n credentialKey: parsed.data.app,\n connectionId,\n targets: {\n projectIds: resolvedProjectIds,\n projectNamesById,\n organization: parsed.data.org === \"true\",\n userId: parsed.data.user,\n },\n });\n }),\n ),\n );\n\n return c.json({ ok: true, connectionId, app: parsed.data.app });\n });\n\n routes.get(\"/installation\", (c) => {\n if (!options.mcp) {\n return c.json({ error: \"mcp_unconfigured\" }, 501);\n }\n\n return c.redirect(options.mcp.forwardInstallationRedirect(c.req.url), 302);\n });\n\n return routes;\n}\n","import { createDefaultAuthJwtVerifier } from \"@keystrokehq/auth\";\nimport { getServerTenantScopeId } from \"@keystrokehq/database\";\nimport { selectProjectForOrganizationBySlug } from \"@keystrokehq/platform-database\";\nimport { ExecuteKeystrokeToolRequestSchema, ListMcpAppsResponseSchema } from \"@keystrokehq/shared\";\nimport { Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\n\nimport { requireOrganization } from \"../../../auth/require-organization\";\nimport { requireSession } from \"../../../auth/require-session\";\nimport type { OrganizationVariables, SessionVariables } from \"../../../auth/types\";\nimport { resolveKeystrokeInstanceIdByApp } from \"../../../lib/resolve-keystroke-instance\";\nimport { resolveMcpEntityIdFromScope } from \"../../../lib/mcp-entity\";\nimport { externalPlatformOrigin } from \"../../../lib/platform-origin\";\nimport type { McpProviderPlugin } from \"../../../mcp-provider-plugin\";\nimport { withOrganizationProjectDatabase } from \"../../../middleware/with-organization-project-database\";\nimport { handleMcpToolExecute, parseMcpToolExecuteBody } from \"../../internal/mcp-gateway\";\nimport { mountPublicMcpRoutes } from \"./public\";\nimport {\n StartKeystrokeConnectionInputSchema,\n StartKeystrokeConnectionResultSchema,\n} from \"./schemas\";\n\ntype MountMcpRoutesOptions = {\n mcp?: McpProviderPlugin;\n};\n\nfunction unconfigured(c: { json: (body: unknown, status?: number) => Response }) {\n return c.json({ error: \"mcp_unconfigured\" }, 501);\n}\n\nexport function mountMcpRoutes(\n options: MountMcpRoutesOptions,\n): Hono<{ Variables: OrganizationVariables }> {\n const mcp = options.mcp;\n const routes = new Hono<{ Variables: OrganizationVariables }>();\n\n routes.get(\"/apps\", async (c) => {\n if (!mcp) {\n return unconfigured(c);\n }\n\n const user = c.get(\"user\");\n const entityId = resolveMcpEntityIdFromScope(\"user\", user.id);\n const app = c.req.query(\"app\")?.trim() || undefined;\n\n try {\n const apps = await mcp.listApps(entityId, { app });\n return c.json(ListMcpAppsResponseSchema.parse({ apps }));\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to list apps\";\n throw new HTTPException(500, { message });\n }\n });\n\n routes.post(\"/connections\", async (c) => {\n if (!mcp) {\n return unconfigured(c);\n }\n\n const organization = c.get(\"organization\");\n const user = c.get(\"user\");\n const parsed = StartKeystrokeConnectionInputSchema.safeParse(\n await c.req.json().catch(() => null),\n );\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\" }, 400);\n }\n\n const resolvedProjects: Array<{ id: string; name: string }> = [];\n for (const slug of parsed.data.projects) {\n const project = await selectProjectForOrganizationBySlug(organization.organizationId, slug);\n if (!project) {\n return c.json({ error: `Project \"${slug}\" not found` }, 400);\n }\n resolvedProjects.push({ id: project.id, name: project.name });\n }\n\n const primaryScope = parsed.data.createUserProvidedCredential\n ? { scopeType: \"user\" as const, scopeId: user.id }\n : parsed.data.createOrganizationCredential\n ? { scopeType: \"organization\" as const, scopeId: getServerTenantScopeId() }\n : resolvedProjects[0]\n ? { scopeType: \"project\" as const, scopeId: resolvedProjects[0].id }\n : { scopeType: \"user\" as const, scopeId: user.id };\n\n const entityId = resolveMcpEntityIdFromScope(primaryScope.scopeType, primaryScope.scopeId);\n const platformOrigin = externalPlatformOrigin();\n if (!platformOrigin) {\n return c.json({ error: \"PUBLIC_PLATFORM_URL is not configured\" }, 500);\n }\n\n const callbackUrl = new URL(\"/mcp/callback\", `${platformOrigin}/`);\n callbackUrl.searchParams.set(\"entityId\", entityId);\n callbackUrl.searchParams.set(\"app\", parsed.data.app);\n callbackUrl.searchParams.set(\"organizationId\", organization.organizationId);\n if (parsed.data.projects.length > 0) {\n callbackUrl.searchParams.set(\"projects\", parsed.data.projects.join(\",\"));\n }\n if (parsed.data.createOrganizationCredential) {\n callbackUrl.searchParams.set(\"org\", \"true\");\n }\n if (parsed.data.createUserProvidedCredential) {\n callbackUrl.searchParams.set(\"user\", user.id);\n }\n\n try {\n const connectionRequest = await mcp.authorize(\n entityId,\n parsed.data.app,\n callbackUrl.toString(),\n );\n\n return c.json(\n StartKeystrokeConnectionResultSchema.parse({\n status: \"redirecting\",\n authorizeUrl: connectionRequest.redirectUrl,\n connectionId: connectionRequest.connectionId,\n }),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to initiate connection\";\n throw new HTTPException(500, { message });\n }\n });\n\n routes.post(\"/execute\", withOrganizationProjectDatabase(), async (c) => {\n if (!mcp) {\n return unconfigured(c);\n }\n\n const parsed = await parseMcpToolExecuteBody(c.req.raw);\n if (!parsed?.success) {\n return c.json({ error: \"Invalid request body\" }, 400);\n }\n\n return handleMcpToolExecute(\n mcp,\n parsed.data.instanceId,\n parsed.data.toolSlug,\n parsed.data.arguments,\n );\n });\n\n // Public client surface: resolve the keystroke credential by app slug for the\n // calling org/user, then execute. Org comes from the active-org header (dashboard)\n // or the org-platform API key (integration packages).\n routes.post(\"/tools/execute\", withOrganizationProjectDatabase(), async (c) => {\n if (!mcp) {\n return unconfigured(c);\n }\n\n const parsed = ExecuteKeystrokeToolRequestSchema.safeParse(\n await c.req.json().catch(() => null),\n );\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\" }, 400);\n }\n\n const user = c.get(\"user\");\n const instanceId = await resolveKeystrokeInstanceIdByApp(parsed.data.app, {\n orgScopeId: getServerTenantScopeId(),\n userId: user.id,\n });\n if (!instanceId) {\n return c.json({ error: \"not_found\", message: \"Keystroke credential not found.\" }, 404);\n }\n\n return handleMcpToolExecute(mcp, instanceId, parsed.data.tool, parsed.data.arguments);\n });\n\n routes.delete(\"/connections/:connectionId\", async (c) => {\n if (!mcp) {\n return unconfigured(c);\n }\n\n const user = c.get(\"user\");\n const connectionId = c.req.param(\"connectionId\");\n const entityId = resolveMcpEntityIdFromScope(\"user\", user.id);\n\n try {\n await mcp.revokeConnection(entityId, connectionId);\n return c.json({ ok: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to revoke connection\";\n return c.json({ error: message }, 404);\n }\n });\n\n return routes;\n}\n\nexport function mountRootMcpRoutes(options: {\n mcp?: McpProviderPlugin;\n}): Hono<{ Variables: SessionVariables }> {\n const root = new Hono<{ Variables: SessionVariables }>();\n if (!options.mcp) {\n return root;\n }\n\n root.route(\"/\", mountPublicMcpRoutes({ mcp: options.mcp }));\n\n const jwtVerifier = createDefaultAuthJwtVerifier();\n const authed = new Hono<{ Variables: OrganizationVariables }>();\n authed.use(\"/*\", requireSession(jwtVerifier));\n authed.use(\"/*\", requireOrganization());\n authed.route(\"/\", mountMcpRoutes({ mcp: options.mcp }));\n root.route(\"/\", authed);\n\n return root;\n}\n","import type { Context, MiddlewareHandler } from \"hono\";\n\n/** Worker auth from Bearer or x-api-key (Anthropic SDK uses the latter). */\nexport function readWorkerTokenFromRequest(c: Context): string | undefined {\n const authorization = c.req.header(\"authorization\");\n if (authorization?.startsWith(\"Bearer \")) {\n return authorization.slice(\"Bearer \".length).trim();\n }\n\n const apiKey = c.req.header(\"x-api-key\")?.trim();\n if (apiKey) {\n return apiKey;\n }\n\n return undefined;\n}\n\nexport function requireWorkerToken(expectedToken: string | undefined): MiddlewareHandler {\n return async (c, next) => {\n if (!expectedToken) {\n return c.json(\n { error: \"worker_auth_unconfigured\", message: \"Worker auth is not configured.\" },\n 503,\n );\n }\n\n const token = readWorkerTokenFromRequest(c);\n if (!token || token !== expectedToken) {\n return c.json({ error: \"unauthorized\", message: \"Invalid worker token.\" }, 401);\n }\n\n await next();\n };\n}\n","const EXA_API_ORIGIN = \"https://api.exa.ai\";\n\nexport type ProxyExaWebSearchOptions = {\n apiKey: string | undefined;\n method: string;\n path: string;\n requestUrl: string;\n body?: ArrayBuffer;\n fetchImpl?: typeof fetch;\n};\n\nexport async function proxyExaWebSearchRequest(\n options: ProxyExaWebSearchOptions,\n): Promise<Response> {\n const apiKey = options.apiKey?.trim();\n if (!apiKey) {\n return Response.json({ error: \"web_search_unconfigured\" }, { status: 501 });\n }\n\n const target = new URL(`${EXA_API_ORIGIN}/${options.path.replace(/^\\/+/, \"\")}`);\n target.search = new URL(options.requestUrl).search;\n\n const fetchImpl = options.fetchImpl ?? fetch;\n const response = await fetchImpl(target, {\n method: options.method,\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n },\n body: options.method === \"GET\" || options.method === \"HEAD\" ? undefined : options.body,\n });\n\n const headers = new Headers(response.headers);\n headers.delete(\"content-encoding\");\n headers.delete(\"transfer-encoding\");\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n","import { Hono } from \"hono\";\nimport {\n runWithProjectDatabase,\n runWithProjectScope,\n runWithTenantScope,\n} from \"@keystrokehq/database\";\nimport {\n ensureWebhookApiKeyForRoute,\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n selectProjectById,\n} from \"@keystrokehq/platform-database\";\nimport {\n buildWebhookUrl,\n createCredentialMaterializeHandler,\n createOAuthTokenRefreshRegistry,\n} from \"@keystrokehq/server\";\nimport { z } from \"zod\";\n\nimport type { LlmProxyPlugin } from \"../../llm-proxy-plugin\";\nimport { externalPlatformOrigin, platformWebhookOrigin } from \"../../lib/platform-origin\";\nimport { requireWorkerToken } from \"../../middleware/require-worker-token\";\nimport { proxyExaWebSearchRequest } from \"./web-search-proxy\";\n\nconst EnsureWebhookRouteBodySchema = z.object({\n route: z.string().trim().min(1),\n attachmentKeys: z.array(z.string().trim().min(1)).min(1),\n});\n\nexport function mountInternalRoutes(\n workerToken: string | undefined,\n tokenRefresh: ReturnType<typeof createOAuthTokenRefreshRegistry>,\n llmProxy?: LlmProxyPlugin,\n): Hono {\n const internal = new Hono();\n const protect = requireWorkerToken(workerToken);\n const materialize = createCredentialMaterializeHandler(tokenRefresh);\n\n internal.use(\"/*\", protect);\n\n internal.post(\"/projects/:projectId/credentials/materialize\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const project = await selectProjectById(projectId);\n if (!project) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n const organization = await selectOrganizationById(project.organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const url = resolveOrgDatabaseUrl(organization);\n let response: Response | undefined;\n\n await runWithOrganizationScope(project.organizationId, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, () =>\n runWithProjectScope(project.id, () =>\n runWithTenantScope(project.organizationId, async () => {\n response = await materialize(c);\n }),\n ),\n ),\n );\n\n return (\n response ??\n c.json({ error: \"internal_error\", message: \"Failed to materialize credential.\" }, 500)\n );\n });\n\n internal.all(\"/projects/:projectId/web-search/:path{.+}\", async (c) => {\n const body =\n c.req.method === \"GET\" || c.req.method === \"HEAD\" ? undefined : await c.req.arrayBuffer();\n\n return proxyExaWebSearchRequest({\n apiKey: process.env.EXA_API_KEY,\n method: c.req.method,\n path: c.req.param(\"path\"),\n requestUrl: c.req.url,\n body,\n });\n });\n\n if (llmProxy) {\n internal.all(\"/projects/:projectId/llm/:path{.+}\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const project = await selectProjectById(projectId);\n if (!project) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n const organization = await selectOrganizationById(project.organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const url = resolveOrgDatabaseUrl(organization);\n let response: Response | undefined;\n\n await runWithOrganizationScope(project.organizationId, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, () =>\n runWithProjectScope(project.id, () =>\n runWithTenantScope(project.organizationId, async () => {\n response = await llmProxy.handler(c, {\n organizationId: project.organizationId,\n projectId: project.id,\n pathSuffix: `/${c.req.param(\"path\")}`,\n });\n }),\n ),\n ),\n );\n\n return (\n response ??\n c.json({ error: \"internal_error\", message: \"Failed to proxy LLM request.\" }, 500)\n );\n });\n }\n\n internal.post(\"/projects/:projectId/webhooks/ensure\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const project = await selectProjectById(projectId);\n if (!project) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n const parsed = EnsureWebhookRouteBodySchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\", details: parsed.error.flatten() }, 400);\n }\n\n const origin = platformWebhookOrigin(projectId, externalPlatformOrigin());\n if (!origin) {\n return c.json({ error: \"PUBLIC_PLATFORM_URL is not configured\" }, 500);\n }\n\n try {\n const token = await ensureWebhookApiKeyForRoute(\n projectId,\n parsed.data.route,\n parsed.data.attachmentKeys,\n );\n\n return c.json({\n webhookUrl: buildWebhookUrl(origin, parsed.data.route, token),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to ensure webhook API key.\";\n return c.json({ error: \"webhook_provisioning_failed\", message }, 500);\n }\n });\n\n return internal;\n}\n","import { runWithOrganizationScope, selectOrganizationById } from \"@keystrokehq/platform-database\";\nimport { runWithTenantScope } from \"@keystrokehq/database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { OrganizationVariables } from \"../auth/types\";\n\n/** Bind platform credential partition for org-scoped integration routes. */\nexport function withOrganizationDatabase(): MiddlewareHandler<{\n Variables: OrganizationVariables;\n}> {\n return async (c, next) => {\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n await runWithOrganizationScope(organizationId, () =>\n runWithTenantScope(organizationId, () => next()),\n );\n };\n}\n","import {\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectActiveArtifactManifestForProject,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport {\n runWithProjectDatabase,\n runWithProjectScope,\n runWithTenantScope,\n} from \"@keystrokehq/database\";\nimport type { StoredRouteManifest } from \"@keystrokehq/shared\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { ProjectRuntimeVariables } from \"../auth/types\";\nimport { getProjectScheduler } from \"../lib/project-scheduler\";\n\nexport function withProjectRuntime(): MiddlewareHandler<{ Variables: ProjectRuntimeVariables }> {\n return async (c, next) => {\n const project = c.get(\"project\");\n const organization = await selectOrganizationById(project.organizationId);\n\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const url = resolveOrgDatabaseUrl(organization);\n\n // Return the inner result: an early `c.json(...)` Response (e.g. missing manifest) must\n // propagate out of the scope wrappers, or Hono fails with \"Context is not finalized\".\n return runWithOrganizationScope(project.organizationId, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, async () =>\n runWithProjectScope(project.id, async () =>\n runWithTenantScope(project.organizationId, async () => {\n const manifestRaw = await selectActiveArtifactManifestForProject(project.id);\n if (!manifestRaw || typeof manifestRaw !== \"object\") {\n return c.json({ error: \"Project runtime manifest is not available\" }, 503);\n }\n\n const scheduler = await getProjectScheduler(organization, project.id);\n c.set(\"jobQueue\", scheduler);\n c.set(\"scheduler\", scheduler);\n c.set(\"manifest\", manifestRaw as StoredRouteManifest);\n await next();\n }),\n ),\n ),\n );\n };\n}\n","import { prepareAgentSession } from \"@keystrokehq/agent\";\nimport { selectAgentBySlug } from \"@keystrokehq/database\";\nimport type { JobQueue } from \"@keystrokehq/scheduler\";\nimport { PromptInputSchema, validationErrorResponse } from \"@keystrokehq/shared\";\nimport type { Context } from \"hono\";\nimport { ZodError } from \"zod\";\n\nimport { enqueueAgentPrompt } from \"@keystrokehq/server\";\n\nexport function createPlatformAgentPromptHandler(agentKey: string, jobQueue: JobQueue) {\n return async (c: Context): Promise<Response> => {\n const contentType = c.req.header(\"content-type\") ?? \"\";\n let payload: unknown = {};\n\n if (contentType.includes(\"application/json\")) {\n try {\n payload = await c.req.json();\n } catch {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n } else if (contentType.includes(\"text/plain\")) {\n payload = { message: await c.req.text() };\n }\n\n try {\n const input = PromptInputSchema.parse(payload);\n const agent = await selectAgentBySlug(agentKey);\n if (!agent) {\n return c.json({ error: \"Agent not found\" }, 404);\n }\n\n const { sessionId } = await prepareAgentSession(agent.id, input.sessionId, {\n ranByUserId: c.get(\"user\").id,\n });\n const runId = crypto.randomUUID();\n\n await enqueueAgentPrompt({\n agentId: agent.id,\n runId,\n sessionId,\n message: input.message,\n context: input.context,\n thinkingLevel: input.thinkingLevel,\n jobQueue,\n });\n\n return c.json({ sessionId, runId }, 202);\n } catch (error) {\n if (error instanceof ZodError) {\n return c.json(validationErrorResponse(error, \"Invalid agent prompt input\"), 400);\n }\n throw error;\n }\n };\n}\n","import type { StoredGatewaySource } from \"@keystrokehq/database\";\nimport type { ChannelListenMode, NewChannelBindingInput } from \"@keystrokehq/shared\";\n\nexport function toGatewayMode(mode: ChannelListenMode): StoredGatewaySource[\"mode\"] {\n return mode === \"all\" ? \"channel\" : mode;\n}\n\nexport function fromGatewayMode(mode: StoredGatewaySource[\"mode\"]): ChannelListenMode {\n return mode === \"channel\" ? \"all\" : mode;\n}\n\nexport function buildSlackGatewaySource(options: {\n channelId: string;\n channelName: string;\n channelKind?: NewChannelBindingInput[\"channelKind\"];\n mode?: ChannelListenMode;\n subscribeOnMention?: boolean;\n}): StoredGatewaySource {\n return {\n kind: \"slack\",\n mode: toGatewayMode(options.mode ?? \"mention\"),\n credentialKey: \"slack\",\n channelIds: [options.channelId],\n subscribeOnMention: options.subscribeOnMention ?? true,\n channelName: options.channelName,\n channelKind: options.channelKind,\n };\n}\n","import type { GatewayAttachmentRow } from \"@keystrokehq/database\";\nimport type { DecryptedOAuthConnection } from \"@keystrokehq/platform-database\";\nimport {\n ChannelAccountMetadataSchema,\n ChannelAccountSchema,\n ChannelBindingSchema,\n ChannelConnectionSchema,\n type ChannelBindingKind,\n type ChannelListenMode,\n type ChannelPlatformKey,\n} from \"@keystrokehq/shared\";\n\ntype SlackGatewayMode = \"mention\" | \"channel\" | \"dm\";\n\nfunction fromGatewayMode(mode: SlackGatewayMode): ChannelListenMode {\n return mode === \"channel\" ? \"all\" : mode;\n}\n\nconst UNKNOWN_ACCOUNT_ID = \"unknown\";\n\nfunction teamNameFromMetadata(\n metadata: DecryptedOAuthConnection[\"metadata\"] | undefined,\n): string | undefined {\n const parsed = ChannelAccountMetadataSchema.safeParse(metadata);\n return parsed.success ? parsed.data.teamName : undefined;\n}\n\nfunction teamLabel(\n teamId: string,\n oauthConnections: DecryptedOAuthConnection[],\n): { accountLabel: string; connectedAt: string } {\n const oauth = oauthConnections.find((entry) => entry.externalId === teamId);\n const label = teamNameFromMetadata(oauth?.metadata)?.trim() || teamId.trim() || \"Slack workspace\";\n return {\n accountLabel: label,\n connectedAt: new Date().toISOString(),\n };\n}\n\nexport function serializeChannelAccounts(\n oauthConnections: DecryptedOAuthConnection[],\n platform: ChannelPlatformKey,\n): ReturnType<typeof ChannelAccountSchema.parse>[] {\n return oauthConnections.map((oauth) => {\n const id = oauth.externalId.trim() || UNKNOWN_ACCOUNT_ID;\n return ChannelAccountSchema.parse({\n id,\n platform,\n label: teamNameFromMetadata(oauth.metadata)?.trim() || id,\n connectedAt: new Date().toISOString(),\n });\n });\n}\n\nexport function serializeChannelBinding(row: GatewayAttachmentRow) {\n const source = row.source;\n const channelKind = (source.channelKind ?? \"public\") as ChannelBindingKind;\n const channelName = source.channelName ?? row.channelId;\n\n return ChannelBindingSchema.parse({\n id: row.id,\n channelId: row.channelId,\n channelName,\n channelKind,\n mode: fromGatewayMode(source.mode),\n subscribeOnMention: source.subscribeOnMention,\n createdAt: row.registeredAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n });\n}\n\nexport function serializeAgentChannelConnections(\n attachments: GatewayAttachmentRow[],\n oauthConnections: DecryptedOAuthConnection[],\n agentId: string,\n): ReturnType<typeof ChannelConnectionSchema.parse>[] {\n // Attachments created before the bind flow (or via the legacy gateway API) can\n // have a null teamId. When exactly one workspace is connected, attribute them to\n // it; otherwise they fall back to a non-empty sentinel so serialization is valid.\n const fallbackTeamId =\n oauthConnections.length === 1\n ? oauthConnections[0]?.externalId.trim() || UNKNOWN_ACCOUNT_ID\n : UNKNOWN_ACCOUNT_ID;\n\n const grouped = new Map<\n string,\n { platform: string; teamId: string; rows: GatewayAttachmentRow[] }\n >();\n\n for (const row of attachments) {\n const teamId = row.teamId?.trim() || fallbackTeamId;\n const key = `${row.platform}:${teamId}`;\n const bucket = grouped.get(key) ?? { platform: row.platform, teamId, rows: [] };\n bucket.rows.push(row);\n grouped.set(key, bucket);\n }\n\n const connections: ReturnType<typeof ChannelConnectionSchema.parse>[] = [];\n\n for (const { platform, teamId, rows } of grouped.values()) {\n const platformKey = platform as ChannelPlatformKey;\n const label = teamLabel(teamId, oauthConnections);\n const bindings = rows.map(serializeChannelBinding);\n const connectedAt =\n bindings.map((binding) => binding.createdAt).sort()[0] ?? new Date().toISOString();\n\n connections.push(\n ChannelConnectionSchema.parse({\n id: teamId,\n platform: platformKey,\n agentId,\n accountLabel: label.accountLabel,\n accountId: teamId,\n connectedAt,\n bindings,\n }),\n );\n }\n\n return connections;\n}\n","import { listActiveGatewayAttachmentsByAgentSlug } from \"@keystrokehq/database\";\n// oauth_apps/oauth_connections live in the public schema (platform user), not the org schema.\nimport { getDecryptedOAuthConnectionsByAppSlug } from \"@keystrokehq/platform-database\";\nimport type { ChannelPlatformKey } from \"@keystrokehq/shared\";\n\nimport { serializeAgentChannelConnections } from \"./serialize\";\n\nexport const SLACK_CHANNEL_PLATFORM: ChannelPlatformKey = \"slack\";\n\nexport async function loadAgentChannelConnections(agentSlug: string, agentRegistryId: string) {\n const attachments = await listActiveGatewayAttachmentsByAgentSlug(agentSlug);\n const oauthConnections = await getDecryptedOAuthConnectionsByAppSlug(SLACK_CHANNEL_PLATFORM);\n return serializeAgentChannelConnections(attachments, oauthConnections, agentRegistryId);\n}\n","import {\n GatewayChannelConflictError,\n listActiveGatewayAttachmentsByAgentSlug,\n selectActiveAgentById,\n softDeleteGatewayAttachmentByChannel,\n upsertGatewayAttachmentByChannel,\n} from \"@keystrokehq/database\";\nimport { getDecryptedOAuthConnectionsByAppSlug } from \"@keystrokehq/platform-database\";\nimport { listSlackConversations } from \"@keystrokehq/slack\";\nimport {\n BindChannelBodySchema,\n ChannelAccountListResponseSchema,\n ChannelDirectoryListResponseSchema,\n ChannelConnectionListResponseSchema,\n ChannelConnectionSchema,\n UpdateChannelBindingBodySchema,\n} from \"@keystrokehq/shared\";\nimport type { Context } from \"hono\";\n\nimport { buildSlackGatewaySource, fromGatewayMode } from \"../channels/gateway-source\";\nimport { loadAgentChannelConnections, SLACK_CHANNEL_PLATFORM } from \"../channels/load-connections\";\nimport { serializeChannelAccounts } from \"../channels/serialize\";\n\nexport type PlatformChannelHandlersOptions = {\n agentKeys: ReadonlySet<string>;\n};\n\nfunction resolveOAuthToken(\n oauthConnections: Awaited<ReturnType<typeof getDecryptedOAuthConnectionsByAppSlug>>,\n accountId?: string,\n): { token: string; teamId: string } | null {\n if (oauthConnections.length === 0) {\n return null;\n }\n\n if (accountId) {\n const match = oauthConnections.find((entry) => entry.externalId === accountId);\n if (!match?.accessToken) {\n return null;\n }\n return { token: match.accessToken, teamId: match.externalId };\n }\n\n if (oauthConnections.length === 1) {\n const only = oauthConnections[0];\n if (!only?.accessToken) {\n return null;\n }\n return { token: only.accessToken, teamId: only.externalId };\n }\n\n return null;\n}\n\nexport function createPlatformChannelHandlers(options: PlatformChannelHandlersOptions) {\n const listChannelAccounts = async (c: Context): Promise<Response> => {\n const platform = c.req.param(\"platform\");\n if (platform !== SLACK_CHANNEL_PLATFORM) {\n return c.json({ error: \"Unsupported platform\" }, 400);\n }\n\n const oauthConnections = await getDecryptedOAuthConnectionsByAppSlug(SLACK_CHANNEL_PLATFORM);\n const accounts = serializeChannelAccounts(oauthConnections, SLACK_CHANNEL_PLATFORM);\n return c.json(ChannelAccountListResponseSchema.parse({ accounts }));\n };\n\n const listAgentChannels = async (c: Context): Promise<Response> => {\n const agentId = c.req.param(\"agentId\");\n if (!agentId) {\n return c.json({ error: \"Agent id is required\" }, 400);\n }\n const agent = await selectActiveAgentById(agentId);\n if (!agent) {\n return c.json({ error: \"Agent not found\" }, 404);\n }\n\n const connections = await loadAgentChannelConnections(agent.slug, agent.id);\n return c.json(ChannelConnectionListResponseSchema.parse({ connections }));\n };\n\n const listChannelDirectory = async (c: Context): Promise<Response> => {\n const platform = c.req.param(\"platform\");\n if (platform !== SLACK_CHANNEL_PLATFORM) {\n return c.json({ error: \"Unsupported platform\" }, 400);\n }\n\n const accountId = c.req.query(\"accountId\");\n const oauthConnections = await getDecryptedOAuthConnectionsByAppSlug(SLACK_CHANNEL_PLATFORM);\n const resolved = resolveOAuthToken(oauthConnections, accountId);\n\n if (!resolved) {\n if (!accountId && oauthConnections.length > 1) {\n return c.json(\n { error: \"accountId is required when multiple workspaces are connected\" },\n 400,\n );\n }\n if (oauthConnections.length === 0) {\n return c.json({ error: \"Slack is not connected\" }, 400);\n }\n return c.json({ error: \"Slack access token unavailable\" }, 400);\n }\n\n try {\n const channels = await listSlackConversations(resolved.token);\n return c.json(\n ChannelDirectoryListResponseSchema.parse({\n channels,\n }),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to list Slack channels\";\n return c.json({ error: message }, 502);\n }\n };\n\n const bindAgentChannel = async (c: Context): Promise<Response> => {\n const agentId = c.req.param(\"agentId\");\n if (!agentId) {\n return c.json({ error: \"Agent id is required\" }, 400);\n }\n const agent = await selectActiveAgentById(agentId);\n if (!agent) {\n return c.json({ error: \"Agent not found\" }, 404);\n }\n\n const parsed = BindChannelBodySchema.safeParse(await c.req.json());\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\" }, 400);\n }\n\n if (parsed.data.platform !== SLACK_CHANNEL_PLATFORM) {\n return c.json({ error: \"Unsupported platform\" }, 400);\n }\n\n if (!options.agentKeys.has(agent.slug)) {\n return c.json({ error: `Unknown agent: ${agent.slug}` }, 400);\n }\n\n const oauthConnections = await getDecryptedOAuthConnectionsByAppSlug(SLACK_CHANNEL_PLATFORM);\n const accountId = parsed.data.accountId;\n const oauth = oauthConnections.find((entry) => entry.externalId === accountId);\n if (!oauth) {\n return c.json({ error: \"Workspace not connected\" }, 400);\n }\n\n const source = buildSlackGatewaySource(parsed.data.binding);\n\n try {\n await upsertGatewayAttachmentByChannel({\n platform: SLACK_CHANNEL_PLATFORM,\n channelId: parsed.data.binding.channelId,\n teamId: accountId,\n agentSlug: agent.slug,\n source,\n });\n\n const connections = await loadAgentChannelConnections(agent.slug, agent.id);\n const connection = connections.find((entry) => entry.accountId === accountId);\n if (!connection) {\n return c.json({ error: \"Failed to load channel connection\" }, 500);\n }\n\n return c.json(ChannelConnectionSchema.parse(connection));\n } catch (error) {\n if (error instanceof GatewayChannelConflictError) {\n return c.json({ error: error.message }, 409);\n }\n throw error;\n }\n };\n\n const updateAgentChannelBinding = async (c: Context): Promise<Response> => {\n const agentId = c.req.param(\"agentId\");\n const bindingId = c.req.param(\"bindingId\");\n if (!agentId || !bindingId) {\n return c.json({ error: \"Agent id and binding id are required\" }, 400);\n }\n const agent = await selectActiveAgentById(agentId);\n if (!agent) {\n return c.json({ error: \"Agent not found\" }, 404);\n }\n\n const parsed = UpdateChannelBindingBodySchema.safeParse(await c.req.json());\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\" }, 400);\n }\n\n const attachments = await listActiveGatewayAttachmentsByAgentSlug(agent.slug);\n const binding = attachments.find((row) => row.id === bindingId);\n if (!binding) {\n return c.json({ error: \"Channel binding not found\" }, 404);\n }\n\n const source = buildSlackGatewaySource({\n channelId: binding.channelId,\n channelName: binding.source.channelName ?? binding.channelId,\n channelKind: binding.source.channelKind,\n mode: parsed.data.patch.mode ?? fromGatewayMode(binding.source.mode),\n subscribeOnMention: parsed.data.patch.subscribeOnMention ?? binding.source.subscribeOnMention,\n });\n\n await upsertGatewayAttachmentByChannel({\n platform: SLACK_CHANNEL_PLATFORM,\n channelId: binding.channelId,\n teamId: binding.teamId,\n agentSlug: agent.slug,\n source,\n });\n\n const connections = await loadAgentChannelConnections(agent.slug, agent.id);\n const connection = connections.find((entry) => entry.accountId === binding.teamId);\n if (!connection) {\n return c.json({ error: \"Channel connection not found\" }, 404);\n }\n\n return c.json(connection);\n };\n\n const removeAgentChannelBinding = async (c: Context): Promise<Response> => {\n const agentId = c.req.param(\"agentId\");\n const bindingId = c.req.param(\"bindingId\");\n if (!agentId || !bindingId) {\n return c.json({ error: \"Agent id and binding id are required\" }, 400);\n }\n const agent = await selectActiveAgentById(agentId);\n if (!agent) {\n return c.json({ error: \"Agent not found\" }, 404);\n }\n\n const attachments = await listActiveGatewayAttachmentsByAgentSlug(agent.slug);\n const binding = attachments.find((row) => row.id === bindingId);\n if (!binding) {\n return c.json({ error: \"Channel binding not found\" }, 404);\n }\n\n const deleted = await softDeleteGatewayAttachmentByChannel(\n SLACK_CHANNEL_PLATFORM,\n binding.channelId,\n new Date(),\n );\n if (!deleted) {\n return c.json({ error: \"Channel binding not found\" }, 404);\n }\n\n const connections = await loadAgentChannelConnections(agent.slug, agent.id);\n const connection = connections.find((entry) => entry.accountId === binding.teamId);\n if (!connection) {\n return c.body(null, 204);\n }\n\n return c.json(connection);\n };\n\n return {\n listChannelAccounts,\n listAgentChannels,\n listChannelDirectory,\n bindAgentChannel,\n updateAgentChannelBinding,\n removeAgentChannelBinding,\n };\n}\n","import type { JobQueue } from \"@keystrokehq/scheduler\";\nimport { validationErrorResponse, type StoredRouteManifest } from \"@keystrokehq/shared\";\nimport { findWorkflowManifestEntry } from \"@keystrokehq/manifest\";\nimport { enqueueWorkflowRunByKey } from \"@keystrokehq/server\";\nimport type { Context } from \"hono\";\nimport { z, ZodError } from \"zod\";\n\nfunction parseInputFromManifest(\n manifest: StoredRouteManifest,\n workflowKey: string,\n input: unknown,\n): unknown {\n const entry = findWorkflowManifestEntry(manifest, workflowKey);\n if (!entry) {\n throw new Error(`Workflow not found: ${workflowKey}`);\n }\n\n if (typeof z.fromJSONSchema === \"function\") {\n const schema = z.fromJSONSchema(entry.requestSchema as Parameters<typeof z.fromJSONSchema>[0]);\n return schema.parse(input ?? {});\n }\n\n return z.record(z.string(), z.unknown()).parse(input ?? {});\n}\n\nexport function createPlatformWorkflowRunHandler(\n workflowKey: string,\n manifest: StoredRouteManifest,\n jobQueue: JobQueue,\n) {\n return async (c: Context): Promise<Response> => {\n const contentType = c.req.header(\"content-type\") ?? \"\";\n let payload: unknown = {};\n\n if (contentType.includes(\"application/json\")) {\n try {\n payload = await c.req.json();\n } catch {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n }\n\n try {\n const runId = await enqueueWorkflowRunByKey({\n workflowKey,\n input: payload,\n jobQueue,\n parseInput: (value) => parseInputFromManifest(manifest, workflowKey, value),\n ranByUserId: c.get(\"user\").id,\n });\n\n return c.json({ runId }, 202);\n } catch (error) {\n if (error instanceof ZodError) {\n return c.json(validationErrorResponse(error, \"Invalid workflow input\"), 400);\n }\n\n if (error instanceof Error && error.message.startsWith(\"Workflow not found:\")) {\n return c.json({ error: error.message }, 404);\n }\n\n throw error;\n }\n };\n}\n","import { createDefaultAuthJwtVerifier, resolveRequestAuth } from \"@keystrokehq/auth\";\nimport {\n agentSessionDetailHandler,\n agentSessionsListHandler,\n connectProvidersFromManifest,\n createAgentsListHandler,\n createGatewayAttachmentHandlers,\n createTriggerGetHandler,\n createTriggersListHandler,\n createLocalCredentialBackend,\n createOAuthTokenAdapterFromBackend,\n createOAuthTokenRefreshRegistry,\n listKnownIntegrationKeys,\n mountCredentialInstanceRoutes,\n mountProjectIntegrations,\n mountWorkflowCredentialRoutes,\n triggerRunDetailHandler,\n triggerRunsListHandler,\n workflowRunDetailHandler,\n workflowRunsListHandler,\n} from \"@keystrokehq/server\";\nimport type { StoredRouteManifest } from \"@keystrokehq/shared\";\nimport {\n listWebhookApiKeysForProject,\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n selectProjectForOrganizationBySlug,\n} from \"@keystrokehq/platform-database\";\nimport {\n runWithProjectDatabase,\n runWithTenantScope,\n selectActiveWorkflowBySlug,\n selectAgentBySlug,\n getProjectScopeId,\n} from \"@keystrokehq/database\";\nimport type { TriggerListItem } from \"@keystrokehq/shared\";\nimport { type Context, Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\n\nimport { externalPlatformOrigin, platformWebhookOrigin } from \"../../lib/platform-origin\";\nimport { requireOrganization } from \"../../auth/require-organization\";\nimport { requireProject } from \"../../auth/require-project\";\nimport { requireProjectMembership } from \"../../auth/require-project-membership\";\nimport { requireSession } from \"../../auth/require-session\";\nimport type {\n OrganizationVariables,\n ProjectRuntimeVariables,\n SessionVariables,\n} from \"../../auth/types\";\nimport { withOrganizationDatabase } from \"../../middleware/with-organization-database\";\nimport { withOrganizationProjectDatabase } from \"../../middleware/with-organization-project-database\";\nimport { withProjectRuntime } from \"../../middleware/with-project-runtime\";\nimport { createPlatformAgentPromptHandler } from \"./handlers/agent-prompt\";\nimport { createPlatformChannelHandlers } from \"./handlers/channels\";\nimport { createPlatformWorkflowRunHandler } from \"./handlers/workflow-run\";\n\nfunction manifestAgentEntries(manifest: StoredRouteManifest) {\n return manifest.entries\n .filter((entry) => entry.kind === \"agent\")\n .map((entry) => ({\n key: entry.agentSlug,\n route: entry.path,\n }));\n}\n\nasync function webhookTokensByProjectId(projectId: string): Promise<Map<string, string>> {\n const keys = await listWebhookApiKeysForProject(projectId);\n return new Map(keys.map((key) => [key.route, key.token]));\n}\n\nfunction platformApiOrigin(platformOrigin: string | undefined): string | undefined {\n if (!platformOrigin) {\n return undefined;\n }\n return `${platformOrigin}/api`;\n}\n\nfunction agentSlugsFromManifest(manifest: StoredRouteManifest): Set<string> {\n const slugs = new Set<string>();\n for (const entry of manifest.entries) {\n if (\n entry.kind === \"agent\" ||\n entry.kind === \"agent-sessions-list\" ||\n entry.kind === \"agent-session-detail\"\n ) {\n slugs.add(entry.agentSlug);\n }\n }\n return slugs;\n}\n\nfunction targetFromAttachmentId(\n manifest: StoredRouteManifest,\n attachmentId: string,\n): Pick<TriggerListItem, \"targetKind\" | \"workflowKey\" | \"agentKey\"> {\n const targetKey = attachmentId.split(\":\")[1] ?? attachmentId;\n if (agentSlugsFromManifest(manifest).has(targetKey)) {\n return { targetKind: \"agent\", agentKey: targetKey };\n }\n return { targetKind: \"workflow\", workflowKey: targetKey };\n}\n\nfunction manifestTriggerEntries(manifest: StoredRouteManifest): TriggerListItem[] {\n const entries: TriggerListItem[] = [];\n\n for (const entry of manifest.entries) {\n if (entry.kind === \"trigger-webhook\") {\n for (const attachmentId of entry.attachmentIds) {\n entries.push({\n key: attachmentId,\n type: \"webhook\",\n route: entry.path,\n ...targetFromAttachmentId(manifest, attachmentId),\n });\n }\n continue;\n }\n\n if (entry.kind === \"trigger-poll\") {\n entries.push({\n key: entry.attachmentId,\n type: \"poll\",\n route: entry.path,\n ...targetFromAttachmentId(manifest, entry.attachmentId),\n });\n continue;\n }\n\n if (entry.kind === \"cron-schedule\") {\n entries.push({\n key: entry.attachmentId,\n type: \"cron\",\n ...targetFromAttachmentId(manifest, entry.attachmentId),\n });\n }\n }\n\n return entries;\n}\n\nfunction commaSeparatedQuery(value: string | undefined): string[] {\n return (\n value\n ?.split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction createIntegrationServices(\n platformOrigin: string | undefined,\n tokenRefresh: ReturnType<\n typeof createOAuthTokenRefreshRegistry\n > = createOAuthTokenRefreshRegistry(),\n) {\n const credentialBackend = createLocalCredentialBackend({ tokenRefresh });\n const oauthAdapter = createOAuthTokenAdapterFromBackend(credentialBackend);\n const oauthRedirectOrigin = platformApiOrigin(platformOrigin);\n const jwtVerifier = createDefaultAuthJwtVerifier();\n\n return {\n tokenRefresh,\n oauthAdapter,\n jwtVerifier,\n services: {\n agents: { byKey: new Map(), idByKey: new Map() },\n oauthAdapter,\n tokenRefresh,\n runPrompt: () => ({ oauthAdapter }),\n getAuthenticatedUser: async (headers: Headers) => {\n const result = await resolveRequestAuth(jwtVerifier, headers);\n return result ? { id: result.user.id } : null;\n },\n resolvePublicServerUrl: () => oauthRedirectOrigin,\n resolveStateContext: async (c: Context) => {\n const user = c.get(\"user\") as { id: string } | undefined;\n const organization = c.get(\"organization\") as { organizationId: string } | undefined;\n const orgId = organization?.organizationId;\n const orgRow = orgId ? await selectOrganizationById(orgId) : undefined;\n // Credential fan-out targets chosen at initiation (web connect dialog / CLI). They ride\n // the signed state so the unauthenticated callback can materialize the right instances.\n const projectSlugs = commaSeparatedQuery(c.req.query(\"projects\"));\n const scopes = commaSeparatedQuery(c.req.query(\"scopes\"));\n const resolvedProjectIds: string[] = [];\n const projectNamesById: Record<string, string> = {};\n if (orgId) {\n for (const slug of projectSlugs) {\n const project = await selectProjectForOrganizationBySlug(orgId, slug);\n if (!project) {\n throw new HTTPException(400, { message: `Project \"${slug}\" not found` });\n }\n resolvedProjectIds.push(project.id);\n projectNamesById[project.id] = project.name;\n }\n }\n return {\n userId: user?.id,\n orgId,\n ...(orgRow?.slug ? { orgSlug: orgRow.slug } : {}),\n ...(resolvedProjectIds.length > 0\n ? { projectIds: resolvedProjectIds, projectNamesById }\n : {}),\n ...(c.req.query(\"org\") === \"true\" ? { orgCredential: true } : {}),\n ...(c.req.query(\"user\") === \"true\" ? { userCredential: true } : {}),\n ...(scopes.length > 0 ? { scopes } : {}),\n };\n },\n },\n };\n}\n\n/**\n * Public (unauthenticated) OAuth callback routes.\n *\n * OAuth providers redirect a bare browser here with `code` + signed `state`; there is no session,\n * Bearer token, or active-org cookie. We therefore mount the callback outside the session/org\n * middleware and re-establish the org persistence scope from the verified state's `orgId`\n * (`runInStateContext`). On completion redirects the browser to `PUBLIC_WEB_URL/{orgSlug}/apps`.\n */\nexport async function mountOAuthCallbacks(\n tokenRefresh?: ReturnType<typeof createOAuthTokenRefreshRegistry>,\n): Promise<Hono> {\n const platformOrigin = externalPlatformOrigin();\n const { tokenRefresh: refresh, services: baseServices } = createIntegrationServices(\n platformOrigin,\n tokenRefresh,\n );\n\n const callbacks = new Hono();\n const manifest: Extract<StoredRouteManifest[\"entries\"][number], { kind: \"plugin\" }>[] = [];\n\n await mountProjectIntegrations({\n app: callbacks,\n integrationKeys: listKnownIntegrationKeys(),\n manifest,\n mountedRoutes: new Set<string>(),\n tokenRefresh: refresh,\n services: {\n ...baseServices,\n includeGateway: false,\n oauthMountMode: \"callback\",\n runInStateContext: async (ctx, fn) => {\n const orgId = ctx.orgId;\n if (!orgId) {\n throw new Error(\"OAuth callback state is missing an organization id\");\n }\n const organization = await selectOrganizationById(orgId);\n if (!organization) {\n throw new Error(`Organization ${orgId} not found for OAuth callback`);\n }\n const url = resolveOrgDatabaseUrl(organization);\n return runWithOrganizationScope(orgId, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, () =>\n runWithTenantScope(orgId, fn),\n ),\n );\n },\n },\n });\n\n return callbacks;\n}\n\nexport async function mountRuntimeRoutes(\n tokenRefresh?: ReturnType<typeof createOAuthTokenRefreshRegistry>,\n): Promise<Hono<{ Variables: SessionVariables }>> {\n const api = new Hono<{ Variables: ProjectRuntimeVariables }>();\n const platformOrigin = externalPlatformOrigin();\n const {\n tokenRefresh: refresh,\n jwtVerifier,\n services: baseServices,\n } = createIntegrationServices(platformOrigin, tokenRefresh);\n const protect = requireSession(jwtVerifier);\n\n api.use(\"/*\", protect);\n api.use(\"/*\", requireOrganization());\n\n const org = new Hono<{ Variables: OrganizationVariables }>();\n org.use(\"/*\", withOrganizationDatabase());\n org.use(\"/*\", withOrganizationProjectDatabase());\n\n const orgIntegrationManifest: Extract<\n StoredRouteManifest[\"entries\"][number],\n { kind: \"plugin\" }\n >[] = [];\n\n // Org mount handles OAuth *initiation* only (start + authorize-url), behind JWT + org auth.\n // The unauthenticated callback is mounted separately by `mountOAuthCallbacks`.\n await mountProjectIntegrations({\n app: org as unknown as import(\"hono\").Hono,\n integrationKeys: listKnownIntegrationKeys(),\n manifest: orgIntegrationManifest,\n mountedRoutes: new Set<string>(),\n tokenRefresh: refresh,\n services: {\n ...baseServices,\n includeGateway: false,\n oauthMountMode: \"initiate\",\n },\n });\n\n org.get(\"/health\", (c) => c.json({ ok: true }));\n org.get(\"/connect/providers\", (c) =>\n c.json({ providers: connectProvidersFromManifest(orgIntegrationManifest as never) }),\n );\n mountCredentialInstanceRoutes(org, null);\n\n api.route(\"/\", org);\n\n const project = new Hono<{ Variables: ProjectRuntimeVariables }>();\n project.use(\"/*\", requireProject());\n project.use(\"/*\", requireProjectMembership());\n project.use(\"/*\", withProjectRuntime());\n\n const projectIntegrationManifest: Extract<\n StoredRouteManifest[\"entries\"][number],\n { kind: \"plugin\" }\n >[] = [];\n\n project.get(\"/health\", (c) => c.json({ ok: true }));\n\n project.get(\"/agents\", (c) => {\n const manifest = c.get(\"manifest\");\n return createAgentsListHandler(manifestAgentEntries(manifest))(c);\n });\n\n const slackGatewayAttachmentHandlers = (c: Context) =>\n createGatewayAttachmentHandlers({\n agentKeys: agentSlugsFromManifest(c.get(\"manifest\")),\n });\n\n project.get(\"/gateways/slack/attachments\", (c) =>\n slackGatewayAttachmentHandlers(c).listSlackAttachments(c),\n );\n project.get(\"/gateways/slack/attachments/:channelId\", (c) =>\n slackGatewayAttachmentHandlers(c).getSlackAttachment(c),\n );\n project.put(\"/gateways/slack/attachments/:channelId\", (c) =>\n slackGatewayAttachmentHandlers(c).putSlackAttachment(c),\n );\n project.delete(\"/gateways/slack/attachments/:channelId\", (c) =>\n slackGatewayAttachmentHandlers(c).deleteSlackAttachment(c),\n );\n\n const channelHandlers = (c: Context) =>\n createPlatformChannelHandlers({\n agentKeys: agentSlugsFromManifest(c.get(\"manifest\")),\n });\n\n project.get(\"/channels/:platform/accounts\", (c) => channelHandlers(c).listChannelAccounts(c));\n project.get(\"/agents/:agentId/channels\", (c) => channelHandlers(c).listAgentChannels(c));\n project.get(\"/channels/:platform/directory\", (c) => channelHandlers(c).listChannelDirectory(c));\n project.post(\"/agents/:agentId/channels/bindings\", (c) => channelHandlers(c).bindAgentChannel(c));\n project.put(\"/agents/:agentId/channels/bindings/:bindingId\", (c) =>\n channelHandlers(c).updateAgentChannelBinding(c),\n );\n project.delete(\"/agents/:agentId/channels/bindings/:bindingId\", (c) =>\n channelHandlers(c).removeAgentChannelBinding(c),\n );\n\n project.get(\"/agents/:key/sessions\", (c) => agentSessionsListHandler(c.req.param(\"key\"))(c));\n project.get(\"/agents/:key/sessions/:sessionId\", (c) =>\n agentSessionDetailHandler(c.req.param(\"key\"))(c),\n );\n\n project.post(\"/agents/:key\", async (c) => {\n const key = c.req.param(\"key\");\n const agent = await selectAgentBySlug(key);\n if (!agent) {\n return c.json({ error: \"Agent not found\" }, 404);\n }\n\n return createPlatformAgentPromptHandler(key, c.get(\"jobQueue\"))(c);\n });\n\n project.post(\"/workflows/:key\", async (c) => {\n const key = c.req.param(\"key\");\n const workflow = await selectActiveWorkflowBySlug(key);\n if (!workflow) {\n return c.json({ error: \"Workflow not found\" }, 404);\n }\n\n return createPlatformWorkflowRunHandler(key, c.get(\"manifest\"), c.get(\"jobQueue\"))(c);\n });\n\n project.get(\"/workflows/:key/runs\", (c) => workflowRunsListHandler(c.req.param(\"key\"))(c));\n project.get(\"/workflows/:key/runs/:runId\", (c) =>\n workflowRunDetailHandler(c.req.param(\"key\"))(c),\n );\n\n project.get(\"/triggers\", async (c) => {\n const manifest = c.get(\"manifest\");\n const projectId = c.get(\"project\").id;\n const tokens = await webhookTokensByProjectId(projectId);\n return createTriggersListHandler({\n entries: manifestTriggerEntries(manifest),\n webhookTokensByRoute: tokens,\n resolveOrigin: () => platformWebhookOrigin(projectId, platformOrigin) ?? \"\",\n })(c);\n });\n\n project.get(\"/triggers/:id\", async (c) => {\n const manifest = c.get(\"manifest\");\n const projectId = c.get(\"project\").id;\n const tokens = await webhookTokensByProjectId(projectId);\n return createTriggerGetHandler({\n entries: manifestTriggerEntries(manifest),\n webhookTokensByRoute: tokens,\n resolveOrigin: () => platformWebhookOrigin(projectId, platformOrigin) ?? \"\",\n })(c);\n });\n\n project.get(\"/triggers/:id/runs\", (c) => triggerRunsListHandler(c.req.param(\"id\"))(c));\n project.get(\"/triggers/:id/runs/:runId\", (c) => triggerRunDetailHandler(c.req.param(\"id\"))(c));\n\n project.get(\"/openapi.json\", (c) => {\n const manifest = c.get(\"manifest\");\n return c.json({\n openapi: \"3.0.0\",\n info: { title: \"Keystroke Project API\", version: \"1.0.0\" },\n paths: Object.fromEntries(\n manifest.entries\n .filter((entry) => \"method\" in entry && \"path\" in entry)\n .map((entry) => [entry.path, {}]),\n ),\n \"x-keystroke\": { manifest },\n });\n });\n\n mountWorkflowCredentialRoutes(project, null);\n\n await mountProjectIntegrations({\n app: project as unknown as import(\"hono\").Hono,\n integrationKeys: [\"slack\"],\n manifest: projectIntegrationManifest,\n mountedRoutes: new Set<string>(),\n tokenRefresh,\n services: {\n ...baseServices,\n includeOAuth: false,\n includeGateway: false,\n resolvePublicServerUrl: () => {\n const apiOrigin = platformApiOrigin(platformOrigin);\n return apiOrigin ? `${apiOrigin}/projects/${getProjectScopeId()}` : undefined;\n },\n },\n });\n\n api.route(\"/projects/:projectId\", project);\n\n return api as unknown as Hono<{ Variables: SessionVariables }>;\n}\n","import {\n createPgConnection,\n getOrCreateGatewayThreadSession,\n runWithProjectScope,\n} from \"@keystrokehq/database\";\nimport {\n getDecryptedOAuthConnectionByAppSlugAndExternalId,\n resolveOrgDatabaseUrl,\n type OrganizationRow,\n} from \"@keystrokehq/platform-database\";\nimport { enqueueAgentPrompt } from \"@keystrokehq/server\";\nimport { createSlackGatewayIngress, type SlackGatewayRuntime } from \"@keystrokehq/slack\";\n\nimport { getProjectScheduler } from \"./project-scheduler\";\n\ntype CachedIngress = {\n signingSecret: string;\n pending: Promise<SlackGatewayRuntime>;\n};\n\nconst ingressByOrg = new Map<string, CachedIngress>();\n\nexport function getOrgSlackIngressRuntime(\n organization: OrganizationRow,\n signingSecret: string,\n): Promise<SlackGatewayRuntime> {\n const cached = ingressByOrg.get(organization.id);\n if (cached && cached.signingSecret === signingSecret) {\n return cached.pending;\n }\n\n let pending!: Promise<SlackGatewayRuntime>;\n pending = buildOrgSlackIngressRuntime(organization, signingSecret).catch((error) => {\n const current = ingressByOrg.get(organization.id);\n if (current?.pending === pending) {\n ingressByOrg.delete(organization.id);\n }\n throw error;\n });\n\n ingressByOrg.set(organization.id, { signingSecret, pending });\n return pending;\n}\n\nfunction buildOrgSlackIngressRuntime(\n organization: OrganizationRow,\n signingSecret: string,\n): Promise<SlackGatewayRuntime> {\n // Dedicated long-lived connection for chat-adapter state (dedupe + subscriptions). The\n // per-request org DB handle is closed after each request, so a cached runtime needs its own.\n const url = resolveOrgDatabaseUrl(organization);\n const handle = createPgConnection({ url, searchPath: organization.dbSchema });\n const pgPool = handle.dialect === \"postgres\" ? handle.pool : undefined;\n\n return createSlackGatewayIngress({\n signingSecret,\n organizationSlug: organization.slug,\n pgPool,\n dispatch: async ({ attachment, threadId, channelId, teamId, message }) => {\n const projectId = attachment.projectId;\n if (!projectId) {\n return;\n }\n\n await runWithProjectScope(projectId, async () => {\n const sessionId = await getOrCreateGatewayThreadSession({\n threadId,\n agentId: attachment.agentId,\n attachmentId: attachment.attachmentId,\n });\n\n const scheduler = await getProjectScheduler(organization, projectId);\n\n // Pin the exact workspace's OAuth connection so the worker materializes the right bot\n // token. Without this the worker falls back to the default `slack` credential, which may\n // be a different workspace and yields Slack `channel_not_found` on reply/typing.\n const connection = await getDecryptedOAuthConnectionByAppSlugAndExternalId(\"slack\", teamId);\n\n await enqueueAgentPrompt({\n agentId: attachment.agentId,\n runId: crypto.randomUUID(),\n sessionId,\n message,\n jobQueue: scheduler,\n gatewayReply: {\n platform: \"slack\",\n threadId,\n channelId,\n teamId,\n ...(connection ? { connectionId: connection.id } : {}),\n agentName: attachment.agentKey,\n attachmentId: attachment.attachmentId,\n attachmentKey: attachment.key,\n },\n });\n });\n },\n });\n}\n","import {\n getActiveOrgGatewayAttachmentByTeamAndChannel,\n runWithProjectDatabase,\n} from \"@keystrokehq/database\";\nimport {\n listOAuthInstallationsByAppSlugAndExternalId,\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n type ResolvedOAuthInstallation,\n} from \"@keystrokehq/platform-database\";\n\nexport type SlackOrgRoutingResult =\n | { kind: \"none\" }\n | { kind: \"single\"; installation: ResolvedOAuthInstallation }\n | { kind: \"bound\"; installation: ResolvedOAuthInstallation }\n | { kind: \"unbound\"; installations: ResolvedOAuthInstallation[] }\n | { kind: \"conflict\"; organizationIds: string[] };\n\nexport async function routeSlackEventToOrganization(options: {\n appKey: string;\n teamId: string;\n channelId?: string;\n}): Promise<SlackOrgRoutingResult> {\n const installations = await listOAuthInstallationsByAppSlugAndExternalId(\n options.appKey,\n options.teamId,\n );\n\n if (installations.length === 0) {\n return { kind: \"none\" };\n }\n\n if (installations.length === 1) {\n return { kind: \"single\", installation: installations[0]! };\n }\n\n if (!options.channelId) {\n return { kind: \"none\" };\n }\n\n const boundOrgIds: string[] = [];\n\n for (const installation of installations) {\n const organization = await selectOrganizationById(installation.organizationId);\n if (!organization) {\n continue;\n }\n\n const url = resolveOrgDatabaseUrl(organization);\n const binding = await runWithOrganizationScope(organization.id, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, () =>\n getActiveOrgGatewayAttachmentByTeamAndChannel(\"slack\", options.teamId, options.channelId!),\n ),\n );\n\n if (binding) {\n boundOrgIds.push(organization.id);\n }\n }\n\n if (boundOrgIds.length === 1) {\n const installation = installations.find((entry) => entry.organizationId === boundOrgIds[0]!);\n if (installation) {\n return { kind: \"bound\", installation };\n }\n }\n\n if (boundOrgIds.length > 1) {\n return { kind: \"conflict\", organizationIds: boundOrgIds };\n }\n\n return { kind: \"unbound\", installations };\n}\n","import { runWithProjectDatabase } from \"@keystrokehq/database\";\nimport {\n buildSlackGatewaySetupUrl,\n channelIdFromSlackEventPayload,\n isSlackMentionEventPayload,\n postSlackChannelMessage,\n slackSignatureHeaders,\n teamIdFromSlackEventPayload,\n verifySlackSignature,\n} from \"@keystrokehq/slack\";\nimport {\n getGlobalOAuthAccessTokenByAppSlugAndExternalId,\n getOAuthAppSigningSecretBySlugGlobal,\n listOAuthInstallationsByAppSlugAndExternalId,\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport type { Context } from \"hono\";\n\nimport { getOrgSlackIngressRuntime } from \"../../lib/slack-gateway-ingress\";\nimport { routeSlackEventToOrganization } from \"../../lib/slack-gateway-routing\";\n\nconst SLACK_OAUTH_APP_KEY = \"slack\";\n\nfunction slackNotConfiguredResponse() {\n return {\n error: \"slack_not_configured\" as const,\n message: \"Slack OAuth is not configured. Install via the UI or seed oauth_apps.\",\n };\n}\n\nasync function postMultiOrgUnboundMessage(options: {\n teamId: string;\n channelId: string;\n token: string;\n}): Promise<void> {\n const webOrigin = process.env.PUBLIC_WEB_URL?.replace(/\\/$/, \"\");\n const installations = await listOAuthInstallationsByAppSlugAndExternalId(\n SLACK_OAUTH_APP_KEY,\n options.teamId,\n );\n const links: string[] = [];\n\n for (const installation of installations) {\n const organization = await selectOrganizationById(installation.organizationId);\n if (!organization) {\n continue;\n }\n\n const url = buildSlackGatewaySetupUrl(\n webOrigin,\n organization.slug,\n options.channelId,\n options.teamId,\n );\n if (url) {\n links.push(`<${url}|${organization.name ?? organization.slug}>`);\n }\n }\n\n if (links.length === 0) {\n return;\n }\n\n const text = `No agent is configured for this channel. Choose an agent: ${links.join(\" · \")}`;\n await postSlackChannelMessage({\n token: options.token,\n channelId: options.channelId,\n text,\n });\n}\n\nasync function handleSlackEventForOrganization(options: {\n organizationId: string;\n signingSecret: string;\n body: string;\n request: Request;\n teamId: string;\n}): Promise<Response> {\n const organization = await selectOrganizationById(options.organizationId);\n if (!organization) {\n console.warn(\"[gateway:slack] organization missing for installation\", {\n organizationId: options.organizationId,\n teamId: options.teamId,\n });\n return new Response(JSON.stringify({ ok: true, skipped: true }), {\n status: 200,\n headers: { \"content-type\": \"application/json\" },\n });\n }\n\n const url = resolveOrgDatabaseUrl(organization);\n\n return runWithOrganizationScope(organization.id, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, async () => {\n const runtime = await getOrgSlackIngressRuntime(organization, options.signingSecret);\n\n const pending: Promise<unknown>[] = [];\n const verifyRequest = new Request(options.request.url, {\n method: \"POST\",\n headers: options.request.headers,\n body: options.body,\n });\n\n const response = await runtime.webhookHandler(verifyRequest, {\n waitUntil: (promise: Promise<unknown>) => pending.push(promise),\n });\n\n const results = await Promise.allSettled(pending);\n for (const result of results) {\n if (result.status === \"rejected\") {\n console.error(\"[gateway:slack] handler failed\", {\n teamId: options.teamId,\n organizationId: options.organizationId,\n error: result.reason,\n });\n }\n }\n\n return response;\n }),\n );\n}\n\n/**\n * Single shared Slack gateway webhook for all orgs/projects.\n */\nexport function createPlatformSlackGatewayHandler() {\n return async (c: Context): Promise<Response> => {\n const body = await c.req.text();\n const { timestamp, signature } = slackSignatureHeaders(c.req.raw.headers);\n\n let payload: unknown;\n try {\n payload = JSON.parse(body);\n } catch {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n\n if (\n payload &&\n typeof payload === \"object\" &&\n (payload as Record<string, unknown>).type === \"url_verification\"\n ) {\n const challenge = (payload as Record<string, unknown>).challenge;\n if (typeof challenge !== \"string\") {\n return c.json({ error: \"Missing url_verification challenge\" }, 400);\n }\n return c.json({ challenge });\n }\n\n const signingSecret = await getOAuthAppSigningSecretBySlugGlobal(SLACK_OAUTH_APP_KEY);\n if (!signingSecret) {\n return c.json(slackNotConfiguredResponse(), 503);\n }\n\n if (\n !verifySlackSignature({\n signingSecret,\n rawBody: body,\n timestamp,\n signature,\n })\n ) {\n return c.json({ error: \"Invalid signature\" }, 401);\n }\n\n const teamId = teamIdFromSlackEventPayload(payload);\n const channelId = channelIdFromSlackEventPayload(payload);\n\n console.info(\"[gateway:slack] webhook received\", {\n payloadType: (payload as Record<string, unknown>).type,\n eventType: (payload as { event?: { type?: string } }).event?.type,\n teamId,\n channelId,\n });\n\n if (!teamId) {\n console.warn(\"[gateway:slack] skipped: missing team_id\");\n return c.json({ ok: true, skipped: true });\n }\n\n const routing = await routeSlackEventToOrganization({\n appKey: SLACK_OAUTH_APP_KEY,\n teamId,\n channelId,\n });\n\n if (routing.kind === \"none\") {\n console.warn(\"[gateway:slack] skipped: no installation for team\", { teamId });\n return c.json({ ok: true, skipped: true });\n }\n\n if (routing.kind === \"conflict\") {\n console.error(\"[gateway:slack] channel bound in multiple organizations\", {\n teamId,\n channelId,\n organizationIds: routing.organizationIds,\n });\n\n const token = await getGlobalOAuthAccessTokenByAppSlugAndExternalId(\n SLACK_OAUTH_APP_KEY,\n teamId,\n );\n if (token && channelId) {\n await postSlackChannelMessage({\n token,\n channelId,\n text: \"This channel is connected to more than one Keystroke organization. Remove one of the bindings to continue.\",\n });\n }\n\n return c.json({ ok: true, skipped: true });\n }\n\n if (routing.kind === \"unbound\") {\n if (channelId && isSlackMentionEventPayload(payload)) {\n const token = await getGlobalOAuthAccessTokenByAppSlugAndExternalId(\n SLACK_OAUTH_APP_KEY,\n teamId,\n );\n if (token) {\n await postMultiOrgUnboundMessage({ teamId, channelId, token });\n } else {\n console.warn(\"[gateway:slack] cannot post unbound links: missing bot token\", {\n teamId,\n });\n }\n } else {\n console.warn(\"[gateway:slack] skipped: multiple orgs, no channel binding\", {\n teamId,\n channelId,\n });\n }\n return c.json({ ok: true, skipped: true });\n }\n\n const installation =\n routing.kind === \"single\" || routing.kind === \"bound\" ? routing.installation : undefined;\n\n if (!installation) {\n return c.json({ ok: true, skipped: true });\n }\n\n return handleSlackEventForOrganization({\n organizationId: installation.organizationId,\n signingSecret,\n body,\n request: c.req.raw,\n teamId,\n });\n };\n}\n","import { Hono } from \"hono\";\n\nimport { createPlatformSlackGatewayHandler } from \"./slack-webhook\";\n\nconst SLACK_GATEWAY_PATH = \"/gateways/slack\";\n\nexport function mountSlackGatewayRoutes(): Hono {\n const gateways = new Hono();\n gateways.post(SLACK_GATEWAY_PATH, createPlatformSlackGatewayHandler());\n return gateways;\n}\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { selectProjectById } from \"@keystrokehq/platform-database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { PublicProjectRuntimeVariables } from \"../auth/types\";\n\nexport function resolvePublicProject(): MiddlewareHandler<{\n Variables: PublicProjectRuntimeVariables;\n}> {\n return async (c, next) => {\n const projectId = c.req.param(\"projectId\")?.trim();\n if (!projectId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project id is required\" }), 400);\n }\n\n const project = await selectProjectById(projectId);\n if (!project) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n }\n\n c.set(\"project\", project);\n await next();\n };\n}\n","import {\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectActiveArtifactManifestForProject,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport {\n runWithProjectDatabase,\n runWithProjectScope,\n runWithTenantScope,\n} from \"@keystrokehq/database\";\nimport type { StoredRouteManifest } from \"@keystrokehq/shared\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { PublicProjectRuntimeVariables } from \"../auth/types\";\nimport { getProjectScheduler } from \"../lib/project-scheduler\";\n\nexport function withPublicProjectRuntime(): MiddlewareHandler<{\n Variables: PublicProjectRuntimeVariables;\n}> {\n return async (c, next) => {\n const project = c.get(\"project\");\n\n if (project.status !== \"active\") {\n return c.json({ error: \"Project is not active\" }, 503);\n }\n\n const organization = await selectOrganizationById(project.organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const url = resolveOrgDatabaseUrl(organization);\n\n await runWithOrganizationScope(project.organizationId, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, async () =>\n runWithProjectScope(project.id, async () =>\n runWithTenantScope(project.organizationId, async () => {\n const manifestRaw = await selectActiveArtifactManifestForProject(project.id);\n if (!manifestRaw || typeof manifestRaw !== \"object\") {\n return c.json({ error: \"Project runtime manifest is not available\" }, 503);\n }\n\n const scheduler = await getProjectScheduler(organization, project.id);\n c.set(\"jobQueue\", scheduler);\n c.set(\"scheduler\", scheduler);\n c.set(\"manifest\", manifestRaw as StoredRouteManifest);\n await next();\n }),\n ),\n ),\n );\n };\n}\n","import {\n enqueueWebhookIngress,\n loadWebhookAttachmentSchemasForRoute,\n matchWebhookPayload,\n} from \"@keystrokehq/server\";\nimport { webhookRouteFromEndpoint } from \"@keystrokehq/manifest\";\nimport type { Context } from \"hono\";\n\nexport function createPlatformWebhookIngressHandler(route: string) {\n return async (c: Context): Promise<Response> => {\n const schemas = await loadWebhookAttachmentSchemasForRoute(route);\n if (schemas.length === 0) {\n return c.json({ error: \"Webhook route not found\" }, 404);\n }\n\n let payload: unknown;\n\n try {\n payload = await c.req.json();\n } catch {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n\n const matches = matchWebhookPayload(payload, schemas);\n if (matches.length === 0) {\n return c.json({ ok: true, skipped: true });\n }\n\n const runId = await enqueueWebhookIngress({\n route,\n matches,\n jobQueue: c.get(\"jobQueue\"),\n });\n\n return c.json({ runId }, 202);\n };\n}\n\nexport function webhookRouteFromRequestPath(endpointSuffix: string): string {\n return webhookRouteFromEndpoint(endpointSuffix);\n}\n","import { resumeWorkflowHook } from \"@keystrokehq/server\";\nimport type { Context } from \"hono\";\n\n/**\n * In-process hook resume (PR1): resolves the token against the org DB, appends\n * hook_resumed, and enqueues the run's advance job on the per-project queue.\n * PR4 will replace this with a proxy to the project container.\n */\nexport function createPlatformHookResumeHandler() {\n return async (c: Context): Promise<Response> => {\n const token = c.req.param(\"token\")?.trim();\n if (!token) {\n return c.json({ error: \"Hook token is required\" }, 400);\n }\n\n let payload: unknown = {};\n const contentType = c.req.header(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n try {\n payload = await c.req.json();\n } catch {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n }\n\n const result = await resumeWorkflowHook(token, payload, { jobQueue: c.get(\"jobQueue\") });\n if (!result.ok) {\n return c.json({ error: result.error }, result.status);\n }\n return c.json({ runId: result.runId }, 202);\n };\n}\n","import { extractWebhookApiKeyFromRequest } from \"@keystrokehq/auth\";\nimport { verifyWebhookApiKeyForRoute } from \"@keystrokehq/platform-database\";\nimport { Hono } from \"hono\";\n\nimport type { PublicProjectRuntimeVariables } from \"../../auth/types\";\nimport { resolvePublicProject } from \"../../middleware/resolve-public-project\";\nimport { withPublicProjectRuntime } from \"../../middleware/with-public-project-runtime\";\nimport {\n createPlatformWebhookIngressHandler,\n webhookRouteFromRequestPath,\n} from \"../runtime/handlers/webhook-ingress\";\nimport { createPlatformHookResumeHandler } from \"../runtime/handlers/hook-resume\";\n\nexport function mountWebhookRoutes(): Hono<{ Variables: PublicProjectRuntimeVariables }> {\n const webhooks = new Hono<{ Variables: PublicProjectRuntimeVariables }>();\n\n webhooks.use(\"/:projectId/triggers/:endpoint{.+}\", resolvePublicProject());\n webhooks.use(\"/:projectId/triggers/:endpoint{.+}\", withPublicProjectRuntime());\n\n webhooks.use(\"/:projectId/hooks/:token/resume\", resolvePublicProject());\n webhooks.use(\"/:projectId/hooks/:token/resume\", withPublicProjectRuntime());\n webhooks.post(\"/:projectId/hooks/:token/resume\", createPlatformHookResumeHandler());\n\n webhooks.post(\"/:projectId/triggers/:endpoint{.+}\", async (c) => {\n const suffix = c.req.param(\"endpoint\")?.trim() ?? \"\";\n if (!suffix) {\n return c.json({ error: \"Webhook endpoint is required\" }, 400);\n }\n\n const route = webhookRouteFromRequestPath(suffix);\n const secret = extractWebhookApiKeyFromRequest(c.req.raw);\n if (!secret) {\n return c.json({ error: \"Webhook API key is required\" }, 401);\n }\n\n const projectRow = c.get(\"project\");\n const valid = await verifyWebhookApiKeyForRoute(projectRow.id, route, secret);\n if (!valid) {\n return c.json({ error: \"Invalid webhook API key\" }, 401);\n }\n\n return createPlatformWebhookIngressHandler(route)(c);\n });\n\n return webhooks;\n}\n","import type { Auth } from \"@keystrokehq/auth\";\nimport type { PlatformConfig } from \"./config\";\nimport { ACTIVE_ORG_HEADER } from \"@keystrokehq/shared\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\n\nimport { mountAuth } from \"./auth/mount\";\nimport type { SessionVariables } from \"./auth/types\";\nimport { mountAccountRoutes } from \"./routes/account/mount\";\nimport { mountRootMcpRoutes } from \"./routes/account/mcp/mount\";\nimport { mountInternalRoutes } from \"./routes/internal/mount\";\nimport { mountOAuthCallbacks, mountRuntimeRoutes } from \"./routes/runtime/mount\";\nimport { createOAuthTokenRefreshRegistry } from \"@keystrokehq/server\";\nimport { mountSlackGatewayRoutes } from \"./routes/gateways/mount\";\nimport { mountWebhookRoutes } from \"./routes/webhooks/mount\";\n\nexport type CreateAppOptions = {\n /** Browser origin allowed for credentialed cross-origin requests (e.g. http://localhost:3000). */\n webOrigin?: string;\n hosting: PlatformConfig[\"hosting\"];\n storage: PlatformConfig[\"storage\"];\n llmProxy?: PlatformConfig[\"llmProxy\"];\n mcp?: PlatformConfig[\"mcp\"];\n};\n\nexport async function createApp(\n auth: Auth,\n options: CreateAppOptions,\n): Promise<Hono<{ Variables: SessionVariables }>> {\n const app = new Hono<{ Variables: SessionVariables }>();\n const tokenRefresh = createOAuthTokenRefreshRegistry();\n\n if (options.webOrigin) {\n app.use(\n \"*\",\n cors({\n origin: options.webOrigin,\n credentials: true,\n allowHeaders: [\"Content-Type\", \"Authorization\", ACTIVE_ORG_HEADER],\n maxAge: 86400,\n }),\n );\n }\n\n mountAuth(app, auth);\n app.route(\"/api/projects\", mountWebhookRoutes());\n app.route(\"/api\", mountSlackGatewayRoutes());\n // OAuth callbacks must mount before account/runtime routes — account requires a JWT\n // bearer on `/*`; a bare browser redirect from Google carries no Authorization header.\n app.route(\"/api\", await mountOAuthCallbacks(tokenRefresh));\n app.route(\"/mcp\", mountRootMcpRoutes({ mcp: options.mcp }));\n app.route(\n \"/api\",\n mountAccountRoutes({\n hosting: options.hosting,\n storage: options.storage,\n mcp: options.mcp,\n }),\n );\n app.route(\"/api\", await mountRuntimeRoutes(tokenRefresh));\n app.route(\n \"/internal\",\n mountInternalRoutes(options.hosting.workerRuntime.workerToken, tokenRefresh, options.llmProxy),\n );\n\n app.get(\"/health\", (c) => c.json({ ok: true }));\n\n app.get(\"/\", (c) =>\n c.json({\n service: \"keystroke-cloud-platform\",\n }),\n );\n\n return app;\n}\n","import { serve } from \"@hono/node-server\";\nimport { createAuth, resolveCrossSubDomainCookieDomain } from \"@keystrokehq/auth\";\nimport { listenPortFromPublicUrl } from \"@keystrokehq/shared\";\nimport {\n ensureProjectPgBossGrants,\n initDatabase,\n resolveProjectRuntimeDatabase,\n selectProjectArtifactById,\n selectProjectById,\n createOrgContainerPresign,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport { ensureKeystrokeAssetsBucket } from \"@keystrokehq/storage\";\nimport { seedOAuthAppsFromEnvForAllOrganizations } from \"@keystrokehq/server\";\nimport type { PlatformConfig } from \"./config\";\nimport { resolveRuntimeArtifact, startProjectRuntimeWorker } from \"@keystrokehq/projects\";\nimport { defaultSchedulerPlugin, resolveSchedulerPluginFromEnv } from \"@keystrokehq/scheduler\";\nimport type { Hono } from \"hono\";\n\nimport { createApp } from \"./app\";\nimport type { SessionVariables } from \"./auth/types\";\n\nexport type StartPlatformServerHooks = {\n afterCreateApp?: (app: Hono<{ Variables: SessionVariables }>) => void | Promise<void>;\n};\n\n/** Fly `internal_port` — not the public HTTPS URL port. */\nconst PRODUCTION_PLATFORM_LISTEN_PORT = 8080;\nconst LOCAL_PLATFORM_PORT = 3002;\n\nfunction resolvePlatformListenPort(): number {\n if (process.env.NODE_ENV === \"production\") {\n return PRODUCTION_PLATFORM_LISTEN_PORT;\n }\n\n return listenPortFromPublicUrl(process.env.PUBLIC_PLATFORM_URL, LOCAL_PLATFORM_PORT);\n}\n\nasync function usesPgBossScheduler(): Promise<boolean> {\n const plugin = (await resolveSchedulerPluginFromEnv(process.env)) ?? defaultSchedulerPlugin();\n return plugin.name === \"pg-boss\" || plugin.name === \"default\";\n}\n\nexport async function startPlatformServer(\n platformConfig: PlatformConfig,\n hooks: StartPlatformServerHooks = {},\n): Promise<void> {\n const runtime = platformConfig.hosting.createRuntime();\n\n await initDatabase();\n await ensureKeystrokeAssetsBucket();\n process.env.KEYSTROKE_SECRETS_MODE = \"platform\";\n await seedOAuthAppsFromEnvForAllOrganizations();\n\n if (await usesPgBossScheduler()) {\n await ensureProjectPgBossGrants();\n }\n\n await startProjectRuntimeWorker(runtime, {\n resolveStartInput: async (job) => {\n const project = await selectProjectById(job.projectId);\n if (!project) {\n throw new Error(`Project ${job.projectId} not found`);\n }\n\n const resolved = resolveRuntimeArtifact(project, job.artifactId);\n if (resolved.action === \"error\") {\n throw new Error(resolved.message);\n }\n if (resolved.action === \"skip\") {\n throw new Error(`Project ${job.projectId} has no deploy artifact to start`);\n }\n\n const artifact = await selectProjectArtifactById(resolved.artifactId);\n if (!artifact || artifact.status !== \"ready\") {\n throw new Error(`Project ${job.projectId} pending artifact is not ready`);\n }\n\n const organization = await selectOrganizationById(project.organizationId);\n if (!organization) {\n throw new Error(`Organization not found for project ${job.projectId}`);\n }\n\n const containerPresign = createOrgContainerPresign(organization);\n const artifactUrl = await containerPresign.presignGet({ key: artifact.storageKey });\n\n const workerRuntime = platformConfig.hosting.workerRuntime;\n\n return {\n projectId: job.projectId,\n name: job.name,\n artifactId: resolved.artifactId,\n artifactUrl,\n database: await resolveProjectRuntimeDatabase({\n organizationId: project.organizationId,\n projectId: project.id,\n }),\n env: platformConfig.llmProxy?.workerEnv({\n platformUrl: workerRuntime.platformUrl,\n workerToken: workerRuntime.workerToken,\n projectId: project.id,\n }),\n hosting: organization.hostingAppName ? { appName: organization.hostingAppName } : undefined,\n previousRuntimeId: project.runtimeId,\n };\n },\n });\n\n const webUrl = process.env.PUBLIC_WEB_URL;\n if (!webUrl) {\n throw new Error(\"PUBLIC_WEB_URL is required for the platform server\");\n }\n\n const platformUrl = process.env.PUBLIC_PLATFORM_URL?.replace(/\\/+$/, \"\");\n if (!platformUrl) {\n throw new Error(\"PUBLIC_PLATFORM_URL is required for the platform server\");\n }\n\n const crossSubDomainCookieDomain = resolveCrossSubDomainCookieDomain(webUrl, platformUrl);\n\n const auth = createAuth({\n baseURL: platformUrl,\n verificationUri: `${webUrl.replace(/\\/+$/, \"\")}/device`,\n trustedOrigins: [webUrl],\n crossSubDomainCookieDomain,\n });\n if (!auth) {\n throw new Error(\"BETTER_AUTH_SECRET is required for the platform server\");\n }\n\n const app = await createApp(auth, {\n webOrigin: webUrl,\n hosting: platformConfig.hosting,\n storage: platformConfig.storage,\n llmProxy: platformConfig.llmProxy,\n mcp: platformConfig.mcp,\n });\n await hooks.afterCreateApp?.(app);\n const port = resolvePlatformListenPort();\n\n serve({ fetch: app.fetch, port }, (info) => {\n console.log(`Platform API listening on http://localhost:${info.port}`);\n });\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],"mappings":"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"}
|