@ponderbot/cli 0.1.0-alpha.24 → 0.1.0-alpha.26
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/README.md +39 -0
- package/dist/main.js +47 -24
- package/dist/main.js.map +1 -1
- package/package.json +2 -2
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","names":["isRecord","errorMessage","isRecord","ensureDevSpace","bundle","promptOutput"],"sources":["../src/config.ts","../src/deployment-environment.ts","../src/dev-manifest.ts","../src/dev-install.ts","../src/node-worker-runner.ts","../src/output.ts","../src/dev-runner.ts","../src/events.ts","../src/manifest-diagnostics.ts","../src/dev.ts","../src/worker-artifact-dependencies.ts","../src/worker-artifact.ts","../src/worker-image.ts","../src/model-policy.ts","../src/provider-auth.ts","../src/spaces.ts","../src/stack.ts","../src/version-bump.ts","../src/main.ts"],"sourcesContent":["import { resolve } from \"node:path\";\n\nimport {\n createClient,\n resolveEnvironment,\n type ResolvedEnvironment,\n} from \"@ponderbot/sdk\";\nimport {\n loadProjectDefinition,\n type ProjectDefinition,\n type ProjectEnvironmentDefinition,\n} from \"@ponderbot/sdk/authoring\";\nimport { parseApplicationOrigin } from \"@ponderbot/sdk/worker\";\n\ninterface ResolveConfigOptions {\n requireDevAllowed?: boolean;\n resolveApplicationOrigin?: boolean;\n useProjectEndpoint?: boolean;\n}\n\nexport interface ProjectConfig {\n project: string;\n projectDefinition: ProjectDefinition;\n}\n\nexport interface ResolvedConfig extends ProjectConfig {\n environment: string;\n environmentRole: NonNullable<ProjectEnvironmentDefinition[\"role\"]>;\n allowDev: boolean;\n sourceName: string;\n url: string;\n spaceId: string;\n token: string;\n applicationOrigin?: string;\n}\n\nexport interface ResolvedProjectReleaseConfig extends ProjectConfig {\n environment: string;\n environmentRole: NonNullable<ProjectEnvironmentDefinition[\"role\"]>;\n allowDev: boolean;\n sourceName: string;\n url: string;\n spaceId?: string;\n token: string;\n}\n\nconst projectDir = (): string =>\n resolve(process.cwd(), process.env.PONDERBOT_PROJECT ?? \"./ponderbot\");\n\nconst exitConfig = (message: string): never => {\n console.error(`ponder: ${message}`);\n process.exit(2);\n};\n\nexport const resolveProject = async (): Promise<ProjectConfig> => {\n const project = projectDir();\n return {\n project,\n projectDefinition: await loadProjectDefinition(resolve(project, \"config\")),\n };\n};\n\nexport const resolveConfig = async (\n envName?: string,\n spaceId?: string,\n): Promise<ResolvedConfig> =>\n requireExecutionSpace(await resolveEnvironmentConfig(envName), spaceId);\n\nexport const resolveProjectReleaseConfig = async (\n envName?: string,\n): Promise<ResolvedProjectReleaseConfig & { applicationOrigin?: string }> =>\n resolveEnvironmentConfig(envName, { resolveApplicationOrigin: true });\n\nexport const resolveDevConfig = async (envName?: string): Promise<ResolvedConfig> =>\n requireExecutionSpace(\n await resolveEnvironmentConfig(envName ?? \"development\", {\n requireDevAllowed: true,\n resolveApplicationOrigin: true,\n useProjectEndpoint: true,\n }),\n );\n\nconst resolveEnvironmentConfig = async (\n envName: string | undefined,\n options: ResolveConfigOptions = {},\n): Promise<ResolvedProjectReleaseConfig & { applicationOrigin?: string }> => {\n let resolved: ResolvedEnvironment;\n const project = projectDir();\n let projectDefinition: ProjectDefinition;\n try {\n projectDefinition = await loadProjectDefinition(resolve(project, \"config\"));\n resolved = resolveEnvironment(projectDefinition, envName);\n } catch (error) {\n return exitConfig(error instanceof Error ? error.message : String(error));\n }\n\n if (\n options.requireDevAllowed &&\n !(resolved.projectEnvironment.allowDev ?? resolved.env === \"development\")\n ) {\n return exitConfig(`environment \"${resolved.env}\" does not allow ponder manifest dev`);\n }\n\n const endpoint = options.useProjectEndpoint\n ? {\n baseUrl: resolved.projectEnvironment.url,\n spaceId: resolved.projectEnvironment.spaceId,\n }\n : resolved.client;\n\n let applicationOrigin: string | undefined;\n if (options.resolveApplicationOrigin) {\n try {\n applicationOrigin = resolveProjectApplicationOrigin(projectDefinition);\n } catch (error) {\n return exitConfig(error instanceof Error ? error.message : String(error));\n }\n }\n\n return {\n project,\n projectDefinition,\n environment: resolved.env,\n environmentRole: resolved.projectEnvironment.role ?? \"execution\",\n allowDev:\n resolved.projectEnvironment.allowDev ?? resolved.env === \"development\",\n sourceName: `${resolved.env}:${projectDefinition.name}`,\n url: endpoint.baseUrl,\n spaceId: endpoint.spaceId,\n token: resolved.client.token,\n applicationOrigin,\n };\n};\n\nconst requireExecutionSpace = (\n config: ResolvedProjectReleaseConfig & { applicationOrigin?: string },\n spaceId?: string,\n): ResolvedConfig => {\n const resolvedSpaceId =\n spaceId !== undefined && spaceId.length > 0 ? spaceId : config.spaceId;\n\n if (resolvedSpaceId === undefined || resolvedSpaceId.length === 0) {\n return exitConfig(\n `set the execution Space with --space, PONDERBOT_SPACE_ID, or spaceId for environment \"${config.environment}\" in ponderbot/config.ts`,\n );\n }\n\n return { ...config, spaceId: resolvedSpaceId };\n};\n\nconst resolveProjectApplicationOrigin = (\n projectDefinition: ProjectDefinition,\n) => {\n const origin = projectDefinition.applicationOrigin;\n if (origin === undefined) {\n return undefined;\n }\n\n const value = process.env[origin.env];\n if (value === undefined || value.length === 0) {\n throw new Error(`application origin environment variable \"${origin.env}\" is not set`);\n }\n\n return parseApplicationOrigin(value);\n};\n\nexport const clientFor = (\n config: Pick<ResolvedProjectReleaseConfig, \"url\" | \"token\" | \"spaceId\">,\n) =>\n createClient({ baseUrl: config.url, token: config.token, spaceId: config.spaceId });\n","import { type PonderbotClient } from \"@ponderbot/sdk\";\n\nimport { type ResolvedConfig } from \"./config\";\n\nconst INERT_SOURCE_SETTINGS = {\n allow_schedules: false,\n allow_webhooks: false,\n allow_manual_triggers: false,\n} as const;\n\nexport const reconcileDeploymentEnvironment = async (\n client: PonderbotClient,\n config: Pick<ResolvedConfig, \"environmentRole\">,\n): Promise<void> => {\n if (config.environmentRole === \"release-source\") {\n const { settings } = await client.spaces.settings.update(INERT_SOURCE_SETTINGS);\n\n if (\n settings.allow_schedules !== false ||\n settings.allow_webhooks !== false ||\n settings.allow_manual_triggers !== false\n ) {\n throw new Error(\"release-source Space settings did not become execution-inert\");\n }\n }\n};\n","import { createHash } from \"node:crypto\";\n\nimport { type Manifest } from \"@ponderbot/sdk/authoring\";\n\nexport const staticProjectManifest = (manifest: Manifest): Manifest => ({\n ...manifest,\n version: staticProjectVersion(manifest),\n});\n\nexport const staticProjectVersion = (manifest: Manifest): string => {\n const sourceHash = createHash(\"sha256\")\n .update(JSON.stringify(manifest))\n .digest(\"hex\")\n .slice(0, 12);\n\n return `${manifest.version ?? \"dev\"}-dev.${sourceHash}`;\n};\n","import { type PonderbotClient } from \"@ponderbot/sdk\";\n\nimport { type ResolvedConfig } from \"./config\";\n\nconst INSTALL_CONCURRENCY = 8;\n\n/**\n * Installs the current Project Release for this environment into every Space\n * associated with the manifest, except the Space the dev loop deploys into.\n *\n * Every `ponder manifest dev` run calls this, whatever the environment role.\n * The `release-source` role only adds inert Space settings and skips the local\n * event tail; it does not own the install. A project with no associated Space\n * is normal, so an empty target list logs nothing.\n */\nexport const installDevelopmentProjectRelease = async (\n client: PonderbotClient,\n config: Pick<ResolvedConfig, \"environment\" | \"spaceId\">,\n manifestName: string,\n): Promise<string[]> => {\n const { space_ids: spaceIds } = await client.dev.manifests.targets(\n manifestName,\n config.environment,\n );\n const targets = spaceIds.filter((spaceId) => spaceId !== config.spaceId);\n\n if (targets.length === 0) {\n return targets;\n }\n\n await eachConcurrent(targets, INSTALL_CONCURRENCY, async (spaceId) => {\n await client.projects.releases.install(manifestName, config.environment, spaceId);\n });\n console.log(\n `installed project release in ${targets.length} associated Spaces: ${targets.join(\", \")}`,\n );\n return targets;\n};\n\nconst eachConcurrent = async <T>(\n values: T[],\n concurrency: number,\n run: (value: T) => Promise<void>,\n) => {\n let index = 0;\n let failure: unknown;\n const worker = async () => {\n while (index < values.length) {\n const value = values[index];\n index += 1;\n if (value !== undefined) {\n try {\n await run(value);\n } catch (error) {\n failure ??= error;\n }\n }\n }\n };\n await Promise.all(\n Array.from({ length: Math.min(concurrency, values.length) }, () => worker()),\n );\n if (failure !== undefined) throw failure;\n};\n","import { spawn } from \"node:child_process\";\nimport { mkdtemp, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n cancelledResult,\n parseWorkerExecutionResult,\n parseSerializedExecutionBoundary,\n type NodeWorkerRequest,\n type ActionWorkerExecutionResult,\n type HookWorkerExecutionResult,\n type WorkerCancellationReason,\n type WorkerExecutionResult,\n} from \"@ponderbot/sdk/worker\";\n\nconst MAXIMUM_WORKER_RESPONSE_BYTES = 1_000_000;\nconst MAXIMUM_WORKER_STDERR_BYTES = 65_536;\nconst MAXIMUM_TIMER_DELAY = 2_147_483_647;\n\nexport type NodeWorkerFailureReason =\n | \"runner_failed\"\n | \"runner_dispatch_failed\"\n | \"runner_contract_missing_result\"\n | \"runner_contract_invalid_result\";\n\nexport class NodeWorkerFailure extends Error {\n readonly reason: NodeWorkerFailureReason;\n\n constructor(reason: NodeWorkerFailureReason, message: string) {\n super(message);\n this.name = \"NodeWorkerFailure\";\n this.reason = reason;\n }\n}\n\nexport const createWorkerTermination = <Timer>(input: {\n completionGraceMilliseconds: number;\n isRunning: () => boolean;\n kill: (signal: \"SIGTERM\" | \"SIGKILL\") => void;\n schedule: (callback: () => void, delay: number) => Timer;\n cancel: (timer: Timer) => void;\n}) => {\n let aborted = false;\n let forceKillTimer: Timer | undefined;\n const abort = () => {\n if (aborted) {\n return;\n }\n aborted = true;\n input.kill(\"SIGTERM\");\n forceKillTimer = input.schedule(() => {\n if (input.isRunning()) {\n input.kill(\"SIGKILL\");\n }\n }, input.completionGraceMilliseconds);\n };\n const settle = () => {\n if (forceKillTimer === undefined) {\n return;\n }\n input.cancel(forceKillTimer);\n forceKillTimer = undefined;\n };\n return {\n abort,\n settle,\n wasAborted: () => aborted,\n };\n};\n\ntype NodeExecutionOptions = NodeWorkerRequest & {\n completionGraceMilliseconds: number;\n environment?: Record<string, string>;\n nodeBinary?: string;\n signal?: AbortSignal;\n stderr?: { write(chunk: string): unknown };\n};\n\ntype ExecutePonderbotWorkerInNode = {\n (\n options: NodeExecutionOptions & {\n invocation: Extract<NodeWorkerRequest[\"invocation\"], { kind: \"action\" }>;\n },\n ): Promise<ActionWorkerExecutionResult>;\n (\n options: NodeExecutionOptions & {\n invocation: Extract<NodeWorkerRequest[\"invocation\"], { kind: \"hook\" }>;\n },\n ): Promise<HookWorkerExecutionResult>;\n (options: NodeExecutionOptions): Promise<WorkerExecutionResult>;\n};\n\nexport const executePonderbotWorkerInNode = (async (\n options: NodeExecutionOptions,\n): Promise<WorkerExecutionResult> => {\n const {\n completionGraceMilliseconds,\n nodeBinary,\n signal,\n environment,\n stderr: stderrTarget,\n ...requestOptions\n } = options;\n if (\n !Number.isSafeInteger(completionGraceMilliseconds) ||\n completionGraceMilliseconds < 0 ||\n completionGraceMilliseconds > MAXIMUM_TIMER_DELAY\n ) {\n throw new Error(\"invalid_worker_completion_grace\");\n }\n const execution = parseSerializedExecutionBoundary(requestOptions.execution);\n if (signal?.aborted) {\n return cancellationResult(requestOptions.invocation, \"caller_cancelled\");\n }\n if (Date.parse(execution.deadlineAt) <= Date.now()) {\n return cancellationResult(requestOptions.invocation, \"deadline_exceeded\");\n }\n const request: NodeWorkerRequest = {\n ...requestOptions,\n execution,\n };\n const directory = await mkdtemp(join(tmpdir(), \"ponderbot-node-worker-\"));\n const requestPath = join(directory, \"request.json\");\n const responsePath = join(directory, \"response.json\");\n\n try {\n await writeFile(requestPath, `${JSON.stringify(request)}\\n`, { mode: 0o600 });\n const childResult = await runNodeWorker({\n nodeBinary: nodeBinary ?? process.env.PONDERBOT_NODE_BINARY ?? \"node\",\n requestPath,\n responsePath,\n execution: request.execution,\n completionGraceMilliseconds,\n signal,\n environment,\n });\n if (childResult.stderr.length > 0) {\n (stderrTarget ?? process.stderr).write(childResult.stderr);\n }\n if (childResult.cancellationReason !== undefined) {\n return cancellationResult(\n request.invocation,\n childResult.cancellationReason,\n );\n }\n try {\n const responseStats = await stat(responsePath);\n if (responseStats.size > MAXIMUM_WORKER_RESPONSE_BYTES) {\n throw new NodeWorkerFailure(\n \"runner_contract_invalid_result\",\n \"node_worker_response_too_large\",\n );\n }\n return parseWorkerExecutionResult(\n JSON.parse(await readFile(responsePath, \"utf8\")) as unknown,\n { kind: request.invocation.kind },\n );\n } catch (error) {\n if (error instanceof NodeWorkerFailure) {\n throw error;\n }\n const reason =\n isRecord(error) && error.code === \"ENOENT\"\n ? \"runner_contract_missing_result\"\n : \"runner_contract_invalid_result\";\n throw new NodeWorkerFailure(reason, errorMessage(error));\n }\n } finally {\n await rm(directory, { recursive: true, force: true });\n }\n}) as ExecutePonderbotWorkerInNode;\n\nconst actionCheckpoint = (invocation: NodeWorkerRequest[\"invocation\"]) =>\n invocation.kind === \"action\"\n ? { onceRecords: invocation.execution.onceRecords }\n : undefined;\n\nconst cancellationResult = (\n invocation: NodeWorkerRequest[\"invocation\"],\n reason: WorkerCancellationReason,\n): WorkerExecutionResult =>\n invocation.kind === \"action\"\n ? cancelledResult(\"action\", reason, actionCheckpoint(invocation)!)\n : cancelledResult(\"hook\", reason);\n\nconst runNodeWorker = async (input: {\n nodeBinary: string;\n requestPath: string;\n responsePath: string;\n execution: NodeWorkerRequest[\"execution\"];\n completionGraceMilliseconds: number;\n signal?: AbortSignal;\n environment?: Record<string, string>;\n}) => {\n const workerExecutable = await resolveWorkerExecutable();\n return new Promise<{\n stderr: string;\n cancellationReason?: WorkerCancellationReason;\n }>((resolveRun, rejectRun) => {\n const child = spawn(\n input.nodeBinary,\n [\n workerExecutable,\n \"--request\",\n input.requestPath,\n \"--response\",\n input.responsePath,\n ],\n {\n stdio: [\"ignore\", \"inherit\", \"pipe\"],\n ...(input.environment === undefined ? {} : { env: { ...process.env, ...input.environment } }),\n },\n );\n let stderr = \"\";\n const deadlineAt = Date.parse(input.execution.deadlineAt);\n const termination = createWorkerTermination({\n completionGraceMilliseconds: input.completionGraceMilliseconds,\n isRunning: () => child.exitCode === null && child.signalCode === null,\n kill: (signal) => {\n child.kill(signal);\n },\n schedule: setTimeout,\n cancel: clearTimeout,\n });\n const cancellation = createWorkerCancellation(termination);\n let deadlineTimer: ReturnType<typeof setTimeout>;\n const abortFromDeadline = () => {\n cancellation.abort(\"deadline_exceeded\");\n };\n const abortFromCaller = () => {\n cancellation.abort(\"caller_cancelled\");\n };\n const scheduleDeadline = () => {\n const remaining = Math.max(0, deadlineAt - Date.now());\n deadlineTimer = setTimeout(\n remaining > MAXIMUM_TIMER_DELAY ? scheduleDeadline : abortFromDeadline,\n Math.min(remaining, MAXIMUM_TIMER_DELAY),\n );\n };\n scheduleDeadline();\n const settle = () => {\n clearTimeout(deadlineTimer);\n termination.settle();\n input.signal?.removeEventListener(\"abort\", abortFromCaller);\n };\n\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk: string) => {\n if (stderr.length < MAXIMUM_WORKER_STDERR_BYTES) {\n stderr += chunk.slice(0, MAXIMUM_WORKER_STDERR_BYTES - stderr.length);\n }\n });\n if (input.signal?.aborted) {\n abortFromCaller();\n } else {\n input.signal?.addEventListener(\"abort\", abortFromCaller, { once: true });\n }\n child.on(\"error\", (error) => {\n settle();\n rejectRun(error);\n });\n child.on(\"exit\", (code) => {\n settle();\n const cancellationReason = cancellation.reason();\n if (cancellationReason !== undefined) {\n resolveRun({\n stderr,\n cancellationReason,\n });\n return;\n }\n if (code === 0) {\n resolveRun({ stderr });\n return;\n }\n rejectRun(\n new NodeWorkerFailure(\n stderr.trim() === \"invalid_node_worker_request\"\n ? \"runner_dispatch_failed\"\n : \"runner_failed\",\n stderr.trim() || `node_worker_exited: ${code ?? \"signal\"}`,\n ),\n );\n });\n });\n};\n\nconst createWorkerCancellation = (termination: {\n abort: () => void;\n}) => {\n let cancellationReason: WorkerCancellationReason | undefined;\n\n return {\n abort: (reason: WorkerCancellationReason) => {\n if (cancellationReason !== undefined) {\n return;\n }\n cancellationReason = reason;\n termination.abort();\n },\n reason: () => cancellationReason,\n };\n};\n\nconst resolveWorkerExecutable = async () => {\n const workerModule = fileURLToPath(import.meta.resolve(\"@ponderbot/sdk/worker\"));\n const sdkDirectory = dirname(dirname(workerModule));\n const packageJson = JSON.parse(\n await readFile(join(sdkDirectory, \"package.json\"), \"utf8\"),\n ) as unknown;\n if (\n !isRecord(packageJson) ||\n !isRecord(packageJson.bin) ||\n typeof packageJson.bin[\"ponderbot-worker\"] !== \"string\"\n ) {\n throw new Error(\"ponderbot_worker_executable_missing\");\n }\n return resolve(sdkDirectory, packageJson.bin[\"ponderbot-worker\"]);\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst errorMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error);\n","import { isPonderbotError } from \"@ponderbot/sdk\";\nimport { isManifestBuildError } from \"@ponderbot/sdk/authoring\";\n\ninterface PrintOptions {\n json?: boolean;\n}\n\nexport const print = (data: unknown, options: PrintOptions = {}): void => {\n if (options.json) {\n console.log(JSON.stringify(jsonData(data)));\n return;\n }\n\n for (const line of lines(data)) {\n console.log(line);\n }\n}\n\nexport const fail = (error: unknown, code = 1): never => {\n console.error(formatError(error));\n process.exit(code);\n}\n\nexport const formatError = (error: unknown): string => {\n if (isManifestBuildError(error)) {\n return error.message;\n }\n\n if (isPonderbotError(error)) {\n const conflictVersion = manifestReleaseVersionConflict(error.detail);\n if (conflictVersion !== undefined) {\n return `version ${conflictVersion} is already released with different content — bump version in ponderbot/config.ts or rerun with --bump patch`;\n }\n\n return typeof error.detail === \"undefined\" ? error.code : JSON.stringify(error.detail);\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\nconst lines = (data: unknown): string[] => {\n if (isRecord(data) && isRecord(data.release) && isRecord(data.resources)) {\n return releaseCatalogLines(data.release, data.resources);\n }\n\n if (isStartedDevStack(data)) {\n return [\n \"Ponderbot dev stack ready.\",\n ` PONDERBOT_URL=${data.dev_environment.url}`,\n ` PONDERBOT_SPACE_ID=${data.dev_environment.space_id}`,\n ` PONDERBOT_TOKEN=${data.dev_environment.token}`,\n \"Put these in your app's .env - createClient() reads them.\",\n ];\n }\n\n if (isRecord(data) && isRecord(data.release) && typeof data.release.id === \"string\") {\n return [\n ...versionBumpLines(data.version_bump),\n `release ${data.release.id}`,\n ...recordLines(data.registered),\n ];\n }\n\n if (isRecord(data) && data.ok === true && isRecord(data.counts)) {\n return [\"manifest valid\", ...recordLines(data.counts)];\n }\n\n if (isRecord(data) && Array.isArray(data.spaces)) {\n return [\"id name status\", ...data.spaces.map((space) => columns(space, spaceKeys))];\n }\n\n if (isRecord(data) && isRecord(data.space)) {\n if (isRecord(data.budget) && isRecord(data.usage)) {\n return spaceShowLines(data.space, data.budget, data.usage);\n }\n\n return [columns(data.space, spaceKeys)];\n }\n\n if (isRecord(data) && isRecord(data.budget)) {\n return recordLines(data.budget);\n }\n\n if (isRecord(data) && Array.isArray(data.models)) {\n return [\"ref provider model\", ...data.models.map((model) => columns(model, modelKeys))];\n }\n\n if (isRecord(data) && isRecord(data.model)) {\n return [columns(data.model, modelKeys)];\n }\n\n if (isRecord(data) && isRecord(data.agent_model_refs)) {\n return [\n \"agent model\",\n ...Object.entries(data.agent_model_refs).map(\n ([agentRef, modelRef]) => `${agentRef} ${String(modelRef)}`,\n ),\n ];\n }\n\n if (isRecord(data) && isRecord(data.run)) {\n return lines(data.run);\n }\n\n if (\n isRecord(data) &&\n data.type === \"provider_auth\" &&\n typeof data.provider === \"string\" &&\n typeof data.method === \"string\" &&\n typeof data.space_id === \"string\"\n ) {\n if (typeof data.binding_id === \"string\") {\n const target =\n data.all_spaces === true\n ? \"all Spaces\"\n : `Spaces ${Array.isArray(data.space_ids) ? data.space_ids.join(\", \") : data.space_id}`;\n\n return [\n `provider ${data.provider} ${data.method} shared credentials saved for ${target}`,\n `binding ${data.binding_id}`,\n `smoke test: ${String(data.smoke_test ?? \"ponder spaces show\")}`,\n ];\n }\n\n return [\n `provider ${data.provider} ${data.method} credentials saved for space ${data.space_id}`,\n `smoke test: ${String(data.smoke_test ?? \"ponder spaces show\")}`,\n ];\n }\n\n if (Array.isArray(data)) {\n return data.flatMap((item) => lines(item));\n }\n\n if (isRecord(data)) {\n const arrayEntry = Object.entries(data).find((entry): entry is [string, unknown[]] =>\n Array.isArray(entry[1]),\n );\n if (arrayEntry) {\n return arrayEntry[1].flatMap((item) => lines(item));\n }\n\n return [recordSummary(data)];\n }\n\n return [String(data)];\n}\n\nconst versionBumpLines = (data: unknown): string[] => {\n if (\n !isRecord(data) ||\n typeof data.previousVersion !== \"string\" ||\n typeof data.nextVersion !== \"string\"\n ) {\n return [];\n }\n\n return [`version ${data.previousVersion} → ${data.nextVersion}`];\n}\n\nconst jsonData = (data: unknown): unknown => {\n if (!isStartedDevStack(data)) {\n return data;\n }\n\n return {\n ...data,\n dev_environment: {\n url: data.dev_environment.url,\n space_id: data.dev_environment.space_id,\n token_env: \"PONDERBOT_TOKEN\",\n },\n };\n}\n\nfunction isStartedDevStack(data: unknown): data is {\n type: \"stack\";\n status: \"started\";\n dev_environment: {\n url: string;\n space_id: string;\n token: string;\n };\n} {\n return (\n isRecord(data) &&\n data.type === \"stack\" &&\n data.status === \"started\" &&\n isRecord(data.dev_environment) &&\n typeof data.dev_environment.url === \"string\" &&\n typeof data.dev_environment.space_id === \"string\" &&\n typeof data.dev_environment.token === \"string\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nconst manifestReleaseVersionConflict = (detail: unknown): string | undefined => {\n const details = isRecord(detail) ? detail.details : detail;\n\n if (\n Array.isArray(details) &&\n (details[0] === \"manifest_release_version_conflict\" ||\n details[0] === \"manifest_project_release_version_conflict\") &&\n typeof details[3] === \"string\"\n ) {\n return details[3];\n }\n\n return undefined;\n}\n\nconst recordLines = (data: unknown): string[] => {\n if (!isRecord(data)) {\n return [];\n }\n\n return Object.entries(data).map(([key, value]) => `${key} ${String(value)}`);\n}\n\nfunction spaceShowLines(\n space: Record<string, unknown>,\n budget: Record<string, unknown>,\n usage: Record<string, unknown>,\n): string[] {\n return [\n columns(space, spaceKeys),\n \"budget\",\n ...recordLines(budget),\n ...spaceUsageLines(usage),\n ];\n}\n\nfunction spaceUsageLines(usage: Record<string, unknown>): string[] {\n const period = isRecord(usage.period) ? usage.period : {};\n const resources = isRecord(usage.usage) ? usage.usage : {};\n\n return [\n `usage ${String(period.type ?? \"unknown\")} ${String(period.starts_at ?? \"\")} ${String(period.ends_at ?? \"\")}`.trim(),\n ...Object.entries(resources).map(([key, value]) => {\n if (!isRecord(value)) {\n return `${key} ${JSON.stringify(value)}`;\n }\n\n return [\n key,\n `used=${String(value.used ?? \"\")}`,\n `limit=${limitValue(value.limit)}`,\n `remaining=${limitValue(value.remaining)}`,\n ].join(\" \");\n }),\n ];\n}\n\nconst limitValue = (value: unknown): string => {\n return value === null ? \"unlimited\" : String(value);\n}\n\nconst spaceKeys = [\"id\", \"name\", \"status\"];\n\nconst modelKeys = [\"ref\", \"provider\", \"model\"];\n\nconst releaseKeys = [\"id\", \"manifest_name\", \"environment\", \"version\", \"status\"];\n\nconst catalogKeys: Record<string, string[]> = {\n agents: [\"ref\", \"name\"],\n mcp_servers: [\"ref\", \"url\", \"tool_count\"],\n actions: [\"ref\", \"kind\"],\n skills: [\"ref\", \"name\"],\n workflows: [\"ref\", \"name\"],\n schedules: [\"ref\", \"target_type\", \"target_ref\", \"mode\", \"enabled\", \"next_run_at\"],\n webhooks: [\"ref\", \"target_type\", \"target_ref\"],\n agent_groups: [\"ref\", \"strategy\"],\n};\n\nconst columns = (record: unknown, keys: string[]): string => {\n if (!isRecord(record)) {\n return String(record);\n }\n\n return keys\n .map((key) => record[key])\n .filter((value) => value !== undefined && value !== null)\n .map((value) => String(value))\n .join(\" \");\n};\n\nconst releaseCatalogLines = (\n release: Record<string, unknown>,\n resources: Record<string, unknown>,\n): string[] => [\n `release ${columns(release, releaseKeys)}`,\n ...Object.entries(resources).flatMap(([kind, entries]) =>\n Array.isArray(entries) && entries.length > 0\n ? [\n `${kind} (${entries.length})`,\n ...entries.map((entry) => ` ${columns(entry, catalogKeys[kind] ?? [\"ref\", \"name\"])}`),\n ]\n : [],\n ),\n];\n\nfunction recordSummary(record: Record<string, unknown>): string {\n const fields = [\n field(record, \"type\") ?? field(record, \"run_type\") ?? field(record, \"target_type\"),\n field(record, \"id\") ??\n field(record, \"run_id\") ??\n field(record, \"record_id\") ??\n field(record, \"receipt_id\"),\n field(record, \"ref\") ?? field(record, \"target_ref\") ?? field(record, \"action\"),\n field(record, \"status\"),\n ].filter((value): value is string => value !== undefined);\n\n return fields.length === 0 ? JSON.stringify(record) : fields.join(\" \");\n}\n\nfunction field(record: Record<string, unknown>, name: string): string | undefined {\n const value = record[name];\n return typeof value === \"string\" ? value : undefined;\n}\n","import {\n isPonderbotError,\n ponderbotError,\n type CallContext,\n type DevManifestHookDelivery,\n type JsonObject,\n type PonderbotClient,\n type Run,\n type SSEEvent,\n} from \"@ponderbot/sdk\";\nimport {\n parseSerializedExecutionBoundary,\n parseActionExecutionSnapshot,\n isLifecycleEvent,\n type ActionCheckpoint,\n type ActionWorkerExecutionResult,\n type HookWorkerExecutionResult,\n type ActionSuspension,\n type SerializedExecutionBoundary,\n type WorkerExecutionResult,\n} from \"@ponderbot/sdk/worker\";\n\nimport { type ResolvedConfig } from \"./config\";\nimport {\n executePonderbotWorkerInNode,\n NodeWorkerFailure,\n} from \"./node-worker-runner\";\nimport { formatError } from \"./output\";\n\nexport interface DevActionRunner {\n catchUp(): Promise<void>;\n catchUpManifest(manifestName: string): Promise<void>;\n handleEvent(event: SSEEvent): void;\n idle(): Promise<void>;\n stop(): Promise<void>;\n}\n\ninterface QueueState {\n stopped: boolean;\n concurrency: number;\n active: Map<string, ActiveDevRun>;\n idlePromise: Promise<void>;\n resolveIdle?: () => void;\n pending: DevRunIdentity[];\n scheduledIds: Set<string>;\n claimBackoff: Map<string, ClaimBackoff>;\n}\n\n// One backoff record per run key. A Hook record carries the attempt's request\n// id so that a re-offered attempt N+1 replaces the attempt-N record instead of\n// inheriting its backoff. Action backoff has no attempt identity.\ninterface ClaimBackoff {\n requestId?: string;\n blockedUntil: number;\n}\n\ninterface DevActionRunIdentity {\n actionRunId: string;\n spaceId: string;\n}\n\ninterface DevHookDeliveryIdentity {\n hookDelivery: DevManifestHookDelivery;\n}\n\ntype DevRunIdentity = DevActionRunIdentity | DevHookDeliveryIdentity;\n\ninterface ActiveDevRun {\n requestId?: string;\n controller?: AbortController;\n}\n\ninterface DevActionRunnerOptions {\n concurrency?: number;\n}\n\nconst DEFAULT_DEV_ACTION_CONCURRENCY = 4;\nconst CLAIM_FAILURE_BACKOFF_MILLISECONDS = 30_000;\n\nconst runKey = (run: DevRunIdentity) =>\n \"actionRunId\" in run\n ? `action:${run.spaceId}:${run.actionRunId}`\n : `hook:${run.hookDelivery.id}`;\n\nconst claimRequestId = (run: DevRunIdentity) =>\n \"actionRunId\" in run ? undefined : run.hookDelivery.dev_runner.request_id;\n\nconst blockClaim = (queue: QueueState, run: DevRunIdentity) => {\n queue.claimBackoff.set(runKey(run), {\n requestId: claimRequestId(run),\n blockedUntil: Date.now() + CLAIM_FAILURE_BACKOFF_MILLISECONDS,\n });\n};\n\n// Blocks only while the stored record is for this offered attempt and its\n// backoff has not elapsed. A different request id or an elapsed backoff drops\n// the record, so the map holds at most one entry per run key.\nconst claimBlocked = (queue: QueueState, run: DevRunIdentity) => {\n const key = runKey(run);\n const backoff = queue.claimBackoff.get(key);\n if (backoff === undefined) {\n return false;\n }\n if (backoff.requestId === claimRequestId(run) && Date.now() < backoff.blockedUntil) {\n return true;\n }\n queue.claimBackoff.delete(key);\n return false;\n};\n\ninterface DevRunnerCallback {\n url: string;\n token: string;\n runnerId: string;\n actionRunId: string;\n requestId: string;\n attempt: number;\n checkpoint: ActionCheckpoint;\n}\n\ntype DevRunnerCallbackIdentity = Omit<DevRunnerCallback, \"checkpoint\">;\n\ninterface DevRunnerCallbackBody {\n status: \"completed\" | \"failed\" | \"cancelled\" | \"suspended\";\n exit_code: number;\n result: JsonObject;\n reason: string | null;\n checkpoint: ActionCheckpoint;\n suspension?: ActionSuspension;\n}\n\nexport const createDevActionRunner = (\n client: PonderbotClient,\n config: ResolvedConfig,\n options: DevActionRunnerOptions = {},\n): DevActionRunner => {\n const concurrency = Math.max(\n 1,\n Math.floor(options.concurrency ?? DEFAULT_DEV_ACTION_CONCURRENCY),\n );\n const state: QueueState = {\n stopped: false,\n concurrency,\n active: new Map(),\n idlePromise: Promise.resolve(),\n pending: [],\n scheduledIds: new Set(),\n claimBackoff: new Map(),\n };\n\n const enqueue = (queue: QueueState, run: DevRunIdentity) => {\n const key = runKey(run);\n if (queue.stopped || queue.scheduledIds.has(key)) {\n return;\n }\n if (claimBlocked(queue, run)) {\n return;\n }\n\n if (queue.scheduledIds.size === 0) {\n queue.idlePromise = new Promise<void>((resolve) => {\n queue.resolveIdle = resolve;\n });\n }\n queue.pending.push(run);\n queue.scheduledIds.add(key);\n drain(queue);\n };\n\n const drain = (queue: QueueState) => {\n while (\n !queue.stopped &&\n queue.active.size < queue.concurrency &&\n queue.pending.length > 0\n ) {\n const run = queue.pending.shift();\n if (run === undefined) continue;\n const key = runKey(run);\n const active: ActiveDevRun = {};\n queue.active.set(key, active);\n void executeDevRun(run, active).finally(() => {\n queue.active.delete(key);\n queue.scheduledIds.delete(key);\n drain(queue);\n settleIdle(queue);\n });\n }\n };\n\n const settleIdle = (queue: QueueState) => {\n if (queue.scheduledIds.size > 0) return;\n queue.resolveIdle?.();\n queue.resolveIdle = undefined;\n };\n\n const executeDevRun = async (run: DevRunIdentity, active: ActiveDevRun): Promise<void> => {\n if (\"hookDelivery\" in run) {\n await executeDevHook(run.hookDelivery, active);\n return;\n }\n await executeDevAction(run, active);\n };\n\n const executeDevAction = async ({\n actionRunId,\n spaceId,\n }: DevActionRunIdentity, active: ActiveDevRun): Promise<void> => {\n let callback: DevRunnerCallback | undefined;\n\n try {\n let { run } = await client.runs.show(\"action\", actionRunId, spaceId);\n if (state.stopped || run.runner !== \"dev\" || run.status !== \"running\") {\n return;\n }\n // The claim is the dev acceptance: it records the runner callback that\n // sets runner_status and closes the dispatch receipt. Every attempt is\n // claimed, not only the ones that carry a secret grant.\n try {\n await client.dev.actionRuns.claim(actionRunId, spaceId);\n } catch (claimError) {\n if (!(isPonderbotError(claimError) && claimError.status === 409)) {\n throw claimError;\n }\n ({ run } = await client.runs.show(\"action\", actionRunId, spaceId));\n if (state.stopped || run.runner !== \"dev\" || run.status !== \"running\") {\n return;\n }\n blockClaim(state, { actionRunId, spaceId });\n console.error(formatError(claimError));\n return;\n }\n ({ run } = await client.runs.show(\"action\", actionRunId, spaceId));\n if (state.stopped || run.runner !== \"dev\" || run.status !== \"running\") {\n return;\n }\n\n const context = devCallContext(run, spaceId);\n const actionExecution = devActionExecution(run);\n const activeCallback = {\n ...devRunnerCallback(run),\n checkpoint: { onceRecords: actionExecution.onceRecords },\n };\n callback = activeCallback;\n const execution = devExecutionBoundary(run);\n const controller = new AbortController();\n active.requestId = activeCallback.requestId;\n active.controller = controller;\n const environment = await redeemActionSecretGrant(run, spaceId, config);\n const result = await executePonderbotWorkerInNode({\n dir: config.project,\n dev: true,\n invocation: {\n kind: \"action\",\n name: run.ref ?? actionRunId,\n input: devInput(run),\n execution: actionExecution,\n },\n context,\n execution,\n applicationOrigin: config.applicationOrigin ?? devApplicationOrigin(run),\n completionGraceMilliseconds: devCompletionGraceMilliseconds(run),\n environment,\n reload: true,\n signal: controller.signal,\n });\n\n if (state.stopped) return;\n\n try {\n await postRunnerCallback(activeCallback, devRunnerCallbackBody(result));\n } catch (callbackError) {\n logCallbackDeliveryError(callbackError);\n return;\n }\n\n } catch (error) {\n if (state.stopped) return;\n\n if (callback === undefined) {\n console.error(formatError(error));\n return;\n }\n\n try {\n await postRunnerCallback(\n callback,\n devRunnerFailureBody(error, callback.checkpoint),\n );\n } catch (callbackError) {\n logCallbackDeliveryError(callbackError);\n }\n\n console.error(formatError(error));\n }\n };\n\n const executeDevHook = async (\n offered: DevManifestHookDelivery,\n active: ActiveDevRun,\n ): Promise<void> => {\n // Claim the attempt before the body runs. The Runtime replaces a spent or\n // nearly expired grant under the delivery row lock, so a runner restart or\n // watch redeploy never retries against a grant that was already redeemed.\n let delivery: DevManifestHookDelivery;\n try {\n ({ delivery } = await client.dev.hookDeliveries.claim(offered.id, offered.space_id));\n } catch (claimError) {\n if (state.stopped) return;\n if (isPonderbotError(claimError) && claimError.status === 404) {\n // The attempt is no longer waiting for the dev runner.\n return;\n }\n if (isPonderbotError(claimError) && claimError.status === 409) {\n blockClaim(state, { hookDelivery: offered });\n }\n console.error(formatError(claimError));\n return;\n }\n const callback = devHookCallback(delivery);\n try {\n const context = devHookContext(delivery);\n const execution = devHookExecution(delivery);\n const controller = new AbortController();\n active.requestId = callback.requestId;\n active.controller = controller;\n let environment: Record<string, string>;\n try {\n environment = await redeemSecretGrant(\n {\n token: delivery.dev_runner.secret_grant,\n kind: \"hook\",\n ownerId: delivery.id,\n spaceId: context.space_id,\n releaseId: context.release_id,\n runId: context.run_id,\n attempt: context.attempt,\n requestId: delivery.dev_runner.request_id,\n runnerId: delivery.dev_runner.runner_id,\n },\n config,\n `dev_hook_secret_delivery_failed: ${delivery.id}`,\n `dev_hook_secret_delivery_invalid: ${delivery.id}`,\n );\n } catch (redeemError) {\n if (state.stopped) return;\n if (!isSecretGrantContention(redeemError)) {\n throw redeemError;\n }\n // Redemption is single-use. A claimed grant another runner already\n // spent or replaced must not execute or fail the attempt here; this\n // runner backs off and re-claims on a later poll.\n blockClaim(state, { hookDelivery: offered });\n console.error(formatError(redeemError));\n return;\n }\n const event = delivery.dev_runner.worker_command.event;\n if (!isLifecycleEvent(event)) {\n throw new Error(`dev_hook_event_invalid: ${delivery.id}`);\n }\n const result = await executePonderbotWorkerInNode({\n dir: config.project,\n dev: true,\n invocation: {\n kind: \"hook\",\n name: delivery.dev_runner.worker_command.name,\n event,\n },\n context,\n execution,\n applicationOrigin: config.applicationOrigin,\n completionGraceMilliseconds: 0,\n environment,\n reload: true,\n signal: controller.signal,\n });\n if (state.stopped) return;\n try {\n await postHookRunnerCallback(callback, devHookCallbackBody(result));\n } catch (callbackError) {\n logCallbackDeliveryError(callbackError);\n }\n } catch (error) {\n if (state.stopped) return;\n try {\n await postHookRunnerCallback(callback, devHookFailureBody(error));\n } catch (callbackError) {\n logCallbackDeliveryError(callbackError);\n }\n console.error(formatError(error));\n }\n };\n\n return {\n async catchUp() {\n const response = await client.runs.list({\n type: \"action\",\n status: \"running\",\n });\n for (const run of response.runs) {\n if (run.runner === \"dev\") {\n enqueue(state, { actionRunId: run.id, spaceId: config.spaceId });\n }\n }\n },\n async catchUpManifest(manifestName) {\n const response = await client.dev.manifests.actionRuns(\n manifestName,\n config.environment,\n );\n const runningKeys = new Set(\n response.runs.map((run) =>\n runKey({ actionRunId: run.id, spaceId: run.space_id }),\n ),\n );\n const hookResponse = await client.dev.manifests.hookDeliveries(\n manifestName,\n config.environment,\n );\n const hookKeys = new Set(hookResponse.deliveries.map((delivery) => runKey({ hookDelivery: delivery })));\n for (const [key, active] of state.active) {\n if (!runningKeys.has(key) && !hookKeys.has(key)) {\n active.controller?.abort(\n new DOMException(\"Runtime cancelled execution\", \"AbortError\"),\n );\n }\n }\n for (const run of response.runs) {\n enqueue(state, { actionRunId: run.id, spaceId: run.space_id });\n }\n for (const delivery of hookResponse.deliveries) {\n enqueue(state, { hookDelivery: delivery });\n }\n },\n handleEvent(event) {\n if (isDevActionDispatchHint(event)) {\n enqueue(state, {\n actionRunId: event.data.run_id,\n spaceId: eventSpaceId(event, config.spaceId),\n });\n return;\n }\n if (\n isDevActionTerminalHint(event)\n ) {\n const active = state.active.get(\n runKey({\n actionRunId: event.data.run_id,\n spaceId: eventSpaceId(event, config.spaceId),\n }),\n );\n if (active?.requestId === event.data.metadata.request_id) {\n active.controller?.abort(\n new DOMException(\"Runtime cancelled execution\", \"AbortError\"),\n );\n }\n }\n },\n idle() {\n return state.idlePromise;\n },\n stop() {\n if (!state.stopped) {\n state.stopped = true;\n for (const run of state.pending) {\n state.scheduledIds.delete(runKey(run));\n }\n state.pending.length = 0;\n for (const active of state.active.values()) {\n active.controller?.abort(\n new DOMException(\"Dev runner stopped\", \"AbortError\"),\n );\n }\n settleIdle(state);\n }\n return state.idlePromise;\n },\n };\n};\n\nconst isDevActionTerminalHint = (\n event: SSEEvent,\n): event is SSEEvent & {\n data: {\n type: \"run_updated\";\n run_type: \"action\";\n run_id: string;\n space_id?: string;\n metadata: {\n request_id: string;\n runner: \"dev\";\n status: string;\n };\n };\n} =>\n event.event === \"run_updated\" &&\n isRecord(event.data) &&\n event.data.type === \"run_updated\" &&\n event.data.run_type === \"action\" &&\n typeof event.data.run_id === \"string\" &&\n isRecord(event.data.metadata) &&\n event.data.metadata.runner === \"dev\" &&\n typeof event.data.metadata.request_id === \"string\" &&\n [\"cancelled\", \"failed\", \"completed\"].includes(\n String(event.data.metadata.status),\n );\n\nconst isDevActionDispatchHint = (\n event: SSEEvent,\n): event is SSEEvent & {\n data: {\n type: \"run_updated\";\n run_type: \"action\";\n run_id: string;\n space_id?: string;\n metadata: { runner: \"dev\"; status: \"running\" };\n };\n} =>\n event.event === \"run_updated\" &&\n isRecord(event.data) &&\n event.data.type === \"run_updated\" &&\n event.data.run_type === \"action\" &&\n typeof event.data.run_id === \"string\" &&\n isRecord(event.data.metadata) &&\n event.data.metadata.runner === \"dev\" &&\n event.data.metadata.status === \"running\";\n\nconst eventSpaceId = (event: SSEEvent, fallback: string) =>\n isRecord(event.data) && typeof event.data.space_id === \"string\"\n ? event.data.space_id\n : fallback;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst isJsonObject = (value: unknown): value is JsonObject =>\n isRecord(value) && Object.values(value).every(isJsonValue);\n\nconst isJsonValue = (value: unknown): boolean =>\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n (Array.isArray(value) && value.every(isJsonValue)) ||\n isJsonObject(value);\n\nconst devInput = (run: Run): JsonObject => {\n const input = run.input ?? {};\n if (!isJsonObject(input)) {\n throw new Error(`dev_runner_input_invalid: ${run.id}`);\n }\n return input;\n};\n\nconst devCallContext = (\n run: Run,\n spaceId: string,\n): CallContext => {\n const devRunner = run.dev_runner;\n if (\n devRunner === null ||\n devRunner === undefined ||\n typeof devRunner.runner_id !== \"string\"\n ) {\n throw new Error(`dev_runner_context_missing: ${run.id}`);\n }\n\n if (\n (devRunner.schedule_ref === undefined) !==\n (devRunner.scheduled_at === undefined)\n ) {\n throw new Error(`dev_runner_schedule_context_invalid: ${run.id}`);\n }\n const context: CallContext = {\n space_id: spaceId,\n action_run_id: run.id,\n run_type: \"action\",\n run_id: run.id,\n release_id: devReleaseId(run),\n attempt: devAttempt(run),\n runner_id: devRunner.runner_id,\n metadata: {\n request_id: devRequestId(run),\n },\n };\n\n if (devRunner.principal !== undefined) {\n context.principal = devRunner.principal;\n }\n\n if (devRunner.workflow_run_id !== undefined) {\n context.workflow_run_id = devRunner.workflow_run_id;\n }\n\n if (\n devRunner.schedule_ref !== undefined &&\n devRunner.scheduled_at !== undefined\n ) {\n context.schedule_ref = devRunner.schedule_ref;\n context.scheduled_at = devRunner.scheduled_at;\n }\n\n return context;\n};\n\nconst devReleaseId = (run: Run) => {\n if (typeof run.release_id !== \"string\" || run.release_id.length === 0) {\n throw new Error(`dev_runner_release_id_invalid: ${run.id}`);\n }\n return run.release_id;\n};\n\nconst devApplicationOrigin = (run: Run) => {\n const origin = run.dev_runner?.application_origin;\n if (origin === undefined) {\n return undefined;\n }\n if (typeof origin !== \"string\" || origin.length === 0) {\n throw new Error(`dev_runner_application_origin_invalid: ${run.id}`);\n }\n return origin;\n};\n\nconst devRunnerCallback = (run: Run): DevRunnerCallbackIdentity => {\n const devRunner = run.dev_runner;\n if (\n devRunner === null ||\n devRunner === undefined ||\n typeof devRunner.callback_url !== \"string\" ||\n typeof devRunner.callback_token !== \"string\" ||\n typeof devRunner.runner_id !== \"string\"\n ) {\n throw new Error(`dev_runner_context_missing: ${run.id}`);\n }\n\n return {\n url: devRunner.callback_url,\n token: devRunner.callback_token,\n runnerId: devRunner.runner_id,\n requestId: devRequestId(run),\n actionRunId: run.id,\n attempt: devAttempt(run),\n };\n};\n\nconst devExecutionBoundary = (run: Run): SerializedExecutionBoundary => {\n const execution = run.dev_runner?.execution;\n try {\n const parsed = parseSerializedExecutionBoundary(execution);\n if (parsed.cancellationId !== devRequestId(run)) {\n throw new Error(\"execution_request_identity_mismatch\");\n }\n return parsed;\n } catch {\n throw new Error(`dev_runner_execution_boundary_invalid: ${run.id}`);\n }\n};\n\nconst devActionExecution = (run: Run) => {\n try {\n return parseActionExecutionSnapshot(run.dev_runner?.action_execution);\n } catch {\n throw new Error(`dev_runner_action_execution_invalid: ${run.id}`);\n }\n};\n\nconst devRequestId = (run: Run) => {\n const requestId = run.dev_runner?.request_id;\n if (typeof requestId !== \"string\" || requestId.length === 0) {\n throw new Error(`dev_runner_request_id_invalid: ${run.id}`);\n }\n return requestId;\n};\n\nconst devAttempt = (run: Run) => {\n if (!Number.isSafeInteger(run.attempt) || Number(run.attempt) <= 0) {\n throw new Error(`dev_runner_attempt_invalid: ${run.id}`);\n }\n return Number(run.attempt);\n};\n\nconst devCompletionGraceMilliseconds = (run: Run) => {\n const seconds = run.dev_runner?.completion_grace_seconds;\n if (!Number.isSafeInteger(seconds) || Number(seconds) < 0) {\n throw new Error(`dev_runner_completion_grace_invalid: ${run.id}`);\n }\n const milliseconds = Number(seconds) * 1_000;\n if (!Number.isSafeInteger(milliseconds)) {\n throw new Error(`dev_runner_completion_grace_invalid: ${run.id}`);\n }\n return milliseconds;\n};\n\nconst postRunnerCallback = async (\n callback: DevRunnerCallback,\n body: DevRunnerCallbackBody,\n): Promise<void> => {\n const occurredAt = new Date().toISOString();\n const response = await fetch(callback.url, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${callback.token}`,\n \"content-type\": \"application/json\",\n \"x-ponderbot-runner-event-id\": [\n \"dev-action\",\n callback.actionRunId,\n callback.attempt,\n body.status,\n globalThis.crypto.randomUUID(),\n ].join(\":\"),\n \"x-ponderbot-runner-timestamp\": occurredAt,\n },\n body: JSON.stringify({\n runner_id: callback.runnerId,\n status: body.status,\n exit_code: body.exit_code,\n result: body.result,\n reason: body.reason,\n checkpoint: body.checkpoint,\n suspension: body.suspension,\n occurred_at: occurredAt,\n }),\n });\n\n const responseBody = await response.json().catch(() => ({}));\n if (!response.ok) {\n const error =\n isRecord(responseBody) && responseBody.error !== undefined\n ? responseBody.error\n : response.statusText;\n throw ponderbotError(response.status, String(error), responseBody);\n }\n};\n\nconst devRunnerCallbackBody = (\n result: ActionWorkerExecutionResult,\n): DevRunnerCallbackBody => {\n switch (result.status) {\n case \"completed\":\n return {\n status: \"completed\",\n exit_code: 0,\n result: result.output,\n reason: null,\n checkpoint: result.checkpoint,\n };\n case \"suspended\":\n return {\n status: \"suspended\",\n exit_code: 0,\n result: {},\n reason: null,\n checkpoint: result.checkpoint,\n suspension: result.suspension,\n };\n case \"failed\":\n return {\n status: \"failed\",\n exit_code: 1,\n result: {\n error:\n result.error.detail === undefined\n ? {\n code: result.error.code,\n message: result.error.message,\n }\n : {\n code: result.error.code,\n message: result.error.message,\n detail: result.error.detail,\n },\n },\n reason: result.error.code,\n checkpoint: result.checkpoint,\n };\n case \"cancelled\":\n return {\n status: \"cancelled\",\n exit_code: result.reason === \"deadline_exceeded\" ? 124 : 130,\n result: {},\n reason: result.reason,\n checkpoint: result.checkpoint,\n };\n }\n};\n\nconst devRunnerFailureBody = (\n error: unknown,\n checkpoint: ActionCheckpoint,\n): DevRunnerCallbackBody => {\n const message = errorMessage(error);\n const reason =\n error instanceof NodeWorkerFailure ? error.reason : \"runner_failed\";\n\n return {\n status: \"failed\",\n exit_code: 1,\n result: {\n error: {\n code: reason,\n message,\n },\n },\n reason,\n checkpoint,\n };\n};\n\ninterface DevHookRunnerCallback {\n url: string;\n token: string;\n runnerId: string;\n hookDeliveryId: string;\n requestId: string;\n}\n\ninterface DevHookRunnerCallbackBody {\n status: \"completed\" | \"failed\" | \"cancelled\";\n exit_code: number;\n result: JsonObject;\n reason: string | null;\n}\n\nconst devHookCallback = (delivery: DevManifestHookDelivery): DevHookRunnerCallback => ({\n url: delivery.dev_runner.callback_url,\n token: delivery.dev_runner.callback_token,\n runnerId: delivery.dev_runner.runner_id,\n hookDeliveryId: delivery.id,\n requestId: delivery.dev_runner.request_id,\n});\n\nconst devHookContext = (delivery: DevManifestHookDelivery): CallContext => {\n const context = delivery.dev_runner.context;\n const spaceId = context.space_id;\n const runId = context.run_id;\n const releaseId = context.release_id;\n const hookDeliveryId = context.hook_delivery_id;\n const attempt = context.attempt;\n if (\n typeof spaceId !== \"string\" ||\n typeof runId !== \"string\" ||\n typeof releaseId !== \"string\" ||\n typeof hookDeliveryId !== \"string\" ||\n typeof attempt !== \"number\" ||\n !Number.isSafeInteger(attempt) ||\n attempt <= 0\n ) {\n throw new Error(`dev_hook_context_invalid: ${delivery.id}`);\n }\n return {\n space_id: spaceId,\n run_id: runId,\n release_id: releaseId,\n hook_delivery_id: hookDeliveryId,\n attempt,\n runner_id: delivery.dev_runner.runner_id,\n metadata: { request_id: delivery.dev_runner.request_id },\n };\n};\n\nconst devHookExecution = (delivery: DevManifestHookDelivery): SerializedExecutionBoundary => {\n try {\n const execution = delivery.dev_runner.context.execution;\n const parsed = parseSerializedExecutionBoundary(execution);\n if (parsed.cancellationId !== delivery.dev_runner.request_id) {\n throw new Error(\"execution_request_identity_mismatch\");\n }\n return parsed;\n } catch {\n throw new Error(`dev_hook_execution_boundary_invalid: ${delivery.id}`);\n }\n};\n\nconst redeemActionSecretGrant = async (\n run: Run,\n spaceId: string,\n config: ResolvedConfig,\n): Promise<Record<string, string> | undefined> => {\n const grant = run.dev_runner?.secret_grant;\n if (grant === undefined) {\n return undefined;\n }\n if (typeof grant !== \"string\" || grant.length === 0) {\n throw new Error(`dev_runner_secret_grant_invalid: ${run.id}`);\n }\n return redeemSecretGrant(\n {\n token: grant,\n kind: \"action\",\n ownerId: run.id,\n spaceId,\n releaseId: devReleaseId(run),\n runId: run.id,\n attempt: devAttempt(run),\n requestId: devRequestId(run),\n runnerId: devRunnerCallback(run).runnerId,\n },\n config,\n `dev_action_secret_delivery_failed: ${run.id}`,\n `dev_action_secret_delivery_invalid: ${run.id}`,\n );\n};\n\nconst redeemSecretGrant = async (\n identity: {\n token: string;\n kind: \"action\" | \"hook\";\n ownerId: string;\n spaceId: string;\n releaseId: string;\n runId: string;\n attempt: number;\n requestId: string;\n runnerId: string;\n },\n config: ResolvedConfig,\n failed: string,\n invalid: string,\n): Promise<Record<string, string>> => {\n const response = await fetch(`${config.url}/api/internal/secret-delivery/redeem`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n token: identity.token,\n kind: identity.kind,\n owner_id: identity.ownerId,\n space_id: identity.spaceId,\n release_id: identity.releaseId,\n run_id: identity.runId,\n attempt: identity.attempt,\n request_id: identity.requestId,\n runner_id: identity.runnerId,\n }),\n });\n const body = await response.json().catch(() => undefined);\n if (!response.ok) {\n const code =\n isRecord(body) && typeof body.error === \"string\"\n ? body.error\n : \"unknown_error\";\n // Typed so callers can distinguish single-use grant contention from\n // every other failure.\n throw Object.assign(ponderbotError(response.status, code, body), {\n message: `${failed}: HTTP ${response.status} ${code}`,\n });\n }\n if (!isRecord(body) || !isRecord(body.env)) {\n throw new Error(invalid);\n }\n const environment: Record<string, string> = {};\n for (const [name, value] of Object.entries(body.env)) {\n if (typeof value !== \"string\") {\n throw new Error(invalid);\n }\n environment[name] = value;\n }\n return environment;\n};\n\nconst postHookRunnerCallback = async (\n callback: DevHookRunnerCallback,\n body: DevHookRunnerCallbackBody,\n): Promise<void> => {\n const occurredAt = new Date().toISOString();\n const response = await fetch(callback.url, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${callback.token}`,\n \"content-type\": \"application/json\",\n \"x-ponderbot-runner-event-id\": [\n \"dev-hook\",\n callback.hookDeliveryId,\n callback.requestId,\n body.status,\n globalThis.crypto.randomUUID(),\n ].join(\":\"),\n \"x-ponderbot-runner-timestamp\": occurredAt,\n },\n body: JSON.stringify({\n runner_id: callback.runnerId,\n status: body.status,\n exit_code: body.exit_code,\n result: body.result,\n reason: body.reason,\n occurred_at: occurredAt,\n }),\n });\n const responseBody = await response.json().catch(() => ({}));\n if (!response.ok) {\n const error =\n isRecord(responseBody) && responseBody.error !== undefined\n ? responseBody.error\n : response.statusText;\n throw ponderbotError(response.status, String(error), responseBody);\n }\n};\n\nconst devHookCallbackBody = (\n result: HookWorkerExecutionResult,\n): DevHookRunnerCallbackBody => {\n switch (result.status) {\n case \"completed\":\n return { status: \"completed\", exit_code: 0, result: result.output, reason: null };\n case \"failed\":\n return {\n status: \"failed\",\n exit_code: 1,\n result: { error: result.error },\n reason: result.error.code,\n };\n case \"cancelled\":\n return {\n status: \"cancelled\",\n exit_code: result.reason === \"deadline_exceeded\" ? 124 : 130,\n result: {},\n reason: result.reason,\n };\n }\n};\n\nconst devHookFailureBody = (error: unknown): DevHookRunnerCallbackBody => ({\n status: \"failed\",\n exit_code: 1,\n result: {\n error: {\n code: error instanceof NodeWorkerFailure ? error.reason : \"runner_failed\",\n message: errorMessage(error),\n },\n },\n reason: error instanceof NodeWorkerFailure ? error.reason : \"runner_failed\",\n});\n\nconst errorMessage = (error: unknown): string => {\n return error instanceof Error ? error.message : String(error);\n};\n\nconst logCallbackDeliveryError = (error: unknown): void => {\n if (isAttemptSupersededCallbackError(error)) {\n return;\n }\n\n console.error(formatError(error));\n};\n\nconst SECRET_GRANT_CONTENTION_CODES = [\n \"secret_delivery_grant_redeemed\",\n \"secret_delivery_grant_not_active\",\n];\n\nconst isSecretGrantContention = (error: unknown): boolean =>\n isPonderbotError(error) &&\n error.status === 409 &&\n SECRET_GRANT_CONTENTION_CODES.includes(error.code);\n\nconst isAttemptSupersededCallbackError = (error: unknown): boolean => {\n return isPonderbotError(error) && [401, 409].includes(error.status);\n};\n","import { type PonderbotClient, type SSEEvent } from \"@ponderbot/sdk\";\n\nexport interface EventTail {\n stop: () => void;\n done: Promise<void>;\n}\n\ninterface FollowEventsOptions {\n retryMs?: number;\n onError?: (error: unknown) => void;\n onReconnect?: () => void;\n}\n\nexport function followEvents(\n client: PonderbotClient,\n onEvent: (event: SSEEvent) => void,\n options: FollowEventsOptions = {},\n): EventTail {\n const controller = new AbortController();\n const done = runEventTail(client, onEvent, controller, options);\n\n return {\n stop: () => controller.abort(),\n done,\n };\n}\n\nasync function runEventTail(\n client: PonderbotClient,\n onEvent: (event: SSEEvent) => void,\n controller: AbortController,\n options: FollowEventsOptions,\n): Promise<void> {\n try {\n for await (const event of client.events.streamEvents({\n signal: controller.signal,\n initialRetryMs: options.retryMs,\n onReconnect: options.onReconnect,\n })) {\n onEvent(event);\n }\n } catch (error) {\n if (!controller.signal.aborted) {\n if (options.onError) {\n options.onError(error);\n return;\n }\n\n throw error;\n }\n }\n}\n","import {\n type AgentInstructionBudget,\n type BuildError,\n} from \"@ponderbot/sdk/authoring\";\n\nexport const printManifestDiagnostics = (\n budgets: AgentInstructionBudget[],\n warnings: BuildError[],\n): void => {\n if (budgets.length > 0) {\n console.error(\"agent instruction sizes:\");\n for (const budget of budgets) {\n console.error(` ${budget.ref}: ${instructionBudgetSummary(budget)}`);\n }\n }\n\n for (const warning of warnings) {\n console.error(`${warning.file}: warning: ${warning.message}`);\n }\n};\n\nconst instructionBudgetSummary = (budget: AgentInstructionBudget): string => {\n const suffix = budget.overWarning ? \" over budget\" : \"\";\n return `${formatCount(budget.chars)} chars (~${formatCount(\n budget.approxTokens,\n )} tokens)${suffix}`;\n};\n\nconst formatCount = (value: number): string =>\n value >= 1_000 ? `${(value / 1_000).toFixed(1)}k` : `${value}`;\n","import { watch, type FSWatcher } from \"chokidar\";\n\nimport {\n isPonderbotError,\n type ManifestDeployResponse,\n type PonderbotClient,\n} from \"@ponderbot/sdk\";\nimport { buildManifest } from \"@ponderbot/sdk/authoring\";\n\nimport { clientFor, type ResolvedConfig } from \"./config\";\nimport { reconcileDeploymentEnvironment } from \"./deployment-environment\";\nimport { staticProjectManifest } from \"./dev-manifest\";\nimport { installDevelopmentProjectRelease } from \"./dev-install\";\nimport { createDevActionRunner } from \"./dev-runner\";\nimport { followEvents, type EventTail } from \"./events\";\nimport { printManifestDiagnostics } from \"./manifest-diagnostics\";\nimport { formatError, print } from \"./output\";\n\nconst DEBOUNCE_MS = 300;\nconst DEV_RUN_POLL_MS = 750;\nconst SHUTDOWN_GRACE_MS = 2_000;\n\nexport async function devLoop(config: ResolvedConfig): Promise<void> {\n const client = clientFor(config);\n let timer: NodeJS.Timeout | undefined;\n let building = false;\n let queued = false;\n let stopped = false;\n let watcher: FSWatcher | undefined;\n let tail: EventTail | undefined;\n let runPoll: NodeJS.Timeout | undefined;\n let pollingRuns = false;\n let manifestName: string | undefined;\n\n await ensureDevSpace(client, config);\n await reconcileDeploymentEnvironment(client, config);\n const devRunner = createDevActionRunner(client, config);\n\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n queued = false;\n if (timer) clearTimeout(timer);\n if (runPoll) clearInterval(runPoll);\n tail?.stop();\n const cleanup = Promise.allSettled([watcher?.close(), devRunner.stop()]);\n await Promise.race([\n cleanup,\n new Promise<void>((resolve) => setTimeout(resolve, SHUTDOWN_GRACE_MS)),\n ]);\n process.exit(0);\n };\n\n const handleSignal = (): void => {\n stop().catch((error) => {\n console.error(formatError(error));\n process.exit(1);\n });\n };\n\n process.once(\"SIGINT\", handleSignal);\n process.once(\"SIGTERM\", handleSignal);\n\n async function rebuild(reason: string): Promise<void> {\n if (stopped) {\n return;\n }\n\n if (building) {\n queued = true;\n return;\n }\n\n building = true;\n try {\n const { manifest, warnings, instructionBudgets } = await buildManifest(config.project, {\n dev: true,\n reload: true,\n });\n printManifestDiagnostics(instructionBudgets, warnings);\n const developmentManifest = staticProjectManifest(manifest);\n const release = await client.manifests.deploy(developmentManifest, `dev:${reason}`);\n await client.projects.releases.deploy(\n developmentManifest.name,\n config.environment,\n developmentManifest,\n `dev:${reason}`,\n undefined,\n config.applicationOrigin,\n );\n console.log(deployLine(release, reason));\n manifestName = developmentManifest.name;\n\n await installDevelopmentProjectRelease(client, config, developmentManifest.name);\n } catch (error) {\n console.error(formatError(error));\n } finally {\n building = false;\n if (queued && !stopped) {\n queued = false;\n void rebuild(\"queued-changes\");\n }\n }\n }\n\n watcher = watch(config.project, { ignoreInitial: true });\n watcher.on(\"all\", (_event, file) => {\n if (stopped) {\n return;\n }\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => void rebuild(file || \"change\"), DEBOUNCE_MS);\n });\n\n await new Promise<void>((resolve, reject) => {\n watcher?.once(\"ready\", resolve);\n watcher?.once(\"error\", reject);\n });\n\n await rebuild(\"startup\");\n\n const catchUpManifest = async () => {\n if (pollingRuns || manifestName === undefined || stopped) return;\n pollingRuns = true;\n try {\n await devRunner.catchUpManifest(manifestName);\n } catch (error) {\n console.error(formatError(error));\n } finally {\n pollingRuns = false;\n }\n };\n await catchUpManifest();\n runPoll = setInterval(() => void catchUpManifest(), DEV_RUN_POLL_MS);\n\n if (config.environmentRole === \"release-source\") {\n return;\n }\n\n await devRunner.catchUp().catch((error) => console.error(formatError(error)));\n\n tail = followEvents(client, (event) => {\n print(event);\n devRunner.handleEvent(event);\n }, {\n onError: (error) => console.error(formatError(error)),\n onReconnect: () => {\n void devRunner.catchUp().catch((error) => console.error(formatError(error)));\n },\n });\n}\n\nasync function ensureDevSpace(client: PonderbotClient, config: ResolvedConfig): Promise<void> {\n try {\n await client.spaces.get();\n } catch (error) {\n if (isPonderbotError(error) && error.status === 404 && error.code === \"space_not_found\") {\n throw new Error(\n `space \"${config.spaceId}\" not found; run: ponder spaces create ${config.spaceId}`,\n );\n }\n\n throw error;\n }\n}\n\nconst deployLine = (response: ManifestDeployResponse, reason: string): string => {\n return [\n `deployed ${response.release.id} (${reason})`,\n ...Object.entries(response.registered).map(([key, value]) => `${key} ${value}`),\n ].join(\" \");\n}\n","import { builtinModules } from \"node:module\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { dirname, join, parse } from \"node:path\";\n\nimport { type Plugin } from \"esbuild\";\n\ninterface PackageIdentity {\n name: string;\n root: string;\n version: string;\n packageJson: Record<string, unknown>;\n}\n\nexport interface WorkerArtifactDependencyCollector {\n plugin: Plugin;\n dependencies: () => Record<string, string>;\n}\n\nconst NATIVE_FILE_PATTERN = /\\.(?:wasm|node|gyp|c|cc|cpp|cxx|h|hpp|hxx)$/i;\nconst builtins = new Set([\n ...builtinModules,\n ...builtinModules.map((name) => `node:${name}`),\n]);\n\nexport const workerArtifactDependencyCollector = (\n forcedExternal: readonly string[],\n): WorkerArtifactDependencyCollector => {\n const forced = new Set(forcedExternal);\n const dependencies = new Map<string, string>();\n const packageCache = new Map<string, PackageIdentity | null>();\n const nativeCache = new Map<string, boolean>();\n\n return {\n dependencies: () => Object.fromEntries([...dependencies].sort()),\n plugin: {\n name: \"ponderbot-worker-artifact-dependencies\",\n setup(build) {\n build.onResolve({ filter: /.*/ }, async (args) => {\n if (\n !isPackageImport(args.path) ||\n builtins.has(args.path) ||\n (\n args.pluginData as\n { ponderbotDependencyProbe?: boolean } | undefined\n )?.ponderbotDependencyProbe === true\n ) {\n return undefined;\n }\n\n const importName = packageName(args.path);\n if (dependencies.has(importName)) {\n return { path: args.path, external: true };\n }\n\n const resolved = await build.resolve(args.path, {\n importer: args.importer,\n kind: args.kind,\n namespace: args.namespace,\n resolveDir: args.resolveDir,\n pluginData: { ponderbotDependencyProbe: true },\n });\n if (resolved.errors.length > 0 || resolved.path === \"\") {\n return undefined;\n }\n\n const identity = await packageIdentity(resolved.path, packageCache);\n if (identity === null) {\n if (forced.has(importName)) {\n return {\n errors: [\n {\n text: `External Worker dependency ${importName} has no package name and version`,\n },\n ],\n };\n }\n return undefined;\n }\n\n const external =\n forced.has(importName) ||\n (await packageUsesNativeCode(identity, resolved.path, nativeCache));\n if (!external) {\n return undefined;\n }\n\n dependencies.set(\n importName,\n identity.name === importName\n ? identity.version\n : `npm:${identity.name}@${identity.version}`,\n );\n return { path: args.path, external: true };\n });\n },\n },\n };\n};\n\nconst isPackageImport = (specifier: string): boolean =>\n ![\".\", \"/\", \"~\", \"#\", \"file:\", \"data:\"].some((prefix) =>\n specifier.startsWith(prefix),\n );\n\nconst packageName = (specifier: string): string => {\n const parts = specifier.split(\"/\");\n return specifier.startsWith(\"@\")\n ? parts.slice(0, 2).join(\"/\")\n : (parts[0] ?? specifier);\n};\n\nconst packageIdentity = async (\n resolvedPath: string,\n cache: Map<string, PackageIdentity | null>,\n): Promise<PackageIdentity | null> => {\n let directory = dirname(resolvedPath);\n const root = parse(directory).root;\n\n while (directory !== root) {\n if (cache.has(directory)) {\n return cache.get(directory) ?? null;\n }\n\n try {\n const packageJson = JSON.parse(\n await readFile(join(directory, \"package.json\"), \"utf8\"),\n ) as Record<string, unknown>;\n if (\n typeof packageJson.name === \"string\" &&\n packageJson.name !== \"\" &&\n typeof packageJson.version === \"string\" &&\n packageJson.version !== \"\"\n ) {\n const identity = {\n name: packageJson.name,\n root: directory,\n version: packageJson.version,\n packageJson,\n };\n cache.set(directory, identity);\n return identity;\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n directory = dirname(directory);\n }\n\n cache.set(dirname(resolvedPath), null);\n return null;\n};\n\nconst packageUsesNativeCode = async (\n identity: PackageIdentity,\n resolvedPath: string,\n cache: Map<string, boolean>,\n): Promise<boolean> => {\n if (NATIVE_FILE_PATTERN.test(resolvedPath)) {\n return true;\n }\n\n const cached = cache.get(identity.root);\n if (cached !== undefined) {\n return cached;\n }\n\n const declaredFiles = [\n ...(Array.isArray(identity.packageJson.files)\n ? identity.packageJson.files.filter(\n (file): file is string => typeof file === \"string\",\n )\n : []),\n ...[\"main\", \"module\", \"browser\"].flatMap((field) => {\n const value = identity.packageJson[field];\n return typeof value === \"string\" ? [value] : [];\n }),\n ];\n let bindingGyp = false;\n try {\n await access(join(identity.root, \"binding.gyp\"));\n bindingGyp = true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const native =\n identity.packageJson.gypfile === true ||\n bindingGyp ||\n declaredFiles.some((file) => NATIVE_FILE_PATTERN.test(file));\n cache.set(identity.root, native);\n return native;\n};\n","import { createHash } from \"node:crypto\";\nimport {\n access,\n copyFile,\n mkdir,\n mkdtemp,\n readFile,\n readdir,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport {\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n sep,\n} from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { type Source } from \"@ponderbot/sdk/authoring\";\nimport { build as bundle } from \"esbuild\";\n\nimport { workerArtifactDependencyCollector } from \"./worker-artifact-dependencies\";\n\nconst ARTIFACT_FORMAT = \"ponderbot-worker-artifact/v1\";\nconst PROJECT_DIRECTORY = \"project\";\nconst WORKER_MAIN = \"worker-main.ts\";\n\nexport interface WorkerArtifact {\n context: string;\n dockerfile: string;\n dispose: () => Promise<void>;\n}\n\nexport interface WorkerArtifactOptions {\n external?: readonly string[];\n}\n\nexport class WorkerArtifactError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WorkerArtifactError\";\n }\n}\n\nconst containerfile = (\n hasDependencies: boolean,\n): string => `# syntax=docker/dockerfile:1.7\n${\n hasDependencies\n ? `FROM node:24-bookworm-slim AS dependencies\nWORKDIR /opt/ponderbot\nRUN apt-get update && apt-get install -y --no-install-recommends python3 make g++ && rm -rf /var/lib/apt/lists/*\nCOPY package.json ./\nRUN npm install --omit=dev --no-package-lock --no-audit --no-fund\n`\n : \"\"\n}FROM node:24-bookworm-slim\nENV NODE_ENV=production\nENV PONDERBOT_PROJECT_DIR=/opt/ponderbot/project\nWORKDIR /workspace\n${hasDependencies ? \"COPY --from=dependencies --chown=node:node /opt/ponderbot/node_modules /opt/ponderbot/node_modules\\n\" : \"\"}COPY --chown=node:node . /opt/ponderbot\nUSER node\nENTRYPOINT [\"node\", \"/opt/ponderbot/worker-main.js\"]\n`;\n\nexport const buildWorkerArtifact = async (\n source: Source,\n projectDir: string,\n options: WorkerArtifactOptions = {},\n): Promise<WorkerArtifact> => {\n const projectRoot = resolve(projectDir);\n const root = await mkdtemp(join(tmpdir(), \"ponderbot-worker-artifact-\"));\n const entries = join(root, \"entries\");\n const context = join(root, \"artifact\");\n\n try {\n await mkdir(entries, { recursive: true });\n await mkdir(context, { recursive: true });\n\n const configFile = await projectConfigFile(projectRoot);\n const definitionFiles = [\n configFile,\n ...source.actions.map(({ file }) => file),\n ...source.agents.map(({ file }) => file),\n ...source.groups.map(({ file }) => file),\n ...source.workflows.map(({ file }) => file),\n ];\n const entrypoints: string[] = [];\n const entryPaths = new Set<string>();\n\n for (const file of [...new Set(definitionFiles)].sort()) {\n const projectPath = artifactProjectPath(projectRoot, file);\n const entryPath = join(\n entries,\n PROJECT_DIRECTORY,\n projectPath.slice(0, -extname(projectPath).length) + \".ts\",\n );\n\n if (entryPaths.has(entryPath)) {\n throw new WorkerArtifactError(\n `Worker artifact entry path collision for ${projectPath}`,\n );\n }\n\n entryPaths.add(entryPath);\n await mkdir(dirname(entryPath), { recursive: true });\n await writeFile(entryPath, definitionWrapper(resolve(file)), {\n mode: 0o600,\n });\n entrypoints.push(entryPath);\n }\n\n const workerEntry = join(entries, WORKER_MAIN);\n await writeFile(workerEntry, workerMainWrapper(), { mode: 0o600 });\n entrypoints.push(workerEntry);\n\n console.error(\n `bundling ${entrypoints.length - 1} Ponderbot definition modules`,\n );\n const dependencies = await bundleEntries(\n entries,\n context,\n entrypoints,\n options.external ?? [],\n );\n\n const assetFiles = new Set<string>();\n for (const skill of source.skills) {\n assetFiles.add(skill.file);\n }\n for (const agent of source.agents) {\n assetFiles.add(agent.instructionsFile);\n if (agent.soulFile !== undefined) {\n assetFiles.add(agent.soulFile);\n }\n }\n\n for (const file of [...assetFiles].sort()) {\n const destination = join(\n context,\n PROJECT_DIRECTORY,\n artifactProjectPath(projectRoot, file),\n );\n await mkdir(dirname(destination), { recursive: true });\n await copyFile(file, destination);\n }\n\n await writeFile(\n join(context, \"package.json\"),\n `${JSON.stringify(\n {\n name: \"ponderbot-worker-artifact\",\n private: true,\n type: \"module\",\n engines: { node: \">=22.4.0\" },\n dependencies,\n },\n null,\n 2,\n )}\\n`,\n { mode: 0o600 },\n );\n const dockerfile = join(context, \"Containerfile\");\n await writeFile(\n dockerfile,\n containerfile(Object.keys(dependencies).length > 0),\n { mode: 0o600 },\n );\n\n const contentHash = await artifactContentHash(context);\n await writeFile(\n join(context, \"ponderbot-build.json\"),\n `${JSON.stringify(\n {\n format: ARTIFACT_FORMAT,\n content_hash: contentHash,\n project: {\n name: source.project.name,\n version: source.project.version ?? null,\n },\n definition_modules: entrypoints.length - 1,\n external_dependencies: Object.keys(dependencies).length,\n },\n null,\n 2,\n )}\\n`,\n { mode: 0o600 },\n );\n\n return {\n context,\n dockerfile,\n dispose: async () => rm(root, { recursive: true, force: true }),\n };\n } catch (error) {\n await rm(root, { recursive: true, force: true });\n if (error instanceof WorkerArtifactError) {\n throw error;\n }\n throw new WorkerArtifactError(\n error instanceof Error ? error.message : String(error),\n );\n }\n};\n\nconst projectConfigFile = async (projectRoot: string): Promise<string> => {\n for (const extension of [\".ts\", \".js\", \".mjs\"]) {\n const path = join(projectRoot, `config${extension}`);\n try {\n await access(path);\n return path;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n throw new WorkerArtifactError(\n `Ponderbot project config was not found under ${projectRoot}`,\n );\n};\n\nconst artifactProjectPath = (projectRoot: string, file: string): string => {\n const projectPath = relative(projectRoot, resolve(file));\n if (\n projectPath === \"..\" ||\n projectPath.startsWith(`..${sep}`) ||\n isAbsolute(projectPath)\n ) {\n throw new WorkerArtifactError(\n `Ponderbot definition ${file} must be inside project ${projectRoot}`,\n );\n }\n\n return projectPath;\n};\n\nconst definitionWrapper = (file: string): string => {\n const specifier = JSON.stringify(file);\n return `export * from ${specifier};\nimport * as loaded from ${specifier};\nexport default loaded.default;\n`;\n};\n\nconst workerMainWrapper = (): string => {\n const workerModule = fileURLToPath(\n import.meta.resolve(\"@ponderbot/sdk/worker\"),\n );\n return `import { runNodeWorkerMain } from ${JSON.stringify(workerModule)};\nawait runNodeWorkerMain();\n`;\n};\n\nconst bundleEntries = async (\n root: string,\n outdir: string,\n entrypoints: string[],\n forcedExternal: readonly string[],\n): Promise<Record<string, string>> => {\n const collector = workerArtifactDependencyCollector(forcedExternal);\n try {\n await bundle({\n entryPoints: entrypoints,\n outbase: root,\n outdir,\n bundle: true,\n splitting: true,\n packages: \"bundle\",\n platform: \"node\",\n target: \"node22.4\",\n format: \"esm\",\n sourcemap: false,\n minifySyntax: true,\n minifyWhitespace: true,\n keepNames: true,\n legalComments: \"none\",\n entryNames: \"[dir]/[name]\",\n chunkNames: \"chunks/[name]-[hash]\",\n assetNames: \"assets/[name]-[hash]\",\n plugins: [collector.plugin],\n logLevel: \"silent\",\n });\n return collector.dependencies();\n } catch (error) {\n throw new WorkerArtifactError(\n `Ponderbot Worker artifact bundle failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n};\n\nconst artifactContentHash = async (context: string): Promise<string> => {\n const files: string[] = [];\n const pending = [context];\n\n while (pending.length > 0) {\n const directory = pending.pop();\n if (directory === undefined) {\n break;\n }\n\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) {\n pending.push(path);\n } else if (entry.isFile()) {\n files.push(path);\n }\n }\n }\n\n const hash = createHash(\"sha256\");\n for (const file of files.sort()) {\n hash.update(relative(context, file).split(sep).join(\"/\"));\n hash.update(\"\\0\");\n hash.update(await readFile(file));\n hash.update(\"\\0\");\n }\n return `sha256:${hash.digest(\"hex\")}`;\n};\n","import { spawn } from \"node:child_process\";\nimport { mkdtemp, readFile, realpath, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join, relative, resolve } from \"node:path\";\n\nimport {\n agentInstructionBudgets,\n type AgentInstructionBudget,\n type BuildError,\n checkSource,\n emitManifest,\n hasWorkerEntryHandlers,\n loadSource,\n type WorkerImageBuildDefinition,\n type Manifest,\n manifestBuildError,\n type ProjectDefinition,\n sourceWarnings,\n type Source,\n} from \"@ponderbot/sdk/authoring\";\n\nimport { staticProjectManifest } from \"./dev-manifest\";\nimport {\n buildWorkerArtifact,\n WorkerArtifactError,\n type WorkerArtifact,\n} from \"./worker-artifact\";\n\nconst WORKER_IMAGE_TAG_ENV = \"PONDERBOT_WORKER_IMAGE_TAG\";\nexport const WORKER_IMAGE_TAG_TOKEN = \"${PONDERBOT_WORKER_IMAGE_TAG}\";\nexport const WORKER_IMAGE_TAG_ERROR =\n \"PONDERBOT_WORKER_IMAGE_TAG must be a tag or sha256 digest; pass full refs via --image\";\nconst DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/;\n\nexport class WorkerImageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WorkerImageError\";\n }\n}\n\nexport interface WorkerImageOptions {\n image?: string;\n platform?: string;\n staticRelease?: boolean;\n}\n\nexport interface ManifestBuildPlan {\n manifest: Manifest;\n workerImage?: string;\n warnings: BuildError[];\n instructionBudgets: AgentInstructionBudget[];\n}\n\ninterface ResolvedWorkerImage {\n workerImage?: string;\n}\n\nexport async function deployManifestPlan(\n projectDir: string,\n options: WorkerImageOptions = {},\n): Promise<ManifestBuildPlan> {\n const source = await loadSource(projectDir, { reload: true });\n const staticRelease = options.staticRelease === true && options.image === undefined;\n const explicit = staticRelease\n ? undefined\n : configuredWorkerImage(source.project, options.image);\n const hasHandlers = hasWorkerEntryHandlers(source);\n const sourceForCheck = setWorkerImage(source, explicit);\n const errors = checkSource(sourceForCheck, {\n requireWorkerImage:\n hasHandlers &&\n explicit === undefined &&\n !staticRelease &&\n source.project.worker?.build === undefined,\n });\n if (errors.length > 0) {\n throw manifestBuildError(errors);\n }\n\n const plan = await resolveBuiltWorkerImage(\n source,\n projectDir,\n explicit,\n options,\n staticRelease,\n );\n const finalSource = setWorkerImage(source, plan.workerImage ?? explicit);\n const manifest = emitManifest(finalSource, {\n dev: staticRelease,\n workerImage: finalSource.project.workerImage,\n });\n\n return {\n manifest: staticRelease ? staticProjectManifest(manifest) : manifest,\n workerImage: plan.workerImage,\n warnings: sourceWarnings(finalSource),\n instructionBudgets: agentInstructionBudgets(finalSource),\n };\n}\n\nasync function resolveBuiltWorkerImage(\n source: Source,\n projectDir: string,\n explicit: string | undefined,\n options: WorkerImageOptions,\n staticRelease: boolean,\n): Promise<ResolvedWorkerImage> {\n const hasHandlers = hasWorkerEntryHandlers(source);\n\n if (!hasHandlers) {\n return {};\n }\n\n if (explicit !== undefined) {\n return { workerImage: explicit };\n }\n\n if (staticRelease) {\n return {};\n }\n\n const build = source.project.worker?.build;\n if (build === undefined) {\n return {};\n }\n\n return {\n workerImage: await buildAndPushWorkerImage(\n source,\n build,\n projectDir,\n options.platform,\n ),\n };\n}\n\nconst setWorkerImage = (\n source: Source,\n workerImage: string | undefined,\n): Source => {\n return {\n ...source,\n project: {\n ...source.project,\n workerImage,\n },\n };\n};\n\nexport function configuredWorkerImage(\n project: ProjectDefinition,\n override?: string,\n): string | undefined {\n const envValue = process.env[WORKER_IMAGE_TAG_ENV];\n const configured =\n envValue === undefined || envValue.length === 0\n ? project.workerImage\n : (project.workerImage ?? project.worker?.build?.image);\n\n return resolveWorkerImage(configured, override, envValue);\n}\n\nexport function resolveWorkerImage(\n configured: string | undefined,\n override: string | undefined,\n envTag: string | undefined,\n): string | undefined {\n if (override !== undefined) {\n return override;\n }\n\n const tagOrDigest = envTag === \"\" ? undefined : envTag;\n\n if (tagOrDigest === undefined) {\n return configured?.includes(WORKER_IMAGE_TAG_TOKEN)\n ? undefined\n : configured;\n }\n\n if (configured === undefined) {\n return undefined;\n }\n\n if (DIGEST_PATTERN.test(tagOrDigest)) {\n return `${repository(configured)}@${tagOrDigest}`;\n }\n\n if (\n tagOrDigest.includes(\"/\") ||\n tagOrDigest.includes(\"@\") ||\n tagOrDigest.includes(\":\")\n ) {\n throw new WorkerImageError(WORKER_IMAGE_TAG_ERROR);\n }\n\n if (configured.includes(WORKER_IMAGE_TAG_TOKEN)) {\n return configured.split(WORKER_IMAGE_TAG_TOKEN).join(tagOrDigest);\n }\n\n return `${repository(configured)}:${tagOrDigest}`;\n}\n\nasync function buildAndPushWorkerImage(\n source: Source,\n build: WorkerImageBuildDefinition,\n projectDir: string,\n platform: string | undefined,\n): Promise<string> {\n const tag = build.image;\n const repo = repository(tag);\n const configuredContext = resolve(process.cwd(), build.context ?? \".\");\n const metadataDirectory = await mkdtemp(\n join(tmpdir(), \"ponderbot-worker-buildx-\"),\n );\n const metadataFile = join(metadataDirectory, \"metadata.json\");\n let artifact: WorkerArtifact | undefined;\n\n try {\n let context = configuredContext;\n let dockerfile = resolve(\n process.cwd(),\n build.dockerfile ?? \"Containerfile\",\n );\n\n if (build.dockerfile === undefined) {\n const resolvedContext = await realpath(configuredContext);\n projectDirectoryInContext(await realpath(projectDir), resolvedContext);\n try {\n artifact = await buildWorkerArtifact(source, projectDir, {\n external: build.external,\n });\n } catch (error) {\n if (error instanceof WorkerArtifactError) {\n throw new WorkerImageError(error.message);\n }\n throw error;\n }\n context = artifact.context;\n dockerfile = artifact.dockerfile;\n }\n\n const cacheReference = `${repo}:buildcache`;\n const buildArgs = [\n \"buildx\",\n \"build\",\n \"--file\",\n dockerfile,\n \"--tag\",\n tag,\n \"--push\",\n \"--provenance\",\n \"false\",\n \"--metadata-file\",\n metadataFile,\n \"--progress\",\n \"plain\",\n \"--cache-from\",\n `type=registry,ref=${cacheReference}`,\n \"--cache-to\",\n `type=registry,mode=max,image-manifest=true,oci-mediatypes=true,ref=${cacheReference}`,\n ...(platform === undefined ? [] : [\"--platform\", platform]),\n ...Object.entries(build.args ?? {}).flatMap(([name, value]) => [\n \"--build-arg\",\n `${name}=${value}`,\n ]),\n context,\n ];\n\n console.error(`building worker image ${tag}`);\n await runDocker(buildArgs, repo);\n\n const digest = await buildxDigest(metadataFile);\n if (digest === undefined) {\n throw new WorkerImageError(\n `docker buildx did not report a registry digest for ${tag}`,\n );\n }\n\n const pinned = `${repo}@${digest}`;\n console.error(`pinned worker image ${pinned}`);\n return pinned;\n } finally {\n if (artifact !== undefined) {\n await artifact.dispose();\n }\n await rm(metadataDirectory, { recursive: true, force: true });\n }\n}\n\nexport const projectDirectoryInContext = (\n projectDir: string,\n context: string,\n) => {\n const projectRelativeToContext = relative(context, projectDir);\n if (\n projectRelativeToContext === \"..\" ||\n projectRelativeToContext.startsWith(\n `..${process.platform === \"win32\" ? \"\\\\\" : \"/\"}`,\n ) ||\n isAbsolute(projectRelativeToContext)\n ) {\n throw new WorkerImageError(\n `Ponderbot project ${projectDir} must be inside Worker Image build context ${context}`,\n );\n }\n\n const dockerPath =\n process.platform === \"win32\"\n ? projectRelativeToContext.split(\"\\\\\").join(\"/\")\n : projectRelativeToContext;\n return dockerPath.length === 0 ? \".\" : `./${dockerPath}`;\n};\n\nasync function runDocker(\n args: string[],\n registryHint: string,\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolveRun, rejectRun) => {\n const child = spawn(\"docker\", args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n process.stderr.write(chunk);\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n process.stderr.write(chunk);\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n rejectRun(\n new WorkerImageError(\n \"docker not found; install Docker and make sure docker is on PATH\",\n ),\n );\n return;\n }\n rejectRun(error);\n });\n\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolveRun({ stdout, stderr });\n return;\n }\n\n rejectRun(\n new WorkerImageError(\n `docker buildx build failed with exit code ${code}; run docker login for ${registryHint} if the registry requires authentication`,\n ),\n );\n });\n });\n}\n\nconst buildxDigest = async (\n metadataFile: string,\n): Promise<string | undefined> => {\n try {\n const metadata = JSON.parse(await readFile(metadataFile, \"utf8\")) as {\n \"containerimage.digest\"?: unknown;\n };\n const digest = metadata[\"containerimage.digest\"];\n return typeof digest === \"string\" && DIGEST_PATTERN.test(digest)\n ? digest\n : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst repository = (image: string): string => {\n const withoutDigest = image.split(\"@\", 1)[0] ?? image;\n const slash = withoutDigest.lastIndexOf(\"/\");\n const colon = withoutDigest.lastIndexOf(\":\");\n if (colon > slash) {\n return withoutDigest.slice(0, colon);\n }\n return withoutDigest;\n};\n","import type { ModelDefinitionInput } from \"@ponderbot/sdk\";\n\nexport interface ModelAddOptions {\n capability?: string[];\n fallback?: string[];\n model: string;\n provider: string;\n}\n\nexport const modelDefinitionInput = (\n options: ModelAddOptions,\n): ModelDefinitionInput => ({\n provider: modelProvider(options.provider),\n model: options.model,\n capabilities: Object.fromEntries(\n (options.capability ?? []).map((capability) => [capability, true]),\n ),\n fallback_model_refs: options.fallback ?? [],\n});\n\nconst modelProvider = (\n provider: string,\n): ModelDefinitionInput[\"provider\"] => {\n switch (provider) {\n case \"anthropic\":\n case \"fake\":\n case \"mistral\":\n case \"openai\":\n return provider;\n default:\n throw new Error(\"--provider must be anthropic, fake, mistral, or openai\");\n }\n};\n","import { createServer } from \"node:http\";\nimport { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stderr as promptOutput } from \"node:process\";\nimport type {\n ModelProvider,\n ModelProviderRegistryEntry,\n} from \"@ponderbot/sdk\";\n\nimport { clientFor, resolveConfig } from \"./config\";\n\ntype Provider = ModelProvider;\ntype Method = \"api-key\" | \"oauth\";\n\nexport interface ProviderAuthOptions {\n env?: string;\n space?: string;\n provider?: string;\n method?: string;\n browser?: boolean;\n shared?: boolean;\n allSpaces?: boolean;\n spaces?: string[];\n}\n\nexport interface ProviderAuthResult {\n type: \"provider_auth\";\n status: \"saved\";\n provider: Provider;\n method: Method;\n space_id: string;\n binding_id?: string;\n all_spaces?: boolean;\n space_ids?: string[];\n smoke_test: string;\n}\n\ninterface OAuthAuthorization {\n authUrl: string;\n callbackUrl: string;\n state: string;\n}\n\ninterface LoopbackCallback {\n code: Promise<string>;\n ready: Promise<void>;\n close: () => void;\n}\n\nexport const providerAuth = async (options: ProviderAuthOptions): Promise<ProviderAuthResult> => {\n const config = await resolveConfig(options.env, options.space);\n const spaceId = config.spaceId;\n const client = clientFor(config);\n const registry = await client.modelProviders.list(spaceId);\n const provider = await resolveProvider(options.provider, registry.providers);\n const providerEntry = registry.providers.find((entry) => entry.id === provider);\n\n if (providerEntry === undefined) {\n throw new Error(`provider ${provider} is not available`);\n }\n\n const method = await resolveMethod(providerEntry, options.method);\n\n if (options.allSpaces === true && options.shared !== true) {\n throw new Error(\"--all-spaces requires --shared\");\n }\n\n if (options.spaces !== undefined && options.shared !== true) {\n throw new Error(\"--spaces requires --shared\");\n }\n\n if (options.allSpaces === true && options.spaces !== undefined) {\n throw new Error(\"use either --all-spaces or --spaces, not both\");\n }\n\n const sharedSpaceIds = options.spaces ?? [spaceId];\n\n if (options.shared === true) {\n const { binding } = await client.providerBindings.create(provider);\n\n if (method === \"api-key\") {\n const apiKey = await readApiKey(options);\n await client.providerBindings.setApiKey(binding.id, { apiKey });\n } else {\n if (!canPrompt()) {\n throw new Error(\n \"OAuth login needs an interactive terminal. Run locally with a browser, or rerun with --no-browser to paste the callback URL.\",\n );\n }\n\n await authorizeOAuthLogin(\n () => client.providerBindings.startOAuthLogin(binding.id),\n (authorizationResponse, state) =>\n client.providerBindings.completeOAuthLogin(binding.id, {\n authorizationResponse,\n state,\n }),\n options.browser !== false,\n );\n }\n\n if (options.allSpaces === true) {\n await client.providerBindings.authorize(binding.id, { allSpaces: true });\n } else {\n await client.providerBindings.authorize(binding.id, { spaceIds: sharedSpaceIds });\n }\n\n return providerAuthResult(provider, method, spaceId, {\n bindingId: binding.id,\n allSpaces: options.allSpaces === true,\n spaceIds: options.allSpaces === true ? undefined : sharedSpaceIds,\n });\n }\n\n if (method === \"api-key\") {\n const apiKey = await readApiKey(options);\n await client.modelProviders.setApiKey(spaceId, { provider, apiKey });\n return providerAuthResult(provider, method, spaceId);\n }\n\n if (!canPrompt()) {\n throw new Error(\n \"OAuth login needs an interactive terminal. Run locally with a browser, or rerun with --no-browser to paste the callback URL.\",\n );\n }\n\n await authorizeOAuthLogin(\n () => client.modelProviders.startOAuthLogin(spaceId, provider),\n (authorizationResponse, state) =>\n client.modelProviders.completeOAuthLogin(spaceId, provider, {\n authorizationResponse,\n state,\n }),\n options.browser !== false,\n );\n\n return providerAuthResult(provider, method, spaceId);\n};\n\nconst providerAuthResult = (\n provider: Provider,\n method: Method,\n spaceId: string,\n shared?: { bindingId: string; allSpaces: boolean; spaceIds?: string[] },\n): ProviderAuthResult => ({\n type: \"provider_auth\",\n status: \"saved\",\n provider,\n method,\n space_id: spaceId,\n binding_id: shared?.bindingId,\n all_spaces: shared?.allSpaces,\n space_ids: shared?.spaceIds,\n smoke_test: \"ponder spaces show\",\n});\n\nconst resolveProvider = async (\n value: string | undefined,\n entries: ModelProviderRegistryEntry[],\n): Promise<Provider> => {\n const providers = entries.map((entry) => entry.id);\n\n if (value !== undefined) {\n const provider = providers.find((candidate) => candidate === value);\n if (provider !== undefined) {\n return provider;\n }\n\n throw new Error(`--provider must be one of ${providers.join(\", \")}`);\n }\n\n return promptChoice(\"Provider\", providers);\n};\n\nconst resolveMethod = async (\n provider: ModelProviderRegistryEntry,\n value: string | undefined,\n): Promise<Method> => {\n const supportsApiKey = provider.auth_methods.some((method) => method.id === \"api_key\");\n const supportsOAuth = provider.auth_methods.some((method) => method.id !== \"api_key\");\n\n if (value !== undefined) {\n if (value === \"api-key\" && supportsApiKey) {\n return \"api-key\";\n }\n\n if ((value === \"oauth\" || value === \"codex\") && supportsOAuth) {\n return \"oauth\";\n }\n\n throw new Error(`--method is not supported by --provider ${provider.id}`);\n }\n\n if (!supportsOAuth) {\n return \"api-key\";\n }\n\n if (!supportsApiKey) {\n return \"oauth\";\n }\n\n return promptChoice(\"Authentication method\", [\"api-key\", \"oauth\"] as const);\n};\n\nconst readApiKey = async (options: ProviderAuthOptions): Promise<string> => {\n const envValue = process.env.PONDER_PROVIDER_API_KEY;\n if (envValue !== undefined && envValue !== \"\") {\n return envValue;\n }\n\n if (!process.stdin.isTTY) {\n const piped = (await readStdin()).trim();\n if (piped !== \"\") {\n return piped;\n }\n\n throw new Error(\"set PONDER_PROVIDER_API_KEY or pipe the API key on stdin\");\n }\n\n if (options.provider !== undefined && options.method !== undefined && !canPrompt()) {\n throw new Error(\"set PONDER_PROVIDER_API_KEY or pipe the API key on stdin\");\n }\n\n return promptSecret(\"API key\");\n};\n\nconst authorizeOAuthLogin = async (\n start: () => Promise<{ login: OAuthAuthorization }>,\n complete: (authorizationResponse: string, state: string) => Promise<unknown>,\n openBrowser: boolean,\n): Promise<void> => {\n const { login } = await start();\n const authorization = {\n authUrl: login.authUrl,\n callbackUrl: login.callbackUrl,\n state: login.state,\n };\n let authorizationResponse: string;\n\n if (openBrowser) {\n const callback = listenForCallback(authorization);\n console.error(`Open this URL if your browser does not open automatically:\\n${authorization.authUrl}`);\n\n if (await loopbackReady(callback) && await openSystemBrowser(authorization.authUrl)) {\n authorizationResponse = await callback.code;\n } else {\n callback.close();\n console.error(`Open this URL and paste the redirected callback URL:\\n${authorization.authUrl}`);\n authorizationResponse = await promptLine(\"Callback URL or code\");\n }\n } else {\n console.error(`Open this URL and paste the redirected callback URL:\\n${authorization.authUrl}`);\n authorizationResponse = await promptLine(\"Callback URL or code\");\n }\n\n await complete(authorizationResponse, authorization.state);\n};\n\nconst listenForCallback = (authorization: OAuthAuthorization): LoopbackCallback => {\n const callback = new URL(authorization.callbackUrl);\n const server = createServer((request, response) => {\n try {\n const url = new URL(request.url ?? \"/\", callback);\n const code = authorizationCodeFromInput(url.toString(), authorization.state);\n response.writeHead(200, { \"content-type\": \"text/html\" });\n response.end(\"<html><body>OpenAI login complete. You can close this window.</body></html>\");\n server.close();\n resolve(code);\n } catch (error) {\n response.writeHead(400, { \"content-type\": \"text/plain\" });\n response.end(error instanceof Error ? error.message : \"invalid callback\");\n reject(error);\n }\n });\n\n let resolve!: (code: string) => void;\n let reject!: (error: unknown) => void;\n let readyResolve!: () => void;\n let readyReject!: (error: unknown) => void;\n\n const code = new Promise<string>((promiseResolve, promiseReject) => {\n resolve = promiseResolve;\n reject = promiseReject;\n });\n\n const ready = new Promise<void>((promiseResolve, promiseReject) => {\n readyResolve = promiseResolve;\n readyReject = promiseReject;\n });\n\n server.once(\"listening\", readyResolve);\n server.once(\"error\", (error: NodeJS.ErrnoException) => {\n const normalized =\n error.code === \"EADDRINUSE\"\n ? new Error(\"port 1455 is already in use\")\n : error;\n readyReject(normalized);\n reject(normalized);\n });\n\n server.listen(Number(callback.port), callback.hostname);\n\n return { code, ready, close: () => server.close() };\n};\n\nconst loopbackReady = async (callback: LoopbackCallback): Promise<boolean> => {\n try {\n await callback.ready;\n return true;\n } catch (error) {\n console.error(error instanceof Error ? `${error.message}; falling back to paste mode` : \"falling back to paste mode\");\n callback.close();\n return false;\n }\n};\n\n\nconst authorizationCodeFromInput = (inputValue: string, expectedState: string): string => {\n const trimmed = inputValue.trim();\n if (trimmed === \"\") {\n throw new Error(\"missing authorization code\");\n }\n\n const params = trimmed.includes(\"://\")\n ? new URL(trimmed).searchParams\n : new URLSearchParams(trimmed.startsWith(\"?\") ? trimmed.slice(1) : trimmed);\n const returnedState = params.get(\"state\");\n const code = params.get(\"code\") ?? (trimmed.includes(\"=\") ? null : trimmed);\n\n if (returnedState !== null && returnedState !== expectedState) {\n throw new Error(\"OAuth state did not match\");\n }\n\n if (code === null || code === \"\") {\n throw new Error(\"missing authorization code\");\n }\n\n return code;\n};\n\nconst promptChoice = async <T extends readonly string[]>(\n label: string,\n choices: T,\n): Promise<T[number]> => {\n const rendered = choices.map((choice, index) => `${index + 1}) ${choice}`).join(\"\\n\");\n const answer = await promptLine(`${label}\\n${rendered}\\nChoose`);\n const index = Number(answer.trim());\n\n if (Number.isInteger(index) && index >= 1 && index <= choices.length) {\n return choices[index - 1] as T[number];\n }\n\n if (choices.includes(answer.trim())) {\n return answer.trim() as T[number];\n }\n\n throw new Error(`invalid ${label.toLowerCase()}`);\n};\n\nconst promptLine = async (label: string): Promise<string> => {\n const rl = createInterface({ input, output: promptOutput });\n try {\n return await rl.question(`${label}: `);\n } finally {\n rl.close();\n }\n};\n\nconst promptSecret = async (label: string): Promise<string> => {\n process.stderr.write(`${label}: `);\n const chunks: string[] = [];\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n\n stdin.setRawMode?.(true);\n stdin.resume();\n\n return await new Promise<string>((resolve, reject) => {\n const cleanup = (): void => {\n stdin.setRawMode?.(wasRaw);\n stdin.pause();\n stdin.off(\"data\", onData);\n process.stderr.write(\"\\n\");\n };\n\n const onData = (chunk: Buffer): void => {\n const value = chunk.toString(\"utf8\");\n if (value === \"\\u0003\") {\n cleanup();\n reject(new Error(\"cancelled\"));\n return;\n }\n\n if (value === \"\\r\" || value === \"\\n\") {\n cleanup();\n resolve(chunks.join(\"\"));\n return;\n }\n\n if (value === \"\\u007f\") {\n chunks.pop();\n return;\n }\n\n chunks.push(value);\n };\n\n stdin.on(\"data\", onData);\n });\n};\n\nconst openSystemBrowser = (url: string): Promise<boolean> => {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\n return new Promise((resolve) => {\n const child = spawn(command, args, { stdio: \"ignore\", detached: true });\n child.once(\"error\", () => resolve(false));\n child.once(\"spawn\", () => {\n child.unref();\n resolve(true);\n });\n });\n};\n\nconst readStdin = async (): Promise<string> => {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n};\n\nconst canPrompt = (): boolean => {\n return process.stdin.isTTY === true && process.stderr.isTTY === true;\n};\n","import type { PonderbotClient, Space } from \"@ponderbot/sdk\";\n\nconst spacePageLimit = 100;\n\nexport const listSpaces = async (\n client: PonderbotClient,\n): Promise<Space[]> => {\n const spaces: Space[] = [];\n let cursor: string | undefined;\n\n do {\n const page = await client.spaces.list({ cursor, limit: spacePageLimit });\n spaces.push(...page.spaces);\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n\n return spaces;\n};\n","import { spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { access, chmod, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport { createClient } from \"@ponderbot/sdk\";\n\nimport { listSpaces } from \"./spaces\";\n\nconst DEFAULT_TARGET = \"core\";\nconst DEFAULT_DEV_RUNTIME_IMAGE = \"ponderbot-runtime:dev\";\nconst DEFAULT_DEV_SPACE_ID = \"default\";\nconst DEFAULT_DEV_URL = \"http://127.0.0.1:4100\";\nconst DEV_BOOTSTRAP_TOKEN_FILE = \"dev-bootstrap-token\";\nconst OUTPUT_TAIL_LIMIT = 16_384;\nconst WAIT_TIMEOUT_SECONDS = \"180\";\n\nexport class StackError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StackError\";\n }\n}\n\nexport interface StackOptions {\n target?: string;\n}\n\nexport interface StartStackOptions extends StackOptions {\n attach?: boolean;\n build?: boolean;\n dev?: boolean;\n space?: string;\n}\n\nexport interface DevStackEnvironment {\n url: string;\n space_id: string;\n token: string;\n}\n\nexport interface StackResult {\n type: \"stack\";\n id: string;\n status: \"started\" | \"stopped\";\n compose_file: string;\n ponderbot_home: string;\n dev_environment?: DevStackEnvironment;\n}\n\ninterface ResolvedStack {\n baseImagesEnvFile: string;\n composeFile: string;\n devComposeFile?: string;\n devUrl: string;\n environmentFile?: string;\n ponderbotHome: string;\n repoRoot: string;\n spaceId: string;\n target: string;\n}\n\nexport async function findRepoRoot(start = process.cwd()): Promise<string> {\n let current = resolve(start);\n\n while (true) {\n try {\n await access(join(current, \"docker\", \"compose\", \"targets\"));\n return current;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const parent = dirname(current);\n if (parent === current) {\n throw new StackError(`could not find docker/compose/targets from ${resolve(start)}`);\n }\n current = parent;\n }\n}\n\nexport async function startStack(options: StartStackOptions = {}): Promise<StackResult> {\n const stack = await resolveStack(options.target, options.dev);\n const bootstrapToken = await bootstrapTokenForHome(stack.ponderbotHome);\n const devEnvironment = devStackEnvironment(stack, options.space, bootstrapToken);\n const args = [\n ...composeArgs(stack),\n \"up\",\n ...(options.dev ? [\"--watch\"] : []),\n ...(options.attach || options.dev ? [] : [\"-d\", \"--wait\", \"--wait-timeout\", WAIT_TIMEOUT_SECONDS]),\n ...(options.build ? [\"--build\"] : []),\n ];\n\n await runDockerCompose(args, stack, bootstrapToken);\n await ensureDevSpace(devEnvironment);\n return result(stack, \"started\", devEnvironment);\n}\n\nexport async function stopStack(options: StackOptions = {}): Promise<StackResult> {\n const stack = await resolveStack(options.target, false);\n await runDockerCompose([...composeArgs(stack), \"down\", \"--remove-orphans\"], stack);\n return result(stack, \"stopped\");\n}\n\nasync function resolveStack(target: string | undefined, dev: boolean | undefined): Promise<ResolvedStack> {\n const repoRoot = await findRepoRoot();\n const resolvedTarget = targetName(target);\n const baseImagesEnvFile = await baseImagesEnvFileForRepo(repoRoot);\n const environmentFile = await environmentFileForRepo(repoRoot);\n const composeFile = await composeFileForRepo(repoRoot, resolvedTarget);\n const devComposeFile = dev ? await devComposeFileForRepo(repoRoot) : undefined;\n const ponderbotHome = await ensurePonderbotHome(repoRoot);\n const configuredUrl = process.env.PONDERBOT_URL;\n const devUrl = configuredUrl === undefined || configuredUrl.length === 0 ? DEFAULT_DEV_URL : configuredUrl;\n return {\n baseImagesEnvFile,\n composeFile,\n devComposeFile,\n devUrl,\n environmentFile,\n ponderbotHome,\n repoRoot,\n spaceId: DEFAULT_DEV_SPACE_ID,\n target: resolvedTarget,\n };\n}\n\nconst composeArgs = (stack: ResolvedStack): string[] => {\n return [\n \"compose\",\n \"--env-file\",\n stack.baseImagesEnvFile,\n ...(stack.environmentFile === undefined\n ? []\n : [\"--env-file\", stack.environmentFile]),\n \"-f\",\n stack.composeFile,\n ...(stack.devComposeFile === undefined ? [] : [\"-f\", stack.devComposeFile]),\n ];\n}\n\nconst environmentFileForRepo = async (\n repoRoot: string,\n): Promise<string | undefined> => {\n const environmentFile = join(repoRoot, \".env\");\n try {\n await access(environmentFile);\n return environmentFile;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n};\n\nasync function baseImagesEnvFileForRepo(repoRoot: string): Promise<string> {\n const envFile = join(repoRoot, \"docker\", \"env\", \"base-images.env\");\n try {\n await access(envFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new StackError(`base image env file not found at ${envFile}`);\n }\n throw error;\n }\n return envFile;\n}\n\nasync function composeFileForRepo(repoRoot: string, target: string): Promise<string> {\n if (target === \"dev\") {\n throw new StackError('compose target \"dev\" is an overlay; use ponder start --dev');\n }\n\n if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(target)) {\n throw new StackError(`invalid compose target \"${target}\"`);\n }\n\n const composeFile = join(repoRoot, \"docker\", \"compose\", \"targets\", `${target}.yml`);\n try {\n await access(composeFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new StackError(`compose target \"${target}\" not found at ${composeFile}`);\n }\n throw error;\n }\n return composeFile;\n}\n\nasync function devComposeFileForRepo(repoRoot: string): Promise<string> {\n const devComposeFile = join(repoRoot, \"docker\", \"compose\", \"targets\", \"dev.yml\");\n try {\n await access(devComposeFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new StackError(`dev compose overlay not found at ${devComposeFile}`);\n }\n throw error;\n }\n return devComposeFile;\n}\n\nasync function ensurePonderbotHome(repoRoot: string): Promise<string> {\n const configured = process.env.PONDERBOT_HOME;\n const ponderbotHome = configured === undefined || configured.length === 0 ? join(repoRoot, \".ponderbot\") : configured;\n await mkdir(ponderbotHome, { recursive: true });\n return ponderbotHome;\n}\n\nconst bootstrapTokenForHome = async (ponderbotHome: string): Promise<string> => {\n const configured = process.env.PONDERBOT_BOOTSTRAP_TOKEN;\n if (configured !== undefined && configured.trim().length > 0) {\n return configured;\n }\n\n const tokenPath = join(ponderbotHome, DEV_BOOTSTRAP_TOKEN_FILE);\n try {\n const token = (await readFile(tokenPath, \"utf8\")).trim();\n if (token.length > 0) {\n return token;\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const token = `pb_dev_${randomBytes(32).toString(\"base64url\")}`;\n await writeFile(tokenPath, `${token}\\n`, { mode: 0o600 });\n await chmod(tokenPath, 0o600);\n return token;\n};\n\nconst devStackEnvironment = (\n stack: ResolvedStack,\n space: string | undefined,\n token: string,\n): DevStackEnvironment => ({\n url: stack.devUrl,\n space_id: space === undefined || space.length === 0 ? stack.spaceId : space,\n token,\n});\n\nconst ensureDevSpace = async (environment: DevStackEnvironment): Promise<void> => {\n const client = createClient({\n baseUrl: environment.url,\n spaceId: environment.space_id,\n token: environment.token,\n });\n const spaces = await listSpaces(client);\n const space = spaces.find((space) => space.id === environment.space_id);\n\n if (space === undefined) {\n await client.spaces.create({\n id: environment.space_id,\n name: environment.space_id,\n });\n return;\n }\n\n if (space.status !== \"active\") {\n await client.spaces.update({ status: \"active\" }, environment.space_id);\n }\n};\n\nasync function runDockerCompose(\n args: string[],\n stack: ResolvedStack,\n bootstrapToken?: string,\n): Promise<void> {\n await new Promise<void>((resolveRun, rejectRun) => {\n const child = spawn(\"docker\", args, {\n cwd: stack.repoRoot,\n env: {\n ...process.env,\n ...(stack.devComposeFile === undefined\n ? {}\n : { PONDERBOT_RUNTIME_IMAGE: process.env.PONDERBOT_RUNTIME_IMAGE || DEFAULT_DEV_RUNTIME_IMAGE }),\n ...(bootstrapToken === undefined ? {} : { PONDERBOT_BOOTSTRAP_TOKEN: bootstrapToken }),\n PONDERBOT_DATA_MOUNT_SOURCE: stack.ponderbotHome,\n PONDERBOT_HOME: stack.ponderbotHome,\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let outputTail = \"\";\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n outputTail = (outputTail + chunk).slice(-OUTPUT_TAIL_LIMIT);\n process.stderr.write(chunk);\n });\n child.stderr.on(\"data\", (chunk: string) => {\n outputTail = (outputTail + chunk).slice(-OUTPUT_TAIL_LIMIT);\n process.stderr.write(chunk);\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n rejectRun(new StackError(\"docker not found; install Docker and make sure docker is on PATH\"));\n return;\n }\n rejectRun(error);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolveRun();\n return;\n }\n\n rejectRun(new StackError(composeFailureMessage(args, code, outputTail)));\n });\n });\n}\n\nconst composeFailureMessage = (args: string[], code: number | null, output: string): string => {\n if (/Cannot connect to the Docker daemon|Is the docker daemon running|docker daemon is not running/i.test(output)) {\n return \"docker daemon unavailable; start Docker and try again\";\n }\n\n const action = args.includes(\"up\") ? \"up\" : args.includes(\"down\") ? \"down\" : \"compose\";\n return `docker compose ${action} failed with exit code ${code ?? \"unknown\"}`;\n}\n\nfunction result(\n stack: ResolvedStack,\n status: StackResult[\"status\"],\n devEnvironment?: DevStackEnvironment,\n): StackResult {\n const base: StackResult = {\n type: \"stack\",\n id: stack.target,\n status,\n compose_file: stack.composeFile,\n ponderbot_home: stack.ponderbotHome,\n };\n\n return devEnvironment === undefined\n ? base\n : {\n ...base,\n dev_environment: devEnvironment,\n };\n}\n\nconst targetName = (target: string | undefined): string => {\n return target === undefined || target.length === 0 ? DEFAULT_TARGET : target;\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport type VersionBumpLevel = \"patch\" | \"minor\" | \"major\";\n\nexport interface ProjectVersionBump {\n previousVersion: string;\n nextVersion: string;\n}\n\nconst VERSION_LITERAL_PATTERN = /\\bversion:\\s*\"([^\"\\r\\n]+)\"/g;\nconst SEMVER_PATTERN = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/;\n\nexport const bumpProjectVersion = async (\n projectDir: string,\n currentVersion: string | undefined,\n level: string,\n): Promise<ProjectVersionBump> => {\n const bumpLevel = parseBumpLevel(level);\n const file = join(projectDir, \"config.ts\");\n const source = await readFile(file, \"utf8\");\n const matches = [...source.matchAll(VERSION_LITERAL_PATTERN)];\n\n if (matches.length !== 1) {\n throw manualBumpError(file);\n }\n\n const match = matches[0];\n const literalVersion = match?.[1];\n if (\n match?.index === undefined ||\n literalVersion === undefined ||\n currentVersion === undefined ||\n literalVersion !== currentVersion\n ) {\n throw manualBumpError(file);\n }\n\n const nextVersion = bumpedVersion(currentVersion, bumpLevel);\n const replacement = match[0].replace(`\"${literalVersion}\"`, `\"${nextVersion}\"`);\n await writeFile(\n file,\n `${source.slice(0, match.index)}${replacement}${source.slice(match.index + match[0].length)}`,\n );\n\n return { previousVersion: currentVersion, nextVersion };\n};\n\nconst parseBumpLevel = (level: string): VersionBumpLevel => {\n switch (level) {\n case \"patch\":\n case \"minor\":\n case \"major\":\n return level;\n default:\n throw new Error(\"--bump must be patch, minor, or major\");\n }\n};\n\nconst bumpedVersion = (version: string, level: VersionBumpLevel): string => {\n const match = SEMVER_PATTERN.exec(version);\n if (match === null) {\n throw new Error(`project version ${JSON.stringify(version)} is not x.y.z semver; bump the version manually`);\n }\n\n const major = Number(match[1]);\n const minor = Number(match[2]);\n const patch = Number(match[3]);\n\n switch (level) {\n case \"patch\":\n return `${major}.${minor}.${patch + 1}`;\n case \"minor\":\n return `${major}.${minor + 1}.0`;\n case \"major\":\n return `${major + 1}.0.0`;\n }\n};\n\nconst manualBumpError = (file: string): Error =>\n new Error(`${file} does not contain exactly one version string literal; bump the version manually`);\n","#!/usr/bin/env bun\nimport { constants } from \"node:fs\";\nimport { access, copyFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n isPonderbotError,\n isRunType,\n RUN_TYPES,\n type ManifestRelease,\n type RunType,\n type SpaceBudget,\n} from \"@ponderbot/sdk\";\nimport {\n buildManifest,\n type Manifest,\n} from \"@ponderbot/sdk/authoring\";\nimport { Command } from \"commander\";\n\nimport {\n clientFor,\n resolveConfig,\n resolveDevConfig,\n resolveProject,\n resolveProjectReleaseConfig,\n} from \"./config\";\nimport { devLoop } from \"./dev\";\nimport { followEvents } from \"./events\";\nimport { configuredWorkerImage, deployManifestPlan, WorkerImageError } from \"./worker-image\";\nimport { printManifestDiagnostics } from \"./manifest-diagnostics\";\nimport { modelDefinitionInput } from \"./model-policy\";\nimport { fail, print } from \"./output\";\nimport { providerAuth } from \"./provider-auth\";\nimport { listSpaces } from \"./spaces\";\nimport { StackError, startStack, stopStack } from \"./stack\";\nimport { bumpProjectVersion } from \"./version-bump\";\n\nconst program = new Command(\"ponder\")\n .option(\"--json\", \"machine output\")\n .showHelpAfterError();\n\nprogram\n .command(\"start\")\n .option(\"--target <name>\", \"compose target\", \"core\")\n .option(\"--attach\", \"run compose in the foreground and stream logs until stopped\")\n .option(\"--build\", \"build compose images before starting\")\n .option(\"--dev\", \"run the runtime with Docker Compose Watch and Phoenix code reloading\")\n .option(\"--space <id>\", \"space id to create and print for local app credentials\")\n .description(\"start the local Docker compose stack\")\n .action(async (options: { attach?: boolean; build?: boolean; dev?: boolean; space?: string; target?: string }) => {\n try {\n print(\n await startStack({\n attach: options.attach,\n build: options.build,\n dev: options.dev,\n space: options.space,\n target: options.target,\n }),\n program.opts(),\n );\n } catch (error) {\n fail(error, error instanceof StackError ? 2 : 1);\n }\n });\n\nprogram\n .command(\"stop\")\n .option(\"--target <name>\", \"compose target\", \"core\")\n .description(\"stop the local Docker compose stack\")\n .action(async (options: { target?: string }) => {\n try {\n print(await stopStack(options), program.opts());\n } catch (error) {\n fail(error, error instanceof StackError ? 2 : 1);\n }\n });\n\nprogram\n .command(\"init\")\n .description(\"scaffold ponderbot/config.ts\")\n .action(async () => {\n await scaffold();\n print({ ok: true, project: \"ponderbot\" }, program.opts());\n });\n\nconst manifest = program.command(\"manifest\").description(\"author, validate, and deploy the manifest\");\n\nmanifest\n .command(\"validate\")\n .description(\"build the manifest and report structural errors\")\n .action(async () => {\n try {\n const config = await resolveProject();\n const { manifest, warnings, instructionBudgets } = await buildManifest(config.project, {\n workerImage: configuredWorkerImage(config.projectDefinition),\n requireWorkerImage: false,\n });\n printManifestDiagnostics(instructionBudgets, warnings);\n print({ ok: true, counts: countByKind(manifest) }, program.opts());\n } catch (error) {\n fail(error, error instanceof WorkerImageError ? 2 : 1);\n }\n });\n\nmanifest\n .command(\"deploy\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--image <ref>\", \"prebuilt worker image ref\")\n .option(\"--platform <platform>\", \"docker build platform\")\n .option(\"--bump <patch|minor|major>\", \"bump ponderbot/config.ts version before deploy\")\n .description(\"build and deploy the manifest\")\n .action(async (options: { bump?: string; env?: string; image?: string; platform?: string }) => {\n const config = await resolveProjectReleaseConfig(options.env);\n const client = clientFor(config);\n try {\n const versionBump =\n options.bump === undefined\n ? undefined\n : await bumpProjectVersion(config.project, config.projectDefinition.version, options.bump);\n const plan = await deployManifestPlan(config.project, {\n ...options,\n staticRelease: options.image === undefined && config.allowDev,\n });\n printManifestDiagnostics(plan.instructionBudgets, plan.warnings);\n const release = await client.projects.releases.deploy(\n config.projectDefinition.name,\n config.environment,\n plan.manifest,\n config.sourceName,\n undefined,\n config.applicationOrigin,\n );\n print(\n versionBump === undefined ? release : { ...release, version_bump: versionBump },\n program.opts(),\n );\n } catch (error) {\n fail(error, error instanceof WorkerImageError ? 2 : 1);\n }\n });\n\nmanifest\n .command(\"dev\")\n .option(\"--env <name>\", \"environment\")\n .description(\"watch, deploy to a dev environment, and follow runtime events\")\n .action(async (options: { env?: string }) => {\n try {\n await devLoop(await resolveDevConfig(options.env));\n } catch (error) {\n fail(error, 1);\n }\n });\n\nconst spaces = program.command(\"spaces\").description(\"manage runtime spaces\");\n\nspaces\n .command(\"list\")\n .option(\"--env <name>\", \"environment\")\n .description(\"list spaces\")\n .action(async (options: { env?: string }) => {\n const config = await resolveConfig(options.env);\n await runSpacesCommand(\"spaces:read\", \"*\", async () => {\n print({ spaces: await listSpaces(clientFor(config)) }, program.opts());\n });\n });\n\nspaces\n .command(\"create <spaceId>\")\n .option(\"--name <name>\", \"space name\")\n .option(\"--env <name>\", \"environment\")\n .description(\"create a space\")\n .action(async (spaceId: string, options: { name?: string; env?: string }) => {\n const config = await resolveConfig(options.env);\n await runSpacesCommand(\"spaces:write\", \"*\", async () => {\n try {\n print(\n await clientFor(config).spaces.create({\n id: spaceId,\n name: options.name ?? spaceId,\n }),\n program.opts(),\n );\n } catch (error) {\n throw spaceCreateError(error, spaceId);\n }\n });\n });\n\nspaces\n .command(\"show [spaceId]\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show a space with budget and usage\")\n .action(async (spaceId: string | undefined, options: { env?: string }) => {\n const config = await resolveConfig(options.env);\n const client = clientFor(config);\n const resolvedSpaceId = spaceId ?? config.spaceId;\n\n await runSpacesCommand(\"spaces:read\", resolvedSpaceId, async () => {\n const [space, budget, usage] = await Promise.all([\n client.spaces.get(resolvedSpaceId),\n client.spaces.budget.get(resolvedSpaceId),\n client.spaces.usage(resolvedSpaceId),\n ]);\n\n print({ space: space.space, budget: budget.budget, usage }, program.opts());\n });\n });\n\nspaces\n .command(\"budget [spaceId]\")\n .option(\"--set <file>\", \"replace budget from a JSON file\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show or replace a space budget\")\n .action(async (spaceId: string | undefined, options: { set?: string; env?: string }) => {\n const config = await resolveConfig(options.env);\n const client = clientFor(config);\n const resolvedSpaceId = spaceId ?? config.spaceId;\n const scope = options.set === undefined ? \"spaces:read\" : \"spaces:write\";\n\n await runSpacesCommand(scope, resolvedSpaceId, async () => {\n if (options.set === undefined) {\n print(await client.spaces.budget.get(resolvedSpaceId), program.opts());\n return;\n }\n\n print(\n await client.spaces.budget.set(await readJsonFile<SpaceBudget>(options.set), resolvedSpaceId),\n program.opts(),\n );\n });\n });\n\nconst provider = program.command(\"provider\").description(\"configure model provider credentials\");\n\nprovider\n .command(\"auth\")\n .description(\"authenticate a model provider for a space\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--provider <name>\", \"anthropic | mistral | openai (skips the picker)\")\n .option(\"--method <method>\", \"api-key | oauth\")\n .option(\"--shared\", \"store one Runtime credential binding instead of a Space credential\")\n .option(\"--all-spaces\", \"authorize the shared binding for every Space\")\n .option(\"--spaces <spaceIds...>\", \"authorize the shared binding for selected Spaces\")\n .option(\"--no-browser\", \"print the Codex authorize URL and paste the callback URL\")\n .action(async (options) => {\n print(await providerAuth(options), program.opts());\n });\n\nconst model = program.command(\"model\").description(\"manage Space model policy\");\n\nmodel\n .command(\"add <modelRef>\")\n .requiredOption(\"--provider <name>\", \"anthropic | fake | mistral | openai\")\n .requiredOption(\"--model <name>\", \"provider model name\")\n .option(\"--capability <name...>\", \"declared model capabilities\")\n .option(\"--fallback <modelRef...>\", \"ordered fallback model refs\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"add or update a model in the Space catalog\")\n .action(async (modelRef: string, options) => {\n const config = await resolveConfig(options.env, options.space);\n\n await runSpacesCommand(\"spaces:write\", config.spaceId, async () => {\n print(\n await clientFor(config).models.upsert(modelRef, modelDefinitionInput(options)),\n program.opts(),\n );\n });\n });\n\nmodel\n .command(\"list\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"list models in the Space catalog\")\n .action(async (options) => {\n const config = await resolveConfig(options.env, options.space);\n\n await runSpacesCommand(\"spaces:read\", config.spaceId, async () => {\n print(await clientFor(config).models.list(), program.opts());\n });\n });\n\nmodel\n .command(\"assign <agentRef> <modelRef>\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"assign a Space catalog model to an exact Agent ref\")\n .action(async (agentRef: string, modelRef: string, options) => {\n const config = await resolveConfig(options.env, options.space);\n\n await runSpacesCommand(\"spaces:write\", config.spaceId, async () => {\n print(await clientFor(config).models.assign(agentRef, modelRef), program.opts());\n });\n });\n\nmodel\n .command(\"assignments\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"list exact Agent model assignments for a Space\")\n .action(async (options) => {\n const config = await resolveConfig(options.env, options.space);\n\n await runSpacesCommand(\"spaces:read\", config.spaceId, async () => {\n print(await clientFor(config).models.assignments(), program.opts());\n });\n });\n\nconst releases = program.command(\"releases\").description(\"inspect manifest releases\");\n\nreleases\n .command(\"list\", { isDefault: true })\n .option(\"--env <name>\", \"environment\")\n .description(\"list releases\")\n .action(async (options: { env?: string }) => {\n const config = await resolveConfig(options.env);\n print(await clientFor(config).releases.list(), program.opts());\n });\n\nreleases\n .command(\"catalog [releaseId]\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show the deployed resources of one release (defaults to the active release)\")\n .action(async (releaseId: string | undefined, options: { space?: string; env?: string }) => {\n const config = await resolveConfig(options.env, options.space);\n const client = clientFor(config);\n const resolvedReleaseId = releaseId ?? activeReleaseId(await client.releases.list());\n\n print(await client.releases.catalog(resolvedReleaseId), program.opts());\n });\n\nprogram\n .command(\"rollback <releaseId>\")\n .option(\"--env <name>\", \"environment\")\n .description(\"roll back to a release\")\n .action(async (releaseId: string, options: { env?: string }) => {\n const config = await resolveConfig(options.env);\n print(await clientFor(config).releases.rollback(releaseId), program.opts());\n });\n\nprogram\n .command(\"runs\")\n .option(\"--type <type>\", \"run type\")\n .option(\"--status <status>\", \"run status\")\n .option(\"--env <name>\", \"environment\")\n .description(\"list runs\")\n .action(async (options: { type?: string; status?: string; env?: string }) => {\n const config = await resolveConfig(options.env);\n print(\n await clientFor(config).runs.list(\n Object.fromEntries(\n [\n [\"type\", options.type],\n [\"status\", options.status],\n ].filter((entry): entry is [string, string] => typeof entry[1] === \"string\"),\n ),\n ),\n program.opts(),\n );\n });\n\nprogram\n .command(\"run <type> <id>\")\n .option(\"--export\", \"export run bundle\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show a run or export bundle\")\n .action(async (type: string, id: string, options: { export?: boolean; env?: string }) => {\n const runType = parseRunType(type);\n const config = await resolveConfig(options.env);\n const client = clientFor(config);\n print(\n options.export\n ? await client.runs.export(runType, id)\n : await client.runs.show(runType, id),\n program.opts(),\n );\n });\n\nprogram\n .command(\"cancel <type> <id>\")\n .option(\"--env <name>\", \"environment\")\n .description(\"cancel a run\")\n .action(async (type: string, id: string, options: { env?: string }) => {\n const runType = parseRunType(type);\n const config = await resolveConfig(options.env);\n print(await clientFor(config).runs.cancel(runType, id), program.opts());\n });\n\nprogram\n .command(\"action\")\n .command(\"run <ref>\")\n .option(\"--input <json>\", \"input payload\", \"{}\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--release-id <id>\", \"pinned release id\")\n .option(\"--manifest-name <name>\", \"current release selector\")\n .description(\"start an Action Run\")\n .action(\n async (\n ref: string,\n options: {\n input: string;\n space?: string;\n env?: string;\n releaseId?: string;\n manifestName?: string;\n },\n ) => {\n const config = await resolveConfig(options.env, options.space);\n print(\n await clientFor(config).actions.run(\n ref,\n JSON.parse(options.input) as Record<string, unknown>,\n {\n releaseId: options.releaseId,\n manifestName: options.manifestName,\n },\n ),\n program.opts(),\n );\n },\n );\n\nprogram\n .command(\"workflow\")\n .command(\"trigger <ref>\")\n .option(\"--input <json>\", \"input payload\", \"{}\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--release-id <id>\", \"pinned release id\")\n .option(\"--manifest-name <name>\", \"current release selector\")\n .description(\"start a Workflow Run\")\n .action(\n async (\n ref: string,\n options: {\n input: string;\n space?: string;\n env?: string;\n releaseId?: string;\n manifestName?: string;\n },\n ) => {\n const config = await resolveConfig(options.env, options.space);\n print(\n await clientFor(config).workflows.trigger(\n ref,\n JSON.parse(options.input) as Record<string, unknown>,\n {\n releaseId: options.releaseId,\n manifestName: options.manifestName,\n },\n ),\n program.opts(),\n );\n },\n );\n\n// One Decision generation is named by its id alone: the stored generation selects\n// its own subject adapter, so no command names a subject type.\nprogram\n .command(\"decisions\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--actionable\", \"only generations this actor could answer\")\n .description(\"list pending decisions\")\n .action(async (options: { env?: string; actionable?: boolean }) => {\n const config = await resolveConfig(options.env);\n print(\n await clientFor(config).decisions.list({\n status: \"pending\",\n ...(options.actionable ? { actionable: true } : {}),\n }),\n program.opts(),\n );\n });\n\nprogram\n .command(\"approve <id>\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--reason <reason>\", \"bounded reason recorded on the response\")\n .description(\"approve a decision\")\n .action(\n async (id: string, options: { env?: string; reason?: string }) => {\n const config = await resolveConfig(options.env);\n print(\n await clientFor(config).decisions.approve(id, {\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n }),\n program.opts(),\n );\n },\n );\n\nprogram\n .command(\"reject <id>\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--reason <reason>\", \"bounded reason recorded on the response\")\n .description(\"reject a decision\")\n .action(\n async (id: string, options: { env?: string; reason?: string }) => {\n const config = await resolveConfig(options.env);\n print(\n await clientFor(config).decisions.reject(id, {\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n }),\n program.opts(),\n );\n },\n );\n\nprogram\n .command(\"events\")\n .option(\"--follow\", \"follow runtime events\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show recent events or follow the event stream\")\n .action(async (options: { follow?: boolean; env?: string }) => {\n const config = await resolveConfig(options.env);\n const client = clientFor(config);\n\n if (!options.follow) {\n print(await client.events.recent(), program.opts());\n return;\n }\n\n const tail = followEvents(client, (event) => print(event, program.opts()));\n process.once(\"SIGINT\", () => tail.stop());\n await tail.done;\n });\n\nprogram.parseAsync().catch((error: unknown) => fail(error, 1));\n\nasync function scaffold(): Promise<void> {\n const root = process.cwd();\n const templateRoot = fileURLToPath(new URL(\"../templates\", import.meta.url));\n const projectFile = join(root, \"ponderbot\", \"config.ts\");\n\n await assertNewProjectFiles([projectFile]);\n await mkdir(dirname(projectFile), { recursive: true });\n await copyFile(join(templateRoot, \"ponderbot\", \"config.ts\"), projectFile, constants.COPYFILE_EXCL);\n}\n\nasync function assertNewProjectFiles(paths: string[]): Promise<void> {\n for (const path of paths) {\n try {\n await access(path);\n throw new Error(`${path} already exists`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n}\n\nfunction countByKind(manifest: Manifest): Record<string, number> {\n return {\n actions: manifest.actions.length,\n skills: manifest.skills.length,\n schedules: manifest.schedules.length,\n workflows: manifest.workflows.length,\n agents: manifest.agents.length,\n agent_groups: manifest.agent_groups.length,\n };\n}\n\nfunction parseRunType(value: string): RunType {\n if (!isRunType(value)) {\n throw new TypeError(`run type must be one of ${RUN_TYPES.join(\", \")}`);\n }\n\n return value;\n}\n\nasync function readJsonFile<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nasync function runSpacesCommand(\n scope: string,\n space: string,\n run: () => Promise<void>,\n): Promise<void> {\n try {\n await run();\n } catch (error) {\n fail(spaceScopeError(error, scope, space), 1);\n }\n}\n\nconst spaceScopeError = (error: unknown, scope: string, space: string): unknown => {\n if (isPonderbotError(error) && error.status === 403) {\n return new Error(`your token lacks ${scope} on ${space} - mint one with that grant`);\n }\n\n return error;\n}\n\nconst spaceCreateError = (error: unknown, spaceId: string): unknown => {\n if (isPonderbotError(error) && error.status === 409) {\n return new Error(`space \"${spaceId}\" already exists`);\n }\n\n return error;\n}\n\nconst activeReleaseId = ({ releases }: { releases: ManifestRelease[] }): string => {\n const newest = releases\n .filter((release) => release.status === \"active\")\n .sort((left, right) => (right.deployed_at ?? \"\").localeCompare(left.deployed_at ?? \"\"))[0];\n\n if (newest === undefined) {\n return fail(\n new Error(\"no active release in this space - deploy one, or name a release id\"),\n 2,\n );\n }\n\n return newest.id;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","names":["isRecord","errorMessage","isRecord","ensureDevSpace","bundle","promptOutput"],"sources":["../src/config.ts","../src/deployment-environment.ts","../src/dev-manifest.ts","../src/dev-install.ts","../src/node-worker-runner.ts","../src/output.ts","../src/dev-runner.ts","../src/events.ts","../src/manifest-diagnostics.ts","../src/dev.ts","../src/worker-artifact-dependencies.ts","../src/worker-artifact.ts","../src/worker-image.ts","../src/model-policy.ts","../src/provider-auth.ts","../src/spaces.ts","../src/stack.ts","../src/version-bump.ts","../src/main.ts"],"sourcesContent":["import { resolve } from \"node:path\";\n\nimport {\n createClient,\n resolveEnvironment,\n type ResolvedEnvironment,\n} from \"@ponderbot/sdk\";\nimport {\n loadProjectDefinition,\n type ProjectDefinition,\n type ProjectEnvironmentDefinition,\n} from \"@ponderbot/sdk/authoring\";\nimport { parseApplicationOrigin } from \"@ponderbot/sdk/worker\";\n\ninterface ResolveConfigOptions {\n requireDevAllowed?: boolean;\n resolveApplicationOrigin?: boolean;\n useProjectEndpoint?: boolean;\n}\n\nexport interface ProjectConfig {\n project: string;\n projectDefinition: ProjectDefinition;\n}\n\nexport interface ResolvedConfig extends ProjectConfig {\n environment: string;\n environmentRole: NonNullable<ProjectEnvironmentDefinition[\"role\"]>;\n allowDev: boolean;\n sourceName: string;\n url: string;\n spaceId: string;\n token: string;\n applicationOrigin?: string;\n}\n\nexport interface ResolvedProjectReleaseConfig extends ProjectConfig {\n environment: string;\n environmentRole: NonNullable<ProjectEnvironmentDefinition[\"role\"]>;\n allowDev: boolean;\n sourceName: string;\n url: string;\n spaceId?: string;\n token: string;\n}\n\nconst projectDir = (): string =>\n resolve(process.cwd(), process.env.PONDERBOT_PROJECT ?? \"./ponderbot\");\n\nconst exitConfig = (message: string): never => {\n console.error(`ponder: ${message}`);\n process.exit(2);\n};\n\nexport const resolveProject = async (): Promise<ProjectConfig> => {\n const project = projectDir();\n return {\n project,\n projectDefinition: await loadProjectDefinition(resolve(project, \"config\")),\n };\n};\n\nexport const resolveConfig = async (\n envName?: string,\n spaceId?: string,\n): Promise<ResolvedConfig> =>\n requireExecutionSpace(await resolveEnvironmentConfig(envName), spaceId);\n\nexport const resolveProjectReleaseConfig = async (\n envName?: string,\n): Promise<ResolvedProjectReleaseConfig & { applicationOrigin?: string }> =>\n resolveEnvironmentConfig(envName, { resolveApplicationOrigin: true });\n\n// Runtime-level commands such as `spaces list` and `spaces create` need a URL\n// and a token. They need neither an execution Space nor the deploy-only\n// application origin.\nexport const resolveRuntimeConfig = async (\n envName?: string,\n): Promise<ResolvedProjectReleaseConfig> => resolveEnvironmentConfig(envName);\n\nexport const resolveDevConfig = async (envName?: string): Promise<ResolvedConfig> =>\n requireExecutionSpace(\n await resolveEnvironmentConfig(envName ?? \"development\", {\n requireDevAllowed: true,\n resolveApplicationOrigin: true,\n useProjectEndpoint: true,\n }),\n );\n\nconst resolveEnvironmentConfig = async (\n envName: string | undefined,\n options: ResolveConfigOptions = {},\n): Promise<ResolvedProjectReleaseConfig & { applicationOrigin?: string }> => {\n let resolved: ResolvedEnvironment;\n const project = projectDir();\n let projectDefinition: ProjectDefinition;\n try {\n projectDefinition = await loadProjectDefinition(resolve(project, \"config\"));\n resolved = resolveEnvironment(projectDefinition, envName);\n } catch (error) {\n return exitConfig(error instanceof Error ? error.message : String(error));\n }\n\n if (\n options.requireDevAllowed &&\n !(resolved.projectEnvironment.allowDev ?? resolved.env === \"development\")\n ) {\n return exitConfig(`environment \"${resolved.env}\" does not allow ponder manifest dev`);\n }\n\n const endpoint = options.useProjectEndpoint\n ? {\n baseUrl: resolved.projectEnvironment.url,\n spaceId: resolved.projectEnvironment.spaceId,\n }\n : resolved.client;\n\n let applicationOrigin: string | undefined;\n if (options.resolveApplicationOrigin) {\n try {\n applicationOrigin = resolveProjectApplicationOrigin(projectDefinition);\n } catch (error) {\n return exitConfig(error instanceof Error ? error.message : String(error));\n }\n }\n\n return {\n project,\n projectDefinition,\n environment: resolved.env,\n environmentRole: resolved.projectEnvironment.role ?? \"execution\",\n allowDev:\n resolved.projectEnvironment.allowDev ?? resolved.env === \"development\",\n sourceName: `${resolved.env}:${projectDefinition.name}`,\n url: endpoint.baseUrl,\n spaceId: endpoint.spaceId,\n token: resolved.client.token,\n applicationOrigin,\n };\n};\n\nconst requireExecutionSpace = (\n config: ResolvedProjectReleaseConfig & { applicationOrigin?: string },\n spaceId?: string,\n): ResolvedConfig => {\n const resolvedSpaceId =\n spaceId !== undefined && spaceId.length > 0 ? spaceId : config.spaceId;\n\n if (resolvedSpaceId === undefined || resolvedSpaceId.length === 0) {\n return exitConfig(\n `set the execution Space with --space or spaceId for environment \"${config.environment}\" in ponderbot/config.ts`,\n );\n }\n\n return { ...config, spaceId: resolvedSpaceId };\n};\n\nconst resolveProjectApplicationOrigin = (\n projectDefinition: ProjectDefinition,\n) => {\n const origin = projectDefinition.applicationOrigin;\n if (origin === undefined) {\n return undefined;\n }\n\n const value = process.env[origin.env];\n if (value === undefined || value.length === 0) {\n throw new Error(`application origin environment variable \"${origin.env}\" is not set`);\n }\n\n return parseApplicationOrigin(value);\n};\n\nexport const clientFor = (\n config: Pick<ResolvedProjectReleaseConfig, \"url\" | \"token\" | \"spaceId\">,\n) =>\n createClient({ baseUrl: config.url, token: config.token, spaceId: config.spaceId });\n\nexport const withResolvedTarget = <T extends object>(\n config: Pick<ResolvedProjectReleaseConfig, \"environment\" | \"url\">,\n result: T,\n): T & { environment: string; base_url: string } => ({\n ...result,\n environment: config.environment,\n base_url: config.url,\n});\n","import { type PonderbotClient } from \"@ponderbot/sdk\";\n\nimport { type ResolvedConfig } from \"./config\";\n\nconst INERT_SOURCE_SETTINGS = {\n allow_schedules: false,\n allow_persistent_development_schedules: false,\n allow_webhooks: false,\n allow_manual_triggers: false,\n} as const;\n\nexport const reconcileDeploymentEnvironment = async (\n client: PonderbotClient,\n config: Pick<ResolvedConfig, \"environmentRole\">,\n): Promise<void> => {\n if (config.environmentRole === \"release-source\") {\n const { settings } = await client.spaces.settings.update(INERT_SOURCE_SETTINGS);\n\n if (\n settings.allow_schedules !== false ||\n settings.allow_persistent_development_schedules !== false ||\n settings.allow_webhooks !== false ||\n settings.allow_manual_triggers !== false\n ) {\n throw new Error(\"release-source Space settings did not become execution-inert\");\n }\n }\n};\n","import { createHash } from \"node:crypto\";\n\nimport { type Manifest } from \"@ponderbot/sdk/authoring\";\n\nexport const staticProjectManifest = (manifest: Manifest): Manifest => ({\n ...manifest,\n version: staticProjectVersion(manifest),\n});\n\nexport const staticProjectVersion = (manifest: Manifest): string => {\n const sourceHash = createHash(\"sha256\")\n .update(JSON.stringify(manifest))\n .digest(\"hex\")\n .slice(0, 12);\n\n return `${manifest.version ?? \"dev\"}-dev.${sourceHash}`;\n};\n","import { type PonderbotClient } from \"@ponderbot/sdk\";\n\nimport { type ResolvedConfig } from \"./config\";\n\nconst INSTALL_CONCURRENCY = 8;\n\n/**\n * Installs the current Project Release for this environment into every Space\n * associated with the manifest, except the Space the dev loop deploys into.\n *\n * Every `ponder manifest dev` run calls this, whatever the environment role.\n * The `release-source` role only adds inert Space settings and skips the local\n * event tail; it does not own the install. A project with no associated Space\n * is normal, so an empty target list logs nothing.\n */\nexport const installDevelopmentProjectRelease = async (\n client: PonderbotClient,\n config: Pick<ResolvedConfig, \"environment\" | \"spaceId\">,\n manifestName: string,\n): Promise<string[]> => {\n const { space_ids: spaceIds } = await client.dev.manifests.targets(\n manifestName,\n config.environment,\n );\n const targets = spaceIds.filter((spaceId) => spaceId !== config.spaceId);\n\n if (targets.length === 0) {\n return targets;\n }\n\n await eachConcurrent(targets, INSTALL_CONCURRENCY, async (spaceId) => {\n await client.projects.releases.install(manifestName, config.environment, spaceId);\n });\n console.log(\n `installed project release in ${targets.length} associated Spaces: ${targets.join(\", \")}`,\n );\n return targets;\n};\n\nconst eachConcurrent = async <T>(\n values: T[],\n concurrency: number,\n run: (value: T) => Promise<void>,\n) => {\n let index = 0;\n let failure: unknown;\n const worker = async () => {\n while (index < values.length) {\n const value = values[index];\n index += 1;\n if (value !== undefined) {\n try {\n await run(value);\n } catch (error) {\n failure ??= error;\n }\n }\n }\n };\n await Promise.all(\n Array.from({ length: Math.min(concurrency, values.length) }, () => worker()),\n );\n if (failure !== undefined) throw failure;\n};\n","import { spawn } from \"node:child_process\";\nimport { mkdtemp, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n cancelledResult,\n parseWorkerExecutionResult,\n parseSerializedExecutionBoundary,\n type NodeWorkerRequest,\n type ActionWorkerExecutionResult,\n type HookWorkerExecutionResult,\n type WorkerCancellationReason,\n type WorkerExecutionResult,\n} from \"@ponderbot/sdk/worker\";\n\nconst MAXIMUM_WORKER_RESPONSE_BYTES = 1_000_000;\nconst MAXIMUM_WORKER_STDERR_BYTES = 65_536;\nconst MAXIMUM_TIMER_DELAY = 2_147_483_647;\n\nexport type NodeWorkerFailureReason =\n | \"runner_failed\"\n | \"runner_dispatch_failed\"\n | \"runner_contract_missing_result\"\n | \"runner_contract_invalid_result\";\n\nexport class NodeWorkerFailure extends Error {\n readonly reason: NodeWorkerFailureReason;\n\n constructor(reason: NodeWorkerFailureReason, message: string) {\n super(message);\n this.name = \"NodeWorkerFailure\";\n this.reason = reason;\n }\n}\n\nexport const createWorkerTermination = <Timer>(input: {\n completionGraceMilliseconds: number;\n isRunning: () => boolean;\n kill: (signal: \"SIGTERM\" | \"SIGKILL\") => void;\n schedule: (callback: () => void, delay: number) => Timer;\n cancel: (timer: Timer) => void;\n}) => {\n let aborted = false;\n let forceKillTimer: Timer | undefined;\n const abort = () => {\n if (aborted) {\n return;\n }\n aborted = true;\n input.kill(\"SIGTERM\");\n forceKillTimer = input.schedule(() => {\n if (input.isRunning()) {\n input.kill(\"SIGKILL\");\n }\n }, input.completionGraceMilliseconds);\n };\n const settle = () => {\n if (forceKillTimer === undefined) {\n return;\n }\n input.cancel(forceKillTimer);\n forceKillTimer = undefined;\n };\n return {\n abort,\n settle,\n wasAborted: () => aborted,\n };\n};\n\ntype NodeExecutionOptions = NodeWorkerRequest & {\n completionGraceMilliseconds: number;\n environment?: Record<string, string>;\n nodeBinary?: string;\n signal?: AbortSignal;\n stderr?: { write(chunk: string): unknown };\n};\n\ntype ExecutePonderbotWorkerInNode = {\n (\n options: NodeExecutionOptions & {\n invocation: Extract<NodeWorkerRequest[\"invocation\"], { kind: \"action\" }>;\n },\n ): Promise<ActionWorkerExecutionResult>;\n (\n options: NodeExecutionOptions & {\n invocation: Extract<NodeWorkerRequest[\"invocation\"], { kind: \"hook\" }>;\n },\n ): Promise<HookWorkerExecutionResult>;\n (options: NodeExecutionOptions): Promise<WorkerExecutionResult>;\n};\n\nexport const executePonderbotWorkerInNode = (async (\n options: NodeExecutionOptions,\n): Promise<WorkerExecutionResult> => {\n const {\n completionGraceMilliseconds,\n nodeBinary,\n signal,\n environment,\n stderr: stderrTarget,\n ...requestOptions\n } = options;\n if (\n !Number.isSafeInteger(completionGraceMilliseconds) ||\n completionGraceMilliseconds < 0 ||\n completionGraceMilliseconds > MAXIMUM_TIMER_DELAY\n ) {\n throw new Error(\"invalid_worker_completion_grace\");\n }\n const execution = parseSerializedExecutionBoundary(requestOptions.execution);\n if (signal?.aborted) {\n return cancellationResult(requestOptions.invocation, \"caller_cancelled\");\n }\n if (Date.parse(execution.deadlineAt) <= Date.now()) {\n return cancellationResult(requestOptions.invocation, \"deadline_exceeded\");\n }\n const request: NodeWorkerRequest = {\n ...requestOptions,\n execution,\n };\n const directory = await mkdtemp(join(tmpdir(), \"ponderbot-node-worker-\"));\n const requestPath = join(directory, \"request.json\");\n const responsePath = join(directory, \"response.json\");\n\n try {\n await writeFile(requestPath, `${JSON.stringify(request)}\\n`, { mode: 0o600 });\n const childResult = await runNodeWorker({\n nodeBinary: nodeBinary ?? process.env.PONDERBOT_NODE_BINARY ?? \"node\",\n requestPath,\n responsePath,\n execution: request.execution,\n completionGraceMilliseconds,\n signal,\n environment,\n });\n if (childResult.stderr.length > 0) {\n (stderrTarget ?? process.stderr).write(childResult.stderr);\n }\n if (childResult.cancellationReason !== undefined) {\n return cancellationResult(\n request.invocation,\n childResult.cancellationReason,\n );\n }\n try {\n const responseStats = await stat(responsePath);\n if (responseStats.size > MAXIMUM_WORKER_RESPONSE_BYTES) {\n throw new NodeWorkerFailure(\n \"runner_contract_invalid_result\",\n \"node_worker_response_too_large\",\n );\n }\n return parseWorkerExecutionResult(\n JSON.parse(await readFile(responsePath, \"utf8\")) as unknown,\n { kind: request.invocation.kind },\n );\n } catch (error) {\n if (error instanceof NodeWorkerFailure) {\n throw error;\n }\n const reason =\n isRecord(error) && error.code === \"ENOENT\"\n ? \"runner_contract_missing_result\"\n : \"runner_contract_invalid_result\";\n throw new NodeWorkerFailure(reason, errorMessage(error));\n }\n } finally {\n await rm(directory, { recursive: true, force: true });\n }\n}) as ExecutePonderbotWorkerInNode;\n\nconst actionCheckpoint = (invocation: NodeWorkerRequest[\"invocation\"]) =>\n invocation.kind === \"action\"\n ? { onceRecords: invocation.execution.onceRecords }\n : undefined;\n\nconst cancellationResult = (\n invocation: NodeWorkerRequest[\"invocation\"],\n reason: WorkerCancellationReason,\n): WorkerExecutionResult =>\n invocation.kind === \"action\"\n ? cancelledResult(\"action\", reason, actionCheckpoint(invocation)!)\n : cancelledResult(\"hook\", reason);\n\nconst runNodeWorker = async (input: {\n nodeBinary: string;\n requestPath: string;\n responsePath: string;\n execution: NodeWorkerRequest[\"execution\"];\n completionGraceMilliseconds: number;\n signal?: AbortSignal;\n environment?: Record<string, string>;\n}) => {\n const workerExecutable = await resolveWorkerExecutable();\n return new Promise<{\n stderr: string;\n cancellationReason?: WorkerCancellationReason;\n }>((resolveRun, rejectRun) => {\n const child = spawn(\n input.nodeBinary,\n [\n workerExecutable,\n \"--request\",\n input.requestPath,\n \"--response\",\n input.responsePath,\n ],\n {\n stdio: [\"ignore\", \"inherit\", \"pipe\"],\n ...(input.environment === undefined ? {} : { env: { ...process.env, ...input.environment } }),\n },\n );\n let stderr = \"\";\n const deadlineAt = Date.parse(input.execution.deadlineAt);\n const termination = createWorkerTermination({\n completionGraceMilliseconds: input.completionGraceMilliseconds,\n isRunning: () => child.exitCode === null && child.signalCode === null,\n kill: (signal) => {\n child.kill(signal);\n },\n schedule: setTimeout,\n cancel: clearTimeout,\n });\n const cancellation = createWorkerCancellation(termination);\n let deadlineTimer: ReturnType<typeof setTimeout>;\n const abortFromDeadline = () => {\n cancellation.abort(\"deadline_exceeded\");\n };\n const abortFromCaller = () => {\n cancellation.abort(\"caller_cancelled\");\n };\n const scheduleDeadline = () => {\n const remaining = Math.max(0, deadlineAt - Date.now());\n deadlineTimer = setTimeout(\n remaining > MAXIMUM_TIMER_DELAY ? scheduleDeadline : abortFromDeadline,\n Math.min(remaining, MAXIMUM_TIMER_DELAY),\n );\n };\n scheduleDeadline();\n const settle = () => {\n clearTimeout(deadlineTimer);\n termination.settle();\n input.signal?.removeEventListener(\"abort\", abortFromCaller);\n };\n\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk: string) => {\n if (stderr.length < MAXIMUM_WORKER_STDERR_BYTES) {\n stderr += chunk.slice(0, MAXIMUM_WORKER_STDERR_BYTES - stderr.length);\n }\n });\n if (input.signal?.aborted) {\n abortFromCaller();\n } else {\n input.signal?.addEventListener(\"abort\", abortFromCaller, { once: true });\n }\n child.on(\"error\", (error) => {\n settle();\n rejectRun(error);\n });\n child.on(\"exit\", (code) => {\n settle();\n const cancellationReason = cancellation.reason();\n if (cancellationReason !== undefined) {\n resolveRun({\n stderr,\n cancellationReason,\n });\n return;\n }\n if (code === 0) {\n resolveRun({ stderr });\n return;\n }\n rejectRun(\n new NodeWorkerFailure(\n stderr.trim() === \"invalid_node_worker_request\"\n ? \"runner_dispatch_failed\"\n : \"runner_failed\",\n stderr.trim() || `node_worker_exited: ${code ?? \"signal\"}`,\n ),\n );\n });\n });\n};\n\nconst createWorkerCancellation = (termination: {\n abort: () => void;\n}) => {\n let cancellationReason: WorkerCancellationReason | undefined;\n\n return {\n abort: (reason: WorkerCancellationReason) => {\n if (cancellationReason !== undefined) {\n return;\n }\n cancellationReason = reason;\n termination.abort();\n },\n reason: () => cancellationReason,\n };\n};\n\nconst resolveWorkerExecutable = async () => {\n const workerModule = fileURLToPath(import.meta.resolve(\"@ponderbot/sdk/worker\"));\n const sdkDirectory = dirname(dirname(workerModule));\n const packageJson = JSON.parse(\n await readFile(join(sdkDirectory, \"package.json\"), \"utf8\"),\n ) as unknown;\n if (\n !isRecord(packageJson) ||\n !isRecord(packageJson.bin) ||\n typeof packageJson.bin[\"ponderbot-worker\"] !== \"string\"\n ) {\n throw new Error(\"ponderbot_worker_executable_missing\");\n }\n return resolve(sdkDirectory, packageJson.bin[\"ponderbot-worker\"]);\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst errorMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error);\n","import { isPonderbotError } from \"@ponderbot/sdk\";\nimport { isManifestBuildError } from \"@ponderbot/sdk/authoring\";\n\ninterface PrintOptions {\n json?: boolean;\n}\n\nexport const print = (data: unknown, options: PrintOptions = {}): void => {\n if (options.json) {\n console.log(JSON.stringify(jsonData(data)));\n return;\n }\n\n for (const line of lines(data)) {\n console.log(line);\n }\n}\n\nexport const fail = (error: unknown, code = 1): never => {\n console.error(formatError(error));\n process.exit(code);\n}\n\nexport const formatError = (error: unknown): string => {\n if (isManifestBuildError(error)) {\n return error.message;\n }\n\n if (isPonderbotError(error)) {\n const conflictVersion = manifestReleaseVersionConflict(error.detail);\n if (conflictVersion !== undefined) {\n return `version ${conflictVersion} is already released with different content — bump version in ponderbot/config.ts or rerun with --bump patch`;\n }\n\n return typeof error.detail === \"undefined\" ? error.code : JSON.stringify(error.detail);\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\nconst lines = (data: unknown): string[] => {\n if (\n isRecord(data) &&\n typeof data.environment === \"string\" &&\n typeof data.base_url === \"string\"\n ) {\n const { environment, base_url: baseUrl, ...result } = data;\n return [`environment ${environment}`, `base URL ${baseUrl}`, ...lines(result)];\n }\n\n if (isRecord(data) && isRecord(data.release) && isRecord(data.resources)) {\n return releaseCatalogLines(data.release, data.resources);\n }\n\n if (isStartedDevStack(data)) {\n return [\n \"Ponderbot dev stack ready.\",\n ` PONDERBOT_URL=${data.dev_environment.url}`,\n ` PONDERBOT_SPACE_ID=${data.dev_environment.space_id}`,\n ` PONDERBOT_TOKEN=${data.dev_environment.token}`,\n \"Put these in your app's .env - createClient() reads them.\",\n ];\n }\n\n if (isRecord(data) && isRecord(data.release) && typeof data.release.id === \"string\") {\n return [\n ...versionBumpLines(data.version_bump),\n `release ${data.release.id}`,\n ...recordLines(data.registered),\n ];\n }\n\n if (isRecord(data) && data.ok === true && isRecord(data.counts)) {\n return [\"manifest valid\", ...recordLines(data.counts)];\n }\n\n if (isRecord(data) && Array.isArray(data.spaces)) {\n return [\"id name status\", ...data.spaces.map((space) => columns(space, spaceKeys))];\n }\n\n if (isRecord(data) && isRecord(data.space)) {\n if (isRecord(data.budget) && isRecord(data.usage)) {\n return spaceShowLines(data.space, data.budget, data.usage);\n }\n\n return [columns(data.space, spaceKeys)];\n }\n\n if (isRecord(data) && isRecord(data.budget)) {\n return recordLines(data.budget);\n }\n\n if (isRecord(data) && Array.isArray(data.models)) {\n return [\"ref provider model\", ...data.models.map((model) => columns(model, modelKeys))];\n }\n\n if (isRecord(data) && isRecord(data.model)) {\n return [columns(data.model, modelKeys)];\n }\n\n if (isRecord(data) && isRecord(data.agent_model_refs)) {\n return [\n \"agent model\",\n ...Object.entries(data.agent_model_refs).map(\n ([agentRef, modelRef]) => `${agentRef} ${String(modelRef)}`,\n ),\n ];\n }\n\n if (isRecord(data) && isRecord(data.run)) {\n return lines(data.run);\n }\n\n if (\n isRecord(data) &&\n data.type === \"provider_auth\" &&\n typeof data.provider === \"string\" &&\n typeof data.method === \"string\" &&\n typeof data.space_id === \"string\"\n ) {\n if (typeof data.binding_id === \"string\") {\n const target =\n data.all_spaces === true\n ? \"all Spaces\"\n : `Spaces ${Array.isArray(data.space_ids) ? data.space_ids.join(\", \") : data.space_id}`;\n\n return [\n `provider ${data.provider} ${data.method} shared credentials saved for ${target}`,\n `binding ${data.binding_id}`,\n `smoke test: ${String(data.smoke_test ?? \"ponder spaces show\")}`,\n ];\n }\n\n return [\n `provider ${data.provider} ${data.method} credentials saved for space ${data.space_id}`,\n `smoke test: ${String(data.smoke_test ?? \"ponder spaces show\")}`,\n ];\n }\n\n if (Array.isArray(data)) {\n return data.flatMap((item) => lines(item));\n }\n\n if (isRecord(data)) {\n const arrayEntry = Object.entries(data).find((entry): entry is [string, unknown[]] =>\n Array.isArray(entry[1]),\n );\n if (arrayEntry) {\n return arrayEntry[1].flatMap((item) => lines(item));\n }\n\n return [recordSummary(data)];\n }\n\n return [String(data)];\n}\n\nconst versionBumpLines = (data: unknown): string[] => {\n if (\n !isRecord(data) ||\n typeof data.previousVersion !== \"string\" ||\n typeof data.nextVersion !== \"string\"\n ) {\n return [];\n }\n\n return [`version ${data.previousVersion} → ${data.nextVersion}`];\n}\n\nconst jsonData = (data: unknown): unknown => {\n if (!isStartedDevStack(data)) {\n return data;\n }\n\n return {\n ...data,\n dev_environment: {\n url: data.dev_environment.url,\n space_id: data.dev_environment.space_id,\n token_env: \"PONDERBOT_TOKEN\",\n },\n };\n}\n\nfunction isStartedDevStack(data: unknown): data is {\n type: \"stack\";\n status: \"started\";\n dev_environment: {\n url: string;\n space_id: string;\n token: string;\n };\n} {\n return (\n isRecord(data) &&\n data.type === \"stack\" &&\n data.status === \"started\" &&\n isRecord(data.dev_environment) &&\n typeof data.dev_environment.url === \"string\" &&\n typeof data.dev_environment.space_id === \"string\" &&\n typeof data.dev_environment.token === \"string\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nconst manifestReleaseVersionConflict = (detail: unknown): string | undefined => {\n const details = isRecord(detail) ? detail.details : detail;\n\n if (\n Array.isArray(details) &&\n (details[0] === \"manifest_release_version_conflict\" ||\n details[0] === \"manifest_project_release_version_conflict\") &&\n typeof details[3] === \"string\"\n ) {\n return details[3];\n }\n\n return undefined;\n}\n\nconst recordLines = (data: unknown): string[] => {\n if (!isRecord(data)) {\n return [];\n }\n\n return Object.entries(data).map(([key, value]) => `${key} ${String(value)}`);\n}\n\nfunction spaceShowLines(\n space: Record<string, unknown>,\n budget: Record<string, unknown>,\n usage: Record<string, unknown>,\n): string[] {\n return [\n columns(space, spaceKeys),\n \"budget\",\n ...recordLines(budget),\n ...spaceUsageLines(usage),\n ];\n}\n\nfunction spaceUsageLines(usage: Record<string, unknown>): string[] {\n const period = isRecord(usage.period) ? usage.period : {};\n const resources = isRecord(usage.usage) ? usage.usage : {};\n\n return [\n `usage ${String(period.type ?? \"unknown\")} ${String(period.starts_at ?? \"\")} ${String(period.ends_at ?? \"\")}`.trim(),\n ...Object.entries(resources).map(([key, value]) => {\n if (!isRecord(value)) {\n return `${key} ${JSON.stringify(value)}`;\n }\n\n return [\n key,\n `used=${String(value.used ?? \"\")}`,\n `limit=${limitValue(value.limit)}`,\n `remaining=${limitValue(value.remaining)}`,\n ].join(\" \");\n }),\n ];\n}\n\nconst limitValue = (value: unknown): string => {\n return value === null ? \"unlimited\" : String(value);\n}\n\nconst spaceKeys = [\"id\", \"name\", \"status\"];\n\nconst modelKeys = [\"ref\", \"provider\", \"model\"];\n\nconst releaseKeys = [\"id\", \"manifest_name\", \"environment\", \"version\", \"status\"];\n\nconst catalogKeys: Record<string, string[]> = {\n agents: [\"ref\", \"name\"],\n mcp_servers: [\"ref\", \"url\", \"tool_count\"],\n actions: [\"ref\", \"kind\"],\n skills: [\"ref\", \"name\"],\n workflows: [\"ref\", \"name\"],\n schedules: [\"ref\", \"target_type\", \"target_ref\", \"mode\", \"enabled\", \"next_run_at\"],\n webhooks: [\"ref\", \"target_type\", \"target_ref\"],\n agent_groups: [\"ref\", \"strategy\"],\n};\n\nconst columns = (record: unknown, keys: string[]): string => {\n if (!isRecord(record)) {\n return String(record);\n }\n\n return keys\n .map((key) => record[key])\n .filter((value) => value !== undefined && value !== null)\n .map((value) => String(value))\n .join(\" \");\n};\n\nconst releaseCatalogLines = (\n release: Record<string, unknown>,\n resources: Record<string, unknown>,\n): string[] => [\n `release ${columns(release, releaseKeys)}`,\n ...Object.entries(resources).flatMap(([kind, entries]) =>\n Array.isArray(entries) && entries.length > 0\n ? [\n `${kind} (${entries.length})`,\n ...entries.map((entry) => ` ${columns(entry, catalogKeys[kind] ?? [\"ref\", \"name\"])}`),\n ]\n : [],\n ),\n];\n\nfunction recordSummary(record: Record<string, unknown>): string {\n const fields = [\n field(record, \"type\") ?? field(record, \"run_type\") ?? field(record, \"target_type\"),\n field(record, \"id\") ??\n field(record, \"run_id\") ??\n field(record, \"record_id\") ??\n field(record, \"receipt_id\"),\n field(record, \"ref\") ?? field(record, \"target_ref\") ?? field(record, \"action\"),\n field(record, \"status\"),\n ].filter((value): value is string => value !== undefined);\n\n return fields.length === 0 ? JSON.stringify(record) : fields.join(\" \");\n}\n\nfunction field(record: Record<string, unknown>, name: string): string | undefined {\n const value = record[name];\n return typeof value === \"string\" ? value : undefined;\n}\n","import {\n isPonderbotError,\n ponderbotError,\n type CallContext,\n type DevManifestHookDelivery,\n type JsonObject,\n type PonderbotClient,\n type Run,\n type SSEEvent,\n} from \"@ponderbot/sdk\";\nimport {\n parseSerializedExecutionBoundary,\n parseActionExecutionSnapshot,\n isLifecycleEvent,\n type ActionCheckpoint,\n type ActionWorkerExecutionResult,\n type HookWorkerExecutionResult,\n type ActionSuspension,\n type SerializedExecutionBoundary,\n type WorkerExecutionResult,\n} from \"@ponderbot/sdk/worker\";\n\nimport { type ResolvedConfig } from \"./config\";\nimport {\n executePonderbotWorkerInNode,\n NodeWorkerFailure,\n} from \"./node-worker-runner\";\nimport { formatError } from \"./output\";\n\nexport interface DevActionRunner {\n catchUp(): Promise<void>;\n catchUpManifest(manifestName: string): Promise<void>;\n handleEvent(event: SSEEvent): void;\n idle(): Promise<void>;\n stop(): Promise<void>;\n}\n\ninterface QueueState {\n stopped: boolean;\n concurrency: number;\n active: Map<string, ActiveDevRun>;\n idlePromise: Promise<void>;\n resolveIdle?: () => void;\n pending: DevRunIdentity[];\n scheduledIds: Set<string>;\n claimBackoff: Map<string, ClaimBackoff>;\n}\n\n// One backoff record per run key. A Hook record carries the attempt's request\n// id so that a re-offered attempt N+1 replaces the attempt-N record instead of\n// inheriting its backoff. Action backoff has no attempt identity.\ninterface ClaimBackoff {\n requestId?: string;\n blockedUntil: number;\n}\n\ninterface DevActionRunIdentity {\n actionRunId: string;\n spaceId: string;\n}\n\ninterface DevHookDeliveryIdentity {\n hookDelivery: DevManifestHookDelivery;\n}\n\ntype DevRunIdentity = DevActionRunIdentity | DevHookDeliveryIdentity;\n\ninterface ActiveDevRun {\n requestId?: string;\n controller?: AbortController;\n}\n\ninterface DevActionRunnerOptions {\n concurrency?: number;\n}\n\nconst DEFAULT_DEV_ACTION_CONCURRENCY = 4;\nconst CLAIM_FAILURE_BACKOFF_MILLISECONDS = 30_000;\n\nconst runKey = (run: DevRunIdentity) =>\n \"actionRunId\" in run\n ? `action:${run.spaceId}:${run.actionRunId}`\n : `hook:${run.hookDelivery.id}`;\n\nconst claimRequestId = (run: DevRunIdentity) =>\n \"actionRunId\" in run ? undefined : run.hookDelivery.dev_runner.request_id;\n\nconst blockClaim = (queue: QueueState, run: DevRunIdentity) => {\n queue.claimBackoff.set(runKey(run), {\n requestId: claimRequestId(run),\n blockedUntil: Date.now() + CLAIM_FAILURE_BACKOFF_MILLISECONDS,\n });\n};\n\n// Blocks only while the stored record is for this offered attempt and its\n// backoff has not elapsed. A different request id or an elapsed backoff drops\n// the record, so the map holds at most one entry per run key.\nconst claimBlocked = (queue: QueueState, run: DevRunIdentity) => {\n const key = runKey(run);\n const backoff = queue.claimBackoff.get(key);\n if (backoff === undefined) {\n return false;\n }\n if (backoff.requestId === claimRequestId(run) && Date.now() < backoff.blockedUntil) {\n return true;\n }\n queue.claimBackoff.delete(key);\n return false;\n};\n\ninterface DevRunnerCallback {\n url: string;\n token: string;\n runnerId: string;\n actionRunId: string;\n requestId: string;\n attempt: number;\n checkpoint: ActionCheckpoint;\n}\n\ntype DevRunnerCallbackIdentity = Omit<DevRunnerCallback, \"checkpoint\">;\n\ninterface DevRunnerCallbackBody {\n status: \"completed\" | \"failed\" | \"cancelled\" | \"suspended\";\n exit_code: number;\n result: JsonObject;\n reason: string | null;\n checkpoint: ActionCheckpoint;\n suspension?: ActionSuspension;\n}\n\nexport const createDevActionRunner = (\n client: PonderbotClient,\n config: ResolvedConfig,\n options: DevActionRunnerOptions = {},\n): DevActionRunner => {\n const concurrency = Math.max(\n 1,\n Math.floor(options.concurrency ?? DEFAULT_DEV_ACTION_CONCURRENCY),\n );\n const state: QueueState = {\n stopped: false,\n concurrency,\n active: new Map(),\n idlePromise: Promise.resolve(),\n pending: [],\n scheduledIds: new Set(),\n claimBackoff: new Map(),\n };\n\n const enqueue = (queue: QueueState, run: DevRunIdentity) => {\n const key = runKey(run);\n if (queue.stopped || queue.scheduledIds.has(key)) {\n return;\n }\n if (claimBlocked(queue, run)) {\n return;\n }\n\n if (queue.scheduledIds.size === 0) {\n queue.idlePromise = new Promise<void>((resolve) => {\n queue.resolveIdle = resolve;\n });\n }\n queue.pending.push(run);\n queue.scheduledIds.add(key);\n drain(queue);\n };\n\n const drain = (queue: QueueState) => {\n while (\n !queue.stopped &&\n queue.active.size < queue.concurrency &&\n queue.pending.length > 0\n ) {\n const run = queue.pending.shift();\n if (run === undefined) continue;\n const key = runKey(run);\n const active: ActiveDevRun = {};\n queue.active.set(key, active);\n void executeDevRun(run, active).finally(() => {\n queue.active.delete(key);\n queue.scheduledIds.delete(key);\n drain(queue);\n settleIdle(queue);\n });\n }\n };\n\n const settleIdle = (queue: QueueState) => {\n if (queue.scheduledIds.size > 0) return;\n queue.resolveIdle?.();\n queue.resolveIdle = undefined;\n };\n\n const executeDevRun = async (run: DevRunIdentity, active: ActiveDevRun): Promise<void> => {\n if (\"hookDelivery\" in run) {\n await executeDevHook(run.hookDelivery, active);\n return;\n }\n await executeDevAction(run, active);\n };\n\n const executeDevAction = async ({\n actionRunId,\n spaceId,\n }: DevActionRunIdentity, active: ActiveDevRun): Promise<void> => {\n let callback: DevRunnerCallback | undefined;\n\n try {\n let { run } = await client.runs.show(\"action\", actionRunId, spaceId);\n if (state.stopped || run.runner !== \"dev\" || run.status !== \"running\") {\n return;\n }\n // The claim is the dev acceptance: it records the runner callback that\n // sets runner_status and closes the dispatch receipt. Every attempt is\n // claimed, not only the ones that carry a secret grant.\n try {\n await client.dev.actionRuns.claim(actionRunId, spaceId);\n } catch (claimError) {\n if (!(isPonderbotError(claimError) && claimError.status === 409)) {\n throw claimError;\n }\n ({ run } = await client.runs.show(\"action\", actionRunId, spaceId));\n if (state.stopped || run.runner !== \"dev\" || run.status !== \"running\") {\n return;\n }\n blockClaim(state, { actionRunId, spaceId });\n console.error(formatError(claimError));\n return;\n }\n ({ run } = await client.runs.show(\"action\", actionRunId, spaceId));\n if (state.stopped || run.runner !== \"dev\" || run.status !== \"running\") {\n return;\n }\n\n const context = devCallContext(run, spaceId);\n const actionExecution = devActionExecution(run);\n const activeCallback = {\n ...devRunnerCallback(run),\n checkpoint: { onceRecords: actionExecution.onceRecords },\n };\n callback = activeCallback;\n const execution = devExecutionBoundary(run);\n const controller = new AbortController();\n active.requestId = activeCallback.requestId;\n active.controller = controller;\n const environment = await redeemActionSecretGrant(run, spaceId, config);\n const result = await executePonderbotWorkerInNode({\n dir: config.project,\n dev: true,\n invocation: {\n kind: \"action\",\n name: run.ref ?? actionRunId,\n input: devInput(run),\n execution: actionExecution,\n },\n context,\n execution,\n applicationOrigin: config.applicationOrigin ?? devApplicationOrigin(run),\n completionGraceMilliseconds: devCompletionGraceMilliseconds(run),\n environment,\n reload: true,\n signal: controller.signal,\n });\n\n if (state.stopped) return;\n\n try {\n await postRunnerCallback(activeCallback, devRunnerCallbackBody(result));\n } catch (callbackError) {\n logCallbackDeliveryError(callbackError);\n return;\n }\n\n } catch (error) {\n if (state.stopped) return;\n\n if (callback === undefined) {\n console.error(formatError(error));\n return;\n }\n\n try {\n await postRunnerCallback(\n callback,\n devRunnerFailureBody(error, callback.checkpoint),\n );\n } catch (callbackError) {\n logCallbackDeliveryError(callbackError);\n }\n\n console.error(formatError(error));\n }\n };\n\n const executeDevHook = async (\n offered: DevManifestHookDelivery,\n active: ActiveDevRun,\n ): Promise<void> => {\n // Claim the attempt before the body runs. The Runtime replaces a spent or\n // nearly expired grant under the delivery row lock, so a runner restart or\n // watch redeploy never retries against a grant that was already redeemed.\n let delivery: DevManifestHookDelivery;\n try {\n ({ delivery } = await client.dev.hookDeliveries.claim(offered.id, offered.space_id));\n } catch (claimError) {\n if (state.stopped) return;\n if (isPonderbotError(claimError) && claimError.status === 404) {\n // The attempt is no longer waiting for the dev runner.\n return;\n }\n if (isPonderbotError(claimError) && claimError.status === 409) {\n blockClaim(state, { hookDelivery: offered });\n }\n console.error(formatError(claimError));\n return;\n }\n const callback = devHookCallback(delivery);\n try {\n const context = devHookContext(delivery);\n const execution = devHookExecution(delivery);\n const controller = new AbortController();\n active.requestId = callback.requestId;\n active.controller = controller;\n let environment: Record<string, string>;\n try {\n environment = await redeemSecretGrant(\n {\n token: delivery.dev_runner.secret_grant,\n kind: \"hook\",\n ownerId: delivery.id,\n spaceId: context.space_id,\n releaseId: context.release_id,\n runId: context.run_id,\n attempt: context.attempt,\n requestId: delivery.dev_runner.request_id,\n runnerId: delivery.dev_runner.runner_id,\n },\n config,\n `dev_hook_secret_delivery_failed: ${delivery.id}`,\n `dev_hook_secret_delivery_invalid: ${delivery.id}`,\n );\n } catch (redeemError) {\n if (state.stopped) return;\n if (!isSecretGrantContention(redeemError)) {\n throw redeemError;\n }\n // Redemption is single-use. A claimed grant another runner already\n // spent or replaced must not execute or fail the attempt here; this\n // runner backs off and re-claims on a later poll.\n blockClaim(state, { hookDelivery: offered });\n console.error(formatError(redeemError));\n return;\n }\n const event = delivery.dev_runner.worker_command.event;\n if (!isLifecycleEvent(event)) {\n throw new Error(`dev_hook_event_invalid: ${delivery.id}`);\n }\n const result = await executePonderbotWorkerInNode({\n dir: config.project,\n dev: true,\n invocation: {\n kind: \"hook\",\n name: delivery.dev_runner.worker_command.name,\n event,\n },\n context,\n execution,\n applicationOrigin: config.applicationOrigin,\n completionGraceMilliseconds: 0,\n environment,\n reload: true,\n signal: controller.signal,\n });\n if (state.stopped) return;\n try {\n await postHookRunnerCallback(callback, devHookCallbackBody(result));\n } catch (callbackError) {\n logCallbackDeliveryError(callbackError);\n }\n } catch (error) {\n if (state.stopped) return;\n try {\n await postHookRunnerCallback(callback, devHookFailureBody(error));\n } catch (callbackError) {\n logCallbackDeliveryError(callbackError);\n }\n console.error(formatError(error));\n }\n };\n\n return {\n async catchUp() {\n const response = await client.runs.list({\n type: \"action\",\n status: \"running\",\n });\n for (const run of response.runs) {\n if (run.runner === \"dev\") {\n enqueue(state, { actionRunId: run.id, spaceId: config.spaceId });\n }\n }\n },\n async catchUpManifest(manifestName) {\n const response = await client.dev.manifests.actionRuns(\n manifestName,\n config.environment,\n );\n const runningKeys = new Set(\n response.runs.map((run) =>\n runKey({ actionRunId: run.id, spaceId: run.space_id }),\n ),\n );\n const hookResponse = await client.dev.manifests.hookDeliveries(\n manifestName,\n config.environment,\n );\n const hookKeys = new Set(hookResponse.deliveries.map((delivery) => runKey({ hookDelivery: delivery })));\n for (const [key, active] of state.active) {\n if (!runningKeys.has(key) && !hookKeys.has(key)) {\n active.controller?.abort(\n new DOMException(\"Runtime cancelled execution\", \"AbortError\"),\n );\n }\n }\n for (const run of response.runs) {\n enqueue(state, { actionRunId: run.id, spaceId: run.space_id });\n }\n for (const delivery of hookResponse.deliveries) {\n enqueue(state, { hookDelivery: delivery });\n }\n },\n handleEvent(event) {\n if (isDevActionDispatchHint(event)) {\n enqueue(state, {\n actionRunId: event.data.run_id,\n spaceId: eventSpaceId(event, config.spaceId),\n });\n return;\n }\n if (\n isDevActionTerminalHint(event)\n ) {\n const active = state.active.get(\n runKey({\n actionRunId: event.data.run_id,\n spaceId: eventSpaceId(event, config.spaceId),\n }),\n );\n if (active?.requestId === event.data.metadata.request_id) {\n active.controller?.abort(\n new DOMException(\"Runtime cancelled execution\", \"AbortError\"),\n );\n }\n }\n },\n idle() {\n return state.idlePromise;\n },\n stop() {\n if (!state.stopped) {\n state.stopped = true;\n for (const run of state.pending) {\n state.scheduledIds.delete(runKey(run));\n }\n state.pending.length = 0;\n for (const active of state.active.values()) {\n active.controller?.abort(\n new DOMException(\"Dev runner stopped\", \"AbortError\"),\n );\n }\n settleIdle(state);\n }\n return state.idlePromise;\n },\n };\n};\n\nconst isDevActionTerminalHint = (\n event: SSEEvent,\n): event is SSEEvent & {\n data: {\n type: \"run_updated\";\n run_type: \"action\";\n run_id: string;\n space_id?: string;\n metadata: {\n request_id: string;\n runner: \"dev\";\n status: string;\n };\n };\n} =>\n event.event === \"run_updated\" &&\n isRecord(event.data) &&\n event.data.type === \"run_updated\" &&\n event.data.run_type === \"action\" &&\n typeof event.data.run_id === \"string\" &&\n isRecord(event.data.metadata) &&\n event.data.metadata.runner === \"dev\" &&\n typeof event.data.metadata.request_id === \"string\" &&\n [\"cancelled\", \"failed\", \"completed\"].includes(\n String(event.data.metadata.status),\n );\n\nconst isDevActionDispatchHint = (\n event: SSEEvent,\n): event is SSEEvent & {\n data: {\n type: \"run_updated\";\n run_type: \"action\";\n run_id: string;\n space_id?: string;\n metadata: { runner: \"dev\"; status: \"running\" };\n };\n} =>\n event.event === \"run_updated\" &&\n isRecord(event.data) &&\n event.data.type === \"run_updated\" &&\n event.data.run_type === \"action\" &&\n typeof event.data.run_id === \"string\" &&\n isRecord(event.data.metadata) &&\n event.data.metadata.runner === \"dev\" &&\n event.data.metadata.status === \"running\";\n\nconst eventSpaceId = (event: SSEEvent, fallback: string) =>\n isRecord(event.data) && typeof event.data.space_id === \"string\"\n ? event.data.space_id\n : fallback;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst isJsonObject = (value: unknown): value is JsonObject =>\n isRecord(value) && Object.values(value).every(isJsonValue);\n\nconst isJsonValue = (value: unknown): boolean =>\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n (Array.isArray(value) && value.every(isJsonValue)) ||\n isJsonObject(value);\n\nconst devInput = (run: Run): JsonObject => {\n const input = run.input ?? {};\n if (!isJsonObject(input)) {\n throw new Error(`dev_runner_input_invalid: ${run.id}`);\n }\n return input;\n};\n\nconst devCallContext = (\n run: Run,\n spaceId: string,\n): CallContext => {\n const devRunner = run.dev_runner;\n if (\n devRunner === null ||\n devRunner === undefined ||\n typeof devRunner.runner_id !== \"string\"\n ) {\n throw new Error(`dev_runner_context_missing: ${run.id}`);\n }\n\n if (\n (devRunner.schedule_ref === undefined) !==\n (devRunner.scheduled_at === undefined)\n ) {\n throw new Error(`dev_runner_schedule_context_invalid: ${run.id}`);\n }\n const context: CallContext = {\n space_id: spaceId,\n action_run_id: run.id,\n run_type: \"action\",\n run_id: run.id,\n release_id: devReleaseId(run),\n attempt: devAttempt(run),\n runner_id: devRunner.runner_id,\n metadata: {\n request_id: devRequestId(run),\n },\n };\n\n if (devRunner.principal !== undefined) {\n context.principal = devRunner.principal;\n }\n\n if (devRunner.workflow_run_id !== undefined) {\n context.workflow_run_id = devRunner.workflow_run_id;\n }\n\n if (\n devRunner.schedule_ref !== undefined &&\n devRunner.scheduled_at !== undefined\n ) {\n context.schedule_ref = devRunner.schedule_ref;\n context.scheduled_at = devRunner.scheduled_at;\n }\n\n return context;\n};\n\nconst devReleaseId = (run: Run) => {\n if (typeof run.release_id !== \"string\" || run.release_id.length === 0) {\n throw new Error(`dev_runner_release_id_invalid: ${run.id}`);\n }\n return run.release_id;\n};\n\nconst devApplicationOrigin = (run: Run) => {\n const origin = run.dev_runner?.application_origin;\n if (origin === undefined) {\n return undefined;\n }\n if (typeof origin !== \"string\" || origin.length === 0) {\n throw new Error(`dev_runner_application_origin_invalid: ${run.id}`);\n }\n return origin;\n};\n\nconst devRunnerCallback = (run: Run): DevRunnerCallbackIdentity => {\n const devRunner = run.dev_runner;\n if (\n devRunner === null ||\n devRunner === undefined ||\n typeof devRunner.callback_url !== \"string\" ||\n typeof devRunner.callback_token !== \"string\" ||\n typeof devRunner.runner_id !== \"string\"\n ) {\n throw new Error(`dev_runner_context_missing: ${run.id}`);\n }\n\n return {\n url: devRunner.callback_url,\n token: devRunner.callback_token,\n runnerId: devRunner.runner_id,\n requestId: devRequestId(run),\n actionRunId: run.id,\n attempt: devAttempt(run),\n };\n};\n\nconst devExecutionBoundary = (run: Run): SerializedExecutionBoundary => {\n const execution = run.dev_runner?.execution;\n try {\n const parsed = parseSerializedExecutionBoundary(execution);\n if (parsed.cancellationId !== devRequestId(run)) {\n throw new Error(\"execution_request_identity_mismatch\");\n }\n return parsed;\n } catch {\n throw new Error(`dev_runner_execution_boundary_invalid: ${run.id}`);\n }\n};\n\nconst devActionExecution = (run: Run) => {\n try {\n return parseActionExecutionSnapshot(run.dev_runner?.action_execution);\n } catch {\n throw new Error(`dev_runner_action_execution_invalid: ${run.id}`);\n }\n};\n\nconst devRequestId = (run: Run) => {\n const requestId = run.dev_runner?.request_id;\n if (typeof requestId !== \"string\" || requestId.length === 0) {\n throw new Error(`dev_runner_request_id_invalid: ${run.id}`);\n }\n return requestId;\n};\n\nconst devAttempt = (run: Run) => {\n if (!Number.isSafeInteger(run.attempt) || Number(run.attempt) <= 0) {\n throw new Error(`dev_runner_attempt_invalid: ${run.id}`);\n }\n return Number(run.attempt);\n};\n\nconst devCompletionGraceMilliseconds = (run: Run) => {\n const seconds = run.dev_runner?.completion_grace_seconds;\n if (!Number.isSafeInteger(seconds) || Number(seconds) < 0) {\n throw new Error(`dev_runner_completion_grace_invalid: ${run.id}`);\n }\n const milliseconds = Number(seconds) * 1_000;\n if (!Number.isSafeInteger(milliseconds)) {\n throw new Error(`dev_runner_completion_grace_invalid: ${run.id}`);\n }\n return milliseconds;\n};\n\nconst postRunnerCallback = async (\n callback: DevRunnerCallback,\n body: DevRunnerCallbackBody,\n): Promise<void> => {\n const occurredAt = new Date().toISOString();\n const response = await fetch(callback.url, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${callback.token}`,\n \"content-type\": \"application/json\",\n \"x-ponderbot-runner-event-id\": [\n \"dev-action\",\n callback.actionRunId,\n callback.attempt,\n body.status,\n globalThis.crypto.randomUUID(),\n ].join(\":\"),\n \"x-ponderbot-runner-timestamp\": occurredAt,\n },\n body: JSON.stringify({\n runner_id: callback.runnerId,\n status: body.status,\n exit_code: body.exit_code,\n result: body.result,\n reason: body.reason,\n checkpoint: body.checkpoint,\n suspension: body.suspension,\n occurred_at: occurredAt,\n }),\n });\n\n const responseBody = await response.json().catch(() => ({}));\n if (!response.ok) {\n const error =\n isRecord(responseBody) && responseBody.error !== undefined\n ? responseBody.error\n : response.statusText;\n throw ponderbotError(response.status, String(error), responseBody);\n }\n};\n\nconst devRunnerCallbackBody = (\n result: ActionWorkerExecutionResult,\n): DevRunnerCallbackBody => {\n switch (result.status) {\n case \"completed\":\n return {\n status: \"completed\",\n exit_code: 0,\n result: result.output,\n reason: null,\n checkpoint: result.checkpoint,\n };\n case \"suspended\":\n return {\n status: \"suspended\",\n exit_code: 0,\n result: {},\n reason: null,\n checkpoint: result.checkpoint,\n suspension: result.suspension,\n };\n case \"failed\":\n return {\n status: \"failed\",\n exit_code: 1,\n result: {\n error:\n result.error.detail === undefined\n ? {\n code: result.error.code,\n message: result.error.message,\n }\n : {\n code: result.error.code,\n message: result.error.message,\n detail: result.error.detail,\n },\n },\n reason: result.error.code,\n checkpoint: result.checkpoint,\n };\n case \"cancelled\":\n return {\n status: \"cancelled\",\n exit_code: result.reason === \"deadline_exceeded\" ? 124 : 130,\n result: {},\n reason: result.reason,\n checkpoint: result.checkpoint,\n };\n }\n};\n\nconst devRunnerFailureBody = (\n error: unknown,\n checkpoint: ActionCheckpoint,\n): DevRunnerCallbackBody => {\n const message = errorMessage(error);\n const reason =\n error instanceof NodeWorkerFailure ? error.reason : \"runner_failed\";\n\n return {\n status: \"failed\",\n exit_code: 1,\n result: {\n error: {\n code: reason,\n message,\n },\n },\n reason,\n checkpoint,\n };\n};\n\ninterface DevHookRunnerCallback {\n url: string;\n token: string;\n runnerId: string;\n hookDeliveryId: string;\n requestId: string;\n}\n\ninterface DevHookRunnerCallbackBody {\n status: \"completed\" | \"failed\" | \"cancelled\";\n exit_code: number;\n result: JsonObject;\n reason: string | null;\n}\n\nconst devHookCallback = (delivery: DevManifestHookDelivery): DevHookRunnerCallback => ({\n url: delivery.dev_runner.callback_url,\n token: delivery.dev_runner.callback_token,\n runnerId: delivery.dev_runner.runner_id,\n hookDeliveryId: delivery.id,\n requestId: delivery.dev_runner.request_id,\n});\n\nconst devHookContext = (delivery: DevManifestHookDelivery): CallContext => {\n const context = delivery.dev_runner.context;\n const spaceId = context.space_id;\n const runId = context.run_id;\n const releaseId = context.release_id;\n const hookDeliveryId = context.hook_delivery_id;\n const attempt = context.attempt;\n if (\n typeof spaceId !== \"string\" ||\n typeof runId !== \"string\" ||\n typeof releaseId !== \"string\" ||\n typeof hookDeliveryId !== \"string\" ||\n typeof attempt !== \"number\" ||\n !Number.isSafeInteger(attempt) ||\n attempt <= 0\n ) {\n throw new Error(`dev_hook_context_invalid: ${delivery.id}`);\n }\n return {\n space_id: spaceId,\n run_id: runId,\n release_id: releaseId,\n hook_delivery_id: hookDeliveryId,\n attempt,\n runner_id: delivery.dev_runner.runner_id,\n metadata: { request_id: delivery.dev_runner.request_id },\n };\n};\n\nconst devHookExecution = (delivery: DevManifestHookDelivery): SerializedExecutionBoundary => {\n try {\n const execution = delivery.dev_runner.context.execution;\n const parsed = parseSerializedExecutionBoundary(execution);\n if (parsed.cancellationId !== delivery.dev_runner.request_id) {\n throw new Error(\"execution_request_identity_mismatch\");\n }\n return parsed;\n } catch {\n throw new Error(`dev_hook_execution_boundary_invalid: ${delivery.id}`);\n }\n};\n\nconst redeemActionSecretGrant = async (\n run: Run,\n spaceId: string,\n config: ResolvedConfig,\n): Promise<Record<string, string> | undefined> => {\n const grant = run.dev_runner?.secret_grant;\n if (grant === undefined) {\n return undefined;\n }\n if (typeof grant !== \"string\" || grant.length === 0) {\n throw new Error(`dev_runner_secret_grant_invalid: ${run.id}`);\n }\n return redeemSecretGrant(\n {\n token: grant,\n kind: \"action\",\n ownerId: run.id,\n spaceId,\n releaseId: devReleaseId(run),\n runId: run.id,\n attempt: devAttempt(run),\n requestId: devRequestId(run),\n runnerId: devRunnerCallback(run).runnerId,\n },\n config,\n `dev_action_secret_delivery_failed: ${run.id}`,\n `dev_action_secret_delivery_invalid: ${run.id}`,\n );\n};\n\nconst redeemSecretGrant = async (\n identity: {\n token: string;\n kind: \"action\" | \"hook\";\n ownerId: string;\n spaceId: string;\n releaseId: string;\n runId: string;\n attempt: number;\n requestId: string;\n runnerId: string;\n },\n config: ResolvedConfig,\n failed: string,\n invalid: string,\n): Promise<Record<string, string>> => {\n const response = await fetch(`${config.url}/api/internal/secret-delivery/redeem`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n token: identity.token,\n kind: identity.kind,\n owner_id: identity.ownerId,\n space_id: identity.spaceId,\n release_id: identity.releaseId,\n run_id: identity.runId,\n attempt: identity.attempt,\n request_id: identity.requestId,\n runner_id: identity.runnerId,\n }),\n });\n const body = await response.json().catch(() => undefined);\n if (!response.ok) {\n const code =\n isRecord(body) && typeof body.error === \"string\"\n ? body.error\n : \"unknown_error\";\n // Typed so callers can distinguish single-use grant contention from\n // every other failure.\n throw Object.assign(ponderbotError(response.status, code, body), {\n message: `${failed}: HTTP ${response.status} ${code}`,\n });\n }\n if (!isRecord(body) || !isRecord(body.env)) {\n throw new Error(invalid);\n }\n const environment: Record<string, string> = {};\n for (const [name, value] of Object.entries(body.env)) {\n if (typeof value !== \"string\") {\n throw new Error(invalid);\n }\n environment[name] = value;\n }\n return environment;\n};\n\nconst postHookRunnerCallback = async (\n callback: DevHookRunnerCallback,\n body: DevHookRunnerCallbackBody,\n): Promise<void> => {\n const occurredAt = new Date().toISOString();\n const response = await fetch(callback.url, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${callback.token}`,\n \"content-type\": \"application/json\",\n \"x-ponderbot-runner-event-id\": [\n \"dev-hook\",\n callback.hookDeliveryId,\n callback.requestId,\n body.status,\n globalThis.crypto.randomUUID(),\n ].join(\":\"),\n \"x-ponderbot-runner-timestamp\": occurredAt,\n },\n body: JSON.stringify({\n runner_id: callback.runnerId,\n status: body.status,\n exit_code: body.exit_code,\n result: body.result,\n reason: body.reason,\n occurred_at: occurredAt,\n }),\n });\n const responseBody = await response.json().catch(() => ({}));\n if (!response.ok) {\n const error =\n isRecord(responseBody) && responseBody.error !== undefined\n ? responseBody.error\n : response.statusText;\n throw ponderbotError(response.status, String(error), responseBody);\n }\n};\n\nconst devHookCallbackBody = (\n result: HookWorkerExecutionResult,\n): DevHookRunnerCallbackBody => {\n switch (result.status) {\n case \"completed\":\n return { status: \"completed\", exit_code: 0, result: result.output, reason: null };\n case \"failed\":\n return {\n status: \"failed\",\n exit_code: 1,\n result: { error: result.error },\n reason: result.error.code,\n };\n case \"cancelled\":\n return {\n status: \"cancelled\",\n exit_code: result.reason === \"deadline_exceeded\" ? 124 : 130,\n result: {},\n reason: result.reason,\n };\n }\n};\n\nconst devHookFailureBody = (error: unknown): DevHookRunnerCallbackBody => ({\n status: \"failed\",\n exit_code: 1,\n result: {\n error: {\n code: error instanceof NodeWorkerFailure ? error.reason : \"runner_failed\",\n message: errorMessage(error),\n },\n },\n reason: error instanceof NodeWorkerFailure ? error.reason : \"runner_failed\",\n});\n\nconst errorMessage = (error: unknown): string => {\n return error instanceof Error ? error.message : String(error);\n};\n\nconst logCallbackDeliveryError = (error: unknown): void => {\n if (isAttemptSupersededCallbackError(error)) {\n return;\n }\n\n console.error(formatError(error));\n};\n\nconst SECRET_GRANT_CONTENTION_CODES = [\n \"secret_delivery_grant_redeemed\",\n \"secret_delivery_grant_not_active\",\n];\n\nconst isSecretGrantContention = (error: unknown): boolean =>\n isPonderbotError(error) &&\n error.status === 409 &&\n SECRET_GRANT_CONTENTION_CODES.includes(error.code);\n\nconst isAttemptSupersededCallbackError = (error: unknown): boolean => {\n return isPonderbotError(error) && [401, 409].includes(error.status);\n};\n","import { type PonderbotClient, type SSEEvent } from \"@ponderbot/sdk\";\n\nexport interface EventTail {\n stop: () => void;\n done: Promise<void>;\n}\n\ninterface FollowEventsOptions {\n retryMs?: number;\n onError?: (error: unknown) => void;\n onReconnect?: () => void;\n}\n\nexport function followEvents(\n client: PonderbotClient,\n onEvent: (event: SSEEvent) => void,\n options: FollowEventsOptions = {},\n): EventTail {\n const controller = new AbortController();\n const done = runEventTail(client, onEvent, controller, options);\n\n return {\n stop: () => controller.abort(),\n done,\n };\n}\n\nasync function runEventTail(\n client: PonderbotClient,\n onEvent: (event: SSEEvent) => void,\n controller: AbortController,\n options: FollowEventsOptions,\n): Promise<void> {\n try {\n for await (const event of client.events.streamEvents({\n signal: controller.signal,\n initialRetryMs: options.retryMs,\n onReconnect: options.onReconnect,\n })) {\n onEvent(event);\n }\n } catch (error) {\n if (!controller.signal.aborted) {\n if (options.onError) {\n options.onError(error);\n return;\n }\n\n throw error;\n }\n }\n}\n","import {\n type AgentInstructionBudget,\n type BuildError,\n} from \"@ponderbot/sdk/authoring\";\n\nexport const printManifestDiagnostics = (\n budgets: AgentInstructionBudget[],\n warnings: BuildError[],\n): void => {\n if (budgets.length > 0) {\n console.error(\"agent instruction sizes:\");\n for (const budget of budgets) {\n console.error(` ${budget.ref}: ${instructionBudgetSummary(budget)}`);\n }\n }\n\n for (const warning of warnings) {\n console.error(`${warning.file}: warning: ${warning.message}`);\n }\n};\n\nconst instructionBudgetSummary = (budget: AgentInstructionBudget): string => {\n const suffix = budget.overWarning ? \" over budget\" : \"\";\n return `${formatCount(budget.chars)} chars (~${formatCount(\n budget.approxTokens,\n )} tokens)${suffix}`;\n};\n\nconst formatCount = (value: number): string =>\n value >= 1_000 ? `${(value / 1_000).toFixed(1)}k` : `${value}`;\n","import { watch, type FSWatcher } from \"chokidar\";\n\nimport {\n isPonderbotError,\n type ManifestDeployResponse,\n type PonderbotClient,\n} from \"@ponderbot/sdk\";\nimport { buildManifest } from \"@ponderbot/sdk/authoring\";\n\nimport { clientFor, type ResolvedConfig } from \"./config\";\nimport { reconcileDeploymentEnvironment } from \"./deployment-environment\";\nimport { staticProjectManifest } from \"./dev-manifest\";\nimport { installDevelopmentProjectRelease } from \"./dev-install\";\nimport { createDevActionRunner } from \"./dev-runner\";\nimport { followEvents, type EventTail } from \"./events\";\nimport { printManifestDiagnostics } from \"./manifest-diagnostics\";\nimport { formatError, print } from \"./output\";\n\nconst DEBOUNCE_MS = 300;\nconst DEV_RUN_POLL_MS = 750;\nconst SHUTDOWN_GRACE_MS = 2_000;\n\nexport async function devLoop(config: ResolvedConfig): Promise<void> {\n const client = clientFor(config);\n let timer: NodeJS.Timeout | undefined;\n let building = false;\n let queued = false;\n let stopped = false;\n let watcher: FSWatcher | undefined;\n let tail: EventTail | undefined;\n let runPoll: NodeJS.Timeout | undefined;\n let pollingRuns = false;\n let manifestName: string | undefined;\n\n await ensureDevSpace(client, config);\n await reconcileDeploymentEnvironment(client, config);\n const devRunner = createDevActionRunner(client, config);\n\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n queued = false;\n if (timer) clearTimeout(timer);\n if (runPoll) clearInterval(runPoll);\n tail?.stop();\n const cleanup = Promise.allSettled([watcher?.close(), devRunner.stop()]);\n await Promise.race([\n cleanup,\n new Promise<void>((resolve) => setTimeout(resolve, SHUTDOWN_GRACE_MS)),\n ]);\n process.exit(0);\n };\n\n const handleSignal = (): void => {\n stop().catch((error) => {\n console.error(formatError(error));\n process.exit(1);\n });\n };\n\n process.once(\"SIGINT\", handleSignal);\n process.once(\"SIGTERM\", handleSignal);\n\n async function rebuild(reason: string): Promise<void> {\n if (stopped) {\n return;\n }\n\n if (building) {\n queued = true;\n return;\n }\n\n building = true;\n try {\n const { manifest, warnings, instructionBudgets } = await buildManifest(config.project, {\n dev: true,\n reload: true,\n });\n printManifestDiagnostics(instructionBudgets, warnings);\n const developmentManifest = staticProjectManifest(manifest);\n const release = await client.manifests.deploy(developmentManifest, `dev:${reason}`);\n await client.projects.releases.deploy(\n developmentManifest.name,\n config.environment,\n developmentManifest,\n `dev:${reason}`,\n undefined,\n config.applicationOrigin,\n );\n console.log(deployLine(release, reason));\n manifestName = developmentManifest.name;\n\n await installDevelopmentProjectRelease(client, config, developmentManifest.name);\n } catch (error) {\n console.error(formatError(error));\n } finally {\n building = false;\n if (queued && !stopped) {\n queued = false;\n void rebuild(\"queued-changes\");\n }\n }\n }\n\n watcher = watch(config.project, { ignoreInitial: true });\n watcher.on(\"all\", (_event, file) => {\n if (stopped) {\n return;\n }\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => void rebuild(file || \"change\"), DEBOUNCE_MS);\n });\n\n await new Promise<void>((resolve, reject) => {\n watcher?.once(\"ready\", resolve);\n watcher?.once(\"error\", reject);\n });\n\n await rebuild(\"startup\");\n\n const catchUpManifest = async () => {\n if (pollingRuns || manifestName === undefined || stopped) return;\n pollingRuns = true;\n try {\n await devRunner.catchUpManifest(manifestName);\n } catch (error) {\n console.error(formatError(error));\n } finally {\n pollingRuns = false;\n }\n };\n await catchUpManifest();\n runPoll = setInterval(() => void catchUpManifest(), DEV_RUN_POLL_MS);\n\n if (config.environmentRole === \"release-source\") {\n return;\n }\n\n await devRunner.catchUp().catch((error) => console.error(formatError(error)));\n\n tail = followEvents(client, (event) => {\n print(event);\n devRunner.handleEvent(event);\n }, {\n onError: (error) => console.error(formatError(error)),\n onReconnect: () => {\n void devRunner.catchUp().catch((error) => console.error(formatError(error)));\n },\n });\n}\n\nasync function ensureDevSpace(client: PonderbotClient, config: ResolvedConfig): Promise<void> {\n try {\n await client.spaces.get();\n } catch (error) {\n if (isPonderbotError(error) && error.status === 404 && error.code === \"space_not_found\") {\n throw new Error(\n `space \"${config.spaceId}\" not found; run: ponder spaces create ${config.spaceId}`,\n );\n }\n\n throw error;\n }\n}\n\nconst deployLine = (response: ManifestDeployResponse, reason: string): string => {\n return [\n `deployed ${response.release.id} (${reason})`,\n ...Object.entries(response.registered).map(([key, value]) => `${key} ${value}`),\n ].join(\" \");\n}\n","import { builtinModules } from \"node:module\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { dirname, join, parse } from \"node:path\";\n\nimport { type Plugin } from \"esbuild\";\n\ninterface PackageIdentity {\n name: string;\n root: string;\n version: string;\n packageJson: Record<string, unknown>;\n}\n\nexport interface WorkerArtifactDependencyCollector {\n plugin: Plugin;\n dependencies: () => Record<string, string>;\n}\n\nconst NATIVE_FILE_PATTERN = /\\.(?:wasm|node|gyp|c|cc|cpp|cxx|h|hpp|hxx)$/i;\nconst builtins = new Set([\n ...builtinModules,\n ...builtinModules.map((name) => `node:${name}`),\n]);\n\nexport const workerArtifactDependencyCollector = (\n forcedExternal: readonly string[],\n): WorkerArtifactDependencyCollector => {\n const forced = new Set(forcedExternal);\n const dependencies = new Map<string, string>();\n const packageCache = new Map<string, PackageIdentity | null>();\n const nativeCache = new Map<string, boolean>();\n\n return {\n dependencies: () => Object.fromEntries([...dependencies].sort()),\n plugin: {\n name: \"ponderbot-worker-artifact-dependencies\",\n setup(build) {\n build.onResolve({ filter: /.*/ }, async (args) => {\n if (\n !isPackageImport(args.path) ||\n builtins.has(args.path) ||\n (\n args.pluginData as\n { ponderbotDependencyProbe?: boolean } | undefined\n )?.ponderbotDependencyProbe === true\n ) {\n return undefined;\n }\n\n const importName = packageName(args.path);\n if (dependencies.has(importName)) {\n return { path: args.path, external: true };\n }\n\n const resolved = await build.resolve(args.path, {\n importer: args.importer,\n kind: args.kind,\n namespace: args.namespace,\n resolveDir: args.resolveDir,\n pluginData: { ponderbotDependencyProbe: true },\n });\n if (resolved.errors.length > 0 || resolved.path === \"\") {\n return undefined;\n }\n\n const identity = await packageIdentity(resolved.path, packageCache);\n if (identity === null) {\n if (forced.has(importName)) {\n return {\n errors: [\n {\n text: `External Worker dependency ${importName} has no package name and version`,\n },\n ],\n };\n }\n return undefined;\n }\n\n const external =\n forced.has(importName) ||\n (await packageUsesNativeCode(identity, resolved.path, nativeCache));\n if (!external) {\n return undefined;\n }\n\n dependencies.set(\n importName,\n identity.name === importName\n ? identity.version\n : `npm:${identity.name}@${identity.version}`,\n );\n return { path: args.path, external: true };\n });\n },\n },\n };\n};\n\nconst isPackageImport = (specifier: string): boolean =>\n ![\".\", \"/\", \"~\", \"#\", \"file:\", \"data:\"].some((prefix) =>\n specifier.startsWith(prefix),\n );\n\nconst packageName = (specifier: string): string => {\n const parts = specifier.split(\"/\");\n return specifier.startsWith(\"@\")\n ? parts.slice(0, 2).join(\"/\")\n : (parts[0] ?? specifier);\n};\n\nconst packageIdentity = async (\n resolvedPath: string,\n cache: Map<string, PackageIdentity | null>,\n): Promise<PackageIdentity | null> => {\n let directory = dirname(resolvedPath);\n const root = parse(directory).root;\n\n while (directory !== root) {\n if (cache.has(directory)) {\n return cache.get(directory) ?? null;\n }\n\n try {\n const packageJson = JSON.parse(\n await readFile(join(directory, \"package.json\"), \"utf8\"),\n ) as Record<string, unknown>;\n if (\n typeof packageJson.name === \"string\" &&\n packageJson.name !== \"\" &&\n typeof packageJson.version === \"string\" &&\n packageJson.version !== \"\"\n ) {\n const identity = {\n name: packageJson.name,\n root: directory,\n version: packageJson.version,\n packageJson,\n };\n cache.set(directory, identity);\n return identity;\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n directory = dirname(directory);\n }\n\n cache.set(dirname(resolvedPath), null);\n return null;\n};\n\nconst packageUsesNativeCode = async (\n identity: PackageIdentity,\n resolvedPath: string,\n cache: Map<string, boolean>,\n): Promise<boolean> => {\n if (NATIVE_FILE_PATTERN.test(resolvedPath)) {\n return true;\n }\n\n const cached = cache.get(identity.root);\n if (cached !== undefined) {\n return cached;\n }\n\n const declaredFiles = [\n ...(Array.isArray(identity.packageJson.files)\n ? identity.packageJson.files.filter(\n (file): file is string => typeof file === \"string\",\n )\n : []),\n ...[\"main\", \"module\", \"browser\"].flatMap((field) => {\n const value = identity.packageJson[field];\n return typeof value === \"string\" ? [value] : [];\n }),\n ];\n let bindingGyp = false;\n try {\n await access(join(identity.root, \"binding.gyp\"));\n bindingGyp = true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const native =\n identity.packageJson.gypfile === true ||\n bindingGyp ||\n declaredFiles.some((file) => NATIVE_FILE_PATTERN.test(file));\n cache.set(identity.root, native);\n return native;\n};\n","import { createHash } from \"node:crypto\";\nimport {\n access,\n copyFile,\n mkdir,\n mkdtemp,\n readFile,\n readdir,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport {\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n sep,\n} from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { type Source } from \"@ponderbot/sdk/authoring\";\nimport { build as bundle } from \"esbuild\";\n\nimport { workerArtifactDependencyCollector } from \"./worker-artifact-dependencies\";\n\nconst ARTIFACT_FORMAT = \"ponderbot-worker-artifact/v1\";\nconst PROJECT_DIRECTORY = \"project\";\nconst WORKER_MAIN = \"worker-main.ts\";\n\nexport interface WorkerArtifact {\n context: string;\n dockerfile: string;\n dispose: () => Promise<void>;\n}\n\nexport interface WorkerArtifactOptions {\n external?: readonly string[];\n}\n\nexport class WorkerArtifactError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WorkerArtifactError\";\n }\n}\n\nconst containerfile = (\n hasDependencies: boolean,\n): string => `# syntax=docker/dockerfile:1.7\n${\n hasDependencies\n ? `FROM node:24-bookworm-slim AS dependencies\nWORKDIR /opt/ponderbot\nRUN apt-get update && apt-get install -y --no-install-recommends python3 make g++ && rm -rf /var/lib/apt/lists/*\nCOPY package.json ./\nRUN npm install --omit=dev --no-package-lock --no-audit --no-fund\n`\n : \"\"\n}FROM node:24-bookworm-slim\nENV NODE_ENV=production\nENV PONDERBOT_PROJECT_DIR=/opt/ponderbot/project\nWORKDIR /workspace\n${hasDependencies ? \"COPY --from=dependencies --chown=node:node /opt/ponderbot/node_modules /opt/ponderbot/node_modules\\n\" : \"\"}COPY --chown=node:node . /opt/ponderbot\nUSER node\nENTRYPOINT [\"node\", \"/opt/ponderbot/worker-main.js\"]\n`;\n\nexport const buildWorkerArtifact = async (\n source: Source,\n projectDir: string,\n options: WorkerArtifactOptions = {},\n): Promise<WorkerArtifact> => {\n const projectRoot = resolve(projectDir);\n const root = await mkdtemp(join(tmpdir(), \"ponderbot-worker-artifact-\"));\n const entries = join(root, \"entries\");\n const context = join(root, \"artifact\");\n\n try {\n await mkdir(entries, { recursive: true });\n await mkdir(context, { recursive: true });\n\n const configFile = await projectConfigFile(projectRoot);\n const definitionFiles = [\n configFile,\n ...source.actions.map(({ file }) => file),\n ...source.agents.map(({ file }) => file),\n ...source.groups.map(({ file }) => file),\n ...source.workflows.map(({ file }) => file),\n ];\n const entrypoints: string[] = [];\n const entryPaths = new Set<string>();\n\n for (const file of [...new Set(definitionFiles)].sort()) {\n const projectPath = artifactProjectPath(projectRoot, file);\n const entryPath = join(\n entries,\n PROJECT_DIRECTORY,\n projectPath.slice(0, -extname(projectPath).length) + \".ts\",\n );\n\n if (entryPaths.has(entryPath)) {\n throw new WorkerArtifactError(\n `Worker artifact entry path collision for ${projectPath}`,\n );\n }\n\n entryPaths.add(entryPath);\n await mkdir(dirname(entryPath), { recursive: true });\n await writeFile(entryPath, definitionWrapper(resolve(file)), {\n mode: 0o600,\n });\n entrypoints.push(entryPath);\n }\n\n const workerEntry = join(entries, WORKER_MAIN);\n await writeFile(workerEntry, workerMainWrapper(), { mode: 0o600 });\n entrypoints.push(workerEntry);\n\n console.error(\n `bundling ${entrypoints.length - 1} Ponderbot definition modules`,\n );\n const dependencies = await bundleEntries(\n entries,\n context,\n entrypoints,\n options.external ?? [],\n );\n\n const assetFiles = new Set<string>();\n for (const skill of source.skills) {\n assetFiles.add(skill.file);\n }\n for (const agent of source.agents) {\n assetFiles.add(agent.instructionsFile);\n if (agent.soulFile !== undefined) {\n assetFiles.add(agent.soulFile);\n }\n }\n\n for (const file of [...assetFiles].sort()) {\n const destination = join(\n context,\n PROJECT_DIRECTORY,\n artifactProjectPath(projectRoot, file),\n );\n await mkdir(dirname(destination), { recursive: true });\n await copyFile(file, destination);\n }\n\n await writeFile(\n join(context, \"package.json\"),\n `${JSON.stringify(\n {\n name: \"ponderbot-worker-artifact\",\n private: true,\n type: \"module\",\n engines: { node: \">=22.4.0\" },\n dependencies,\n },\n null,\n 2,\n )}\\n`,\n { mode: 0o600 },\n );\n const dockerfile = join(context, \"Containerfile\");\n await writeFile(\n dockerfile,\n containerfile(Object.keys(dependencies).length > 0),\n { mode: 0o600 },\n );\n\n const contentHash = await artifactContentHash(context);\n await writeFile(\n join(context, \"ponderbot-build.json\"),\n `${JSON.stringify(\n {\n format: ARTIFACT_FORMAT,\n content_hash: contentHash,\n project: {\n name: source.project.name,\n version: source.project.version ?? null,\n },\n definition_modules: entrypoints.length - 1,\n external_dependencies: Object.keys(dependencies).length,\n },\n null,\n 2,\n )}\\n`,\n { mode: 0o600 },\n );\n\n return {\n context,\n dockerfile,\n dispose: async () => rm(root, { recursive: true, force: true }),\n };\n } catch (error) {\n await rm(root, { recursive: true, force: true });\n if (error instanceof WorkerArtifactError) {\n throw error;\n }\n throw new WorkerArtifactError(\n error instanceof Error ? error.message : String(error),\n );\n }\n};\n\nconst projectConfigFile = async (projectRoot: string): Promise<string> => {\n for (const extension of [\".ts\", \".js\", \".mjs\"]) {\n const path = join(projectRoot, `config${extension}`);\n try {\n await access(path);\n return path;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n throw new WorkerArtifactError(\n `Ponderbot project config was not found under ${projectRoot}`,\n );\n};\n\nconst artifactProjectPath = (projectRoot: string, file: string): string => {\n const projectPath = relative(projectRoot, resolve(file));\n if (\n projectPath === \"..\" ||\n projectPath.startsWith(`..${sep}`) ||\n isAbsolute(projectPath)\n ) {\n throw new WorkerArtifactError(\n `Ponderbot definition ${file} must be inside project ${projectRoot}`,\n );\n }\n\n return projectPath;\n};\n\nconst definitionWrapper = (file: string): string => {\n const specifier = JSON.stringify(file);\n return `export * from ${specifier};\nimport * as loaded from ${specifier};\nexport default loaded.default;\n`;\n};\n\nconst workerMainWrapper = (): string => {\n const workerModule = fileURLToPath(\n import.meta.resolve(\"@ponderbot/sdk/worker\"),\n );\n return `import { runNodeWorkerMain } from ${JSON.stringify(workerModule)};\nawait runNodeWorkerMain();\n`;\n};\n\nconst bundleEntries = async (\n root: string,\n outdir: string,\n entrypoints: string[],\n forcedExternal: readonly string[],\n): Promise<Record<string, string>> => {\n const collector = workerArtifactDependencyCollector(forcedExternal);\n try {\n await bundle({\n entryPoints: entrypoints,\n outbase: root,\n outdir,\n bundle: true,\n splitting: true,\n packages: \"bundle\",\n platform: \"node\",\n target: \"node22.4\",\n format: \"esm\",\n sourcemap: false,\n minifySyntax: true,\n minifyWhitespace: true,\n keepNames: true,\n legalComments: \"none\",\n entryNames: \"[dir]/[name]\",\n chunkNames: \"chunks/[name]-[hash]\",\n assetNames: \"assets/[name]-[hash]\",\n plugins: [collector.plugin],\n logLevel: \"silent\",\n });\n return collector.dependencies();\n } catch (error) {\n throw new WorkerArtifactError(\n `Ponderbot Worker artifact bundle failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n};\n\nconst artifactContentHash = async (context: string): Promise<string> => {\n const files: string[] = [];\n const pending = [context];\n\n while (pending.length > 0) {\n const directory = pending.pop();\n if (directory === undefined) {\n break;\n }\n\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) {\n pending.push(path);\n } else if (entry.isFile()) {\n files.push(path);\n }\n }\n }\n\n const hash = createHash(\"sha256\");\n for (const file of files.sort()) {\n hash.update(relative(context, file).split(sep).join(\"/\"));\n hash.update(\"\\0\");\n hash.update(await readFile(file));\n hash.update(\"\\0\");\n }\n return `sha256:${hash.digest(\"hex\")}`;\n};\n","import { spawn } from \"node:child_process\";\nimport { mkdtemp, readFile, realpath, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join, relative, resolve } from \"node:path\";\n\nimport {\n agentInstructionBudgets,\n type AgentInstructionBudget,\n type BuildError,\n checkSource,\n emitManifest,\n hasWorkerEntryHandlers,\n loadSource,\n type WorkerImageBuildDefinition,\n type Manifest,\n manifestBuildError,\n type ProjectDefinition,\n sourceWarnings,\n type Source,\n} from \"@ponderbot/sdk/authoring\";\n\nimport { staticProjectManifest } from \"./dev-manifest\";\nimport {\n buildWorkerArtifact,\n WorkerArtifactError,\n type WorkerArtifact,\n} from \"./worker-artifact\";\n\nconst WORKER_IMAGE_TAG_ENV = \"PONDERBOT_WORKER_IMAGE_TAG\";\nexport const WORKER_IMAGE_TAG_TOKEN = \"${PONDERBOT_WORKER_IMAGE_TAG}\";\nexport const WORKER_IMAGE_TAG_ERROR =\n \"PONDERBOT_WORKER_IMAGE_TAG must be a tag or sha256 digest; pass full refs via --image\";\nconst DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/;\n\nexport class WorkerImageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WorkerImageError\";\n }\n}\n\nexport interface WorkerImageOptions {\n image?: string;\n platform?: string;\n staticRelease?: boolean;\n}\n\nexport interface ManifestBuildPlan {\n manifest: Manifest;\n workerImage?: string;\n warnings: BuildError[];\n instructionBudgets: AgentInstructionBudget[];\n}\n\ninterface ResolvedWorkerImage {\n workerImage?: string;\n}\n\nexport async function deployManifestPlan(\n projectDir: string,\n options: WorkerImageOptions = {},\n): Promise<ManifestBuildPlan> {\n const source = await loadSource(projectDir, { reload: true });\n const staticRelease = options.staticRelease === true && options.image === undefined;\n const explicit = staticRelease\n ? undefined\n : configuredWorkerImage(source.project, options.image);\n const hasHandlers = hasWorkerEntryHandlers(source);\n const sourceForCheck = setWorkerImage(source, explicit);\n const errors = checkSource(sourceForCheck, {\n requireWorkerImage:\n hasHandlers &&\n explicit === undefined &&\n !staticRelease &&\n source.project.worker?.build === undefined,\n });\n if (errors.length > 0) {\n throw manifestBuildError(errors);\n }\n\n const plan = await resolveBuiltWorkerImage(\n source,\n projectDir,\n explicit,\n options,\n staticRelease,\n );\n const finalSource = setWorkerImage(source, plan.workerImage ?? explicit);\n const manifest = emitManifest(finalSource, {\n dev: staticRelease,\n workerImage: finalSource.project.workerImage,\n });\n\n return {\n manifest: staticRelease ? staticProjectManifest(manifest) : manifest,\n workerImage: plan.workerImage,\n warnings: sourceWarnings(finalSource),\n instructionBudgets: agentInstructionBudgets(finalSource),\n };\n}\n\nasync function resolveBuiltWorkerImage(\n source: Source,\n projectDir: string,\n explicit: string | undefined,\n options: WorkerImageOptions,\n staticRelease: boolean,\n): Promise<ResolvedWorkerImage> {\n const hasHandlers = hasWorkerEntryHandlers(source);\n\n if (!hasHandlers) {\n return {};\n }\n\n if (explicit !== undefined) {\n return { workerImage: explicit };\n }\n\n if (staticRelease) {\n return {};\n }\n\n const build = source.project.worker?.build;\n if (build === undefined) {\n return {};\n }\n\n return {\n workerImage: await buildAndPushWorkerImage(\n source,\n build,\n projectDir,\n options.platform,\n ),\n };\n}\n\nconst setWorkerImage = (\n source: Source,\n workerImage: string | undefined,\n): Source => {\n return {\n ...source,\n project: {\n ...source.project,\n workerImage,\n },\n };\n};\n\nexport function configuredWorkerImage(\n project: ProjectDefinition,\n override?: string,\n): string | undefined {\n const envValue = process.env[WORKER_IMAGE_TAG_ENV];\n const configured =\n envValue === undefined || envValue.length === 0\n ? project.workerImage\n : (project.workerImage ?? project.worker?.build?.image);\n\n return resolveWorkerImage(configured, override, envValue);\n}\n\nexport function resolveWorkerImage(\n configured: string | undefined,\n override: string | undefined,\n envTag: string | undefined,\n): string | undefined {\n if (override !== undefined) {\n return override;\n }\n\n const tagOrDigest = envTag === \"\" ? undefined : envTag;\n\n if (tagOrDigest === undefined) {\n return configured?.includes(WORKER_IMAGE_TAG_TOKEN)\n ? undefined\n : configured;\n }\n\n if (configured === undefined) {\n return undefined;\n }\n\n if (DIGEST_PATTERN.test(tagOrDigest)) {\n return `${repository(configured)}@${tagOrDigest}`;\n }\n\n if (\n tagOrDigest.includes(\"/\") ||\n tagOrDigest.includes(\"@\") ||\n tagOrDigest.includes(\":\")\n ) {\n throw new WorkerImageError(WORKER_IMAGE_TAG_ERROR);\n }\n\n if (configured.includes(WORKER_IMAGE_TAG_TOKEN)) {\n return configured.split(WORKER_IMAGE_TAG_TOKEN).join(tagOrDigest);\n }\n\n return `${repository(configured)}:${tagOrDigest}`;\n}\n\nasync function buildAndPushWorkerImage(\n source: Source,\n build: WorkerImageBuildDefinition,\n projectDir: string,\n platform: string | undefined,\n): Promise<string> {\n const tag = build.image;\n const repo = repository(tag);\n const configuredContext = resolve(process.cwd(), build.context ?? \".\");\n const metadataDirectory = await mkdtemp(\n join(tmpdir(), \"ponderbot-worker-buildx-\"),\n );\n const metadataFile = join(metadataDirectory, \"metadata.json\");\n let artifact: WorkerArtifact | undefined;\n\n try {\n let context = configuredContext;\n let dockerfile = resolve(\n process.cwd(),\n build.dockerfile ?? \"Containerfile\",\n );\n\n if (build.dockerfile === undefined) {\n const resolvedContext = await realpath(configuredContext);\n projectDirectoryInContext(await realpath(projectDir), resolvedContext);\n try {\n artifact = await buildWorkerArtifact(source, projectDir, {\n external: build.external,\n });\n } catch (error) {\n if (error instanceof WorkerArtifactError) {\n throw new WorkerImageError(error.message);\n }\n throw error;\n }\n context = artifact.context;\n dockerfile = artifact.dockerfile;\n }\n\n const cacheReference = `${repo}:buildcache`;\n const buildArgs = [\n \"buildx\",\n \"build\",\n \"--file\",\n dockerfile,\n \"--tag\",\n tag,\n \"--push\",\n \"--provenance\",\n \"false\",\n \"--metadata-file\",\n metadataFile,\n \"--progress\",\n \"plain\",\n \"--cache-from\",\n `type=registry,ref=${cacheReference}`,\n \"--cache-to\",\n `type=registry,mode=max,image-manifest=true,oci-mediatypes=true,ref=${cacheReference}`,\n ...(platform === undefined ? [] : [\"--platform\", platform]),\n ...Object.entries(build.args ?? {}).flatMap(([name, value]) => [\n \"--build-arg\",\n `${name}=${value}`,\n ]),\n context,\n ];\n\n console.error(`building worker image ${tag}`);\n await runDocker(buildArgs, repo);\n\n const digest = await buildxDigest(metadataFile);\n if (digest === undefined) {\n throw new WorkerImageError(\n `docker buildx did not report a registry digest for ${tag}`,\n );\n }\n\n const pinned = `${repo}@${digest}`;\n console.error(`pinned worker image ${pinned}`);\n return pinned;\n } finally {\n if (artifact !== undefined) {\n await artifact.dispose();\n }\n await rm(metadataDirectory, { recursive: true, force: true });\n }\n}\n\nexport const projectDirectoryInContext = (\n projectDir: string,\n context: string,\n) => {\n const projectRelativeToContext = relative(context, projectDir);\n if (\n projectRelativeToContext === \"..\" ||\n projectRelativeToContext.startsWith(\n `..${process.platform === \"win32\" ? \"\\\\\" : \"/\"}`,\n ) ||\n isAbsolute(projectRelativeToContext)\n ) {\n throw new WorkerImageError(\n `Ponderbot project ${projectDir} must be inside Worker Image build context ${context}`,\n );\n }\n\n const dockerPath =\n process.platform === \"win32\"\n ? projectRelativeToContext.split(\"\\\\\").join(\"/\")\n : projectRelativeToContext;\n return dockerPath.length === 0 ? \".\" : `./${dockerPath}`;\n};\n\nasync function runDocker(\n args: string[],\n registryHint: string,\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolveRun, rejectRun) => {\n const child = spawn(\"docker\", args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n process.stderr.write(chunk);\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n process.stderr.write(chunk);\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n rejectRun(\n new WorkerImageError(\n \"docker not found; install Docker and make sure docker is on PATH\",\n ),\n );\n return;\n }\n rejectRun(error);\n });\n\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolveRun({ stdout, stderr });\n return;\n }\n\n rejectRun(\n new WorkerImageError(\n `docker buildx build failed with exit code ${code}; run docker login for ${registryHint} if the registry requires authentication`,\n ),\n );\n });\n });\n}\n\nconst buildxDigest = async (\n metadataFile: string,\n): Promise<string | undefined> => {\n try {\n const metadata = JSON.parse(await readFile(metadataFile, \"utf8\")) as {\n \"containerimage.digest\"?: unknown;\n };\n const digest = metadata[\"containerimage.digest\"];\n return typeof digest === \"string\" && DIGEST_PATTERN.test(digest)\n ? digest\n : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst repository = (image: string): string => {\n const withoutDigest = image.split(\"@\", 1)[0] ?? image;\n const slash = withoutDigest.lastIndexOf(\"/\");\n const colon = withoutDigest.lastIndexOf(\":\");\n if (colon > slash) {\n return withoutDigest.slice(0, colon);\n }\n return withoutDigest;\n};\n","import type { ModelDefinitionInput } from \"@ponderbot/sdk\";\n\nexport interface ModelAddOptions {\n capability?: string[];\n fallback?: string[];\n model: string;\n provider: string;\n}\n\nexport const modelDefinitionInput = (\n options: ModelAddOptions,\n): ModelDefinitionInput => ({\n provider: modelProvider(options.provider),\n model: options.model,\n capabilities: Object.fromEntries(\n (options.capability ?? []).map((capability) => [capability, true]),\n ),\n fallback_model_refs: options.fallback ?? [],\n});\n\nconst modelProvider = (\n provider: string,\n): ModelDefinitionInput[\"provider\"] => {\n switch (provider) {\n case \"anthropic\":\n case \"fake\":\n case \"mistral\":\n case \"openai\":\n return provider;\n default:\n throw new Error(\"--provider must be anthropic, fake, mistral, or openai\");\n }\n};\n","import { createServer } from \"node:http\";\nimport { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stderr as promptOutput } from \"node:process\";\nimport type {\n ModelProvider,\n ModelProviderRegistryEntry,\n} from \"@ponderbot/sdk\";\n\nimport { clientFor, resolveConfig } from \"./config\";\n\ntype Provider = ModelProvider;\ntype Method = \"api-key\" | \"oauth\";\n\nexport interface ProviderAuthOptions {\n env?: string;\n space?: string;\n provider?: string;\n method?: string;\n browser?: boolean;\n shared?: boolean;\n allSpaces?: boolean;\n spaces?: string[];\n}\n\nexport interface ProviderAuthResult {\n type: \"provider_auth\";\n status: \"saved\";\n provider: Provider;\n method: Method;\n space_id: string;\n binding_id?: string;\n all_spaces?: boolean;\n space_ids?: string[];\n smoke_test: string;\n environment: string;\n base_url: string;\n}\n\ninterface OAuthAuthorization {\n authUrl: string;\n callbackUrl: string;\n state: string;\n}\n\ninterface LoopbackCallback {\n code: Promise<string>;\n ready: Promise<void>;\n close: () => void;\n}\n\nexport const providerAuth = async (options: ProviderAuthOptions): Promise<ProviderAuthResult> => {\n const config = await resolveConfig(options.env, options.space);\n const spaceId = config.spaceId;\n const client = clientFor(config);\n const registry = await client.modelProviders.list(spaceId);\n const provider = await resolveProvider(options.provider, registry.providers);\n const providerEntry = registry.providers.find((entry) => entry.id === provider);\n\n if (providerEntry === undefined) {\n throw new Error(`provider ${provider} is not available`);\n }\n\n const method = await resolveMethod(providerEntry, options.method);\n\n if (options.allSpaces === true && options.shared !== true) {\n throw new Error(\"--all-spaces requires --shared\");\n }\n\n if (options.spaces !== undefined && options.shared !== true) {\n throw new Error(\"--spaces requires --shared\");\n }\n\n if (options.allSpaces === true && options.spaces !== undefined) {\n throw new Error(\"use either --all-spaces or --spaces, not both\");\n }\n\n const sharedSpaceIds = options.spaces ?? [spaceId];\n\n if (options.shared === true) {\n const { binding } = await client.providerBindings.create(provider);\n\n if (method === \"api-key\") {\n const apiKey = await readApiKey(options);\n await client.providerBindings.setApiKey(binding.id, { apiKey });\n } else {\n if (!canPrompt()) {\n throw new Error(\n \"OAuth login needs an interactive terminal. Run locally with a browser, or rerun with --no-browser to paste the callback URL.\",\n );\n }\n\n await authorizeOAuthLogin(\n () => client.providerBindings.startOAuthLogin(binding.id),\n (authorizationResponse, state) =>\n client.providerBindings.completeOAuthLogin(binding.id, {\n authorizationResponse,\n state,\n }),\n options.browser !== false,\n );\n }\n\n if (options.allSpaces === true) {\n await client.providerBindings.authorize(binding.id, { allSpaces: true });\n } else {\n await client.providerBindings.authorize(binding.id, { spaceIds: sharedSpaceIds });\n }\n\n return providerAuthResult(provider, method, spaceId, config.environment, config.url, {\n bindingId: binding.id,\n allSpaces: options.allSpaces === true,\n spaceIds: options.allSpaces === true ? undefined : sharedSpaceIds,\n });\n }\n\n if (method === \"api-key\") {\n const apiKey = await readApiKey(options);\n await client.modelProviders.setApiKey(spaceId, { provider, apiKey });\n return providerAuthResult(provider, method, spaceId, config.environment, config.url);\n }\n\n if (!canPrompt()) {\n throw new Error(\n \"OAuth login needs an interactive terminal. Run locally with a browser, or rerun with --no-browser to paste the callback URL.\",\n );\n }\n\n await authorizeOAuthLogin(\n () => client.modelProviders.startOAuthLogin(spaceId, provider),\n (authorizationResponse, state) =>\n client.modelProviders.completeOAuthLogin(spaceId, provider, {\n authorizationResponse,\n state,\n }),\n options.browser !== false,\n );\n\n return providerAuthResult(provider, method, spaceId, config.environment, config.url);\n};\n\nconst providerAuthResult = (\n provider: Provider,\n method: Method,\n spaceId: string,\n environment: string,\n baseUrl: string,\n shared?: { bindingId: string; allSpaces: boolean; spaceIds?: string[] },\n): ProviderAuthResult => ({\n type: \"provider_auth\",\n status: \"saved\",\n provider,\n method,\n space_id: spaceId,\n binding_id: shared?.bindingId,\n all_spaces: shared?.allSpaces,\n space_ids: shared?.spaceIds,\n smoke_test: \"ponder spaces show\",\n environment,\n base_url: baseUrl,\n});\n\nconst resolveProvider = async (\n value: string | undefined,\n entries: ModelProviderRegistryEntry[],\n): Promise<Provider> => {\n const providers = entries.map((entry) => entry.id);\n\n if (value !== undefined) {\n const provider = providers.find((candidate) => candidate === value);\n if (provider !== undefined) {\n return provider;\n }\n\n throw new Error(`--provider must be one of ${providers.join(\", \")}`);\n }\n\n return promptChoice(\"Provider\", providers);\n};\n\nconst resolveMethod = async (\n provider: ModelProviderRegistryEntry,\n value: string | undefined,\n): Promise<Method> => {\n const supportsApiKey = provider.auth_methods.some((method) => method.id === \"api_key\");\n const supportsOAuth = provider.auth_methods.some((method) => method.id !== \"api_key\");\n\n if (value !== undefined) {\n if (value === \"api-key\" && supportsApiKey) {\n return \"api-key\";\n }\n\n if ((value === \"oauth\" || value === \"codex\") && supportsOAuth) {\n return \"oauth\";\n }\n\n throw new Error(`--method is not supported by --provider ${provider.id}`);\n }\n\n if (!supportsOAuth) {\n return \"api-key\";\n }\n\n if (!supportsApiKey) {\n return \"oauth\";\n }\n\n return promptChoice(\"Authentication method\", [\"api-key\", \"oauth\"] as const);\n};\n\nconst readApiKey = async (options: ProviderAuthOptions): Promise<string> => {\n const envValue = process.env.PONDER_PROVIDER_API_KEY;\n if (envValue !== undefined && envValue !== \"\") {\n return envValue;\n }\n\n if (!process.stdin.isTTY) {\n const piped = (await readStdin()).trim();\n if (piped !== \"\") {\n return piped;\n }\n\n throw new Error(\"set PONDER_PROVIDER_API_KEY or pipe the API key on stdin\");\n }\n\n if (options.provider !== undefined && options.method !== undefined && !canPrompt()) {\n throw new Error(\"set PONDER_PROVIDER_API_KEY or pipe the API key on stdin\");\n }\n\n return promptSecret(\"API key\");\n};\n\nconst authorizeOAuthLogin = async (\n start: () => Promise<{ login: OAuthAuthorization }>,\n complete: (authorizationResponse: string, state: string) => Promise<unknown>,\n openBrowser: boolean,\n): Promise<void> => {\n const { login } = await start();\n const authorization = {\n authUrl: login.authUrl,\n callbackUrl: login.callbackUrl,\n state: login.state,\n };\n let authorizationResponse: string;\n\n if (openBrowser) {\n const callback = listenForCallback(authorization);\n console.error(`Open this URL if your browser does not open automatically:\\n${authorization.authUrl}`);\n\n if (await loopbackReady(callback) && await openSystemBrowser(authorization.authUrl)) {\n authorizationResponse = await callback.code;\n } else {\n callback.close();\n console.error(`Open this URL and paste the redirected callback URL:\\n${authorization.authUrl}`);\n authorizationResponse = await promptLine(\"Callback URL or code\");\n }\n } else {\n console.error(`Open this URL and paste the redirected callback URL:\\n${authorization.authUrl}`);\n authorizationResponse = await promptLine(\"Callback URL or code\");\n }\n\n await complete(authorizationResponse, authorization.state);\n};\n\nconst listenForCallback = (authorization: OAuthAuthorization): LoopbackCallback => {\n const callback = new URL(authorization.callbackUrl);\n const server = createServer((request, response) => {\n try {\n const url = new URL(request.url ?? \"/\", callback);\n const code = authorizationCodeFromInput(url.toString(), authorization.state);\n response.writeHead(200, { \"content-type\": \"text/html\" });\n response.end(\"<html><body>OpenAI login complete. You can close this window.</body></html>\");\n server.close();\n resolve(code);\n } catch (error) {\n response.writeHead(400, { \"content-type\": \"text/plain\" });\n response.end(error instanceof Error ? error.message : \"invalid callback\");\n reject(error);\n }\n });\n\n let resolve!: (code: string) => void;\n let reject!: (error: unknown) => void;\n let readyResolve!: () => void;\n let readyReject!: (error: unknown) => void;\n\n const code = new Promise<string>((promiseResolve, promiseReject) => {\n resolve = promiseResolve;\n reject = promiseReject;\n });\n\n const ready = new Promise<void>((promiseResolve, promiseReject) => {\n readyResolve = promiseResolve;\n readyReject = promiseReject;\n });\n\n server.once(\"listening\", readyResolve);\n server.once(\"error\", (error: NodeJS.ErrnoException) => {\n const normalized =\n error.code === \"EADDRINUSE\"\n ? new Error(\"port 1455 is already in use\")\n : error;\n readyReject(normalized);\n reject(normalized);\n });\n\n server.listen(Number(callback.port), callback.hostname);\n\n return { code, ready, close: () => server.close() };\n};\n\nconst loopbackReady = async (callback: LoopbackCallback): Promise<boolean> => {\n try {\n await callback.ready;\n return true;\n } catch (error) {\n console.error(error instanceof Error ? `${error.message}; falling back to paste mode` : \"falling back to paste mode\");\n callback.close();\n return false;\n }\n};\n\n\nconst authorizationCodeFromInput = (inputValue: string, expectedState: string): string => {\n const trimmed = inputValue.trim();\n if (trimmed === \"\") {\n throw new Error(\"missing authorization code\");\n }\n\n const params = trimmed.includes(\"://\")\n ? new URL(trimmed).searchParams\n : new URLSearchParams(trimmed.startsWith(\"?\") ? trimmed.slice(1) : trimmed);\n const returnedState = params.get(\"state\");\n const code = params.get(\"code\") ?? (trimmed.includes(\"=\") ? null : trimmed);\n\n if (returnedState !== null && returnedState !== expectedState) {\n throw new Error(\"OAuth state did not match\");\n }\n\n if (code === null || code === \"\") {\n throw new Error(\"missing authorization code\");\n }\n\n return code;\n};\n\nconst promptChoice = async <T extends readonly string[]>(\n label: string,\n choices: T,\n): Promise<T[number]> => {\n const rendered = choices.map((choice, index) => `${index + 1}) ${choice}`).join(\"\\n\");\n const answer = await promptLine(`${label}\\n${rendered}\\nChoose`);\n const index = Number(answer.trim());\n\n if (Number.isInteger(index) && index >= 1 && index <= choices.length) {\n return choices[index - 1] as T[number];\n }\n\n if (choices.includes(answer.trim())) {\n return answer.trim() as T[number];\n }\n\n throw new Error(`invalid ${label.toLowerCase()}`);\n};\n\nconst promptLine = async (label: string): Promise<string> => {\n const rl = createInterface({ input, output: promptOutput });\n try {\n return await rl.question(`${label}: `);\n } finally {\n rl.close();\n }\n};\n\nconst promptSecret = async (label: string): Promise<string> => {\n process.stderr.write(`${label}: `);\n const chunks: string[] = [];\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n\n stdin.setRawMode?.(true);\n stdin.resume();\n\n return await new Promise<string>((resolve, reject) => {\n const cleanup = (): void => {\n stdin.setRawMode?.(wasRaw);\n stdin.pause();\n stdin.off(\"data\", onData);\n process.stderr.write(\"\\n\");\n };\n\n const onData = (chunk: Buffer): void => {\n const value = chunk.toString(\"utf8\");\n if (value === \"\\u0003\") {\n cleanup();\n reject(new Error(\"cancelled\"));\n return;\n }\n\n if (value === \"\\r\" || value === \"\\n\") {\n cleanup();\n resolve(chunks.join(\"\"));\n return;\n }\n\n if (value === \"\\u007f\") {\n chunks.pop();\n return;\n }\n\n chunks.push(value);\n };\n\n stdin.on(\"data\", onData);\n });\n};\n\nconst openSystemBrowser = (url: string): Promise<boolean> => {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\n return new Promise((resolve) => {\n const child = spawn(command, args, { stdio: \"ignore\", detached: true });\n child.once(\"error\", () => resolve(false));\n child.once(\"spawn\", () => {\n child.unref();\n resolve(true);\n });\n });\n};\n\nconst readStdin = async (): Promise<string> => {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n};\n\nconst canPrompt = (): boolean => {\n return process.stdin.isTTY === true && process.stderr.isTTY === true;\n};\n","import type { PonderbotClient, Space } from \"@ponderbot/sdk\";\n\nconst spacePageLimit = 100;\n\nexport const listSpaces = async (\n client: PonderbotClient,\n): Promise<Space[]> => {\n const spaces: Space[] = [];\n let cursor: string | undefined;\n\n do {\n const page = await client.spaces.list({ cursor, limit: spacePageLimit });\n spaces.push(...page.spaces);\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n\n return spaces;\n};\n","import { spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { access, chmod, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport { createClient } from \"@ponderbot/sdk\";\n\nimport { listSpaces } from \"./spaces\";\n\nconst DEFAULT_TARGET = \"core\";\nconst DEFAULT_DEV_RUNTIME_IMAGE = \"ponderbot-runtime:dev\";\nconst DEFAULT_DEV_SPACE_ID = \"default\";\nconst DEFAULT_DEV_URL = \"http://127.0.0.1:4100\";\nconst DEV_BOOTSTRAP_TOKEN_FILE = \"dev-bootstrap-token\";\nconst OUTPUT_TAIL_LIMIT = 16_384;\nconst WAIT_TIMEOUT_SECONDS = \"180\";\n\nexport class StackError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StackError\";\n }\n}\n\nexport interface StackOptions {\n target?: string;\n}\n\nexport interface StartStackOptions extends StackOptions {\n attach?: boolean;\n build?: boolean;\n dev?: boolean;\n space?: string;\n}\n\nexport interface DevStackEnvironment {\n url: string;\n space_id: string;\n token: string;\n}\n\nexport interface StackResult {\n type: \"stack\";\n id: string;\n status: \"started\" | \"stopped\";\n compose_file: string;\n ponderbot_home: string;\n dev_environment?: DevStackEnvironment;\n}\n\ninterface ResolvedStack {\n baseImagesEnvFile: string;\n composeFile: string;\n devComposeFile?: string;\n devUrl: string;\n environmentFile?: string;\n ponderbotHome: string;\n repoRoot: string;\n spaceId: string;\n target: string;\n}\n\nexport async function findRepoRoot(start = process.cwd()): Promise<string> {\n let current = resolve(start);\n\n while (true) {\n try {\n await access(join(current, \"docker\", \"compose\", \"targets\"));\n return current;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const parent = dirname(current);\n if (parent === current) {\n throw new StackError(`could not find docker/compose/targets from ${resolve(start)}`);\n }\n current = parent;\n }\n}\n\nexport async function startStack(options: StartStackOptions = {}): Promise<StackResult> {\n const stack = await resolveStack(options.target, options.dev);\n const bootstrapToken = await bootstrapTokenForHome(stack.ponderbotHome);\n const devEnvironment = devStackEnvironment(stack, options.space, bootstrapToken);\n const args = [\n ...composeArgs(stack),\n \"up\",\n ...(options.dev ? [\"--watch\"] : []),\n ...(options.attach || options.dev ? [] : [\"-d\", \"--wait\", \"--wait-timeout\", WAIT_TIMEOUT_SECONDS]),\n ...(options.build ? [\"--build\"] : []),\n ];\n\n await runDockerCompose(args, stack, bootstrapToken);\n await ensureDevSpace(devEnvironment);\n return result(stack, \"started\", devEnvironment);\n}\n\nexport async function stopStack(options: StackOptions = {}): Promise<StackResult> {\n const stack = await resolveStack(options.target, false);\n await runDockerCompose([...composeArgs(stack), \"down\", \"--remove-orphans\"], stack);\n return result(stack, \"stopped\");\n}\n\nasync function resolveStack(target: string | undefined, dev: boolean | undefined): Promise<ResolvedStack> {\n const repoRoot = await findRepoRoot();\n const resolvedTarget = targetName(target);\n const baseImagesEnvFile = await baseImagesEnvFileForRepo(repoRoot);\n const environmentFile = await environmentFileForRepo(repoRoot);\n const composeFile = await composeFileForRepo(repoRoot, resolvedTarget);\n const devComposeFile = dev ? await devComposeFileForRepo(repoRoot) : undefined;\n const ponderbotHome = await ensurePonderbotHome(repoRoot);\n const configuredUrl = process.env.PONDERBOT_URL;\n const devUrl = configuredUrl === undefined || configuredUrl.length === 0 ? DEFAULT_DEV_URL : configuredUrl;\n return {\n baseImagesEnvFile,\n composeFile,\n devComposeFile,\n devUrl,\n environmentFile,\n ponderbotHome,\n repoRoot,\n spaceId: DEFAULT_DEV_SPACE_ID,\n target: resolvedTarget,\n };\n}\n\nconst composeArgs = (stack: ResolvedStack): string[] => {\n return [\n \"compose\",\n \"--env-file\",\n stack.baseImagesEnvFile,\n ...(stack.environmentFile === undefined\n ? []\n : [\"--env-file\", stack.environmentFile]),\n \"-f\",\n stack.composeFile,\n ...(stack.devComposeFile === undefined ? [] : [\"-f\", stack.devComposeFile]),\n ];\n}\n\nconst environmentFileForRepo = async (\n repoRoot: string,\n): Promise<string | undefined> => {\n const environmentFile = join(repoRoot, \".env\");\n try {\n await access(environmentFile);\n return environmentFile;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n};\n\nasync function baseImagesEnvFileForRepo(repoRoot: string): Promise<string> {\n const envFile = join(repoRoot, \"docker\", \"env\", \"base-images.env\");\n try {\n await access(envFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new StackError(`base image env file not found at ${envFile}`);\n }\n throw error;\n }\n return envFile;\n}\n\nasync function composeFileForRepo(repoRoot: string, target: string): Promise<string> {\n if (target === \"dev\") {\n throw new StackError('compose target \"dev\" is an overlay; use ponder start --dev');\n }\n\n if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(target)) {\n throw new StackError(`invalid compose target \"${target}\"`);\n }\n\n const composeFile = join(repoRoot, \"docker\", \"compose\", \"targets\", `${target}.yml`);\n try {\n await access(composeFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new StackError(`compose target \"${target}\" not found at ${composeFile}`);\n }\n throw error;\n }\n return composeFile;\n}\n\nasync function devComposeFileForRepo(repoRoot: string): Promise<string> {\n const devComposeFile = join(repoRoot, \"docker\", \"compose\", \"targets\", \"dev.yml\");\n try {\n await access(devComposeFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new StackError(`dev compose overlay not found at ${devComposeFile}`);\n }\n throw error;\n }\n return devComposeFile;\n}\n\nasync function ensurePonderbotHome(repoRoot: string): Promise<string> {\n const configured = process.env.PONDERBOT_HOME;\n const ponderbotHome = configured === undefined || configured.length === 0 ? join(repoRoot, \".ponderbot\") : configured;\n await mkdir(ponderbotHome, { recursive: true });\n return ponderbotHome;\n}\n\nconst bootstrapTokenForHome = async (ponderbotHome: string): Promise<string> => {\n const configured = process.env.PONDERBOT_BOOTSTRAP_TOKEN;\n if (configured !== undefined && configured.trim().length > 0) {\n return configured;\n }\n\n const tokenPath = join(ponderbotHome, DEV_BOOTSTRAP_TOKEN_FILE);\n try {\n const token = (await readFile(tokenPath, \"utf8\")).trim();\n if (token.length > 0) {\n return token;\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const token = `pb_dev_${randomBytes(32).toString(\"base64url\")}`;\n await writeFile(tokenPath, `${token}\\n`, { mode: 0o600 });\n await chmod(tokenPath, 0o600);\n return token;\n};\n\nconst devStackEnvironment = (\n stack: ResolvedStack,\n space: string | undefined,\n token: string,\n): DevStackEnvironment => ({\n url: stack.devUrl,\n space_id: space === undefined || space.length === 0 ? stack.spaceId : space,\n token,\n});\n\nconst ensureDevSpace = async (environment: DevStackEnvironment): Promise<void> => {\n const client = createClient({\n baseUrl: environment.url,\n spaceId: environment.space_id,\n token: environment.token,\n });\n const spaces = await listSpaces(client);\n const space = spaces.find((space) => space.id === environment.space_id);\n\n if (space === undefined) {\n await client.spaces.create({\n id: environment.space_id,\n name: environment.space_id,\n });\n return;\n }\n\n if (space.status !== \"active\") {\n await client.spaces.update({ status: \"active\" }, environment.space_id);\n }\n};\n\nasync function runDockerCompose(\n args: string[],\n stack: ResolvedStack,\n bootstrapToken?: string,\n): Promise<void> {\n await new Promise<void>((resolveRun, rejectRun) => {\n const child = spawn(\"docker\", args, {\n cwd: stack.repoRoot,\n env: {\n ...process.env,\n ...(stack.devComposeFile === undefined\n ? {}\n : { PONDERBOT_RUNTIME_IMAGE: process.env.PONDERBOT_RUNTIME_IMAGE || DEFAULT_DEV_RUNTIME_IMAGE }),\n ...(bootstrapToken === undefined ? {} : { PONDERBOT_BOOTSTRAP_TOKEN: bootstrapToken }),\n PONDERBOT_DATA_MOUNT_SOURCE: stack.ponderbotHome,\n PONDERBOT_HOME: stack.ponderbotHome,\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let outputTail = \"\";\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n outputTail = (outputTail + chunk).slice(-OUTPUT_TAIL_LIMIT);\n process.stderr.write(chunk);\n });\n child.stderr.on(\"data\", (chunk: string) => {\n outputTail = (outputTail + chunk).slice(-OUTPUT_TAIL_LIMIT);\n process.stderr.write(chunk);\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n rejectRun(new StackError(\"docker not found; install Docker and make sure docker is on PATH\"));\n return;\n }\n rejectRun(error);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolveRun();\n return;\n }\n\n rejectRun(new StackError(composeFailureMessage(args, code, outputTail)));\n });\n });\n}\n\nconst composeFailureMessage = (args: string[], code: number | null, output: string): string => {\n if (/Cannot connect to the Docker daemon|Is the docker daemon running|docker daemon is not running/i.test(output)) {\n return \"docker daemon unavailable; start Docker and try again\";\n }\n\n const action = args.includes(\"up\") ? \"up\" : args.includes(\"down\") ? \"down\" : \"compose\";\n return `docker compose ${action} failed with exit code ${code ?? \"unknown\"}`;\n}\n\nfunction result(\n stack: ResolvedStack,\n status: StackResult[\"status\"],\n devEnvironment?: DevStackEnvironment,\n): StackResult {\n const base: StackResult = {\n type: \"stack\",\n id: stack.target,\n status,\n compose_file: stack.composeFile,\n ponderbot_home: stack.ponderbotHome,\n };\n\n return devEnvironment === undefined\n ? base\n : {\n ...base,\n dev_environment: devEnvironment,\n };\n}\n\nconst targetName = (target: string | undefined): string => {\n return target === undefined || target.length === 0 ? DEFAULT_TARGET : target;\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport type VersionBumpLevel = \"patch\" | \"minor\" | \"major\";\n\nexport interface ProjectVersionBump {\n previousVersion: string;\n nextVersion: string;\n}\n\nconst VERSION_LITERAL_PATTERN = /\\bversion:\\s*\"([^\"\\r\\n]+)\"/g;\nconst SEMVER_PATTERN = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/;\n\nexport const bumpProjectVersion = async (\n projectDir: string,\n currentVersion: string | undefined,\n level: string,\n): Promise<ProjectVersionBump> => {\n const bumpLevel = parseBumpLevel(level);\n const file = join(projectDir, \"config.ts\");\n const source = await readFile(file, \"utf8\");\n const matches = [...source.matchAll(VERSION_LITERAL_PATTERN)];\n\n if (matches.length !== 1) {\n throw manualBumpError(file);\n }\n\n const match = matches[0];\n const literalVersion = match?.[1];\n if (\n match?.index === undefined ||\n literalVersion === undefined ||\n currentVersion === undefined ||\n literalVersion !== currentVersion\n ) {\n throw manualBumpError(file);\n }\n\n const nextVersion = bumpedVersion(currentVersion, bumpLevel);\n const replacement = match[0].replace(`\"${literalVersion}\"`, `\"${nextVersion}\"`);\n await writeFile(\n file,\n `${source.slice(0, match.index)}${replacement}${source.slice(match.index + match[0].length)}`,\n );\n\n return { previousVersion: currentVersion, nextVersion };\n};\n\nconst parseBumpLevel = (level: string): VersionBumpLevel => {\n switch (level) {\n case \"patch\":\n case \"minor\":\n case \"major\":\n return level;\n default:\n throw new Error(\"--bump must be patch, minor, or major\");\n }\n};\n\nconst bumpedVersion = (version: string, level: VersionBumpLevel): string => {\n const match = SEMVER_PATTERN.exec(version);\n if (match === null) {\n throw new Error(`project version ${JSON.stringify(version)} is not x.y.z semver; bump the version manually`);\n }\n\n const major = Number(match[1]);\n const minor = Number(match[2]);\n const patch = Number(match[3]);\n\n switch (level) {\n case \"patch\":\n return `${major}.${minor}.${patch + 1}`;\n case \"minor\":\n return `${major}.${minor + 1}.0`;\n case \"major\":\n return `${major + 1}.0.0`;\n }\n};\n\nconst manualBumpError = (file: string): Error =>\n new Error(`${file} does not contain exactly one version string literal; bump the version manually`);\n","#!/usr/bin/env bun\nimport { constants } from \"node:fs\";\nimport { access, copyFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n isPonderbotError,\n isRunType,\n RUN_TYPES,\n type ManifestRelease,\n type RunType,\n type SpaceBudget,\n} from \"@ponderbot/sdk\";\nimport {\n buildManifest,\n type Manifest,\n} from \"@ponderbot/sdk/authoring\";\nimport { Command } from \"commander\";\n\nimport {\n clientFor,\n resolveConfig,\n resolveDevConfig,\n resolveProject,\n resolveProjectReleaseConfig,\n resolveRuntimeConfig,\n withResolvedTarget,\n} from \"./config\";\nimport { devLoop } from \"./dev\";\nimport { followEvents } from \"./events\";\nimport { configuredWorkerImage, deployManifestPlan, WorkerImageError } from \"./worker-image\";\nimport { printManifestDiagnostics } from \"./manifest-diagnostics\";\nimport { modelDefinitionInput } from \"./model-policy\";\nimport { fail, print } from \"./output\";\nimport { providerAuth } from \"./provider-auth\";\nimport { listSpaces } from \"./spaces\";\nimport { StackError, startStack, stopStack } from \"./stack\";\nimport { bumpProjectVersion } from \"./version-bump\";\n\nconst program = new Command(\"ponder\")\n .option(\"--json\", \"machine output\")\n .showHelpAfterError();\n\nprogram\n .command(\"start\")\n .option(\"--target <name>\", \"compose target\", \"core\")\n .option(\"--attach\", \"run compose in the foreground and stream logs until stopped\")\n .option(\"--build\", \"build compose images before starting\")\n .option(\"--dev\", \"run the runtime with Docker Compose Watch and Phoenix code reloading\")\n .option(\"--space <id>\", \"space id to create and print for local app credentials\")\n .description(\"start the local Docker compose stack\")\n .action(async (options: { attach?: boolean; build?: boolean; dev?: boolean; space?: string; target?: string }) => {\n try {\n print(\n await startStack({\n attach: options.attach,\n build: options.build,\n dev: options.dev,\n space: options.space,\n target: options.target,\n }),\n program.opts(),\n );\n } catch (error) {\n fail(error, error instanceof StackError ? 2 : 1);\n }\n });\n\nprogram\n .command(\"stop\")\n .option(\"--target <name>\", \"compose target\", \"core\")\n .description(\"stop the local Docker compose stack\")\n .action(async (options: { target?: string }) => {\n try {\n print(await stopStack(options), program.opts());\n } catch (error) {\n fail(error, error instanceof StackError ? 2 : 1);\n }\n });\n\nprogram\n .command(\"init\")\n .description(\"scaffold ponderbot/config.ts\")\n .action(async () => {\n await scaffold();\n print({ ok: true, project: \"ponderbot\" }, program.opts());\n });\n\nconst manifest = program.command(\"manifest\").description(\"author, validate, and deploy the manifest\");\n\nmanifest\n .command(\"validate\")\n .description(\"build the manifest and report structural errors\")\n .action(async () => {\n try {\n const config = await resolveProject();\n const { manifest, warnings, instructionBudgets } = await buildManifest(config.project, {\n workerImage: configuredWorkerImage(config.projectDefinition),\n requireWorkerImage: false,\n });\n printManifestDiagnostics(instructionBudgets, warnings);\n print({ ok: true, counts: countByKind(manifest) }, program.opts());\n } catch (error) {\n fail(error, error instanceof WorkerImageError ? 2 : 1);\n }\n });\n\nmanifest\n .command(\"deploy\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--image <ref>\", \"prebuilt worker image ref\")\n .option(\"--platform <platform>\", \"docker build platform\")\n .option(\"--bump <patch|minor|major>\", \"bump ponderbot/config.ts version before deploy\")\n .description(\"build and deploy the manifest\")\n .action(async (options: { bump?: string; env?: string; image?: string; platform?: string }) => {\n const config = await resolveProjectReleaseConfig(options.env);\n const client = clientFor(config);\n try {\n const versionBump =\n options.bump === undefined\n ? undefined\n : await bumpProjectVersion(config.project, config.projectDefinition.version, options.bump);\n const plan = await deployManifestPlan(config.project, {\n ...options,\n staticRelease: options.image === undefined && config.allowDev,\n });\n printManifestDiagnostics(plan.instructionBudgets, plan.warnings);\n const release = await client.projects.releases.deploy(\n config.projectDefinition.name,\n config.environment,\n plan.manifest,\n config.sourceName,\n undefined,\n config.applicationOrigin,\n );\n print(\n withResolvedTarget(\n config,\n versionBump === undefined ? release : { ...release, version_bump: versionBump },\n ),\n program.opts(),\n );\n } catch (error) {\n fail(error, error instanceof WorkerImageError ? 2 : 1);\n }\n });\n\nmanifest\n .command(\"dev\")\n .option(\"--env <name>\", \"environment\")\n .description(\"watch, deploy to a dev environment, and follow runtime events\")\n .action(async (options: { env?: string }) => {\n try {\n await devLoop(await resolveDevConfig(options.env));\n } catch (error) {\n fail(error, 1);\n }\n });\n\nconst spaces = program.command(\"spaces\").description(\"manage runtime spaces\");\n\nspaces\n .command(\"list\")\n .option(\"--env <name>\", \"environment\")\n .description(\"list spaces\")\n .action(async (options: { env?: string }) => {\n const config = await resolveRuntimeConfig(options.env);\n await runSpacesCommand(\"spaces:read\", \"*\", async () => {\n print({ spaces: await listSpaces(clientFor(config)) }, program.opts());\n });\n });\n\nspaces\n .command(\"create <spaceId>\")\n .option(\"--name <name>\", \"space name\")\n .option(\"--env <name>\", \"environment\")\n .description(\"create a space\")\n .action(async (spaceId: string, options: { name?: string; env?: string }) => {\n const config = await resolveRuntimeConfig(options.env);\n await runSpacesCommand(\"spaces:write\", \"*\", async () => {\n try {\n print(\n withResolvedTarget(\n config,\n await clientFor(config).spaces.create({\n id: spaceId,\n name: options.name ?? spaceId,\n }),\n ),\n program.opts(),\n );\n } catch (error) {\n throw spaceCreateError(error, spaceId);\n }\n });\n });\n\nspaces\n .command(\"show [spaceId]\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show a space with budget and usage\")\n .action(async (spaceId: string | undefined, options: { env?: string }) => {\n const config = await resolveConfig(options.env);\n const client = clientFor(config);\n const resolvedSpaceId = spaceId ?? config.spaceId;\n\n await runSpacesCommand(\"spaces:read\", resolvedSpaceId, async () => {\n const [space, budget, usage] = await Promise.all([\n client.spaces.get(resolvedSpaceId),\n client.spaces.budget.get(resolvedSpaceId),\n client.spaces.usage(resolvedSpaceId),\n ]);\n\n print({ space: space.space, budget: budget.budget, usage }, program.opts());\n });\n });\n\nspaces\n .command(\"budget [spaceId]\")\n .option(\"--set <file>\", \"replace budget from a JSON file\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show or replace a space budget\")\n .action(async (spaceId: string | undefined, options: { set?: string; env?: string }) => {\n const config = await resolveConfig(options.env);\n const client = clientFor(config);\n const resolvedSpaceId = spaceId ?? config.spaceId;\n const scope = options.set === undefined ? \"spaces:read\" : \"spaces:write\";\n\n await runSpacesCommand(scope, resolvedSpaceId, async () => {\n if (options.set === undefined) {\n print(await client.spaces.budget.get(resolvedSpaceId), program.opts());\n return;\n }\n\n print(\n withResolvedTarget(\n config,\n await client.spaces.budget.set(\n await readJsonFile<SpaceBudget>(options.set),\n resolvedSpaceId,\n ),\n ),\n program.opts(),\n );\n });\n });\n\nconst provider = program.command(\"provider\").description(\"configure model provider credentials\");\n\nprovider\n .command(\"auth\")\n .description(\"authenticate a model provider for a space\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--provider <name>\", \"anthropic | mistral | openai (skips the picker)\")\n .option(\"--method <method>\", \"api-key | oauth\")\n .option(\"--shared\", \"store one Runtime credential binding instead of a Space credential\")\n .option(\"--all-spaces\", \"authorize the shared binding for every Space\")\n .option(\"--spaces <spaceIds...>\", \"authorize the shared binding for selected Spaces\")\n .option(\"--no-browser\", \"print the Codex authorize URL and paste the callback URL\")\n .action(async (options) => {\n print(await providerAuth(options), program.opts());\n });\n\nconst model = program.command(\"model\").description(\"manage Space model policy\");\n\nmodel\n .command(\"add <modelRef>\")\n .requiredOption(\"--provider <name>\", \"anthropic | fake | mistral | openai\")\n .requiredOption(\"--model <name>\", \"provider model name\")\n .option(\"--capability <name...>\", \"declared model capabilities\")\n .option(\"--fallback <modelRef...>\", \"ordered fallback model refs\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"add or update a model in the Space catalog\")\n .action(async (modelRef: string, options) => {\n const config = await resolveConfig(options.env, options.space);\n\n await runSpacesCommand(\"spaces:write\", config.spaceId, async () => {\n print(\n withResolvedTarget(\n config,\n await clientFor(config).models.upsert(modelRef, modelDefinitionInput(options)),\n ),\n program.opts(),\n );\n });\n });\n\nmodel\n .command(\"list\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"list models in the Space catalog\")\n .action(async (options) => {\n const config = await resolveConfig(options.env, options.space);\n\n await runSpacesCommand(\"spaces:read\", config.spaceId, async () => {\n print(await clientFor(config).models.list(), program.opts());\n });\n });\n\nmodel\n .command(\"assign <agentRef> <modelRef>\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"assign a Space catalog model to an exact Agent ref\")\n .action(async (agentRef: string, modelRef: string, options) => {\n const config = await resolveConfig(options.env, options.space);\n\n await runSpacesCommand(\"spaces:write\", config.spaceId, async () => {\n print(\n withResolvedTarget(\n config,\n await clientFor(config).models.assign(agentRef, modelRef),\n ),\n program.opts(),\n );\n });\n });\n\nmodel\n .command(\"assignments\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"list exact Agent model assignments for a Space\")\n .action(async (options) => {\n const config = await resolveConfig(options.env, options.space);\n\n await runSpacesCommand(\"spaces:read\", config.spaceId, async () => {\n print(await clientFor(config).models.assignments(), program.opts());\n });\n });\n\nconst releases = program.command(\"releases\").description(\"inspect manifest releases\");\n\nreleases\n .command(\"list\", { isDefault: true })\n .option(\"--env <name>\", \"environment\")\n .description(\"list releases\")\n .action(async (options: { env?: string }) => {\n const config = await resolveConfig(options.env);\n print(await clientFor(config).releases.list(), program.opts());\n });\n\nreleases\n .command(\"catalog [releaseId]\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show the deployed resources of one release (defaults to the active release)\")\n .action(async (releaseId: string | undefined, options: { space?: string; env?: string }) => {\n const config = await resolveConfig(options.env, options.space);\n const client = clientFor(config);\n const resolvedReleaseId = releaseId ?? activeReleaseId(await client.releases.list());\n\n print(await client.releases.catalog(resolvedReleaseId), program.opts());\n });\n\nprogram\n .command(\"rollback <releaseId>\")\n .option(\"--env <name>\", \"environment\")\n .description(\"roll back to a release\")\n .action(async (releaseId: string, options: { env?: string }) => {\n const config = await resolveConfig(options.env);\n print(\n withResolvedTarget(config, await clientFor(config).releases.rollback(releaseId)),\n program.opts(),\n );\n });\n\nprogram\n .command(\"runs\")\n .option(\"--type <type>\", \"run type\")\n .option(\"--status <status>\", \"run status\")\n .option(\"--env <name>\", \"environment\")\n .description(\"list runs\")\n .action(async (options: { type?: string; status?: string; env?: string }) => {\n const config = await resolveConfig(options.env);\n print(\n await clientFor(config).runs.list(\n Object.fromEntries(\n [\n [\"type\", options.type],\n [\"status\", options.status],\n ].filter((entry): entry is [string, string] => typeof entry[1] === \"string\"),\n ),\n ),\n program.opts(),\n );\n });\n\nprogram\n .command(\"run <type> <id>\")\n .option(\"--export\", \"export run bundle\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show a run or export bundle\")\n .action(async (type: string, id: string, options: { export?: boolean; env?: string }) => {\n const runType = parseRunType(type);\n const config = await resolveConfig(options.env);\n const client = clientFor(config);\n print(\n options.export\n ? await client.runs.export(runType, id)\n : await client.runs.show(runType, id),\n program.opts(),\n );\n });\n\nprogram\n .command(\"cancel <type> <id>\")\n .option(\"--env <name>\", \"environment\")\n .description(\"cancel a run\")\n .action(async (type: string, id: string, options: { env?: string }) => {\n const runType = parseRunType(type);\n const config = await resolveConfig(options.env);\n print(\n withResolvedTarget(config, await clientFor(config).runs.cancel(runType, id)),\n program.opts(),\n );\n });\n\nprogram\n .command(\"action\")\n .command(\"run <ref>\")\n .option(\"--input <json>\", \"input payload\", \"{}\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--release-id <id>\", \"pinned release id\")\n .option(\"--manifest-name <name>\", \"current release selector\")\n .description(\"start an Action Run\")\n .action(\n async (\n ref: string,\n options: {\n input: string;\n space?: string;\n env?: string;\n releaseId?: string;\n manifestName?: string;\n },\n ) => {\n const config = await resolveConfig(options.env, options.space);\n print(\n withResolvedTarget(\n config,\n await clientFor(config).actions.run(\n ref,\n JSON.parse(options.input) as Record<string, unknown>,\n {\n releaseId: options.releaseId,\n manifestName: options.manifestName,\n },\n ),\n ),\n program.opts(),\n );\n },\n );\n\nprogram\n .command(\"workflow\")\n .command(\"trigger <ref>\")\n .option(\"--input <json>\", \"input payload\", \"{}\")\n .option(\"--space <spaceId>\", \"target space (defaults to the configured space)\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--release-id <id>\", \"pinned release id\")\n .option(\"--manifest-name <name>\", \"current release selector\")\n .description(\"start a Workflow Run\")\n .action(\n async (\n ref: string,\n options: {\n input: string;\n space?: string;\n env?: string;\n releaseId?: string;\n manifestName?: string;\n },\n ) => {\n const config = await resolveConfig(options.env, options.space);\n print(\n withResolvedTarget(\n config,\n await clientFor(config).workflows.trigger(\n ref,\n JSON.parse(options.input) as Record<string, unknown>,\n {\n releaseId: options.releaseId,\n manifestName: options.manifestName,\n },\n ),\n ),\n program.opts(),\n );\n },\n );\n\n// One Decision generation is named by its id alone: the stored generation selects\n// its own subject adapter, so no command names a subject type.\nprogram\n .command(\"decisions\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--actionable\", \"only generations this actor could answer\")\n .description(\"list pending decisions\")\n .action(async (options: { env?: string; actionable?: boolean }) => {\n const config = await resolveConfig(options.env);\n print(\n await clientFor(config).decisions.list({\n status: \"pending\",\n ...(options.actionable ? { actionable: true } : {}),\n }),\n program.opts(),\n );\n });\n\nprogram\n .command(\"approve <id>\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--reason <reason>\", \"bounded reason recorded on the response\")\n .description(\"approve a decision\")\n .action(\n async (id: string, options: { env?: string; reason?: string }) => {\n const config = await resolveConfig(options.env);\n print(\n withResolvedTarget(\n config,\n await clientFor(config).decisions.approve(id, {\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n }),\n ),\n program.opts(),\n );\n },\n );\n\nprogram\n .command(\"reject <id>\")\n .option(\"--env <name>\", \"environment\")\n .option(\"--reason <reason>\", \"bounded reason recorded on the response\")\n .description(\"reject a decision\")\n .action(\n async (id: string, options: { env?: string; reason?: string }) => {\n const config = await resolveConfig(options.env);\n print(\n withResolvedTarget(\n config,\n await clientFor(config).decisions.reject(id, {\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n }),\n ),\n program.opts(),\n );\n },\n );\n\nprogram\n .command(\"events\")\n .option(\"--follow\", \"follow runtime events\")\n .option(\"--env <name>\", \"environment\")\n .description(\"show recent events or follow the event stream\")\n .action(async (options: { follow?: boolean; env?: string }) => {\n const config = await resolveConfig(options.env);\n const client = clientFor(config);\n\n if (!options.follow) {\n print(await client.events.recent(), program.opts());\n return;\n }\n\n const tail = followEvents(client, (event) => print(event, program.opts()));\n process.once(\"SIGINT\", () => tail.stop());\n await tail.done;\n });\n\nprogram.parseAsync().catch((error: unknown) => fail(error, 1));\n\nasync function scaffold(): Promise<void> {\n const root = process.cwd();\n const templateRoot = fileURLToPath(new URL(\"../templates\", import.meta.url));\n const projectFile = join(root, \"ponderbot\", \"config.ts\");\n\n await assertNewProjectFiles([projectFile]);\n await mkdir(dirname(projectFile), { recursive: true });\n await copyFile(join(templateRoot, \"ponderbot\", \"config.ts\"), projectFile, constants.COPYFILE_EXCL);\n}\n\nasync function assertNewProjectFiles(paths: string[]): Promise<void> {\n for (const path of paths) {\n try {\n await access(path);\n throw new Error(`${path} already exists`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n}\n\nfunction countByKind(manifest: Manifest): Record<string, number> {\n return {\n actions: manifest.actions.length,\n skills: manifest.skills.length,\n schedules: manifest.schedules.length,\n workflows: manifest.workflows.length,\n agents: manifest.agents.length,\n agent_groups: manifest.agent_groups.length,\n };\n}\n\nfunction parseRunType(value: string): RunType {\n if (!isRunType(value)) {\n throw new TypeError(`run type must be one of ${RUN_TYPES.join(\", \")}`);\n }\n\n return value;\n}\n\nasync function readJsonFile<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nasync function runSpacesCommand(\n scope: string,\n space: string,\n run: () => Promise<void>,\n): Promise<void> {\n try {\n await run();\n } catch (error) {\n fail(spaceScopeError(error, scope, space), 1);\n }\n}\n\nconst spaceScopeError = (error: unknown, scope: string, space: string): unknown => {\n if (isPonderbotError(error) && error.status === 403) {\n return new Error(`your token lacks ${scope} on ${space} - mint one with that grant`);\n }\n\n return error;\n}\n\nconst spaceCreateError = (error: unknown, spaceId: string): unknown => {\n if (isPonderbotError(error) && error.status === 409) {\n return new Error(`space \"${spaceId}\" already exists`);\n }\n\n return error;\n}\n\nconst activeReleaseId = ({ releases }: { releases: ManifestRelease[] }): string => {\n const newest = releases\n .filter((release) => release.status === \"active\")\n .sort((left, right) => (right.deployed_at ?? \"\").localeCompare(left.deployed_at ?? \"\"))[0];\n\n if (newest === undefined) {\n return fail(\n new Error(\"no active release in this space - deploy one, or name a release id\"),\n 2,\n );\n }\n\n return newest.id;\n}\n"],"mappings":"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"}
|