@keystrokehq/platform 0.0.115 → 0.0.117

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.
@@ -1 +1 @@
1
- {"version":3,"file":"start-BnTz6Vci.mjs","names":["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","listOrganizations","checkOrganizationSlugAvailability","getActiveOrganization","setActiveOrganization","updateActiveOrganization","clearActiveOrganization","listOrganizationInvitations","acceptOrganizationInvitation","declineOrganizationInvitation","listOrganizationMembers","inviteOrganizationMembers","updateOrganizationMember","removeOrganizationMember","listAgents","getAgent","listWorkflows","getWorkflow","listSkills","getSkill","listProjects","createProject","getProject","listProjectFiles","getProjectFileContent","createProjectArtifact","completeProjectArtifact","presignProjectArtifactSource","uploadProjectArtifactSourceManifest"],"sources":["../../../packages/auth/dist/constants-BaNTvWUo.mjs","../../../packages/platform-database/dist/schema/auth/index.mjs","../../../packages/auth/dist/index.mjs","../../../packages/projects/dist/index.mjs","../src/auth/mount.ts","../src/auth/require-org-admin.ts","../src/auth/resolve-org-id.ts","../src/auth/require-organization.ts","../src/auth/require-project.ts","../src/auth/require-session.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/active/GET.ts","../src/routes/account/organizations/active/POST.ts","../src/routes/account/organizations/active/DELETE.ts","../src/routes/account/organizations/active/PATCH.ts","../src/routes/account/resources/common.ts","../src/routes/account/resources/agents.ts","../src/routes/account/agents/GET.ts","../src/routes/account/agents/[agentId]/GET.ts","../src/routes/account/resources/workflows.ts","../src/routes/account/workflows/GET.ts","../src/routes/account/workflows/[workflowId]/GET.ts","../src/routes/account/resources/skills.ts","../src/routes/account/skills/GET.ts","../src/routes/account/skills/[skillId]/GET.ts","../src/routes/account/projects/GET.ts","../src/routes/account/projects/POST.ts","../src/routes/account/projects/[projectId]/GET.ts","../src/routes/account/projects/[projectId]/artifacts/POST.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/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/mount.ts","../src/lib/platform-origin.ts","../src/middleware/require-worker-token.ts","../src/routes/internal/mount.ts","../src/middleware/with-organization-database.ts","../src/middleware/with-organization-project-database.ts","../src/lib/project-scheduler.ts","../src/middleware/with-project-runtime.ts","../src/routes/runtime/handlers/agent-prompt.ts","../src/routes/runtime/handlers/workflow-run.ts","../src/routes/runtime/mount.ts","../src/lib/slack-gateway-ingress.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":["//#region src/constants.ts\n/** OAuth device-flow client id for `keystroke auth login`. */\nconst CLI_CLIENT_ID = \"keystroke-cli\";\n//#endregion\nexport { CLI_CLIENT_ID as t };\n\n//# sourceMappingURL=constants-BaNTvWUo.mjs.map","import { a as users, i as authAccounts, n as authSessions, o as getDatabaseHandle, r as authDeviceCodes, t as authVerifications } from \"../../auth-verifications-BsbmfOum.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};\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 { t as CLI_CLIENT_ID } from \"./constants-BaNTvWUo.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 { lastLoginMethod } from \"better-auth/plugins\";\nimport { magicLink } from \"better-auth/plugins/magic-link\";\nimport { Resend } from \"resend\";\nimport { normalizeUserEmail, selectUserByNormalizedEmail } from \"@keystrokehq/platform-database\";\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(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\")}</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\treturn betterAuth({\n\t\tsecret: options.secret,\n\t\tbaseURL: options.baseURL,\n\t\ttrustedOrigins: options.trustedOrigins,\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\tbearer()\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_WEB_URL;\n\tif (!baseURL) throw new Error(\"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/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, extractWebhookApiKeyFromRequest, handleAuthRequest, isGitHubSignInConfigured, isGoogleSignInConfigured, isMagicLinkSignInConfigured, resolveAuthEmailFrom };\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, fetchStoredRouteManifest, syncRegistryFromStoredManifest, webhookRouteFromEndpoint } from \"@keystrokehq/server\";\nimport { parseStoredRouteManifest } from \"@keystrokehq/shared\";\nimport { getPgBoss } 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 fetchStoredRouteManifest(input.baseUrl);\n}\n/** Cut over activeArtifactId, then sync org project registry from the runtime 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\tconst manifest = await resolveDeployManifest({\n\t\tartifactManifest: artifact.manifestJson,\n\t\tbaseUrl: input.baseUrl\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.key]);\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}\n//#endregion\n//#region src/runtime-jobs.ts\nconst PROJECT_RUNTIME_QUEUE = \"project.runtime\";\nconst PROJECT_RUNTIME_DLQ = \"project.runtime.dlq\";\nasync function ensureProjectRuntimeQueues(boss) {\n\tawait boss.createQueue(PROJECT_RUNTIME_DLQ);\n\tawait boss.createQueue(PROJECT_RUNTIME_QUEUE, {\n\t\tretryLimit: 5,\n\t\tretryDelay: 30,\n\t\tretryBackoff: true,\n\t\texpireInSeconds: 600,\n\t\tdeadLetter: PROJECT_RUNTIME_DLQ\n\t});\n}\nasync function enqueueProjectRuntime(job) {\n\treturn getPgBoss().send(PROJECT_RUNTIME_QUEUE, job, { singletonKey: job.projectId });\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}\nfunction startProjectRuntimeWorker(runtime, options = {}) {\n\tconst boss = getPgBoss();\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\tboss.work(PROJECT_RUNTIME_QUEUE, async (jobs) => {\n\t\tfor (const job of jobs) try {\n\t\t\tconst project = await selectProjectById(job.data.projectId);\n\t\t\tif (!project) throw new Error(`Project ${job.data.projectId} not found`);\n\t\t\tconst resolved = resolveRuntimeArtifact(project, job.data.artifactId);\n\t\t\tif (resolved.action === \"skip\") continue;\n\t\t\tif (resolved.action === \"error\") throw new Error(resolved.message);\n\t\t\tconst input = await resolveStartInput({\n\t\t\t\t...job.data,\n\t\t\t\tartifactId: resolved.artifactId\n\t\t\t});\n\t\t\tlet result;\n\t\t\ttry {\n\t\t\t\tresult = await runtime.start(input);\n\t\t\t\tawait promoteProjectDeploy({\n\t\t\t\t\tprojectId: job.data.projectId,\n\t\t\t\t\tartifactId: resolved.artifactId,\n\t\t\t\t\tbaseUrl: result.baseUrl\n\t\t\t\t});\n\t\t\t\tawait updateProjectActive(job.data.projectId, result);\n\t\t\t\tif (input.previousRuntimeId) await destroyProjectRuntime(runtime, input, input.previousRuntimeId);\n\t\t\t} catch (error) {\n\t\t\t\tif (result) await destroyProjectRuntime(runtime, input, result.runtimeId);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`[project.runtime] ${job.data.projectId} failed`, error);\n\t\t\tthrow error;\n\t\t}\n\t});\n\tboss.work(PROJECT_RUNTIME_DLQ, async (jobs) => {\n\t\tfor (const job of jobs) await updateProjectFailed(job.data.projectId, \"Project runtime failed after retries\");\n\t});\n}\n//#endregion\nexport { enqueueProjectRuntime, ensureProjectRuntimeQueues, promoteProjectDeploy, 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","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { OrganizationVariables } from \"./types\";\n\nconst adminRoles = new Set([\"owner\", \"admin\"]);\n\nexport function requireOrgAdmin(): MiddlewareHandler<{ Variables: OrganizationVariables }> {\n return async (c, next) => {\n const { role } = c.get(\"organization\");\n\n if (!adminRoles.has(role)) {\n return c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403);\n }\n\n await next();\n };\n}\n","import { ACTIVE_ORG_COOKIE, ACTIVE_ORG_HEADER } from \"@keystrokehq/shared\";\nimport type { Context } from \"hono\";\nimport { getCookie } from \"hono/cookie\";\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 const cookie = getCookie(c, ACTIVE_ORG_COOKIE)?.trim();\n return cookie || undefined;\n}\n\nexport function activeOrganizationCookie(organizationId: string): string {\n return `${ACTIVE_ORG_COOKIE}=${organizationId}; Path=/; HttpOnly; SameSite=Lax`;\n}\n\nexport function clearActiveOrganizationCookie(): string {\n return `${ACTIVE_ORG_COOKIE}=; Path=/; Max-Age=0; HttpOnly; SameSite=Lax`;\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\";\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 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, 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 type { Auth } from \"@keystrokehq/auth\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { SessionVariables } from \"./types\";\n\nexport function requireSession(auth: Auth): MiddlewareHandler<{ Variables: SessionVariables }> {\n return async (c, next) => {\n const result = await auth.api.getSession({ headers: c.req.raw.headers });\n\n if (!result) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n\n c.set(\"user\", result.user);\n c.set(\"session\", result.session);\n await next();\n };\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 slug: identity.slug,\n });\n hostedAppName = hosted.appName;\n }\n\n provisionedStorage = await storage.provisionOrganization({\n organizationId: identity.organizationId,\n name: name.trim(),\n slug: identity.slug,\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 { resolveActiveOrganizationId } from \"../../../../auth/resolve-org-id\";\nimport type { AccountRouteHandler } from \"../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const organizationId = resolveActiveOrganizationId(c);\n\n if (!organizationId) {\n return c.json(ActiveOrganizationResponseSchema.parse({ organization: null }));\n }\n\n const user = c.get(\"user\");\n const membership = await selectUserOrganizationMembership(user.id, organizationId);\n\n return c.json(\n ActiveOrganizationResponseSchema.parse({\n organization: membership ? mapUserOrganization(membership) : null,\n }),\n );\n};\n","import {\n ActiveOrganizationResponseSchema,\n ErrorResponseSchema,\n SetActiveOrganizationRequestSchema,\n mapUserOrganization,\n} from \"@keystrokehq/shared\";\nimport { selectUserOrganizationMembership } from \"@keystrokehq/platform-database\";\n\nimport { activeOrganizationCookie } from \"../../../../auth/resolve-org-id\";\nimport type { AccountRouteHandler } from \"../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const body = await c.req.json().catch(() => null);\n const parsed = SetActiveOrganizationRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization id is required\" }), 400);\n }\n\n const membership = await selectUserOrganizationMembership(user.id, parsed.data.organizationId);\n\n if (!membership) {\n return c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403);\n }\n\n c.header(\"Set-Cookie\", activeOrganizationCookie(membership.organization.id));\n\n return c.json(\n ActiveOrganizationResponseSchema.parse({\n organization: mapUserOrganization(membership),\n }),\n );\n};\n","import { ActiveOrganizationResponseSchema } from \"@keystrokehq/shared\";\n\nimport { clearActiveOrganizationCookie } from \"../../../../auth/resolve-org-id\";\nimport type { AccountRouteHandler } from \"../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n c.header(\"Set-Cookie\", clearActiveOrganizationCookie());\n\n return c.json(ActiveOrganizationResponseSchema.parse({ organization: null }));\n};\n","import {\n ActiveOrganizationResponseSchema,\n ErrorResponseSchema,\n mapUserOrganization,\n UpdateOrganizationRequestSchema,\n} from \"@keystrokehq/shared\";\nimport { OrganizationSlugTakenError, updateOrganizationSlug } 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 return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(parsed.error)), 400);\n }\n\n try {\n const updated = await updateOrganizationSlug(organization.organizationId, parsed.data.slug);\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 {\n PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n StoredProjectSourceManifestSchema,\n type StoredProjectSourceManifest,\n} from \"@keystrokehq/shared\";\nimport type { ActiveProjectArtifactManifestRow } from \"@keystrokehq/platform-database\";\n\nexport type ResourceKind = \"agent\" | \"workflow\" | \"skill\";\n\nexport type ResourceIdentity<TKind extends ResourceKind = ResourceKind> = {\n kind: TKind;\n projectId: string;\n key: string;\n};\n\nexport type ResourceSummaryBase = {\n name: string;\n updatedAt: string;\n};\n\nexport function encodeResourceId(kind: ResourceKind, projectId: string, key: string): string {\n return `${kind}_${Buffer.from(`${projectId}:${key}`).toString(\"base64url\")}`;\n}\n\nexport function decodeResourceId<TKind extends ResourceKind>(\n id: string,\n expectedKind: TKind,\n): ResourceIdentity<TKind> | null {\n const [kind, payload] = id.split(\"_\", 2);\n if (kind !== expectedKind || !payload) {\n return null;\n }\n\n let decoded: string;\n try {\n decoded = Buffer.from(payload, \"base64url\").toString(\"utf8\");\n } catch {\n return null;\n }\n\n const separator = decoded.indexOf(\":\");\n if (separator <= 0) {\n return null;\n }\n\n const projectId = decoded.slice(0, separator);\n const key = decoded.slice(separator + 1);\n if (!projectId || !key) {\n return null;\n }\n\n return { kind: expectedKind, projectId, key };\n}\n\nexport function titleCaseKey(key: string): string {\n const normalized = key\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\nexport function updatedAtForRow(\n row: ActiveProjectArtifactManifestRow,\n generatedAt?: string,\n): string {\n return generatedAt ?? row.artifactUpdatedAt.toISOString();\n}\n\nexport function parseSourceManifest(\n row: ActiveProjectArtifactManifestRow,\n): StoredProjectSourceManifest | null {\n const parsed = StoredProjectSourceManifestSchema.safeParse(row.sourceManifestJson);\n return parsed.success ? parsed.data : null;\n}\n\nexport function compareResourceSummaries<TSummary extends ResourceSummaryBase>(\n left: TSummary,\n right: TSummary,\n): number {\n const byUpdatedAt = right.updatedAt.localeCompare(left.updatedAt);\n if (byUpdatedAt !== 0) {\n return byUpdatedAt;\n }\n\n return left.name.localeCompare(right.name);\n}\n","import {\n AgentSummarySchema,\n PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP,\n type AgentSummary,\n type ProjectSourceResourceRef,\n} from \"@keystrokehq/shared\";\nimport type { ActiveProjectArtifactManifestRow } from \"@keystrokehq/platform-database\";\n\nimport {\n compareResourceSummaries,\n decodeResourceId,\n encodeResourceId,\n parseSourceManifest,\n titleCaseKey,\n updatedAtForRow,\n type ResourceIdentity,\n} from \"./common\";\n\nexport function decodeAgentSummaryId(id: string): ResourceIdentity<\"agent\"> | null {\n return decodeResourceId(id, \"agent\");\n}\n\nfunction buildAgentSummary(\n row: ActiveProjectArtifactManifestRow,\n ref: ProjectSourceResourceRef,\n updatedAt: string,\n): AgentSummary {\n return AgentSummarySchema.parse({\n id: encodeResourceId(\"agent\", row.projectId, ref.key),\n name: titleCaseKey(ref.key),\n projectId: row.projectId,\n updatedAt,\n description: PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n sourcePath: ref.path,\n model: PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n toolCount: PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n credentialCount: PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n lastRunAt: PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP,\n });\n}\n\nexport function buildAgentSummaries(rows: ActiveProjectArtifactManifestRow[]): AgentSummary[] {\n const agents: AgentSummary[] = [];\n\n for (const row of rows) {\n const sourceManifest = parseSourceManifest(row);\n if (!sourceManifest) {\n continue;\n }\n\n const updatedAt = updatedAtForRow(row, sourceManifest.generatedAt);\n agents.push(\n ...sourceManifest.resources.agents.map((ref) => buildAgentSummary(row, ref, updatedAt)),\n );\n }\n\n return agents.sort(compareResourceSummaries);\n}\n","import { AgentSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { buildAgentSummaries } from \"../resources/agents\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n\n return c.json(AgentSummaryListResponseSchema.parse(buildAgentSummaries(rows)));\n};\n","import { AgentSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { buildAgentSummaries, decodeAgentSummaryId } from \"../../resources/agents\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const agentId = c.req.param(\"agentId\") ?? \"\";\n const identity = decodeAgentSummaryId(agentId);\n if (!identity) {\n return c.json(AgentSummaryDetailResponseSchema.parse(null));\n }\n\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n const agents = buildAgentSummaries(rows.filter((row) => row.projectId === identity.projectId));\n\n return c.json(\n AgentSummaryDetailResponseSchema.parse(agents.find((agent) => agent.id === agentId) ?? null),\n );\n};\n","import {\n PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP,\n StoredRouteManifestSchema,\n WorkflowSummarySchema,\n type ProjectSourceResourceRef,\n type StoredRouteManifest,\n type WorkflowSummary,\n} from \"@keystrokehq/shared\";\nimport type { ActiveProjectArtifactManifestRow } from \"@keystrokehq/platform-database\";\n\nimport {\n compareResourceSummaries,\n decodeResourceId,\n encodeResourceId,\n parseSourceManifest,\n titleCaseKey,\n updatedAtForRow,\n type ResourceIdentity,\n} from \"./common\";\n\nexport function decodeWorkflowSummaryId(id: string): ResourceIdentity<\"workflow\"> | null {\n return decodeResourceId(id, \"workflow\");\n}\n\nfunction parseRouteManifest(value: unknown): StoredRouteManifest | null {\n const parsed = StoredRouteManifestSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n\nfunction workflowNameByKey(manifest: StoredRouteManifest | null): Map<string, string> {\n const names = new Map<string, string>();\n if (!manifest) {\n return names;\n }\n\n for (const entry of manifest.entries) {\n if (entry.kind === \"workflow\" && entry.workflowName) {\n names.set(entry.workflowId, entry.workflowName);\n }\n }\n\n return names;\n}\n\nfunction buildWorkflowSummary(\n row: ActiveProjectArtifactManifestRow,\n ref: ProjectSourceResourceRef,\n updatedAt: string,\n namesByKey: Map<string, string>,\n): WorkflowSummary {\n return WorkflowSummarySchema.parse({\n id: encodeResourceId(\"workflow\", row.projectId, ref.key),\n name: namesByKey.get(ref.key) ?? titleCaseKey(ref.key),\n projectId: row.projectId,\n updatedAt,\n description: PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n sourcePath: ref.path,\n stepCount: PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n lastRunAt: PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP,\n });\n}\n\nexport function buildWorkflowSummaries(\n rows: ActiveProjectArtifactManifestRow[],\n): WorkflowSummary[] {\n const workflows: WorkflowSummary[] = [];\n\n for (const row of rows) {\n const sourceManifest = parseSourceManifest(row);\n if (!sourceManifest) {\n continue;\n }\n\n const namesByKey = workflowNameByKey(parseRouteManifest(row.manifestJson));\n const updatedAt = updatedAtForRow(row, sourceManifest.generatedAt);\n workflows.push(\n ...sourceManifest.resources.workflows.map((ref) =>\n buildWorkflowSummary(row, ref, updatedAt, namesByKey),\n ),\n );\n }\n\n return workflows.sort(compareResourceSummaries);\n}\n","import { WorkflowSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { buildWorkflowSummaries } from \"../resources/workflows\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n\n return c.json(WorkflowSummaryListResponseSchema.parse(buildWorkflowSummaries(rows)));\n};\n","import { WorkflowSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { buildWorkflowSummaries, decodeWorkflowSummaryId } from \"../../resources/workflows\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const workflowId = c.req.param(\"workflowId\") ?? \"\";\n const identity = decodeWorkflowSummaryId(workflowId);\n if (!identity) {\n return c.json(WorkflowSummaryDetailResponseSchema.parse(null));\n }\n\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n const workflows = buildWorkflowSummaries(\n rows.filter((row) => row.projectId === identity.projectId),\n );\n\n return c.json(\n WorkflowSummaryDetailResponseSchema.parse(\n workflows.find((workflow) => workflow.id === workflowId) ?? null,\n ),\n );\n};\n","import {\n PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n SkillSummarySchema,\n type ProjectSourceResourceRef,\n type SkillSummary,\n} from \"@keystrokehq/shared\";\nimport type { ActiveProjectArtifactManifestRow } from \"@keystrokehq/platform-database\";\n\nimport {\n compareResourceSummaries,\n decodeResourceId,\n encodeResourceId,\n parseSourceManifest,\n titleCaseKey,\n updatedAtForRow,\n type ResourceIdentity,\n} from \"./common\";\n\nexport function decodeSkillSummaryId(id: string): ResourceIdentity<\"skill\"> | null {\n return decodeResourceId(id, \"skill\");\n}\n\nfunction buildSkillSummary(\n row: ActiveProjectArtifactManifestRow,\n ref: ProjectSourceResourceRef,\n updatedAt: string,\n): SkillSummary {\n return SkillSummarySchema.parse({\n id: encodeResourceId(\"skill\", row.projectId, ref.key),\n name: titleCaseKey(ref.key),\n projectId: row.projectId,\n updatedAt,\n description: PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n sourcePath: ref.path,\n });\n}\n\nexport function buildSkillSummaries(rows: ActiveProjectArtifactManifestRow[]): SkillSummary[] {\n const skills: SkillSummary[] = [];\n\n for (const row of rows) {\n const sourceManifest = parseSourceManifest(row);\n if (!sourceManifest) {\n continue;\n }\n\n const updatedAt = updatedAtForRow(row, sourceManifest.generatedAt);\n skills.push(\n ...sourceManifest.resources.skills.map((ref) => buildSkillSummary(row, ref, updatedAt)),\n );\n }\n\n return skills.sort(compareResourceSummaries);\n}\n","import { SkillSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { buildSkillSummaries } from \"../resources/skills\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n\n return c.json(SkillSummaryListResponseSchema.parse(buildSkillSummaries(rows)));\n};\n","import { SkillSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { buildSkillSummaries, decodeSkillSummaryId } from \"../../resources/skills\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const skillId = c.req.param(\"skillId\") ?? \"\";\n const identity = decodeSkillSummaryId(skillId);\n if (!identity) {\n return c.json(SkillSummaryDetailResponseSchema.parse(null));\n }\n\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n const skills = buildSkillSummaries(rows.filter((row) => row.projectId === identity.projectId));\n\n return c.json(\n SkillSummaryDetailResponseSchema.parse(skills.find((skill) => skill.id === skillId) ?? null),\n );\n};\n","import { ListProjectsResponseSchema, mapProject } from \"@keystrokehq/shared\";\nimport { selectProjectsByOrganizationId } 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 projects = await selectProjectsByOrganizationId(organization.organizationId);\n\n return c.json(\n ListProjectsResponseSchema.parse({\n projects: projects.map(mapProject),\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 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 );\n\n return c.json(\n CreateProjectResponseSchema.parse({\n project: mapProject(project),\n }),\n 201,\n );\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 { 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 });\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 {\n CompleteProjectArtifactResponseSchema,\n ErrorResponseSchema,\n mapProject,\n mapProjectArtifact,\n} from \"@keystrokehq/shared\";\nimport {\n completeProjectArtifact,\n createOrgStorageClient,\n selectOrganizationById,\n selectProjectArtifactForProject,\n} from \"@keystrokehq/platform-database\";\nimport { enqueueProjectRuntime } from \"@keystrokehq/projects\";\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 result = await completeProjectArtifact({\n artifactId,\n projectId: project.id,\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 resources: parsed.data.resources,\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 StoredProjectSourceManifestSchema,\n} from \"@keystrokehq/shared\";\nimport { selectActiveArtifactSourceManifestForProject } 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 active = await selectActiveArtifactSourceManifestForProject(project.id);\n\n // No active deploy, or a deploy whose source upload never landed.\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\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: manifest.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 { 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(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\");\n const inviterLine = payload.inviterName\n ? `<p>${payload.inviterName.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\")} 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 type { Auth } from \"@keystrokehq/auth\";\nimport type { CreateOrganizationDependencies } from \"../../services/create-organization\";\nimport { Hono } from \"hono\";\n\nimport { requireOrgAdmin } from \"../../auth/require-org-admin\";\nimport { requireOrganization } from \"../../auth/require-organization\";\nimport { requireProject } from \"../../auth/require-project\";\nimport { requireSession } from \"../../auth/require-session\";\nimport type {\n OrganizationVariables,\n ProjectRouteVariables,\n SessionVariables,\n} from \"../../auth/types\";\nimport { handler as listOrganizations } from \"./organizations/GET\";\nimport { createOrganizationHandler } from \"./organizations/POST\";\nimport { handler as checkOrganizationSlugAvailability } from \"./organizations/slug-available/GET\";\nimport { handler as getActiveOrganization } from \"./organizations/active/GET\";\nimport { handler as setActiveOrganization } from \"./organizations/active/POST\";\nimport { handler as clearActiveOrganization } from \"./organizations/active/DELETE\";\nimport { handler as updateActiveOrganization } from \"./organizations/active/PATCH\";\nimport { handler as listAgents } from \"./agents/GET\";\nimport { handler as getAgent } from \"./agents/[agentId]/GET\";\nimport { handler as listWorkflows } from \"./workflows/GET\";\nimport { handler as getWorkflow } from \"./workflows/[workflowId]/GET\";\nimport { handler as listSkills } from \"./skills/GET\";\nimport { handler as getSkill } from \"./skills/[skillId]/GET\";\nimport { handler as listProjects } from \"./projects/GET\";\nimport { handler as createProject } from \"./projects/POST\";\nimport { handler as getProject } from \"./projects/[projectId]/GET\";\nimport { handler as createProjectArtifact } from \"./projects/[projectId]/artifacts/POST\";\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 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\";\n\nexport function mountAccountRoutes(\n auth: Auth,\n options: CreateOrganizationDependencies,\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 protect = requireSession(auth);\n\n account.use(\"/*\", protect);\n orgScoped.use(\"/*\", protect);\n orgScoped.use(\"/*\", requireOrganization());\n projectScoped.use(\"/*\", protect);\n projectScoped.use(\"/*\", requireOrganization());\n\n account.get(\"/organizations\", listOrganizations);\n account.get(\"/organizations/slug-available\", checkOrganizationSlugAvailability);\n account.post(\"/organizations\", createOrganizationHandler(options));\n account.get(\"/organizations/active\", getActiveOrganization);\n account.post(\"/organizations/active\", setActiveOrganization);\n account.patch(\"/organizations/active\", requireOrganization(), updateActiveOrganization);\n account.delete(\"/organizations/active\", clearActiveOrganization);\n\n account.get(\"/invitations\", listOrganizationInvitations);\n account.post(\"/invitations/:invitationId/accept\", acceptOrganizationInvitation);\n account.post(\"/invitations/:invitationId/decline\", declineOrganizationInvitation);\n\n const orgAdmin = requireOrgAdmin();\n\n orgScoped.get(\"/members\", listOrganizationMembers);\n orgScoped.post(\"/members/invitations\", orgAdmin, inviteOrganizationMembers);\n orgScoped.patch(\"/members/:userId\", orgAdmin, updateOrganizationMember);\n orgScoped.delete(\"/members/:userId\", orgAdmin, removeOrganizationMember);\n\n orgScoped.get(\"/agents\", listAgents);\n orgScoped.get(\"/agents/:agentId\", getAgent);\n orgScoped.get(\"/workflows\", listWorkflows);\n orgScoped.get(\"/workflows/:workflowId\", getWorkflow);\n orgScoped.get(\"/skills\", listSkills);\n orgScoped.get(\"/skills/:skillId\", getSkill);\n\n orgScoped.get(\"/projects\", listProjects);\n orgScoped.post(\"/projects\", createProject);\n\n projectScoped.get(\"/:projectId\", requireProject(), getProject);\n projectScoped.get(\n \"/:projectId/reachability\",\n requireProject(),\n createProjectReachabilityHandler(options.hosting),\n );\n projectScoped.get(\"/:projectId/files\", requireProject(), listProjectFiles);\n projectScoped.get(\n \"/:projectId/artifacts/:artifactId/files/content\",\n requireProject(),\n getProjectFileContent,\n );\n projectScoped.post(\"/:projectId/artifacts\", requireProject(), createProjectArtifact);\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/complete\",\n requireProject(),\n completeProjectArtifact,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/source/presign\",\n requireProject(),\n presignProjectArtifactSource,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/source/manifest\",\n requireProject(),\n uploadProjectArtifactSourceManifest,\n );\n\n orgScoped.route(\"/projects\", projectScoped);\n account.route(\"/\", orgScoped);\n\n return account;\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/** 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 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","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 { buildWebhookUrl, createCredentialMaterializeHandler } from \"@keystrokehq/server\";\nimport { z } from \"zod\";\n\nimport type { LlmProxyPlugin } from \"../../llm-proxy-plugin\";\nimport { platformWebhookOrigin, publicPlatformOrigin } from \"../../lib/platform-origin\";\nimport { requireWorkerToken } from \"../../middleware/require-worker-token\";\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 llmProxy?: LlmProxyPlugin,\n): Hono {\n const internal = new Hono();\n const protect = requireWorkerToken(workerToken);\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 createCredentialMaterializeHandler()(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 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, publicPlatformOrigin());\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 selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport { runWithProjectDatabase, runWithTenantScope } from \"@keystrokehq/database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { OrganizationVariables } from \"../auth/types\";\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, () => next()),\n ),\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 {\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/server\";\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 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 { prepareAgentSession } from \"@keystrokehq/agent\";\nimport { selectAgentByKey } 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 selectAgentByKey(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 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 { JobQueue } from \"@keystrokehq/scheduler\";\nimport { validationErrorResponse } from \"@keystrokehq/shared\";\nimport {\n enqueueWorkflowRunByKey,\n findWorkflowManifestEntry,\n type StoredRouteManifest,\n} 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 });\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 type { Auth } 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 type StoredRouteManifest,\n} from \"@keystrokehq/server\";\nimport {\n listWebhookApiKeysForProject,\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport {\n runWithProjectDatabase,\n runWithTenantScope,\n selectActiveWorkflowByKey,\n selectAgentByKey,\n getProjectScopeId,\n} from \"@keystrokehq/database\";\nimport type { TriggerListItem } from \"@keystrokehq/shared\";\nimport { type Context, Hono } from \"hono\";\n\nimport { platformWebhookOrigin } from \"../../lib/platform-origin\";\nimport { requireOrganization } from \"../../auth/require-organization\";\nimport { requireProject } from \"../../auth/require-project\";\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 { 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.path.replace(/^\\/agents\\//, \"\"),\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 agentKeysFromManifest(manifest: StoredRouteManifest): Set<string> {\n const keys = new Set<string>();\n for (const entry of manifest.entries) {\n if (entry.kind !== \"agent\") {\n continue;\n }\n keys.add(entry.path.replace(/^\\/agents\\//, \"\"));\n }\n return keys;\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 (agentKeysFromManifest(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 createIntegrationServices(auth: Auth, platformOrigin: string | undefined) {\n const tokenRefresh = createOAuthTokenRefreshRegistry();\n const credentialBackend = createLocalCredentialBackend({ tokenRefresh });\n const oauthAdapter = createOAuthTokenAdapterFromBackend(credentialBackend);\n const oauthRedirectOrigin = platformApiOrigin(platformOrigin);\n\n return {\n tokenRefresh,\n oauthAdapter,\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 auth.api.getSession({ headers });\n return result ? { id: result.user.id } : null;\n },\n resolvePublicServerUrl: () => oauthRedirectOrigin,\n resolveStateContext: (c: Context) => {\n const user = c.get(\"user\") as { id: string } | undefined;\n const organization = c.get(\"organization\") as { organizationId: string } | undefined;\n return { userId: user?.id, orgId: organization?.organizationId };\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`.\n */\nexport async function mountOAuthCallbacks(auth: Auth): Promise<Hono> {\n const platformOrigin = process.env.PUBLIC_PLATFORM_URL?.replace(/\\/$/, \"\");\n const { tokenRefresh, services: baseServices } = createIntegrationServices(auth, platformOrigin);\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,\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 auth: Auth,\n): Promise<Hono<{ Variables: SessionVariables }>> {\n const api = new Hono<{ Variables: ProjectRuntimeVariables }>();\n const protect = requireSession(auth);\n const platformOrigin = process.env.PUBLIC_PLATFORM_URL?.replace(/\\/$/, \"\");\n const { tokenRefresh, services: baseServices } = createIntegrationServices(auth, platformOrigin);\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 session + 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,\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(\"/*\", 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: agentKeysFromManifest(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 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 selectAgentByKey(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 selectActiveWorkflowByKey(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 { resolveOrgDatabaseUrl, type OrganizationRow } 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\n// One ingress runtime per org, shared across requests. The runtime owns a chat-adapter Chat +\n// Postgres state store, so rebuilding it per request would be wasteful.\nconst ingressByOrg = new Map<string, CachedIngress>();\n\n/**\n * Resolve (and cache) the Slack ingress runtime for an org. Must first be called inside the org's\n * scope (the lazy build resolves the org's bot user id from the credential store).\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 + thread 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, 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 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 attachmentId: attachment.attachmentId,\n attachmentKey: attachment.key,\n },\n });\n });\n },\n });\n}\n","import { runWithProjectDatabase } from \"@keystrokehq/database\";\nimport {\n AmbiguousOAuthInstallationError,\n getOAuthAppSigningSecretByKeyGlobal,\n resolveOAuthInstallationByAppKeyAndExternalId,\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport type { Context } from \"hono\";\n\nimport { getOrgSlackIngressRuntime } from \"../../lib/slack-gateway-ingress\";\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\nfunction extractSlackTeamId(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n\n const record = payload as Record<string, unknown>;\n\n if (typeof record.team_id === \"string\" && record.team_id) {\n return record.team_id;\n }\n\n const event = record.event;\n if (event && typeof event === \"object\") {\n const team = (event as Record<string, unknown>).team;\n if (typeof team === \"string\" && team) {\n return team;\n }\n }\n\n const authorizations = record.authorizations;\n if (Array.isArray(authorizations)) {\n for (const entry of authorizations) {\n if (entry && typeof entry === \"object\") {\n const teamId = (entry as Record<string, unknown>).team_id;\n if (typeof teamId === \"string\" && teamId) {\n return teamId;\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Single shared Slack gateway webhook for all orgs/projects.\n *\n * The platform is the untrusted ingress: it resolves the org from the Slack `team_id`, then lets\n * the chat-adapter verify the signature and route the event. Matched messages are enqueued as\n * agent jobs onto the owning project's queue; the per-project worker runs the agent and replies.\n */\nexport function createPlatformSlackGatewayHandler() {\n return async (c: Context): Promise<Response> => {\n const body = await c.req.text();\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 getOAuthAppSigningSecretByKeyGlobal(SLACK_OAUTH_APP_KEY);\n if (!signingSecret) {\n return c.json(slackNotConfiguredResponse(), 503);\n }\n\n const teamId = extractSlackTeamId(payload);\n if (!teamId) {\n return c.json({ ok: true, skipped: true });\n }\n\n let installation;\n try {\n installation = await resolveOAuthInstallationByAppKeyAndExternalId(\n SLACK_OAUTH_APP_KEY,\n teamId,\n );\n } catch (error) {\n if (error instanceof AmbiguousOAuthInstallationError) {\n console.error(\"[gateway:slack] ambiguous installation\", {\n teamId,\n matchCount: error.matchCount,\n });\n return c.json({ error: \"Ambiguous Slack installation\" }, 409);\n }\n throw error;\n }\n\n if (!installation) {\n return c.json({ ok: true, skipped: true });\n }\n\n const organization = await selectOrganizationById(installation.organizationId);\n if (!organization) {\n return c.json({ ok: true, skipped: true });\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, signingSecret);\n\n // The adapter responds 200 immediately and runs handlers via waitUntil; collect those\n // promises and await them so the enqueue completes before we acknowledge Slack.\n const pending: Promise<unknown>[] = [];\n const verifyRequest = new Request(c.req.url, {\n method: \"POST\",\n headers: c.req.raw.headers,\n body,\n });\n\n const response = await runtime.webhookHandler(verifyRequest, {\n waitUntil: (promise: Promise<unknown>) => pending.push(promise),\n });\n await Promise.allSettled(pending);\n return response;\n }),\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/server\";\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 webhookRouteFromEndpoint,\n} from \"@keystrokehq/server\";\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 { mountInternalRoutes } from \"./routes/internal/mount\";\nimport { mountOAuthCallbacks, mountRuntimeRoutes } from \"./routes/runtime/mount\";\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};\n\nexport async function createApp(\n auth: Auth,\n options: CreateAppOptions,\n): Promise<Hono<{ Variables: SessionVariables }>> {\n const app = new Hono<{ Variables: SessionVariables }>();\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 }),\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 uses session\n // middleware on `/*`; a bare browser redirect from Google has no session cookie.\n app.route(\"/api\", await mountOAuthCallbacks(auth));\n app.route(\n \"/api\",\n mountAccountRoutes(auth, {\n hosting: options.hosting,\n storage: options.storage,\n }),\n );\n app.route(\"/api\", await mountRuntimeRoutes(auth));\n app.route(\n \"/internal\",\n mountInternalRoutes(options.hosting.workerRuntime.workerToken, 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 } 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 { seedOAuthAppsFromEnvForAllOrganizations } from \"@keystrokehq/server\";\nimport type { PlatformConfig } from \"./config\";\nimport {\n ensureProjectRuntimeQueues,\n resolveRuntimeArtifact,\n startProjectRuntimeWorker,\n} from \"@keystrokehq/projects\";\nimport { configureSharedScheduler, startPgBoss } 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\nexport async function startPlatformServer(\n platformConfig: PlatformConfig,\n hooks: StartPlatformServerHooks = {},\n): Promise<void> {\n const runtime = platformConfig.hosting.createRuntime();\n\n await initDatabase();\n process.env.KEYSTROKE_SECRETS_MODE = \"platform\";\n await seedOAuthAppsFromEnvForAllOrganizations();\n\n if (platformConfig.scheduler) {\n configureSharedScheduler(platformConfig.scheduler);\n }\n\n const boss = await startPgBoss();\n await ensureProjectRuntimeQueues(boss);\n await ensureProjectPgBossGrants();\n 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 auth = createAuth({\n baseURL: webUrl,\n verificationUri: `${webUrl.replace(/\\/+$/, \"\")}/device`,\n trustedOrigins: [webUrl],\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 });\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"],"mappings":"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"}
1
+ {"version":3,"file":"start-3cyJAXfs.mjs","names":["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","listOrganizations","checkOrganizationSlugAvailability","getActiveOrganization","setActiveOrganization","updateActiveOrganization","clearActiveOrganization","listOrganizationInvitations","acceptOrganizationInvitation","declineOrganizationInvitation","listOrganizationMembers","inviteOrganizationMembers","updateOrganizationMember","removeOrganizationMember","listAgents","getAgent","listWorkflows","getWorkflow","listSkills","getSkill","listProjects","createProject","getProject","listProjectFiles","getProjectFileContent","createProjectArtifact","completeProjectArtifact","presignProjectArtifactSource","uploadProjectArtifactSourceManifest"],"sources":["../../../packages/auth/dist/constants-BaNTvWUo.mjs","../../../packages/platform-database/dist/schema/auth/index.mjs","../../../packages/auth/dist/index.mjs","../../../packages/projects/dist/index.mjs","../src/auth/mount.ts","../src/auth/require-org-admin.ts","../src/auth/resolve-org-id.ts","../src/auth/require-organization.ts","../src/auth/require-project.ts","../src/auth/require-session.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/active/GET.ts","../src/routes/account/organizations/active/POST.ts","../src/routes/account/organizations/active/DELETE.ts","../src/routes/account/organizations/active/PATCH.ts","../src/routes/account/resources/common.ts","../src/routes/account/resources/agents.ts","../src/routes/account/agents/GET.ts","../src/routes/account/agents/[agentId]/GET.ts","../src/routes/account/resources/workflows.ts","../src/routes/account/workflows/GET.ts","../src/routes/account/workflows/[workflowId]/GET.ts","../src/routes/account/resources/skills.ts","../src/routes/account/skills/GET.ts","../src/routes/account/skills/[skillId]/GET.ts","../src/routes/account/projects/GET.ts","../src/routes/account/projects/POST.ts","../src/routes/account/projects/[projectId]/GET.ts","../src/routes/account/projects/[projectId]/artifacts/POST.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/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/mount.ts","../src/lib/platform-origin.ts","../src/middleware/require-worker-token.ts","../src/routes/internal/mount.ts","../src/middleware/with-organization-database.ts","../src/middleware/with-organization-project-database.ts","../src/lib/project-scheduler.ts","../src/middleware/with-project-runtime.ts","../src/routes/runtime/handlers/agent-prompt.ts","../src/routes/runtime/handlers/workflow-run.ts","../src/routes/runtime/mount.ts","../src/lib/slack-gateway-ingress.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":["//#region src/constants.ts\n/** OAuth device-flow client id for `keystroke auth login`. */\nconst CLI_CLIENT_ID = \"keystroke-cli\";\n//#endregion\nexport { CLI_CLIENT_ID as t };\n\n//# sourceMappingURL=constants-BaNTvWUo.mjs.map","import { a as users, i as authAccounts, n as authSessions, o as getDatabaseHandle, r as authDeviceCodes, t as authVerifications } from \"../../auth-verifications-BsbmfOum.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};\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 { t as CLI_CLIENT_ID } from \"./constants-BaNTvWUo.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 { lastLoginMethod } from \"better-auth/plugins\";\nimport { magicLink } from \"better-auth/plugins/magic-link\";\nimport { Resend } from \"resend\";\nimport { normalizeUserEmail, selectUserByNormalizedEmail } from \"@keystrokehq/platform-database\";\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(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\")}</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\treturn betterAuth({\n\t\tsecret: options.secret,\n\t\tbaseURL: options.baseURL,\n\t\ttrustedOrigins: options.trustedOrigins,\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\tbearer()\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_WEB_URL;\n\tif (!baseURL) throw new Error(\"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/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, extractWebhookApiKeyFromRequest, handleAuthRequest, isGitHubSignInConfigured, isGoogleSignInConfigured, isMagicLinkSignInConfigured, resolveAuthEmailFrom };\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, fetchStoredRouteManifest, syncRegistryFromStoredManifest, webhookRouteFromEndpoint } from \"@keystrokehq/server\";\nimport { parseStoredRouteManifest } from \"@keystrokehq/shared\";\nimport { getPgBoss } 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 fetchStoredRouteManifest(input.baseUrl);\n}\n/** Cut over activeArtifactId, then sync org project registry from the runtime 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\tconst manifest = await resolveDeployManifest({\n\t\tartifactManifest: artifact.manifestJson,\n\t\tbaseUrl: input.baseUrl\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.key]);\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}\n//#endregion\n//#region src/runtime-jobs.ts\nconst PROJECT_RUNTIME_QUEUE = \"project.runtime\";\nconst PROJECT_RUNTIME_DLQ = \"project.runtime.dlq\";\nasync function ensureProjectRuntimeQueues(boss) {\n\tawait boss.createQueue(PROJECT_RUNTIME_DLQ);\n\tawait boss.createQueue(PROJECT_RUNTIME_QUEUE, {\n\t\tretryLimit: 5,\n\t\tretryDelay: 30,\n\t\tretryBackoff: true,\n\t\texpireInSeconds: 600,\n\t\tdeadLetter: PROJECT_RUNTIME_DLQ\n\t});\n}\nasync function enqueueProjectRuntime(job) {\n\treturn getPgBoss().send(PROJECT_RUNTIME_QUEUE, job, { singletonKey: job.projectId });\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}\nfunction startProjectRuntimeWorker(runtime, options = {}) {\n\tconst boss = getPgBoss();\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\tboss.work(PROJECT_RUNTIME_QUEUE, async (jobs) => {\n\t\tfor (const job of jobs) try {\n\t\t\tconst project = await selectProjectById(job.data.projectId);\n\t\t\tif (!project) throw new Error(`Project ${job.data.projectId} not found`);\n\t\t\tconst resolved = resolveRuntimeArtifact(project, job.data.artifactId);\n\t\t\tif (resolved.action === \"skip\") continue;\n\t\t\tif (resolved.action === \"error\") throw new Error(resolved.message);\n\t\t\tconst input = await resolveStartInput({\n\t\t\t\t...job.data,\n\t\t\t\tartifactId: resolved.artifactId\n\t\t\t});\n\t\t\tlet result;\n\t\t\ttry {\n\t\t\t\tresult = await runtime.start(input);\n\t\t\t\tawait promoteProjectDeploy({\n\t\t\t\t\tprojectId: job.data.projectId,\n\t\t\t\t\tartifactId: resolved.artifactId,\n\t\t\t\t\tbaseUrl: result.baseUrl\n\t\t\t\t});\n\t\t\t\tawait updateProjectActive(job.data.projectId, result);\n\t\t\t\tif (input.previousRuntimeId) await destroyProjectRuntime(runtime, input, input.previousRuntimeId);\n\t\t\t} catch (error) {\n\t\t\t\tif (result) await destroyProjectRuntime(runtime, input, result.runtimeId);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`[project.runtime] ${job.data.projectId} failed`, error);\n\t\t\tthrow error;\n\t\t}\n\t});\n\tboss.work(PROJECT_RUNTIME_DLQ, async (jobs) => {\n\t\tfor (const job of jobs) await updateProjectFailed(job.data.projectId, \"Project runtime failed after retries\");\n\t});\n}\n//#endregion\nexport { enqueueProjectRuntime, ensureProjectRuntimeQueues, promoteProjectDeploy, 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","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { OrganizationVariables } from \"./types\";\n\nconst adminRoles = new Set([\"owner\", \"admin\"]);\n\nexport function requireOrgAdmin(): MiddlewareHandler<{ Variables: OrganizationVariables }> {\n return async (c, next) => {\n const { role } = c.get(\"organization\");\n\n if (!adminRoles.has(role)) {\n return c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403);\n }\n\n await next();\n };\n}\n","import { ACTIVE_ORG_COOKIE, ACTIVE_ORG_HEADER } from \"@keystrokehq/shared\";\nimport type { Context } from \"hono\";\nimport { getCookie } from \"hono/cookie\";\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 const cookie = getCookie(c, ACTIVE_ORG_COOKIE)?.trim();\n return cookie || undefined;\n}\n\nexport function activeOrganizationCookie(organizationId: string): string {\n return `${ACTIVE_ORG_COOKIE}=${organizationId}; Path=/; HttpOnly; SameSite=Lax`;\n}\n\nexport function clearActiveOrganizationCookie(): string {\n return `${ACTIVE_ORG_COOKIE}=; Path=/; Max-Age=0; HttpOnly; SameSite=Lax`;\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\";\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 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, 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 type { Auth } from \"@keystrokehq/auth\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { SessionVariables } from \"./types\";\n\nexport function requireSession(auth: Auth): MiddlewareHandler<{ Variables: SessionVariables }> {\n return async (c, next) => {\n const result = await auth.api.getSession({ headers: c.req.raw.headers });\n\n if (!result) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n\n c.set(\"user\", result.user);\n c.set(\"session\", result.session);\n await next();\n };\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 slug: identity.slug,\n });\n hostedAppName = hosted.appName;\n }\n\n provisionedStorage = await storage.provisionOrganization({\n organizationId: identity.organizationId,\n name: name.trim(),\n slug: identity.slug,\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 { resolveActiveOrganizationId } from \"../../../../auth/resolve-org-id\";\nimport type { AccountRouteHandler } from \"../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const organizationId = resolveActiveOrganizationId(c);\n\n if (!organizationId) {\n return c.json(ActiveOrganizationResponseSchema.parse({ organization: null }));\n }\n\n const user = c.get(\"user\");\n const membership = await selectUserOrganizationMembership(user.id, organizationId);\n\n return c.json(\n ActiveOrganizationResponseSchema.parse({\n organization: membership ? mapUserOrganization(membership) : null,\n }),\n );\n};\n","import {\n ActiveOrganizationResponseSchema,\n ErrorResponseSchema,\n SetActiveOrganizationRequestSchema,\n mapUserOrganization,\n} from \"@keystrokehq/shared\";\nimport { selectUserOrganizationMembership } from \"@keystrokehq/platform-database\";\n\nimport { activeOrganizationCookie } from \"../../../../auth/resolve-org-id\";\nimport type { AccountRouteHandler } from \"../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const body = await c.req.json().catch(() => null);\n const parsed = SetActiveOrganizationRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization id is required\" }), 400);\n }\n\n const membership = await selectUserOrganizationMembership(user.id, parsed.data.organizationId);\n\n if (!membership) {\n return c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403);\n }\n\n c.header(\"Set-Cookie\", activeOrganizationCookie(membership.organization.id));\n\n return c.json(\n ActiveOrganizationResponseSchema.parse({\n organization: mapUserOrganization(membership),\n }),\n );\n};\n","import { ActiveOrganizationResponseSchema } from \"@keystrokehq/shared\";\n\nimport { clearActiveOrganizationCookie } from \"../../../../auth/resolve-org-id\";\nimport type { AccountRouteHandler } from \"../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n c.header(\"Set-Cookie\", clearActiveOrganizationCookie());\n\n return c.json(ActiveOrganizationResponseSchema.parse({ organization: null }));\n};\n","import {\n ActiveOrganizationResponseSchema,\n ErrorResponseSchema,\n mapUserOrganization,\n UpdateOrganizationRequestSchema,\n} from \"@keystrokehq/shared\";\nimport { OrganizationSlugTakenError, updateOrganizationSlug } 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 return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(parsed.error)), 400);\n }\n\n try {\n const updated = await updateOrganizationSlug(organization.organizationId, parsed.data.slug);\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 {\n PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n StoredProjectSourceManifestSchema,\n type StoredProjectSourceManifest,\n} from \"@keystrokehq/shared\";\nimport type { ActiveProjectArtifactManifestRow } from \"@keystrokehq/platform-database\";\n\nexport type ResourceKind = \"agent\" | \"workflow\" | \"skill\";\n\nexport type ResourceIdentity<TKind extends ResourceKind = ResourceKind> = {\n kind: TKind;\n projectId: string;\n key: string;\n};\n\nexport type ResourceSummaryBase = {\n name: string;\n updatedAt: string;\n};\n\nexport function encodeResourceId(kind: ResourceKind, projectId: string, key: string): string {\n return `${kind}_${Buffer.from(`${projectId}:${key}`).toString(\"base64url\")}`;\n}\n\nexport function decodeResourceId<TKind extends ResourceKind>(\n id: string,\n expectedKind: TKind,\n): ResourceIdentity<TKind> | null {\n const [kind, payload] = id.split(\"_\", 2);\n if (kind !== expectedKind || !payload) {\n return null;\n }\n\n let decoded: string;\n try {\n decoded = Buffer.from(payload, \"base64url\").toString(\"utf8\");\n } catch {\n return null;\n }\n\n const separator = decoded.indexOf(\":\");\n if (separator <= 0) {\n return null;\n }\n\n const projectId = decoded.slice(0, separator);\n const key = decoded.slice(separator + 1);\n if (!projectId || !key) {\n return null;\n }\n\n return { kind: expectedKind, projectId, key };\n}\n\nexport function titleCaseKey(key: string): string {\n const normalized = key\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\nexport function updatedAtForRow(\n row: ActiveProjectArtifactManifestRow,\n generatedAt?: string,\n): string {\n return generatedAt ?? row.artifactUpdatedAt.toISOString();\n}\n\nexport function parseSourceManifest(\n row: ActiveProjectArtifactManifestRow,\n): StoredProjectSourceManifest | null {\n const parsed = StoredProjectSourceManifestSchema.safeParse(row.sourceManifestJson);\n return parsed.success ? parsed.data : null;\n}\n\nexport function compareResourceSummaries<TSummary extends ResourceSummaryBase>(\n left: TSummary,\n right: TSummary,\n): number {\n const byUpdatedAt = right.updatedAt.localeCompare(left.updatedAt);\n if (byUpdatedAt !== 0) {\n return byUpdatedAt;\n }\n\n return left.name.localeCompare(right.name);\n}\n","import {\n AgentSummarySchema,\n PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP,\n type AgentSummary,\n type ProjectSourceResourceRef,\n} from \"@keystrokehq/shared\";\nimport type { ActiveProjectArtifactManifestRow } from \"@keystrokehq/platform-database\";\n\nimport {\n compareResourceSummaries,\n decodeResourceId,\n encodeResourceId,\n parseSourceManifest,\n titleCaseKey,\n updatedAtForRow,\n type ResourceIdentity,\n} from \"./common\";\n\nexport function decodeAgentSummaryId(id: string): ResourceIdentity<\"agent\"> | null {\n return decodeResourceId(id, \"agent\");\n}\n\nfunction buildAgentSummary(\n row: ActiveProjectArtifactManifestRow,\n ref: ProjectSourceResourceRef,\n updatedAt: string,\n): AgentSummary {\n return AgentSummarySchema.parse({\n id: encodeResourceId(\"agent\", row.projectId, ref.key),\n name: titleCaseKey(ref.key),\n projectId: row.projectId,\n updatedAt,\n description: PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n sourcePath: ref.path,\n model: PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n toolCount: PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n credentialCount: PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n lastRunAt: PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP,\n });\n}\n\nexport function buildAgentSummaries(rows: ActiveProjectArtifactManifestRow[]): AgentSummary[] {\n const agents: AgentSummary[] = [];\n\n for (const row of rows) {\n const sourceManifest = parseSourceManifest(row);\n if (!sourceManifest) {\n continue;\n }\n\n const updatedAt = updatedAtForRow(row, sourceManifest.generatedAt);\n agents.push(\n ...sourceManifest.resources.agents.map((ref) => buildAgentSummary(row, ref, updatedAt)),\n );\n }\n\n return agents.sort(compareResourceSummaries);\n}\n","import { AgentSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { buildAgentSummaries } from \"../resources/agents\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n\n return c.json(AgentSummaryListResponseSchema.parse(buildAgentSummaries(rows)));\n};\n","import { AgentSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { buildAgentSummaries, decodeAgentSummaryId } from \"../../resources/agents\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const agentId = c.req.param(\"agentId\") ?? \"\";\n const identity = decodeAgentSummaryId(agentId);\n if (!identity) {\n return c.json(AgentSummaryDetailResponseSchema.parse(null));\n }\n\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n const agents = buildAgentSummaries(rows.filter((row) => row.projectId === identity.projectId));\n\n return c.json(\n AgentSummaryDetailResponseSchema.parse(agents.find((agent) => agent.id === agentId) ?? null),\n );\n};\n","import {\n PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP,\n StoredRouteManifestSchema,\n WorkflowSummarySchema,\n type ProjectSourceResourceRef,\n type StoredRouteManifest,\n type WorkflowSummary,\n} from \"@keystrokehq/shared\";\nimport type { ActiveProjectArtifactManifestRow } from \"@keystrokehq/platform-database\";\n\nimport {\n compareResourceSummaries,\n decodeResourceId,\n encodeResourceId,\n parseSourceManifest,\n titleCaseKey,\n updatedAtForRow,\n type ResourceIdentity,\n} from \"./common\";\n\nexport function decodeWorkflowSummaryId(id: string): ResourceIdentity<\"workflow\"> | null {\n return decodeResourceId(id, \"workflow\");\n}\n\nfunction parseRouteManifest(value: unknown): StoredRouteManifest | null {\n const parsed = StoredRouteManifestSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n\nfunction workflowNameByKey(manifest: StoredRouteManifest | null): Map<string, string> {\n const names = new Map<string, string>();\n if (!manifest) {\n return names;\n }\n\n for (const entry of manifest.entries) {\n if (entry.kind === \"workflow\" && entry.workflowName) {\n names.set(entry.workflowId, entry.workflowName);\n }\n }\n\n return names;\n}\n\nfunction buildWorkflowSummary(\n row: ActiveProjectArtifactManifestRow,\n ref: ProjectSourceResourceRef,\n updatedAt: string,\n namesByKey: Map<string, string>,\n): WorkflowSummary {\n return WorkflowSummarySchema.parse({\n id: encodeResourceId(\"workflow\", row.projectId, ref.key),\n name: namesByKey.get(ref.key) ?? titleCaseKey(ref.key),\n projectId: row.projectId,\n updatedAt,\n description: PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n sourcePath: ref.path,\n stepCount: PLATFORM_RESOURCE_UNSUPPORTED_COUNT,\n lastRunAt: PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP,\n });\n}\n\nexport function buildWorkflowSummaries(\n rows: ActiveProjectArtifactManifestRow[],\n): WorkflowSummary[] {\n const workflows: WorkflowSummary[] = [];\n\n for (const row of rows) {\n const sourceManifest = parseSourceManifest(row);\n if (!sourceManifest) {\n continue;\n }\n\n const namesByKey = workflowNameByKey(parseRouteManifest(row.manifestJson));\n const updatedAt = updatedAtForRow(row, sourceManifest.generatedAt);\n workflows.push(\n ...sourceManifest.resources.workflows.map((ref) =>\n buildWorkflowSummary(row, ref, updatedAt, namesByKey),\n ),\n );\n }\n\n return workflows.sort(compareResourceSummaries);\n}\n","import { WorkflowSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { buildWorkflowSummaries } from \"../resources/workflows\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n\n return c.json(WorkflowSummaryListResponseSchema.parse(buildWorkflowSummaries(rows)));\n};\n","import { WorkflowSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { buildWorkflowSummaries, decodeWorkflowSummaryId } from \"../../resources/workflows\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const workflowId = c.req.param(\"workflowId\") ?? \"\";\n const identity = decodeWorkflowSummaryId(workflowId);\n if (!identity) {\n return c.json(WorkflowSummaryDetailResponseSchema.parse(null));\n }\n\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n const workflows = buildWorkflowSummaries(\n rows.filter((row) => row.projectId === identity.projectId),\n );\n\n return c.json(\n WorkflowSummaryDetailResponseSchema.parse(\n workflows.find((workflow) => workflow.id === workflowId) ?? null,\n ),\n );\n};\n","import {\n PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n SkillSummarySchema,\n type ProjectSourceResourceRef,\n type SkillSummary,\n} from \"@keystrokehq/shared\";\nimport type { ActiveProjectArtifactManifestRow } from \"@keystrokehq/platform-database\";\n\nimport {\n compareResourceSummaries,\n decodeResourceId,\n encodeResourceId,\n parseSourceManifest,\n titleCaseKey,\n updatedAtForRow,\n type ResourceIdentity,\n} from \"./common\";\n\nexport function decodeSkillSummaryId(id: string): ResourceIdentity<\"skill\"> | null {\n return decodeResourceId(id, \"skill\");\n}\n\nfunction buildSkillSummary(\n row: ActiveProjectArtifactManifestRow,\n ref: ProjectSourceResourceRef,\n updatedAt: string,\n): SkillSummary {\n return SkillSummarySchema.parse({\n id: encodeResourceId(\"skill\", row.projectId, ref.key),\n name: titleCaseKey(ref.key),\n projectId: row.projectId,\n updatedAt,\n description: PLATFORM_RESOURCE_UNSUPPORTED_TEXT,\n sourcePath: ref.path,\n });\n}\n\nexport function buildSkillSummaries(rows: ActiveProjectArtifactManifestRow[]): SkillSummary[] {\n const skills: SkillSummary[] = [];\n\n for (const row of rows) {\n const sourceManifest = parseSourceManifest(row);\n if (!sourceManifest) {\n continue;\n }\n\n const updatedAt = updatedAtForRow(row, sourceManifest.generatedAt);\n skills.push(\n ...sourceManifest.resources.skills.map((ref) => buildSkillSummary(row, ref, updatedAt)),\n );\n }\n\n return skills.sort(compareResourceSummaries);\n}\n","import { SkillSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { buildSkillSummaries } from \"../resources/skills\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n\n return c.json(SkillSummaryListResponseSchema.parse(buildSkillSummaries(rows)));\n};\n","import { SkillSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveArtifactManifestsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { buildSkillSummaries, decodeSkillSummaryId } from \"../../resources/skills\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const skillId = c.req.param(\"skillId\") ?? \"\";\n const identity = decodeSkillSummaryId(skillId);\n if (!identity) {\n return c.json(SkillSummaryDetailResponseSchema.parse(null));\n }\n\n const { organizationId } = c.get(\"organization\");\n const rows = await selectActiveArtifactManifestsByOrganizationId(organizationId);\n const skills = buildSkillSummaries(rows.filter((row) => row.projectId === identity.projectId));\n\n return c.json(\n SkillSummaryDetailResponseSchema.parse(skills.find((skill) => skill.id === skillId) ?? null),\n );\n};\n","import { ListProjectsResponseSchema, mapProject } from \"@keystrokehq/shared\";\nimport { selectProjectsByOrganizationId } 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 projects = await selectProjectsByOrganizationId(organization.organizationId);\n\n return c.json(\n ListProjectsResponseSchema.parse({\n projects: projects.map(mapProject),\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 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 );\n\n return c.json(\n CreateProjectResponseSchema.parse({\n project: mapProject(project),\n }),\n 201,\n );\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 { 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 });\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 {\n CompleteProjectArtifactResponseSchema,\n ErrorResponseSchema,\n mapProject,\n mapProjectArtifact,\n} from \"@keystrokehq/shared\";\nimport {\n completeProjectArtifact,\n createOrgStorageClient,\n selectOrganizationById,\n selectProjectArtifactForProject,\n} from \"@keystrokehq/platform-database\";\nimport { enqueueProjectRuntime } from \"@keystrokehq/projects\";\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 result = await completeProjectArtifact({\n artifactId,\n projectId: project.id,\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 resources: parsed.data.resources,\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 StoredProjectSourceManifestSchema,\n} from \"@keystrokehq/shared\";\nimport { selectActiveArtifactSourceManifestForProject } 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 active = await selectActiveArtifactSourceManifestForProject(project.id);\n\n // No active deploy, or a deploy whose source upload never landed.\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\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: manifest.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 { 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(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\");\n const inviterLine = payload.inviterName\n ? `<p>${payload.inviterName.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\")} 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 type { Auth } from \"@keystrokehq/auth\";\nimport type { CreateOrganizationDependencies } from \"../../services/create-organization\";\nimport { Hono } from \"hono\";\n\nimport { requireOrgAdmin } from \"../../auth/require-org-admin\";\nimport { requireOrganization } from \"../../auth/require-organization\";\nimport { requireProject } from \"../../auth/require-project\";\nimport { requireSession } from \"../../auth/require-session\";\nimport type {\n OrganizationVariables,\n ProjectRouteVariables,\n SessionVariables,\n} from \"../../auth/types\";\nimport { handler as listOrganizations } from \"./organizations/GET\";\nimport { createOrganizationHandler } from \"./organizations/POST\";\nimport { handler as checkOrganizationSlugAvailability } from \"./organizations/slug-available/GET\";\nimport { handler as getActiveOrganization } from \"./organizations/active/GET\";\nimport { handler as setActiveOrganization } from \"./organizations/active/POST\";\nimport { handler as clearActiveOrganization } from \"./organizations/active/DELETE\";\nimport { handler as updateActiveOrganization } from \"./organizations/active/PATCH\";\nimport { handler as listAgents } from \"./agents/GET\";\nimport { handler as getAgent } from \"./agents/[agentId]/GET\";\nimport { handler as listWorkflows } from \"./workflows/GET\";\nimport { handler as getWorkflow } from \"./workflows/[workflowId]/GET\";\nimport { handler as listSkills } from \"./skills/GET\";\nimport { handler as getSkill } from \"./skills/[skillId]/GET\";\nimport { handler as listProjects } from \"./projects/GET\";\nimport { handler as createProject } from \"./projects/POST\";\nimport { handler as getProject } from \"./projects/[projectId]/GET\";\nimport { handler as createProjectArtifact } from \"./projects/[projectId]/artifacts/POST\";\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 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\";\n\nexport function mountAccountRoutes(\n auth: Auth,\n options: CreateOrganizationDependencies,\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 protect = requireSession(auth);\n\n account.use(\"/*\", protect);\n orgScoped.use(\"/*\", protect);\n orgScoped.use(\"/*\", requireOrganization());\n projectScoped.use(\"/*\", protect);\n projectScoped.use(\"/*\", requireOrganization());\n\n account.get(\"/organizations\", listOrganizations);\n account.get(\"/organizations/slug-available\", checkOrganizationSlugAvailability);\n account.post(\"/organizations\", createOrganizationHandler(options));\n account.get(\"/organizations/active\", getActiveOrganization);\n account.post(\"/organizations/active\", setActiveOrganization);\n account.patch(\"/organizations/active\", requireOrganization(), updateActiveOrganization);\n account.delete(\"/organizations/active\", clearActiveOrganization);\n\n account.get(\"/invitations\", listOrganizationInvitations);\n account.post(\"/invitations/:invitationId/accept\", acceptOrganizationInvitation);\n account.post(\"/invitations/:invitationId/decline\", declineOrganizationInvitation);\n\n const orgAdmin = requireOrgAdmin();\n\n orgScoped.get(\"/members\", listOrganizationMembers);\n orgScoped.post(\"/members/invitations\", orgAdmin, inviteOrganizationMembers);\n orgScoped.patch(\"/members/:userId\", orgAdmin, updateOrganizationMember);\n orgScoped.delete(\"/members/:userId\", orgAdmin, removeOrganizationMember);\n\n orgScoped.get(\"/agents\", listAgents);\n orgScoped.get(\"/agents/:agentId\", getAgent);\n orgScoped.get(\"/workflows\", listWorkflows);\n orgScoped.get(\"/workflows/:workflowId\", getWorkflow);\n orgScoped.get(\"/skills\", listSkills);\n orgScoped.get(\"/skills/:skillId\", getSkill);\n\n orgScoped.get(\"/projects\", listProjects);\n orgScoped.post(\"/projects\", createProject);\n\n projectScoped.get(\"/:projectId\", requireProject(), getProject);\n projectScoped.get(\n \"/:projectId/reachability\",\n requireProject(),\n createProjectReachabilityHandler(options.hosting),\n );\n projectScoped.get(\"/:projectId/files\", requireProject(), listProjectFiles);\n projectScoped.get(\n \"/:projectId/artifacts/:artifactId/files/content\",\n requireProject(),\n getProjectFileContent,\n );\n projectScoped.post(\"/:projectId/artifacts\", requireProject(), createProjectArtifact);\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/complete\",\n requireProject(),\n completeProjectArtifact,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/source/presign\",\n requireProject(),\n presignProjectArtifactSource,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/source/manifest\",\n requireProject(),\n uploadProjectArtifactSourceManifest,\n );\n\n orgScoped.route(\"/projects\", projectScoped);\n account.route(\"/\", orgScoped);\n\n return account;\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/** 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 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","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 { buildWebhookUrl, createCredentialMaterializeHandler } from \"@keystrokehq/server\";\nimport { z } from \"zod\";\n\nimport type { LlmProxyPlugin } from \"../../llm-proxy-plugin\";\nimport { platformWebhookOrigin, publicPlatformOrigin } from \"../../lib/platform-origin\";\nimport { requireWorkerToken } from \"../../middleware/require-worker-token\";\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 llmProxy?: LlmProxyPlugin,\n): Hono {\n const internal = new Hono();\n const protect = requireWorkerToken(workerToken);\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 createCredentialMaterializeHandler()(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 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, publicPlatformOrigin());\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 selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport { runWithProjectDatabase, runWithTenantScope } from \"@keystrokehq/database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { OrganizationVariables } from \"../auth/types\";\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, () => next()),\n ),\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 {\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/server\";\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 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 { prepareAgentSession } from \"@keystrokehq/agent\";\nimport { selectAgentByKey } 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 selectAgentByKey(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 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 { JobQueue } from \"@keystrokehq/scheduler\";\nimport { validationErrorResponse } from \"@keystrokehq/shared\";\nimport {\n enqueueWorkflowRunByKey,\n findWorkflowManifestEntry,\n type StoredRouteManifest,\n} 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 });\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 type { Auth } 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 type StoredRouteManifest,\n} from \"@keystrokehq/server\";\nimport {\n listWebhookApiKeysForProject,\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport {\n runWithProjectDatabase,\n runWithTenantScope,\n selectActiveWorkflowByKey,\n selectAgentByKey,\n getProjectScopeId,\n} from \"@keystrokehq/database\";\nimport type { TriggerListItem } from \"@keystrokehq/shared\";\nimport { type Context, Hono } from \"hono\";\n\nimport { platformWebhookOrigin } from \"../../lib/platform-origin\";\nimport { requireOrganization } from \"../../auth/require-organization\";\nimport { requireProject } from \"../../auth/require-project\";\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 { 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.path.replace(/^\\/agents\\//, \"\"),\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 agentKeysFromManifest(manifest: StoredRouteManifest): Set<string> {\n const keys = new Set<string>();\n for (const entry of manifest.entries) {\n if (entry.kind !== \"agent\") {\n continue;\n }\n keys.add(entry.path.replace(/^\\/agents\\//, \"\"));\n }\n return keys;\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 (agentKeysFromManifest(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 createIntegrationServices(auth: Auth, platformOrigin: string | undefined) {\n const tokenRefresh = createOAuthTokenRefreshRegistry();\n const credentialBackend = createLocalCredentialBackend({ tokenRefresh });\n const oauthAdapter = createOAuthTokenAdapterFromBackend(credentialBackend);\n const oauthRedirectOrigin = platformApiOrigin(platformOrigin);\n\n return {\n tokenRefresh,\n oauthAdapter,\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 auth.api.getSession({ headers });\n return result ? { id: result.user.id } : null;\n },\n resolvePublicServerUrl: () => oauthRedirectOrigin,\n resolveStateContext: (c: Context) => {\n const user = c.get(\"user\") as { id: string } | undefined;\n const organization = c.get(\"organization\") as { organizationId: string } | undefined;\n return { userId: user?.id, orgId: organization?.organizationId };\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`.\n */\nexport async function mountOAuthCallbacks(auth: Auth): Promise<Hono> {\n const platformOrigin = process.env.PUBLIC_PLATFORM_URL?.replace(/\\/$/, \"\");\n const { tokenRefresh, services: baseServices } = createIntegrationServices(auth, platformOrigin);\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,\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 auth: Auth,\n): Promise<Hono<{ Variables: SessionVariables }>> {\n const api = new Hono<{ Variables: ProjectRuntimeVariables }>();\n const protect = requireSession(auth);\n const platformOrigin = process.env.PUBLIC_PLATFORM_URL?.replace(/\\/$/, \"\");\n const { tokenRefresh, services: baseServices } = createIntegrationServices(auth, platformOrigin);\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 session + 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,\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(\"/*\", 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: agentKeysFromManifest(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 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 selectAgentByKey(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 selectActiveWorkflowByKey(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 { resolveOrgDatabaseUrl, type OrganizationRow } 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\n// One ingress runtime per org, shared across requests. The runtime owns a chat-adapter Chat +\n// Postgres state store, so rebuilding it per request would be wasteful.\nconst ingressByOrg = new Map<string, CachedIngress>();\n\n/**\n * Resolve (and cache) the Slack ingress runtime for an org. Must first be called inside the org's\n * scope (the lazy build resolves the org's bot user id from the credential store).\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 + thread 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, 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 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 attachmentId: attachment.attachmentId,\n attachmentKey: attachment.key,\n },\n });\n });\n },\n });\n}\n","import { runWithProjectDatabase } from \"@keystrokehq/database\";\nimport {\n AmbiguousOAuthInstallationError,\n getOAuthAppSigningSecretByKeyGlobal,\n resolveOAuthInstallationByAppKeyAndExternalId,\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport type { Context } from \"hono\";\n\nimport { getOrgSlackIngressRuntime } from \"../../lib/slack-gateway-ingress\";\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\nfunction extractSlackTeamId(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n\n const record = payload as Record<string, unknown>;\n\n if (typeof record.team_id === \"string\" && record.team_id) {\n return record.team_id;\n }\n\n const event = record.event;\n if (event && typeof event === \"object\") {\n const team = (event as Record<string, unknown>).team;\n if (typeof team === \"string\" && team) {\n return team;\n }\n }\n\n const authorizations = record.authorizations;\n if (Array.isArray(authorizations)) {\n for (const entry of authorizations) {\n if (entry && typeof entry === \"object\") {\n const teamId = (entry as Record<string, unknown>).team_id;\n if (typeof teamId === \"string\" && teamId) {\n return teamId;\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Single shared Slack gateway webhook for all orgs/projects.\n *\n * The platform is the untrusted ingress: it resolves the org from the Slack `team_id`, then lets\n * the chat-adapter verify the signature and route the event. Matched messages are enqueued as\n * agent jobs onto the owning project's queue; the per-project worker runs the agent and replies.\n */\nexport function createPlatformSlackGatewayHandler() {\n return async (c: Context): Promise<Response> => {\n const body = await c.req.text();\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 getOAuthAppSigningSecretByKeyGlobal(SLACK_OAUTH_APP_KEY);\n if (!signingSecret) {\n return c.json(slackNotConfiguredResponse(), 503);\n }\n\n const teamId = extractSlackTeamId(payload);\n if (!teamId) {\n return c.json({ ok: true, skipped: true });\n }\n\n let installation;\n try {\n installation = await resolveOAuthInstallationByAppKeyAndExternalId(\n SLACK_OAUTH_APP_KEY,\n teamId,\n );\n } catch (error) {\n if (error instanceof AmbiguousOAuthInstallationError) {\n console.error(\"[gateway:slack] ambiguous installation\", {\n teamId,\n matchCount: error.matchCount,\n });\n return c.json({ error: \"Ambiguous Slack installation\" }, 409);\n }\n throw error;\n }\n\n if (!installation) {\n return c.json({ ok: true, skipped: true });\n }\n\n const organization = await selectOrganizationById(installation.organizationId);\n if (!organization) {\n return c.json({ ok: true, skipped: true });\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, signingSecret);\n\n // The adapter responds 200 immediately and runs handlers via waitUntil; collect those\n // promises and await them so the enqueue completes before we acknowledge Slack.\n const pending: Promise<unknown>[] = [];\n const verifyRequest = new Request(c.req.url, {\n method: \"POST\",\n headers: c.req.raw.headers,\n body,\n });\n\n const response = await runtime.webhookHandler(verifyRequest, {\n waitUntil: (promise: Promise<unknown>) => pending.push(promise),\n });\n await Promise.allSettled(pending);\n return response;\n }),\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/server\";\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 webhookRouteFromEndpoint,\n} from \"@keystrokehq/server\";\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 { mountInternalRoutes } from \"./routes/internal/mount\";\nimport { mountOAuthCallbacks, mountRuntimeRoutes } from \"./routes/runtime/mount\";\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};\n\nexport async function createApp(\n auth: Auth,\n options: CreateAppOptions,\n): Promise<Hono<{ Variables: SessionVariables }>> {\n const app = new Hono<{ Variables: SessionVariables }>();\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 }),\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 uses session\n // middleware on `/*`; a bare browser redirect from Google has no session cookie.\n app.route(\"/api\", await mountOAuthCallbacks(auth));\n app.route(\n \"/api\",\n mountAccountRoutes(auth, {\n hosting: options.hosting,\n storage: options.storage,\n }),\n );\n app.route(\"/api\", await mountRuntimeRoutes(auth));\n app.route(\n \"/internal\",\n mountInternalRoutes(options.hosting.workerRuntime.workerToken, 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 } 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 { seedOAuthAppsFromEnvForAllOrganizations } from \"@keystrokehq/server\";\nimport type { PlatformConfig } from \"./config\";\nimport {\n ensureProjectRuntimeQueues,\n resolveRuntimeArtifact,\n startProjectRuntimeWorker,\n} from \"@keystrokehq/projects\";\nimport { configureSharedScheduler, startPgBoss } 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\nexport async function startPlatformServer(\n platformConfig: PlatformConfig,\n hooks: StartPlatformServerHooks = {},\n): Promise<void> {\n const runtime = platformConfig.hosting.createRuntime();\n\n await initDatabase();\n process.env.KEYSTROKE_SECRETS_MODE = \"platform\";\n await seedOAuthAppsFromEnvForAllOrganizations();\n\n if (platformConfig.scheduler) {\n configureSharedScheduler(platformConfig.scheduler);\n }\n\n const boss = await startPgBoss();\n await ensureProjectRuntimeQueues(boss);\n await ensureProjectPgBossGrants();\n 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 auth = createAuth({\n baseURL: webUrl,\n verificationUri: `${webUrl.replace(/\\/+$/, \"\")}/device`,\n trustedOrigins: [webUrl],\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 });\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"],"mappings":"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"}