@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.
package/dist/config.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_dist = require("./dist-DYZzWRyP.cjs");
3
- const require_dist$1 = require("./dist-BcsqJD9V.cjs");
3
+ const require_dist$1 = require("./dist-DORNYvce.cjs");
4
4
  //#region src/config.ts
5
5
  function definePlatformConfig(config = {}) {
6
6
  return {
package/dist/config.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as defaultHostingPlugin } from "./dist-BhzHC6fA.mjs";
1
+ import { t as defaultHostingPlugin } from "./dist-CkPv4pkS.mjs";
2
2
  import { r as minioStoragePlugin } from "./dist-CCH-WLnH.mjs";
3
3
  //#region src/config.ts
4
4
  function definePlatformConfig(config = {}) {
@@ -70,7 +70,7 @@ function buildRuntimeEnv(source, artifactUrl, database, extraEnv) {
70
70
  }
71
71
  entries.set(key, value);
72
72
  }
73
- for (const key of PROVIDER_ENV_KEYS) {
73
+ if (!extraEnv) for (const key of PROVIDER_ENV_KEYS) {
74
74
  const value = source[key]?.trim();
75
75
  if (value) entries.set(key, value);
76
76
  }
@@ -276,4 +276,4 @@ async function pingProjectTarget(target, options = {}) {
276
276
  //#endregion
277
277
  export { pingProjectTarget as n, defaultHostingPlugin as t };
278
278
 
279
- //# sourceMappingURL=dist-BhzHC6fA.mjs.map
279
+ //# sourceMappingURL=dist-CkPv4pkS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dist-CkPv4pkS.mjs","names":[],"sources":["../../../packages/hosting/dist/index.mjs"],"sourcesContent":["import Docker from \"dockerode\";\n//#region src/constants.ts\nconst PROJECT_SERVER_IMAGE = \"keystroke/project-server:local\";\nconst PROJECT_SERVER_PORT = 3e3;\nconst PROJECT_SERVER_ROOT = \"/app\";\nconst PROJECT_SERVER_FRAMEWORK_ROOT = \"/opt/keystroke\";\nconst PROJECT_SERVER_FRAMEWORK_NODE_MODULES = `${PROJECT_SERVER_FRAMEWORK_ROOT}/node_modules`;\nconst PROJECT_SERVER_HEALTH = {\n\tpath: \"/health\",\n\tport: PROJECT_SERVER_PORT\n};\n//#endregion\n//#region src/runtime-env.ts\nconst RUNTIME_ENV_KEYS = [\n\t\"BETTER_AUTH_SECRET\",\n\t\"PUBLIC_SERVER_URL\",\n\t\"PUBLIC_WEB_URL\",\n\t\"POSTGRES_SSL\",\n\t\"KEYSTROKE_SCHEDULER_MODULE\"\n];\n/** Provider and gateway env forwarded from the platform into project servers. */\nconst PROVIDER_ENV_KEYS = [\n\t\"ANTHROPIC_API_KEY\",\n\t\"OPENAI_API_KEY\",\n\t\"AI_GATEWAY_API_KEY\",\n\t\"AI_GATEWAY_BASE_URL\"\n];\n/** Shared dev token when `PLATFORM_WORKER_TOKEN` is unset (non-production only). */\nconst DEV_PLATFORM_WORKER_TOKEN = \"dev-platform-worker-token\";\nconst PROJECT_DATABASE_ENV_KEYS = [\n\t\"POSTGRES_HOST\",\n\t\"POSTGRES_PORT\",\n\t\"POSTGRES_DB\",\n\t\"POSTGRES_USER\",\n\t\"POSTGRES_PASSWORD\",\n\t\"DATABASE_SEARCH_PATH\"\n];\n/** Per-project postgres env injected into every project server container/machine. */\nfunction projectDatabaseRuntimeEnv(database) {\n\treturn {\n\t\tPOSTGRES_HOST: rewriteLoopbackHost(database.host),\n\t\tPOSTGRES_PORT: String(database.port),\n\t\tPOSTGRES_DB: database.database,\n\t\tPOSTGRES_USER: database.user,\n\t\tPOSTGRES_PASSWORD: database.password,\n\t\tDATABASE_SEARCH_PATH: database.searchPath\n\t};\n}\n/**\n* Builds the launch spec for a single project server. `artifactUrl` is the\n* per-project presigned URL to that deploy's built `dist` — there is no base\n* image, so it is required.\n*/\nfunction resolveRuntimeLaunch(options, artifactUrl, database, extraEnv) {\n\tif (!artifactUrl) throw new Error(\"Cannot start a project server without an artifact URL\");\n\tconst env = options.env ?? process.env;\n\treturn {\n\t\timage: resolveProjectServerImage(env, options.image),\n\t\tenv: buildRuntimeEnv(env, artifactUrl, database, extraEnv),\n\t\tport: PROJECT_SERVER_PORT,\n\t\thealth: PROJECT_SERVER_HEALTH\n\t};\n}\n/** Env vars passed into the project server container/machine. */\nfunction buildRuntimeEnv(source, artifactUrl, database, extraEnv) {\n\tconst mode = source.KEYSTROKE_MODE ?? \"worker\";\n\tconst entries = new Map([\n\t\t[\"PORT\", String(PROJECT_SERVER_PORT)],\n\t\t[\"KEYSTROKE_ROOT\", PROJECT_SERVER_ROOT],\n\t\t[\"KEYSTROKE_RUNTIME_NODE_MODULES\", PROJECT_SERVER_FRAMEWORK_NODE_MODULES],\n\t\t[\"ARTIFACT_URL\", artifactUrl],\n\t\t[\"KEYSTROKE_MODE\", mode],\n\t\t[\"PROJECT_ID\", database.projectId],\n\t\t[\"ORGANIZATION_ID\", database.organizationId],\n\t\t[\"TENANT_ID\", database.organizationId]\n\t]);\n\tfor (const key of RUNTIME_ENV_KEYS) {\n\t\tconst value = source[key]?.trim();\n\t\tif (!value) {\n\t\t\tif (key === \"POSTGRES_SSL\") throw new Error(\"POSTGRES_SSL is required\");\n\t\t\tcontinue;\n\t\t}\n\t\tentries.set(key, value);\n\t}\n\tif (!extraEnv) for (const key of PROVIDER_ENV_KEYS) {\n\t\tconst value = source[key]?.trim();\n\t\tif (value) entries.set(key, value);\n\t}\n\tif (mode !== \"worker\") {\n\t\tconst credentialsKey = source.CREDENTIALS_ENCRYPTION_KEY;\n\t\tif (credentialsKey) entries.set(\"CREDENTIALS_ENCRYPTION_KEY\", credentialsKey);\n\t}\n\tif (mode === \"worker\") {\n\t\tconst worker = resolveWorkerRuntimeConfig(source);\n\t\tentries.set(\"PLATFORM_URL\", worker.platformUrl);\n\t\tentries.set(\"WORKER_INTERNAL_TOKEN\", worker.workerToken);\n\t}\n\tfor (const [key, value] of Object.entries(projectDatabaseRuntimeEnv(database))) entries.set(key, value);\n\tif (extraEnv) for (const [key, value] of Object.entries(extraEnv)) entries.set(key, value);\n\treturn Object.fromEntries(entries);\n}\nfunction resolvePlatformWorkerToken(source = process.env) {\n\tconst explicit = source.PLATFORM_WORKER_TOKEN?.trim() ?? source.WORKER_INTERNAL_TOKEN?.trim();\n\tif (explicit) return explicit;\n\tif (source.NODE_ENV === \"production\") return;\n\treturn DEV_PLATFORM_WORKER_TOKEN;\n}\n/** Platform API URL reachable from a project-server container. */\nconst DEV_PLATFORM_URL = \"http://localhost:3002\";\nfunction resolveWorkerPlatformUrl(source = process.env) {\n\tconst raw = source.PLATFORM_URL?.trim() ?? source.PUBLIC_PLATFORM_URL?.trim() ?? (source.NODE_ENV === \"production\" ? void 0 : DEV_PLATFORM_URL);\n\tif (!raw) return;\n\treturn rewriteLoopbackUrl(raw);\n}\n/** Rewrite loopback hosts so containers can reach Postgres and other host services. */\nfunction rewriteLoopbackHost(host) {\n\tif (host === \"localhost\" || host === \"127.0.0.1\") return \"host.docker.internal\";\n\treturn host;\n}\nfunction rewriteLoopbackUrl(url) {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\tparsed.hostname = rewriteLoopbackHost(parsed.hostname);\n\t\treturn parsed.toString().replace(/\\/$/, \"\");\n\t} catch {\n\t\treturn url;\n\t}\n}\n/** dockerode expects `KEY=value` strings. */\nfunction formatDockerEnv(env) {\n\treturn Object.entries(env).map(([key, value]) => `${key}=${value}`);\n}\nfunction resolveProjectServerImage(env = process.env, override) {\n\treturn override ?? env.PROJECT_DOCKER_IMAGE ?? env.TENANT_DOCKER_IMAGE ?? \"keystroke/project-server:local\";\n}\n//#endregion\n//#region src/worker-runtime-config.ts\nvar WorkerRuntimeConfigError = class extends Error {\n\tmissing;\n\tconstructor(missing) {\n\t\tsuper(`Worker runtime config incomplete (missing: ${missing.join(\", \")}). In production set PLATFORM_WORKER_TOKEN and PUBLIC_PLATFORM_URL (or PLATFORM_URL).`);\n\t\tthis.name = \"WorkerRuntimeConfigError\";\n\t\tthis.missing = missing;\n\t}\n};\n/** Fail fast when the platform cannot start worker-mode project servers. */\nfunction resolveWorkerRuntimeConfig(source = process.env) {\n\tconst platformUrl = resolveWorkerPlatformUrl(source);\n\tconst workerToken = resolvePlatformWorkerToken(source);\n\tconst missing = [];\n\tif (!platformUrl) missing.push(\"PUBLIC_PLATFORM_URL or PLATFORM_URL\");\n\tif (!workerToken) missing.push(\"PLATFORM_WORKER_TOKEN\");\n\tif (missing.length > 0) throw new WorkerRuntimeConfigError(missing);\n\treturn {\n\t\tplatformUrl,\n\t\tworkerToken\n\t};\n}\n//#endregion\n//#region src/wait-for-health.ts\nconst DEFAULT_TIMEOUT_MS = 12e4;\nconst DEFAULT_INTERVAL_MS = 500;\nasync function waitForHealth(baseUrl, options = {}) {\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\tconst timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\tconst intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;\n\tconst deadline = Date.now() + timeoutMs;\n\tconst url = new URL(PROJECT_SERVER_HEALTH.path, baseUrl);\n\twhile (Date.now() < deadline) {\n\t\ttry {\n\t\t\tif ((await fetchImpl(url, { signal: AbortSignal.timeout(2e3) })).ok) return;\n\t\t} catch {}\n\t\tawait sleep(intervalMs);\n\t}\n\tthrow new Error(`Project server health check timed out after ${timeoutMs}ms (${url})`);\n}\nfunction sleep(ms) {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n//#endregion\n//#region src/docker/create-docker-runtime.ts\nconst MINIO_DOCKER_NETWORK = process.env.MINIO_DOCKER_NETWORK ?? \"keystroke\";\nfunction createDockerRuntime(options = {}) {\n\tconst docker = options.docker ?? new Docker();\n\treturn { async start(input) {\n\t\tconst launch = resolveRuntimeLaunch(options, input.artifactUrl, input.database, input.env);\n\t\tawait ensureImage(docker, launch.image);\n\t\tawait removeExistingContainer(docker, input.projectId);\n\t\tconst container = await docker.createContainer({\n\t\t\tImage: launch.image,\n\t\t\tname: containerName(input.projectId),\n\t\t\tLabels: {\n\t\t\t\t\"keystroke.project.id\": input.projectId,\n\t\t\t\t\"keystroke.project.name\": input.name\n\t\t\t},\n\t\t\tExposedPorts: { [`${launch.port}/tcp`]: {} },\n\t\t\tHostConfig: {\n\t\t\t\tExtraHosts: [\"host.docker.internal:host-gateway\"],\n\t\t\t\tPortBindings: { [`${launch.port}/tcp`]: [{ HostPort: \"0\" }] }\n\t\t\t},\n\t\t\tNetworkingConfig: { EndpointsConfig: { [MINIO_DOCKER_NETWORK]: {} } },\n\t\t\tEnv: formatDockerEnv(launch.env)\n\t\t});\n\t\tawait container.start();\n\t\tconst inspect = await container.inspect();\n\t\tconst binding = inspect.NetworkSettings.Ports?.[`${launch.port}/tcp`]?.[0];\n\t\tif (!binding?.HostPort) throw new Error(\"Failed to resolve project container host port\");\n\t\tconst baseUrl = `http://127.0.0.1:${binding.HostPort}`;\n\t\tawait waitForHealth(baseUrl, {\n\t\t\tfetchImpl: options.fetchImpl,\n\t\t\ttimeoutMs: options.healthTimeoutMs\n\t\t});\n\t\treturn {\n\t\t\truntimeId: inspect.Id,\n\t\t\tbaseUrl\n\t\t};\n\t} };\n}\nfunction containerName(projectId) {\n\treturn `keystroke-project-${projectId}`;\n}\nasync function removeExistingContainer(docker, projectId) {\n\ttry {\n\t\tconst existing = docker.getContainer(containerName(projectId));\n\t\tawait existing.stop({ t: 5 }).catch(() => void 0);\n\t\tawait existing.remove({ force: true });\n\t} catch {}\n}\nasync function ensureImage(docker, image) {\n\ttry {\n\t\tawait docker.getImage(image).inspect();\n\t\treturn;\n\t} catch {}\n\tawait new Promise((resolvePromise, reject) => {\n\t\tdocker.pull(image, (error, stream) => {\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!stream) {\n\t\t\t\treject(/* @__PURE__ */ new Error(`Failed to pull image ${image}`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdocker.modem.followProgress(stream, (progressError) => {\n\t\t\t\tif (progressError) {\n\t\t\t\t\treject(progressError);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolvePromise();\n\t\t\t});\n\t\t});\n\t});\n}\n//#endregion\n//#region src/docker/plugin.ts\nfunction dockerPlugin(options = {}) {\n\tconst env = options.env ?? process.env;\n\treturn {\n\t\tname: \"docker\",\n\t\tworkerRuntime: resolveWorkerRuntimeConfig(env),\n\t\tcreateRuntime: () => createDockerRuntime({\n\t\t\t...options,\n\t\t\tenv\n\t\t})\n\t};\n}\n//#endregion\n//#region src/default-plugin.ts\n/** Local Docker hosting — default for platform and dev. */\nfunction defaultHostingPlugin(options = {}) {\n\treturn dockerPlugin(options);\n}\n//#endregion\n//#region src/runtime-constants.ts\n/** Timeout for a single project runtime `/health` probe. */\nconst RUNTIME_PING_TIMEOUT_MS = 15e3;\n//#endregion\n//#region src/ping-project.ts\nasync function pingProject(baseUrl, options = {}) {\n\tconst timeoutMs = options.timeoutMs ?? 15e3;\n\tconst headers = options.plugin?.pingRequestHeaders?.(options.runtimeId ?? null) ?? {};\n\ttry {\n\t\treturn (await (options.fetchImpl ?? fetch)(new URL(PROJECT_SERVER_HEALTH.path, baseUrl), {\n\t\t\tsignal: AbortSignal.timeout(timeoutMs),\n\t\t\theaders\n\t\t})).ok;\n\t} catch {\n\t\treturn false;\n\t}\n}\n//#endregion\n//#region src/ping-project-target.ts\nfunction canPingProjectTarget(target, plugin) {\n\tif (plugin?.canPingTarget) return plugin.canPingTarget(target);\n\treturn !!target.baseUrl;\n}\nasync function pingProjectTarget(target, options = {}) {\n\tif (!canPingProjectTarget(target, options.plugin)) return false;\n\treturn pingProject(target.baseUrl, {\n\t\t...options,\n\t\truntimeId: target.runtimeId\n\t});\n}\n//#endregion\nexport { DEV_PLATFORM_WORKER_TOKEN, PROJECT_DATABASE_ENV_KEYS, PROJECT_SERVER_FRAMEWORK_NODE_MODULES, PROJECT_SERVER_FRAMEWORK_ROOT, PROJECT_SERVER_HEALTH, PROJECT_SERVER_IMAGE, PROJECT_SERVER_PORT, PROJECT_SERVER_ROOT, RUNTIME_PING_TIMEOUT_MS, WorkerRuntimeConfigError, buildRuntimeEnv, canPingProjectTarget, defaultHostingPlugin, dockerPlugin, formatDockerEnv, pingProject, pingProjectTarget, projectDatabaseRuntimeEnv, resolvePlatformWorkerToken, resolveProjectServerImage, resolveRuntimeLaunch, resolveWorkerPlatformUrl, resolveWorkerRuntimeConfig, rewriteLoopbackHost, rewriteLoopbackUrl, waitForHealth };\n\n//# sourceMappingURL=index.mjs.map"],"mappings":"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"}
@@ -72,7 +72,7 @@ function buildRuntimeEnv(source, artifactUrl, database, extraEnv) {
72
72
  }
73
73
  entries.set(key, value);
74
74
  }
75
- for (const key of PROVIDER_ENV_KEYS) {
75
+ if (!extraEnv) for (const key of PROVIDER_ENV_KEYS) {
76
76
  const value = source[key]?.trim();
77
77
  if (value) entries.set(key, value);
78
78
  }
@@ -289,4 +289,4 @@ Object.defineProperty(exports, "pingProjectTarget", {
289
289
  }
290
290
  });
291
291
 
292
- //# sourceMappingURL=dist-BcsqJD9V.cjs.map
292
+ //# sourceMappingURL=dist-DORNYvce.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dist-DORNYvce.cjs","names":["Docker"],"sources":["../../../packages/hosting/dist/index.mjs"],"sourcesContent":["import Docker from \"dockerode\";\n//#region src/constants.ts\nconst PROJECT_SERVER_IMAGE = \"keystroke/project-server:local\";\nconst PROJECT_SERVER_PORT = 3e3;\nconst PROJECT_SERVER_ROOT = \"/app\";\nconst PROJECT_SERVER_FRAMEWORK_ROOT = \"/opt/keystroke\";\nconst PROJECT_SERVER_FRAMEWORK_NODE_MODULES = `${PROJECT_SERVER_FRAMEWORK_ROOT}/node_modules`;\nconst PROJECT_SERVER_HEALTH = {\n\tpath: \"/health\",\n\tport: PROJECT_SERVER_PORT\n};\n//#endregion\n//#region src/runtime-env.ts\nconst RUNTIME_ENV_KEYS = [\n\t\"BETTER_AUTH_SECRET\",\n\t\"PUBLIC_SERVER_URL\",\n\t\"PUBLIC_WEB_URL\",\n\t\"POSTGRES_SSL\",\n\t\"KEYSTROKE_SCHEDULER_MODULE\"\n];\n/** Provider and gateway env forwarded from the platform into project servers. */\nconst PROVIDER_ENV_KEYS = [\n\t\"ANTHROPIC_API_KEY\",\n\t\"OPENAI_API_KEY\",\n\t\"AI_GATEWAY_API_KEY\",\n\t\"AI_GATEWAY_BASE_URL\"\n];\n/** Shared dev token when `PLATFORM_WORKER_TOKEN` is unset (non-production only). */\nconst DEV_PLATFORM_WORKER_TOKEN = \"dev-platform-worker-token\";\nconst PROJECT_DATABASE_ENV_KEYS = [\n\t\"POSTGRES_HOST\",\n\t\"POSTGRES_PORT\",\n\t\"POSTGRES_DB\",\n\t\"POSTGRES_USER\",\n\t\"POSTGRES_PASSWORD\",\n\t\"DATABASE_SEARCH_PATH\"\n];\n/** Per-project postgres env injected into every project server container/machine. */\nfunction projectDatabaseRuntimeEnv(database) {\n\treturn {\n\t\tPOSTGRES_HOST: rewriteLoopbackHost(database.host),\n\t\tPOSTGRES_PORT: String(database.port),\n\t\tPOSTGRES_DB: database.database,\n\t\tPOSTGRES_USER: database.user,\n\t\tPOSTGRES_PASSWORD: database.password,\n\t\tDATABASE_SEARCH_PATH: database.searchPath\n\t};\n}\n/**\n* Builds the launch spec for a single project server. `artifactUrl` is the\n* per-project presigned URL to that deploy's built `dist` — there is no base\n* image, so it is required.\n*/\nfunction resolveRuntimeLaunch(options, artifactUrl, database, extraEnv) {\n\tif (!artifactUrl) throw new Error(\"Cannot start a project server without an artifact URL\");\n\tconst env = options.env ?? process.env;\n\treturn {\n\t\timage: resolveProjectServerImage(env, options.image),\n\t\tenv: buildRuntimeEnv(env, artifactUrl, database, extraEnv),\n\t\tport: PROJECT_SERVER_PORT,\n\t\thealth: PROJECT_SERVER_HEALTH\n\t};\n}\n/** Env vars passed into the project server container/machine. */\nfunction buildRuntimeEnv(source, artifactUrl, database, extraEnv) {\n\tconst mode = source.KEYSTROKE_MODE ?? \"worker\";\n\tconst entries = new Map([\n\t\t[\"PORT\", String(PROJECT_SERVER_PORT)],\n\t\t[\"KEYSTROKE_ROOT\", PROJECT_SERVER_ROOT],\n\t\t[\"KEYSTROKE_RUNTIME_NODE_MODULES\", PROJECT_SERVER_FRAMEWORK_NODE_MODULES],\n\t\t[\"ARTIFACT_URL\", artifactUrl],\n\t\t[\"KEYSTROKE_MODE\", mode],\n\t\t[\"PROJECT_ID\", database.projectId],\n\t\t[\"ORGANIZATION_ID\", database.organizationId],\n\t\t[\"TENANT_ID\", database.organizationId]\n\t]);\n\tfor (const key of RUNTIME_ENV_KEYS) {\n\t\tconst value = source[key]?.trim();\n\t\tif (!value) {\n\t\t\tif (key === \"POSTGRES_SSL\") throw new Error(\"POSTGRES_SSL is required\");\n\t\t\tcontinue;\n\t\t}\n\t\tentries.set(key, value);\n\t}\n\tif (!extraEnv) for (const key of PROVIDER_ENV_KEYS) {\n\t\tconst value = source[key]?.trim();\n\t\tif (value) entries.set(key, value);\n\t}\n\tif (mode !== \"worker\") {\n\t\tconst credentialsKey = source.CREDENTIALS_ENCRYPTION_KEY;\n\t\tif (credentialsKey) entries.set(\"CREDENTIALS_ENCRYPTION_KEY\", credentialsKey);\n\t}\n\tif (mode === \"worker\") {\n\t\tconst worker = resolveWorkerRuntimeConfig(source);\n\t\tentries.set(\"PLATFORM_URL\", worker.platformUrl);\n\t\tentries.set(\"WORKER_INTERNAL_TOKEN\", worker.workerToken);\n\t}\n\tfor (const [key, value] of Object.entries(projectDatabaseRuntimeEnv(database))) entries.set(key, value);\n\tif (extraEnv) for (const [key, value] of Object.entries(extraEnv)) entries.set(key, value);\n\treturn Object.fromEntries(entries);\n}\nfunction resolvePlatformWorkerToken(source = process.env) {\n\tconst explicit = source.PLATFORM_WORKER_TOKEN?.trim() ?? source.WORKER_INTERNAL_TOKEN?.trim();\n\tif (explicit) return explicit;\n\tif (source.NODE_ENV === \"production\") return;\n\treturn DEV_PLATFORM_WORKER_TOKEN;\n}\n/** Platform API URL reachable from a project-server container. */\nconst DEV_PLATFORM_URL = \"http://localhost:3002\";\nfunction resolveWorkerPlatformUrl(source = process.env) {\n\tconst raw = source.PLATFORM_URL?.trim() ?? source.PUBLIC_PLATFORM_URL?.trim() ?? (source.NODE_ENV === \"production\" ? void 0 : DEV_PLATFORM_URL);\n\tif (!raw) return;\n\treturn rewriteLoopbackUrl(raw);\n}\n/** Rewrite loopback hosts so containers can reach Postgres and other host services. */\nfunction rewriteLoopbackHost(host) {\n\tif (host === \"localhost\" || host === \"127.0.0.1\") return \"host.docker.internal\";\n\treturn host;\n}\nfunction rewriteLoopbackUrl(url) {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\tparsed.hostname = rewriteLoopbackHost(parsed.hostname);\n\t\treturn parsed.toString().replace(/\\/$/, \"\");\n\t} catch {\n\t\treturn url;\n\t}\n}\n/** dockerode expects `KEY=value` strings. */\nfunction formatDockerEnv(env) {\n\treturn Object.entries(env).map(([key, value]) => `${key}=${value}`);\n}\nfunction resolveProjectServerImage(env = process.env, override) {\n\treturn override ?? env.PROJECT_DOCKER_IMAGE ?? env.TENANT_DOCKER_IMAGE ?? \"keystroke/project-server:local\";\n}\n//#endregion\n//#region src/worker-runtime-config.ts\nvar WorkerRuntimeConfigError = class extends Error {\n\tmissing;\n\tconstructor(missing) {\n\t\tsuper(`Worker runtime config incomplete (missing: ${missing.join(\", \")}). In production set PLATFORM_WORKER_TOKEN and PUBLIC_PLATFORM_URL (or PLATFORM_URL).`);\n\t\tthis.name = \"WorkerRuntimeConfigError\";\n\t\tthis.missing = missing;\n\t}\n};\n/** Fail fast when the platform cannot start worker-mode project servers. */\nfunction resolveWorkerRuntimeConfig(source = process.env) {\n\tconst platformUrl = resolveWorkerPlatformUrl(source);\n\tconst workerToken = resolvePlatformWorkerToken(source);\n\tconst missing = [];\n\tif (!platformUrl) missing.push(\"PUBLIC_PLATFORM_URL or PLATFORM_URL\");\n\tif (!workerToken) missing.push(\"PLATFORM_WORKER_TOKEN\");\n\tif (missing.length > 0) throw new WorkerRuntimeConfigError(missing);\n\treturn {\n\t\tplatformUrl,\n\t\tworkerToken\n\t};\n}\n//#endregion\n//#region src/wait-for-health.ts\nconst DEFAULT_TIMEOUT_MS = 12e4;\nconst DEFAULT_INTERVAL_MS = 500;\nasync function waitForHealth(baseUrl, options = {}) {\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\tconst timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\tconst intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;\n\tconst deadline = Date.now() + timeoutMs;\n\tconst url = new URL(PROJECT_SERVER_HEALTH.path, baseUrl);\n\twhile (Date.now() < deadline) {\n\t\ttry {\n\t\t\tif ((await fetchImpl(url, { signal: AbortSignal.timeout(2e3) })).ok) return;\n\t\t} catch {}\n\t\tawait sleep(intervalMs);\n\t}\n\tthrow new Error(`Project server health check timed out after ${timeoutMs}ms (${url})`);\n}\nfunction sleep(ms) {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n//#endregion\n//#region src/docker/create-docker-runtime.ts\nconst MINIO_DOCKER_NETWORK = process.env.MINIO_DOCKER_NETWORK ?? \"keystroke\";\nfunction createDockerRuntime(options = {}) {\n\tconst docker = options.docker ?? new Docker();\n\treturn { async start(input) {\n\t\tconst launch = resolveRuntimeLaunch(options, input.artifactUrl, input.database, input.env);\n\t\tawait ensureImage(docker, launch.image);\n\t\tawait removeExistingContainer(docker, input.projectId);\n\t\tconst container = await docker.createContainer({\n\t\t\tImage: launch.image,\n\t\t\tname: containerName(input.projectId),\n\t\t\tLabels: {\n\t\t\t\t\"keystroke.project.id\": input.projectId,\n\t\t\t\t\"keystroke.project.name\": input.name\n\t\t\t},\n\t\t\tExposedPorts: { [`${launch.port}/tcp`]: {} },\n\t\t\tHostConfig: {\n\t\t\t\tExtraHosts: [\"host.docker.internal:host-gateway\"],\n\t\t\t\tPortBindings: { [`${launch.port}/tcp`]: [{ HostPort: \"0\" }] }\n\t\t\t},\n\t\t\tNetworkingConfig: { EndpointsConfig: { [MINIO_DOCKER_NETWORK]: {} } },\n\t\t\tEnv: formatDockerEnv(launch.env)\n\t\t});\n\t\tawait container.start();\n\t\tconst inspect = await container.inspect();\n\t\tconst binding = inspect.NetworkSettings.Ports?.[`${launch.port}/tcp`]?.[0];\n\t\tif (!binding?.HostPort) throw new Error(\"Failed to resolve project container host port\");\n\t\tconst baseUrl = `http://127.0.0.1:${binding.HostPort}`;\n\t\tawait waitForHealth(baseUrl, {\n\t\t\tfetchImpl: options.fetchImpl,\n\t\t\ttimeoutMs: options.healthTimeoutMs\n\t\t});\n\t\treturn {\n\t\t\truntimeId: inspect.Id,\n\t\t\tbaseUrl\n\t\t};\n\t} };\n}\nfunction containerName(projectId) {\n\treturn `keystroke-project-${projectId}`;\n}\nasync function removeExistingContainer(docker, projectId) {\n\ttry {\n\t\tconst existing = docker.getContainer(containerName(projectId));\n\t\tawait existing.stop({ t: 5 }).catch(() => void 0);\n\t\tawait existing.remove({ force: true });\n\t} catch {}\n}\nasync function ensureImage(docker, image) {\n\ttry {\n\t\tawait docker.getImage(image).inspect();\n\t\treturn;\n\t} catch {}\n\tawait new Promise((resolvePromise, reject) => {\n\t\tdocker.pull(image, (error, stream) => {\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!stream) {\n\t\t\t\treject(/* @__PURE__ */ new Error(`Failed to pull image ${image}`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdocker.modem.followProgress(stream, (progressError) => {\n\t\t\t\tif (progressError) {\n\t\t\t\t\treject(progressError);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolvePromise();\n\t\t\t});\n\t\t});\n\t});\n}\n//#endregion\n//#region src/docker/plugin.ts\nfunction dockerPlugin(options = {}) {\n\tconst env = options.env ?? process.env;\n\treturn {\n\t\tname: \"docker\",\n\t\tworkerRuntime: resolveWorkerRuntimeConfig(env),\n\t\tcreateRuntime: () => createDockerRuntime({\n\t\t\t...options,\n\t\t\tenv\n\t\t})\n\t};\n}\n//#endregion\n//#region src/default-plugin.ts\n/** Local Docker hosting — default for platform and dev. */\nfunction defaultHostingPlugin(options = {}) {\n\treturn dockerPlugin(options);\n}\n//#endregion\n//#region src/runtime-constants.ts\n/** Timeout for a single project runtime `/health` probe. */\nconst RUNTIME_PING_TIMEOUT_MS = 15e3;\n//#endregion\n//#region src/ping-project.ts\nasync function pingProject(baseUrl, options = {}) {\n\tconst timeoutMs = options.timeoutMs ?? 15e3;\n\tconst headers = options.plugin?.pingRequestHeaders?.(options.runtimeId ?? null) ?? {};\n\ttry {\n\t\treturn (await (options.fetchImpl ?? fetch)(new URL(PROJECT_SERVER_HEALTH.path, baseUrl), {\n\t\t\tsignal: AbortSignal.timeout(timeoutMs),\n\t\t\theaders\n\t\t})).ok;\n\t} catch {\n\t\treturn false;\n\t}\n}\n//#endregion\n//#region src/ping-project-target.ts\nfunction canPingProjectTarget(target, plugin) {\n\tif (plugin?.canPingTarget) return plugin.canPingTarget(target);\n\treturn !!target.baseUrl;\n}\nasync function pingProjectTarget(target, options = {}) {\n\tif (!canPingProjectTarget(target, options.plugin)) return false;\n\treturn pingProject(target.baseUrl, {\n\t\t...options,\n\t\truntimeId: target.runtimeId\n\t});\n}\n//#endregion\nexport { DEV_PLATFORM_WORKER_TOKEN, PROJECT_DATABASE_ENV_KEYS, PROJECT_SERVER_FRAMEWORK_NODE_MODULES, PROJECT_SERVER_FRAMEWORK_ROOT, PROJECT_SERVER_HEALTH, PROJECT_SERVER_IMAGE, PROJECT_SERVER_PORT, PROJECT_SERVER_ROOT, RUNTIME_PING_TIMEOUT_MS, WorkerRuntimeConfigError, buildRuntimeEnv, canPingProjectTarget, defaultHostingPlugin, dockerPlugin, formatDockerEnv, pingProject, pingProjectTarget, projectDatabaseRuntimeEnv, resolvePlatformWorkerToken, resolveProjectServerImage, resolveRuntimeLaunch, resolveWorkerPlatformUrl, resolveWorkerRuntimeConfig, rewriteLoopbackHost, rewriteLoopbackUrl, waitForHealth };\n\n//# sourceMappingURL=index.mjs.map"],"mappings":"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"}
package/dist/run.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  const require_config = require("./config.cjs");
2
- const require_start = require("./start-CsYcmcjc.cjs");
2
+ const require_start = require("./start-DDACC7ww.cjs");
3
3
  //#region src/run.ts
4
4
  async function main() {
5
5
  await require_start.startPlatformServer(require_config.definePlatformConfig());
package/dist/run.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { definePlatformConfig } from "./config.mjs";
2
- import { t as startPlatformServer } from "./start-BnTz6Vci.mjs";
2
+ import { t as startPlatformServer } from "./start-3cyJAXfs.mjs";
3
3
  //#region src/run.ts
4
4
  async function main() {
5
5
  await startPlatformServer(definePlatformConfig());
@@ -1,4 +1,4 @@
1
- import { n as pingProjectTarget } from "./dist-BhzHC6fA.mjs";
1
+ import { n as pingProjectTarget } from "./dist-CkPv4pkS.mjs";
2
2
  import { $ as SlugAvailabilityQuerySchema, B as PLATFORM_RESOURCE_UNSUPPORTED_TEXT, C as CreateProjectRequestSchema, D as DeclineOrganizationInvitationResponseSchema, Dt as mapProject, Et as mapOrganizationMember, F as ListOrganizationsResponseSchema, G as ProjectResponseSchema, H as PresignProjectSourceRequestSchema, I as ListProjectFilesResponseSchema, K as PromptInputSchema, L as ListProjectsResponseSchema, Lt as projectFileId, M as InviteOrganizationMembersResponseSchema, Mt as organizationSlugErrorCodeFromMessage, N as ListOrganizationInvitationsResponseSchema, O as ErrorResponseSchema, Ot as mapProjectArtifact, P as ListOrganizationMembersResponseSchema, Pt as parseStoredRouteManifest, Q as SkillSummarySchema, S as CreateProjectArtifactResponseSchema, Tt as mapOrganizationInvitation, U as PresignProjectSourceResponseSchema, V as PLATFORM_RESOURCE_UNSUPPORTED_TIMESTAMP, W as ProjectReachabilityResponseSchema, X as SkillSummaryDetailResponseSchema, Y as SetActiveOrganizationRequestSchema, Z as SkillSummaryListResponseSchema, a as projectSourceBlobKey, b as CreateOrganizationRequestSchema, bt as WorkflowSummaryListResponseSchema, c as AcceptOrganizationInvitationResponseSchema, ct as UpdateOrganizationMemberRequestSchema, dt as UploadProjectSourceManifestRequestSchema, et as SlugAvailabilityResponseSchema, ft as UploadProjectSourceResponseSchema, h as AgentSummarySchema, i as projectArtifactKey, j as InviteOrganizationMembersRequestSchema, jt as organizationInvitationAcceptPath, kt as mapUserOrganization, l as ActiveOrganizationResponseSchema, lt as UpdateOrganizationMemberResponseSchema, m as AgentSummaryListResponseSchema, nt as StoredRouteManifestSchema, o as ACTIVE_ORG_COOKIE, p as AgentSummaryDetailResponseSchema, s as ACTIVE_ORG_HEADER, tt as StoredProjectSourceManifestSchema, ut as UpdateOrganizationRequestSchema, v as CompleteProjectArtifactResponseSchema, w as CreateProjectResponseSchema, wt as listenPortFromPublicUrl, x as CreateOrganizationResponseSchema, xt as WorkflowSummarySchema, yt as WorkflowSummaryDetailResponseSchema, zt as validationErrorResponse } from "./dist-CCH-WLnH.mjs";
3
3
  import { $ as createScheduler, $n as authSessions, $t as createProjectForOrganization, A as webhookRouteFromEndpoint, An as selectProjectsByOrganizationId, Bn as updateProjectFailed, Bt as AmbiguousOAuthInstallationError, Cn as selectOrganizationById, D as syncRegistryFromStoredManifest, Dn as selectProjectArtifactForProject, E as seedOAuthAppsFromEnvForOrganization, En as selectProjectArtifactById, Fn as updateOrganizationMemberRole, Gn as runWithProjectDatabase, Gt as OrganizationMemberNotFoundError, Hn as createPgConnection, Ht as OrganizationInvitationExpiredError, In as updateOrganizationSlug, Jn as selectActiveWorkflowByKey, Jt as checkOrganizationSlugAvailability, Kn as runWithProjectScope, Kt as OrganizationSlugTakenError, Ln as updateProjectActive, M as workflowRunsListHandler, Mn as selectUserByNormalizedEmail, N as createSlackGatewayIngress, Nn as selectUserOrganizationMembership, O as triggerRunDetailHandler, On as selectProjectById, Pn as selectUserOrganizations, Q as configureSharedScheduler, Qn as authDeviceCodes, Qt as createOrganizationForUser, Rn as updateProjectArtifactManifest, S as mountWorkflowCredentialRoutes, Sn as selectActiveArtifactSourceManifestForProject, T as seedOAuthAppsFromEnvForAllOrganizations, Tn as selectPendingInvitationsForUser, Un as getOrCreateGatewayThreadSession, Ut as OrganizationInvitationForbiddenError, Vn as verifyWebhookApiKeyForRoute, Vt as CannotModifyOwnerError, Wn as getProjectScopeId, Wt as OrganizationInvitationNotFoundError, Xn as selectEphemeralTriggerAttachments, Xt as createOrgContainerPresign, Yn as selectAgentByKey, Yt as completeProjectArtifact, Zn as authAccounts, Zt as createOrgStorageClient, _n as resolveProjectRuntimeDatabase, _t as createOAuthTokenRefreshRegistry, a as createAgentsListHandler, an as getOAuthAppSigningSecretByKeyGlobal, b as mountCredentialInstanceRoutes, bn as selectActiveArtifactManifestForProject, c as createTriggerGetHandler, cn as inviteOrganizationMembers, d as enqueueWebhookIngress, dn as normalizeUserEmail, en as declineInvitation, er as authVerifications, et as getPgBoss, f as enqueueWorkflowRunByKey, fn as promoteProjectArtifact, gn as resolveOrgDatabaseUrl, gt as createOAuthTokenAdapterFromBackend, h as findWorkflowManifestEntry, hn as resolveOAuthInstallationByAppKeyAndExternalId, ht as createLocalCredentialBackend, i as connectProvidersFromManifest, in as ensureWebhookApiKeys, it as prepareAgentSession, j as workflowRunDetailHandler, jn as selectUserById, k as triggerRunsListHandler, kn as selectProjectForOrganization, l as createTriggersListHandler, ln as isOrganizationStorageBucketInUse, m as fetchStoredRouteManifest, mn as resolveNewOrganizationIdentity, n as agentSessionsListHandler, nn as ensureProjectPgBossGrants, nr as users, nt as startPgBoss, o as createCredentialMaterializeHandler, on as initDatabase, p as extractWebhookRoutesFromManifest, pn as removeOrganizationMember, qn as runWithTenantScope, qt as acceptInvitation, r as buildWebhookUrl, rn as ensureWebhookApiKeyForRoute, rt as matchWebhookPayload, s as createGatewayAttachmentHandlers, sn as insertProjectArtifact, t as agentSessionDetailHandler, tn as encryptCredentialPayload, tr as getDatabaseHandle, tt as resolveSchedulerPluginFromEnv, u as enqueueAgentPrompt, un as listWebhookApiKeysForProject, v as listKnownIntegrationKeys, vn as runWithOrganizationScope, w as resumeWorkflowHook, wn as selectOrganizationMembers, x as mountProjectIntegrations, xn as selectActiveArtifactManifestsByOrganizationId, y as loadWebhookAttachmentSchemasForRoute, yn as runWithWorkspaceContext, zn as updateProjectArtifactSourceManifest } from "./dist-CPTy7F9l.mjs";
4
4
  import { ZodError, z } from "zod";
@@ -1993,4 +1993,4 @@ async function startPlatformServer(platformConfig, hooks = {}) {
1993
1993
  //#endregion
1994
1994
  export { startPlatformServer as t };
1995
1995
 
1996
- //# sourceMappingURL=start-BnTz6Vci.mjs.map
1996
+ //# sourceMappingURL=start-3cyJAXfs.mjs.map