openpond-sdk 0.3.3 → 0.4.0
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/TASKSETS.md +55 -0
- package/dist/actions-local.js +67 -118
- package/dist/actions-local.js.map +4 -4
- package/dist/actions.js +4 -92
- package/dist/actions.js.map +4 -4
- package/dist/chunk-27ETSPHQ.js +83 -0
- package/dist/chunk-27ETSPHQ.js.map +7 -0
- package/dist/chunk-5PRP457R.js +477 -0
- package/dist/chunk-5PRP457R.js.map +7 -0
- package/dist/chunk-65D4C7HP.js +273 -0
- package/dist/chunk-65D4C7HP.js.map +7 -0
- package/dist/chunk-747CMU2Y.js +222 -0
- package/dist/chunk-747CMU2Y.js.map +7 -0
- package/dist/chunk-7O5X7DBU.js +80 -0
- package/dist/chunk-7O5X7DBU.js.map +7 -0
- package/dist/chunk-A4ZDOZKP.js +115 -0
- package/dist/chunk-A4ZDOZKP.js.map +7 -0
- package/dist/chunk-APHPXQEA.js +155 -0
- package/dist/chunk-APHPXQEA.js.map +7 -0
- package/dist/chunk-AVW35YOH.js +574 -0
- package/dist/chunk-AVW35YOH.js.map +7 -0
- package/dist/chunk-AZUCY3E5.js +2395 -0
- package/dist/chunk-AZUCY3E5.js.map +7 -0
- package/dist/chunk-IVEXCIHO.js +1373 -0
- package/dist/chunk-IVEXCIHO.js.map +7 -0
- package/dist/chunk-K5ZCYOZO.js +49 -0
- package/dist/chunk-K5ZCYOZO.js.map +7 -0
- package/dist/chunk-LLHE4BOD.js +220 -0
- package/dist/chunk-LLHE4BOD.js.map +7 -0
- package/dist/chunk-LXXQVGQY.js +1 -0
- package/dist/chunk-LXXQVGQY.js.map +7 -0
- package/dist/chunk-P27DQ65Z.js +138 -0
- package/dist/chunk-P27DQ65Z.js.map +7 -0
- package/dist/chunk-QLEJOCQX.js +72 -0
- package/dist/chunk-QLEJOCQX.js.map +7 -0
- package/dist/chunk-S7I45WJQ.js +57 -0
- package/dist/chunk-S7I45WJQ.js.map +7 -0
- package/dist/chunk-ZPCK222K.js +586 -0
- package/dist/chunk-ZPCK222K.js.map +7 -0
- package/dist/index.js +33 -2488
- package/dist/index.js.map +4 -4
- package/dist/learning.js +16 -2042
- package/dist/learning.js.map +4 -4
- package/dist/model-batch-review.js +5 -42
- package/dist/model-batch-review.js.map +3 -3
- package/dist/model-projects.js +29 -430
- package/dist/model-projects.js.map +3 -3
- package/dist/model-starter-attempts.js +53 -310
- package/dist/model-starter-attempts.js.map +4 -4
- package/dist/model-starter-catalog.js +17 -460
- package/dist/model-starter-catalog.js.map +4 -4
- package/dist/model-starters.js +32 -709
- package/dist/model-starters.js.map +4 -4
- package/dist/model-taskset-authoring.js +11 -44
- package/dist/model-taskset-authoring.js.map +3 -3
- package/dist/profile-actions.js +4 -211
- package/dist/profile-actions.js.map +3 -3
- package/dist/project-actions.js +4 -224
- package/dist/project-actions.js.map +3 -3
- package/dist/refiner.js +14 -554
- package/dist/refiner.js.map +4 -4
- package/dist/taskset-catalog.js +9 -104
- package/dist/taskset-catalog.js.map +3 -3
- package/dist/taskset-drafts.js +465 -0
- package/dist/taskset-drafts.js.map +7 -0
- package/dist/taskset-packages.js +946 -3089
- package/dist/taskset-packages.js.map +4 -4
- package/dist/training.js +43 -822
- package/dist/training.js.map +4 -4
- package/dist/types/packages/sdk/src/index.d.ts +3 -3
- package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/learning-client.d.ts +130 -0
- package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/learning.d.ts +1 -129
- package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +1170 -0
- package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +560 -0
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts +92 -0
- package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts +15 -0
- package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts +18 -0
- package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +1681 -0
- package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts +19 -0
- package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2713 -0
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-core.d.ts +1000 -0
- package/dist/types/packages/sdk/src/taskset-draft-core.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +429 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts +284 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +846 -0
- package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-files.d.ts +8 -0
- package/dist/types/packages/sdk/src/taskset-draft-files.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts +28 -0
- package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts +8 -0
- package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +967 -0
- package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts +10 -0
- package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +1297 -0
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +1597 -0
- package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-drafts.d.ts +16 -0
- package/dist/types/packages/sdk/src/taskset-drafts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts +64 -0
- package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +1514 -0
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-packages.d.ts +6 -0
- package/dist/types/packages/sdk/src/taskset-packages.d.ts.map +1 -1
- package/dist/workflows.js +4 -221
- package/dist/workflows.js.map +3 -3
- package/package.json +5 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../actions/src/local.ts", "../../actions/src/build.ts", "../../actions/src/
|
|
4
|
-
"sourcesContent": ["import { randomUUID } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n DEFAULT_PROJECT_ACTION_OUTPUT_DIRECTORY,\n buildProjectActions,\n} from \"./build.js\";\nimport {\n loadProjectActionConfiguration,\n resolveProjectActionRuntime,\n} from \"./configuration.js\";\nimport type {\n LocalProjectActionRunner,\n ProjectActionBuildResult,\n ProjectActionRegistry,\n ProjectActionRunRequest,\n ProjectActionRunResult,\n ProjectActionRunnerOptions,\n} from \"./types.js\";\nimport { validateProjectActionRunSetup } from \"./setup.js\";\n\nconst localConcurrency = new Map<string, { active: number; waiting: Array<() => void> }>();\n\nexport function createLocalActionRunner(\n options: ProjectActionRunnerOptions,\n): LocalProjectActionRunner {\n const projectRoot = path.resolve(options.projectRoot);\n const buildPolicy = options.build ?? \"if-missing\";\n let currentBuild: ProjectActionBuildResult | null = null;\n\n const ensureBuild = async (): Promise<ProjectActionBuildResult> => {\n if (buildPolicy === \"always\") return runBuild();\n if (currentBuild) return currentBuild;\n if (buildPolicy === \"never\" || buildPolicy === \"if-missing\") {\n const configuration = await loadProjectActionConfiguration(projectRoot);\n const outputDirectory = path.resolve(\n projectRoot,\n options.outputDirectory ?? configuration.outputDirectory ?? DEFAULT_PROJECT_ACTION_OUTPUT_DIRECTORY,\n );\n const loaded = await loadBuild(projectRoot, outputDirectory);\n if (loaded) return (currentBuild = loaded);\n if (buildPolicy === \"never\") {\n throw new Error(`Project Actions have not been built in ${outputDirectory}.`);\n }\n }\n return runBuild();\n };\n const runBuild = async () => {\n currentBuild = await buildProjectActions({\n projectRoot,\n sourceDirectory: options.sourceDirectory,\n outputDirectory: options.outputDirectory,\n });\n return currentBuild;\n };\n\n return {\n build: runBuild,\n async catalog() {\n return (await ensureBuild()).registry;\n },\n async run<TOutput>(request: ProjectActionRunRequest) {\n const built = await ensureBuild();\n const catalogAction = built.registry.actions.find((action) => action.id === request.actionId);\n if (!catalogAction) throw new Error(`Unknown Project Action: ${request.actionId}`);\n const configuredRuntime = resolveProjectActionRuntime(\n await loadProjectActionConfiguration(projectRoot),\n );\n const resolvedRequest: ProjectActionRunRequest = {\n ...request,\n environment: {\n ...configuredRuntime.environment,\n ...(request.environment ?? {}),\n },\n connections: {\n ...configuredRuntime.connections,\n ...(request.connections ?? {}),\n },\n };\n await validateProjectActionRunSetup(projectRoot, catalogAction.setupRequirements, resolvedRequest);\n const runId = request.runId?.trim() || randomUUID();\n const actionOutputDirectory = path.resolve(\n request.outputDirectory ?? path.join(projectRoot, \".openpond\", \"outputs\", runId),\n );\n assertWithinProject(projectRoot, actionOutputDirectory, \"Project Action output directory\");\n await fs.mkdir(actionOutputDirectory, { recursive: true });\n const release = await acquireLocalActionSlot(\n `${projectRoot}\\0${request.actionId}`,\n catalogAction.implementation.concurrency,\n resolvedRequest.signal,\n );\n const responseFile = path.join(built.outputDirectory, `.run-${randomUUID()}.json`);\n const startedAt = Date.now();\n let childResult: Awaited<ReturnType<typeof executeChild>>;\n let payload: {\n ok: true;\n output: TOutput;\n traces: ProjectActionRunResult[\"traces\"];\n outputs: ProjectActionRunResult[\"outputs\"];\n };\n try {\n childResult = await executeChild({\n runnerPath: built.runnerPath,\n cwd: projectRoot,\n signal: resolvedRequest.signal,\n request: {\n actionId: request.actionId,\n input: resolvedRequest.input ?? {},\n runId,\n idempotencyKey: resolvedRequest.idempotencyKey ?? null,\n timeoutMs: resolvedRequest.timeoutMs,\n projectRoot,\n outputDirectory: actionOutputDirectory,\n responseFile,\n environment: resolvedRequest.environment ?? {},\n connections: resolvedRequest.connections ?? {},\n },\n });\n payload = JSON.parse(await fs.readFile(responseFile, \"utf8\")) as typeof payload;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(redactRuntimeValues(message, resolvedRequest));\n } finally {\n await fs.rm(responseFile, { force: true }).catch(() => undefined);\n release();\n }\n return {\n runId,\n actionId: request.actionId,\n status: \"succeeded\",\n output: payload.output,\n stdout: redactRuntimeValues(childResult.stdout, resolvedRequest),\n stderr: redactRuntimeValues(childResult.stderr, resolvedRequest),\n traces: redactRuntimeValue(payload.traces, resolvedRequest),\n outputs: redactRuntimeValue(payload.outputs, resolvedRequest),\n outputDirectory: actionOutputDirectory,\n durationMs: Date.now() - startedAt,\n } satisfies ProjectActionRunResult<TOutput>;\n },\n };\n}\n\nasync function acquireLocalActionSlot(\n key: string,\n limit: number | null,\n signal?: AbortSignal,\n): Promise<() => void> {\n if (limit === null) return () => undefined;\n const state = localConcurrency.get(key) ?? { active: 0, waiting: [] };\n localConcurrency.set(key, state);\n if (state.active >= limit) {\n await new Promise<void>((resolve, reject) => {\n const resume = () => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n };\n const abort = () => {\n const index = state.waiting.indexOf(resume);\n if (index >= 0) state.waiting.splice(index, 1);\n reject(signal?.reason instanceof Error ? signal.reason : new Error(\"Project Action was cancelled.\"));\n };\n if (signal?.aborted) {\n abort();\n return;\n }\n state.waiting.push(resume);\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n } else {\n state.active += 1;\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const next = state.waiting.shift();\n if (next) {\n next();\n return;\n }\n state.active -= 1;\n if (state.active === 0 && state.waiting.length === 0) localConcurrency.delete(key);\n };\n}\n\nasync function loadBuild(\n projectRoot: string,\n outputDirectory: string,\n): Promise<ProjectActionBuildResult | null> {\n const manifestPath = path.join(outputDirectory, \"build-manifest.json\");\n const registryPath = path.join(outputDirectory, \"action-registry.json\");\n const [manifestText, registryText] = await Promise.all([\n fs.readFile(manifestPath, \"utf8\").catch(() => null),\n fs.readFile(registryPath, \"utf8\").catch(() => null),\n ]);\n if (!manifestText || !registryText) return null;\n const manifest = JSON.parse(manifestText) as ProjectActionBuildResult[\"manifest\"];\n const registry = JSON.parse(registryText) as ProjectActionRegistry;\n return {\n projectRoot,\n outputDirectory,\n bundlePath: path.join(outputDirectory, manifest.bundleFile),\n runnerPath: path.join(outputDirectory, manifest.runnerFile),\n registryPath,\n manifestPath,\n registry,\n manifest,\n };\n}\n\nfunction redactRuntimeValues(value: string, request: ProjectActionRunRequest): string {\n let redacted = value;\n for (const secret of runtimeStringValues(request)) {\n if (secret.length >= 4) redacted = redacted.split(secret).join(\"[REDACTED]\");\n }\n return redacted;\n}\n\nfunction redactRuntimeValue<T>(value: T, request: ProjectActionRunRequest): T {\n const serialized = JSON.stringify(value);\n return JSON.parse(redactRuntimeValues(serialized, request)) as T;\n}\n\nfunction runtimeStringValues(request: ProjectActionRunRequest): string[] {\n const values = new Set<string>(Object.values(request.environment ?? {}));\n const visit = (value: unknown) => {\n if (typeof value === \"string\") values.add(value);\n else if (Array.isArray(value)) value.forEach(visit);\n else if (value && typeof value === \"object\") Object.values(value).forEach(visit);\n };\n visit(request.connections ?? {});\n return [...values].filter(Boolean).sort((left, right) => right.length - left.length);\n}\n\nfunction executeChild(input: {\n runnerPath: string;\n cwd: string;\n signal?: AbortSignal;\n request: Record<string, unknown>;\n}): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n if (input.signal?.aborted) {\n reject(input.signal.reason instanceof Error ? input.signal.reason : new Error(\"Project Action was cancelled.\"));\n return;\n }\n let requestJson: string;\n try {\n requestJson = JSON.stringify(input.request);\n } catch (error) {\n reject(new Error(`Project Action request is not serializable: ${error instanceof Error ? error.message : String(error)}`));\n return;\n }\n const child = spawn(process.execPath, [input.runnerPath], {\n cwd: input.cwd,\n env: minimalEnvironment(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => { stdout += chunk; });\n child.stderr.on(\"data\", (chunk: string) => { stderr += chunk; });\n const abort = () => child.kill(\"SIGTERM\");\n input.signal?.addEventListener(\"abort\", abort, { once: true });\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n input.signal?.removeEventListener(\"abort\", abort);\n if (input.signal?.aborted) {\n reject(input.signal.reason instanceof Error ? input.signal.reason : new Error(\"Project Action was cancelled.\"));\n return;\n }\n if (code !== 0) {\n reject(new Error(`Project Action process failed (${code ?? signal ?? \"unknown\"}): ${stderr.trim() || stdout.trim()}`));\n return;\n }\n resolve({ stdout, stderr });\n });\n child.stdin.end(requestJson);\n });\n}\n\nfunction assertWithinProject(projectRoot: string, target: string, label: string): void {\n const relative = path.relative(projectRoot, target);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`${label} must stay inside the Project root.`);\n }\n}\n\nfunction minimalEnvironment(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n for (const name of [\"PATH\", \"SystemRoot\", \"WINDIR\", \"TMPDIR\", \"TEMP\", \"TMP\"]) {\n if (process.env[name] !== undefined) env[name] = process.env[name];\n }\n return env;\n}\n\nexport { buildProjectActions } from \"./build.js\";\nexport {\n loadProjectActionConfiguration,\n PROJECT_ACTION_CONFIG_PATH,\n resolveProjectActionRuntime,\n} from \"./configuration.js\";\nexport type {\n LocalProjectActionRunner,\n ProjectActionBuildManifest,\n ProjectActionBuildResult,\n ProjectActionCatalogEntry,\n ProjectActionRegistry,\n ProjectActionRunRequest,\n ProjectActionRunResult,\n ProjectActionRunnerOptions,\n} from \"./types.js\";\n", "import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { build } from \"esbuild\";\n\nimport { collectProjectActions, createProjectActionRegistry } from \"./catalog.js\";\nimport { loadProjectActionConfiguration } from \"./configuration.js\";\nimport { discoverProjectActionFiles } from \"./discovery.js\";\nimport { canonicalJson, sha256 } from \"./hash.js\";\nimport { validateProjectActionStaticSetup } from \"./setup.js\";\nimport type {\n ProjectActionBuildManifest,\n ProjectActionBuildResult,\n ProjectActionDefinition,\n} from \"./types.js\";\n\nexport const DEFAULT_PROJECT_ACTION_OUTPUT_DIRECTORY = \".openpond/actions\";\n\nexport async function buildProjectActions(input: {\n projectRoot: string;\n sourceDirectory?: string;\n outputDirectory?: string;\n}): Promise<ProjectActionBuildResult> {\n const configuration = await loadProjectActionConfiguration(input.projectRoot);\n const discovered = await discoverProjectActionFiles({\n projectRoot: input.projectRoot,\n sourceDirectory: input.sourceDirectory ?? configuration.sourceDirectory,\n });\n const outputDirectory = path.resolve(\n discovered.projectRoot,\n input.outputDirectory ?? configuration.outputDirectory ?? DEFAULT_PROJECT_ACTION_OUTPUT_DIRECTORY,\n );\n assertWithinProject(discovered.projectRoot, outputDirectory);\n await fs.mkdir(outputDirectory, { recursive: true });\n\n const entryPath = path.join(outputDirectory, \"entry.mjs\");\n const bundlePath = path.join(outputDirectory, \"bundle.mjs\");\n const runnerPath = path.join(outputDirectory, \"runner.mjs\");\n const registryPath = path.join(outputDirectory, \"action-registry.json\");\n const manifestPath = path.join(outputDirectory, \"build-manifest.json\");\n const imports = discovered.files.map((file, index) => {\n const relative = path.relative(outputDirectory, path.join(discovered.projectRoot, file)).split(path.sep).join(\"/\");\n const specifier = relative.startsWith(\".\") ? relative : `./${relative}`;\n return `import * as actionModule${index} from ${JSON.stringify(specifier)};`;\n });\n const modules = discovered.files.map((_file, index) => `actionModule${index}`).join(\", \");\n await fs.writeFile(\n entryPath,\n [\n ...imports,\n `export const projectActionModules = [${modules}];`,\n \"export default projectActionModules;\",\n \"\",\n ].join(\"\\n\"),\n \"utf8\",\n );\n await build({\n entryPoints: [entryPath],\n outfile: bundlePath,\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n target: \"node22.14\",\n sourcemap: false,\n legalComments: \"none\",\n logLevel: \"silent\",\n nodePaths: dependencySearchPaths(discovered.projectRoot),\n });\n const cacheKey = `openpond_action_build=${Date.now()}_${Math.random().toString(16).slice(2)}`;\n const loaded = await import(`${pathToFileURL(bundlePath).href}?${cacheKey}`) as {\n projectActionModules?: unknown[];\n default?: unknown[];\n };\n const actions = collectProjectActions(loaded.projectActionModules ?? loaded.default ?? []);\n for (const action of actions) {\n await validateProjectActionStaticSetup(discovered.projectRoot, action.setup);\n }\n const registry = createProjectActionRegistry(actions);\n await fs.writeFile(registryPath, canonicalJson(registry), \"utf8\");\n await fs.writeFile(runnerPath, runtimeSource(), { encoding: \"utf8\", mode: 0o755 });\n\n const bundleHash = sha256(await fs.readFile(bundlePath));\n const registryHash = sha256(canonicalJson(registry));\n const manifest: ProjectActionBuildManifest = {\n schemaVersion: \"openpond.projectActionBuild.v1\",\n sourceDirectory: path.relative(discovered.projectRoot, discovered.sourceRoot).split(path.sep).join(\"/\"),\n sourceFiles: discovered.files,\n bundleFile: path.basename(bundlePath),\n runnerFile: path.basename(runnerPath),\n registryFile: path.basename(registryPath),\n bundleHash,\n registryHash,\n };\n await fs.writeFile(manifestPath, canonicalJson(manifest), \"utf8\");\n await fs.rm(entryPath, { force: true });\n return {\n projectRoot: discovered.projectRoot,\n outputDirectory,\n bundlePath,\n runnerPath,\n registryPath,\n manifestPath,\n registry,\n manifest,\n };\n}\n\nfunction dependencySearchPaths(projectRoot: string): string[] {\n const candidates: string[] = [];\n let current = projectRoot;\n while (true) {\n candidates.push(path.join(current, \"node_modules\"));\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n candidates.push(path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../../../node_modules\"));\n return [...new Set(candidates)];\n}\n\nexport async function loadBuiltProjectActions(\n bundlePath: string,\n): Promise<ProjectActionDefinition[]> {\n const stats = await fs.stat(bundlePath).catch(() => null);\n if (!stats?.isFile()) throw new Error(`Project Action bundle does not exist: ${bundlePath}`);\n const loaded = await import(`${pathToFileURL(bundlePath).href}?openpond_action_load=${Date.now()}`) as {\n projectActionModules?: unknown[];\n default?: unknown[];\n };\n return collectProjectActions(loaded.projectActionModules ?? loaded.default ?? []);\n}\n\nfunction assertWithinProject(projectRoot: string, target: string): void {\n const relative = path.relative(projectRoot, target);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(\"Project Action output directory must stay inside the Project root.\");\n }\n}\n\nfunction runtimeSource(): string {\n return `#!/usr/bin/env node\nimport { promises as fs } from \"node:fs\";\nimport { stdin } from \"node:process\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nlet requestText = \"\";\nstdin.setEncoding(\"utf8\");\nfor await (const chunk of stdin) requestText += chunk;\nconst request = JSON.parse(requestText);\nconst bundlePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"bundle.mjs\");\nconst loaded = await import(pathToFileURL(bundlePath).href);\nconst values = [];\nconst seen = new Set();\nconst visit = (value) => {\n if (seen.has(value)) return;\n if (value && (typeof value === \"object\" || typeof value === \"function\")) seen.add(value);\n if (value?.kind === \"openpond-project-action\" && typeof value.run === \"function\") { values.push(value); return; }\n if (Array.isArray(value)) { value.forEach(visit); return; }\n if (value && typeof value === \"object\") Object.values(value).forEach(visit);\n};\n(loaded.projectActionModules ?? loaded.default ?? []).forEach(visit);\nconst action = values.find((candidate) => candidate.id === request.actionId);\nif (!action) throw new Error(\\`Unknown Project Action: \\${request.actionId}\\`);\nconst controller = new AbortController();\nconst timeoutMs = Math.min(request.timeoutMs ?? action.timeoutMs, action.timeoutMs);\nconst timer = setTimeout(() => controller.abort(new Error(\\`Project Action timed out after \\${timeoutMs}ms.\\`)), timeoutMs);\nconst traces = [];\nconst outputs = [];\nconst env = request.environment ?? {};\nconst connections = request.connections ?? {};\nconst context = {\n runId: request.runId,\n actionId: action.id,\n idempotencyKey: request.idempotencyKey ?? null,\n projectRoot: request.projectRoot,\n outputDirectory: request.outputDirectory,\n signal: controller.signal,\n env(name) { return Object.prototype.hasOwnProperty.call(env, name) ? env[name] : undefined; },\n connection(name) {\n if (!Object.prototype.hasOwnProperty.call(connections, name)) throw new Error(\\`Project Action connection is not configured: \\${name}\\`);\n return connections[name];\n },\n trace(name, payload) { traces.push({ name, ...(payload ? { payload } : {}), timestamp: new Date().toISOString() }); },\n output(value) {\n if (!value || typeof value.path !== \"string\" || !value.path.trim()) throw new Error(\"Project Action output requires a path.\");\n const outputPath = path.resolve(request.outputDirectory, value.path);\n const relative = path.relative(request.outputDirectory, outputPath);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) throw new Error(\"Project Action output must stay inside the run output directory.\");\n outputs.push({ ...value, path: relative.split(path.sep).join(\"/\") });\n },\n};\ntry {\n const input = action.inputSchema.parse(request.input ?? {});\n const result = await Promise.race([\n Promise.resolve(action.run(context, input)),\n new Promise((_, reject) => controller.signal.addEventListener(\"abort\", () => reject(controller.signal.reason), { once: true })),\n ]);\n const output = action.outputSchema.parse(result);\n for (const artifact of outputs) {\n const stats = await fs.stat(path.resolve(request.outputDirectory, artifact.path)).catch(() => null);\n if (!stats?.isFile()) throw new Error(\\`Project Action output does not exist: \\${artifact.path}\\`);\n }\n await fs.writeFile(request.responseFile, JSON.stringify({ ok: true, output, traces, outputs }), \"utf8\");\n} finally {\n clearTimeout(timer);\n}\n`;\n}\n", "import type {\n DefineProjectActionOptions,\n ProjectActionDefinition,\n} from \"./types.js\";\nimport { z } from \"zod\";\n\nconst ACTION_ID = /^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/;\n\nexport function defineAction<TInput, TOutput>(\n id: string,\n options: DefineProjectActionOptions<TInput, TOutput>,\n): ProjectActionDefinition<TInput, TOutput> {\n const normalizedId = id.trim();\n if (!ACTION_ID.test(normalizedId) || normalizedId.length > 191) {\n throw new Error(\n `Invalid Project Action id ${JSON.stringify(id)}. Use a lowercase stable id such as analytics.get_summary.`,\n );\n }\n const description = options.description.trim();\n if (!description) throw new Error(`Project Action ${normalizedId} requires a description.`);\n if (description.length > 1_000) throw new Error(`Project Action ${normalizedId} description must be at most 1000 characters.`);\n if (!(options.input instanceof z.ZodType)) {\n throw new Error(`Project Action ${normalizedId} input must be a Zod schema.`);\n }\n if (!(options.output instanceof z.ZodType)) {\n throw new Error(`Project Action ${normalizedId} output must be a Zod schema.`);\n }\n if (typeof options.run !== \"function\") {\n throw new Error(`Project Action ${normalizedId} requires a run function.`);\n }\n const behavior = options.behavior ?? \"read\";\n if (behavior !== \"read\" && behavior !== \"write\") {\n throw new Error(`Project Action ${normalizedId} behavior must be read or write.`);\n }\n const approval = options.approval ?? {\n mode: behavior === \"write\" ? \"writes\" : \"never\",\n };\n if (![\"never\", \"always\", \"writes\", \"sensitive\"].includes(approval.mode)) {\n throw new Error(`Project Action ${normalizedId} has an invalid approval mode.`);\n }\n const label = options.label?.trim() || titleFromId(normalizedId);\n if (label.length > 160) throw new Error(`Project Action ${normalizedId} label must be at most 160 characters.`);\n const timeoutMs = options.timeoutMs ?? 60_000;\n if (!Number.isInteger(timeoutMs) || timeoutMs < 1_000 || timeoutMs > 3_600_000) {\n throw new Error(`Project Action ${normalizedId} timeoutMs must be between 1000 and 3600000.`);\n }\n const concurrency = options.concurrency ?? null;\n if (concurrency !== null && (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 1_000)) {\n throw new Error(`Project Action ${normalizedId} concurrency must be null or an integer from 1 to 1000.`);\n }\n const setup = [...(options.setup ?? [])];\n const setupKeys = new Set<string>();\n for (const requirement of setup) {\n if (![\"connection\", \"env\", \"package\", \"native_tool\"].includes(requirement.kind)) {\n throw new Error(`Project Action ${normalizedId} has an invalid setup requirement kind.`);\n }\n if (!requirement.name?.trim()) {\n throw new Error(`Project Action ${normalizedId} has a setup requirement without a name.`);\n }\n const key = `${requirement.kind}:${requirement.name}`;\n if (setupKeys.has(key)) throw new Error(`Project Action ${normalizedId} repeats setup requirement ${key}.`);\n setupKeys.add(key);\n }\n return Object.freeze({\n kind: \"openpond-project-action\" as const,\n id: normalizedId,\n label,\n description,\n behavior,\n inputSchema: options.input,\n outputSchema: options.output,\n approval,\n setup: Object.freeze(setup),\n invokesModel: options.invokesModel ?? false,\n timeoutMs,\n concurrency,\n run: options.run,\n });\n}\n\nexport function isProjectActionDefinition(value: unknown): value is ProjectActionDefinition {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as { kind?: unknown }).kind === \"openpond-project-action\" &&\n typeof (value as { id?: unknown }).id === \"string\" &&\n typeof (value as { run?: unknown }).run === \"function\",\n );\n}\n\nfunction titleFromId(id: string): string {\n return id\n .split(/[._-]/g)\n .filter(Boolean)\n .map((part) => `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`)\n .join(\" \");\n}\n", "import { z } from \"zod\";\n\nimport type { ProjectActionSchema } from \"./types.js\";\n\nexport function projectActionJsonSchema(schema: ProjectActionSchema): Record<string, unknown> {\n return z.toJSONSchema(schema, { unrepresentable: \"any\" }) as Record<string, unknown>;\n}\n\nexport function parseProjectActionValue(schema: ProjectActionSchema, value: unknown): unknown {\n return schema.parse(value);\n}\n", "import { isProjectActionDefinition } from \"./define-action.js\";\nimport { projectActionJsonSchema } from \"./schema.js\";\nimport type {\n ProjectActionCatalogEntry,\n ProjectActionDefinition,\n ProjectActionRegistry,\n} from \"./types.js\";\n\nexport function collectProjectActions(modules: unknown[]): ProjectActionDefinition[] {\n const actions: ProjectActionDefinition[] = [];\n const seenObjects = new Set<unknown>();\n const visit = (value: unknown) => {\n if (seenObjects.has(value)) return;\n if (value && (typeof value === \"object\" || typeof value === \"function\")) seenObjects.add(value);\n if (isProjectActionDefinition(value)) {\n actions.push(value);\n return;\n }\n if (Array.isArray(value)) {\n value.forEach(visit);\n return;\n }\n if (value && typeof value === \"object\") Object.values(value).forEach(visit);\n };\n modules.forEach(visit);\n const byId = new Map<string, ProjectActionDefinition>();\n for (const action of actions) {\n if (byId.has(action.id)) throw new Error(`Duplicate Project Action id: ${action.id}`);\n byId.set(action.id, action);\n }\n return [...byId.values()].sort((left, right) => left.id.localeCompare(right.id));\n}\n\nexport function createProjectActionRegistry(\n actions: readonly ProjectActionDefinition[],\n): ProjectActionRegistry {\n return {\n schemaVersion: \"openpond.projectActionRegistry.v1\",\n actions: actions.map(toCatalogEntry),\n };\n}\n\nfunction toCatalogEntry(action: ProjectActionDefinition): ProjectActionCatalogEntry {\n return {\n id: action.id,\n sourceActionId: action.id,\n name: action.id,\n label: action.label,\n description: action.description,\n visibility: \"default\",\n inputSchema: projectActionJsonSchema(action.inputSchema),\n outputSchema: projectActionJsonSchema(action.outputSchema),\n approvalPolicy: {\n ...action.approval,\n required: action.approval.mode === \"always\" || action.approval.mode === \"sensitive\" ||\n (action.approval.mode === \"writes\" && action.behavior === \"write\"),\n risk: action.behavior,\n },\n artifactPolicy: {\n outputArtifacts: [],\n persistRunSummary: true,\n persistTrace: true,\n },\n setupRequirements: [...action.setup],\n mcp: { enabled: false },\n schedulePolicy: { enabled: false, allowAdHoc: true },\n trace: { name: action.id, namespace: \"project-actions\" },\n implementation: {\n type: \"openpond-project-action\",\n actionId: action.id,\n behavior: action.behavior,\n timeoutMs: action.timeoutMs,\n concurrency: action.concurrency,\n },\n invokesModel: action.invokesModel,\n };\n}\n", "import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nexport const PROJECT_ACTION_CONFIG_PATH = \"openpond/project-actions.json\";\n\nconst connectionSchema = z.object({\n values: z.record(z.string(), z.unknown()).optional().default({}),\n environment: z.record(z.string(), z.string().trim().min(1)).optional().default({}),\n}).strict();\n\nconst configSchema = z.object({\n sourceDirectory: z.string().trim().min(1).optional(),\n outputDirectory: z.string().trim().min(1).optional(),\n environment: z.record(z.string(), z.string().trim().min(1)).optional().default({}),\n connections: z.record(z.string(), connectionSchema).optional().default({}),\n}).strict();\n\nexport type ProjectActionConfiguration = z.infer<typeof configSchema>;\n\nexport type ResolvedProjectActionRuntime = {\n environment: Record<string, string>;\n connections: Record<string, unknown>;\n};\n\nexport async function loadProjectActionConfiguration(\n projectRoot: string,\n): Promise<ProjectActionConfiguration> {\n const resolvedRoot = path.resolve(projectRoot);\n const configPath = path.join(resolvedRoot, PROJECT_ACTION_CONFIG_PATH);\n const raw = await fs.readFile(configPath, \"utf8\").catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return null;\n throw error;\n });\n if (raw === null) return configSchema.parse({});\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`${PROJECT_ACTION_CONFIG_PATH} is not valid JSON: ${message}`);\n }\n return configSchema.parse(value);\n}\n\nexport function resolveProjectActionRuntime(\n config: ProjectActionConfiguration,\n hostEnvironment: NodeJS.ProcessEnv = process.env,\n): ResolvedProjectActionRuntime {\n const environment: Record<string, string> = {};\n for (const [runtimeName, hostName] of Object.entries(config.environment)) {\n const value = hostEnvironment[hostName];\n if (value !== undefined) environment[runtimeName] = value;\n }\n const connections: Record<string, unknown> = {};\n for (const [name, descriptor] of Object.entries(config.connections)) {\n const value: Record<string, unknown> = { ...descriptor.values };\n for (const [property, hostName] of Object.entries(descriptor.environment)) {\n const environmentValue = hostEnvironment[hostName];\n if (environmentValue !== undefined) value[property] = environmentValue;\n }\n connections[name] = value;\n }\n return { environment, connections };\n}\n", "import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nconst ACTION_FILE = /\\.(?:[cm]?[jt]s)$/i;\nconst IGNORED_FILE = /(?:\\.d\\.ts|\\.test\\.[cm]?[jt]s|\\.spec\\.[cm]?[jt]s)$/i;\n\nexport async function discoverProjectActionFiles(input: {\n projectRoot: string;\n sourceDirectory?: string;\n}): Promise<{ projectRoot: string; sourceRoot: string; files: string[] }> {\n const projectRoot = path.resolve(input.projectRoot);\n const sourceRoot = path.resolve(projectRoot, input.sourceDirectory ?? \"openpond/actions\");\n if (!isWithin(projectRoot, sourceRoot)) {\n throw new Error(\"Project Action source directory must stay inside the Project root.\");\n }\n const stats = await fs.stat(sourceRoot).catch(() => null);\n if (!stats?.isDirectory()) {\n throw new Error(`Project Action source directory does not exist: ${sourceRoot}`);\n }\n const files = await walk(sourceRoot);\n const actions = files\n .filter((file) => ACTION_FILE.test(file) && !IGNORED_FILE.test(file))\n .map((file) => path.relative(projectRoot, file).split(path.sep).join(\"/\"))\n .sort();\n if (actions.length === 0) {\n throw new Error(`No Project Action files were found under ${sourceRoot}.`);\n }\n return { projectRoot, sourceRoot, files: actions };\n}\n\nasync function walk(directory: string): Promise<string[]> {\n const entries = await fs.readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const target = path.join(directory, entry.name);\n if (entry.isDirectory()) files.push(...(await walk(target)));\n else if (entry.isFile()) files.push(target);\n }\n return files;\n}\n\nfunction isWithin(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n", "import { createHash } from \"node:crypto\";\n\nexport function sha256(value: string | Uint8Array): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function canonicalJson(value: unknown): string {\n return `${JSON.stringify(sortValue(value), null, 2)}\\n`;\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, child]) => [key, sortValue(child)]),\n );\n}\n", "import { promises as fs } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport type {\n ProjectActionRunRequest,\n ProjectActionSetupRequirement,\n} from \"./types.js\";\n\nexport async function validateProjectActionStaticSetup(\n projectRoot: string,\n requirements: readonly ProjectActionSetupRequirement[],\n): Promise<void> {\n for (const requirement of requirements) {\n if (requirement.required === false) continue;\n if (requirement.kind === \"package\") {\n try {\n createRequire(path.join(projectRoot, \"package.json\")).resolve(requirement.name);\n } catch {\n throw new Error(`Project Action package is not installed: ${requirement.name}`);\n }\n }\n if (requirement.kind === \"native_tool\" && !(await executableExists(requirement.name))) {\n throw new Error(`Project Action native tool is not installed: ${requirement.name}`);\n }\n }\n}\n\nexport async function validateProjectActionRunSetup(\n projectRoot: string,\n requirements: readonly ProjectActionSetupRequirement[],\n request: ProjectActionRunRequest,\n): Promise<void> {\n await validateProjectActionStaticSetup(projectRoot, requirements);\n for (const requirement of requirements) {\n if (requirement.required === false) continue;\n if (requirement.kind === \"connection\" && !(requirement.name in (request.connections ?? {}))) {\n throw new Error(`Project Action connection is not configured: ${requirement.name}`);\n }\n if (requirement.kind === \"env\" && !(requirement.name in (request.environment ?? {}))) {\n throw new Error(`Project Action environment value is not configured: ${requirement.name}`);\n }\n }\n}\n\nasync function executableExists(name: string): Promise<boolean> {\n if (!name.trim() || name.includes(\"/\") || name.includes(\"\\\\\")) return false;\n for (const directory of (process.env.PATH ?? \"\").split(path.delimiter).filter(Boolean)) {\n const candidates = process.platform === \"win32\"\n ? (process.env.PATHEXT ?? \".EXE;.CMD;.BAT;.COM\").split(\";\").map((extension) => path.join(directory, `${name}${extension}`))\n : [path.join(directory, name)];\n for (const candidate of candidates) {\n if (await fs.access(candidate).then(() => true).catch(() => false)) return true;\n }\n }\n return false;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["fs", "path", "fs", "path", "
|
|
3
|
+
"sources": ["../../actions/src/local.ts", "../../actions/src/build.ts", "../../actions/src/schema.ts", "../../actions/src/catalog.ts", "../../actions/src/discovery.ts", "../../actions/src/hash.ts", "../../actions/src/setup.ts"],
|
|
4
|
+
"sourcesContent": ["import { randomUUID } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n DEFAULT_PROJECT_ACTION_OUTPUT_DIRECTORY,\n buildProjectActions,\n} from \"./build.js\";\nimport {\n loadProjectActionConfiguration,\n resolveProjectActionRuntime,\n} from \"./configuration.js\";\nimport type {\n LocalProjectActionRunner,\n ProjectActionBuildResult,\n ProjectActionRegistry,\n ProjectActionRunRequest,\n ProjectActionRunResult,\n ProjectActionRunnerOptions,\n} from \"./types.js\";\nimport { validateProjectActionRunSetup } from \"./setup.js\";\n\nconst localConcurrency = new Map<string, { active: number; waiting: Array<() => void> }>();\n\nexport function createLocalActionRunner(\n options: ProjectActionRunnerOptions,\n): LocalProjectActionRunner {\n const projectRoot = path.resolve(options.projectRoot);\n const buildPolicy = options.build ?? \"if-missing\";\n let currentBuild: ProjectActionBuildResult | null = null;\n\n const ensureBuild = async (): Promise<ProjectActionBuildResult> => {\n if (buildPolicy === \"always\") return runBuild();\n if (currentBuild) return currentBuild;\n if (buildPolicy === \"never\" || buildPolicy === \"if-missing\") {\n const configuration = await loadProjectActionConfiguration(projectRoot);\n const outputDirectory = path.resolve(\n projectRoot,\n options.outputDirectory ?? configuration.outputDirectory ?? DEFAULT_PROJECT_ACTION_OUTPUT_DIRECTORY,\n );\n const loaded = await loadBuild(projectRoot, outputDirectory);\n if (loaded) return (currentBuild = loaded);\n if (buildPolicy === \"never\") {\n throw new Error(`Project Actions have not been built in ${outputDirectory}.`);\n }\n }\n return runBuild();\n };\n const runBuild = async () => {\n currentBuild = await buildProjectActions({\n projectRoot,\n sourceDirectory: options.sourceDirectory,\n outputDirectory: options.outputDirectory,\n });\n return currentBuild;\n };\n\n return {\n build: runBuild,\n async catalog() {\n return (await ensureBuild()).registry;\n },\n async run<TOutput>(request: ProjectActionRunRequest) {\n const built = await ensureBuild();\n const catalogAction = built.registry.actions.find((action) => action.id === request.actionId);\n if (!catalogAction) throw new Error(`Unknown Project Action: ${request.actionId}`);\n const configuredRuntime = resolveProjectActionRuntime(\n await loadProjectActionConfiguration(projectRoot),\n );\n const resolvedRequest: ProjectActionRunRequest = {\n ...request,\n environment: {\n ...configuredRuntime.environment,\n ...(request.environment ?? {}),\n },\n connections: {\n ...configuredRuntime.connections,\n ...(request.connections ?? {}),\n },\n };\n await validateProjectActionRunSetup(projectRoot, catalogAction.setupRequirements, resolvedRequest);\n const runId = request.runId?.trim() || randomUUID();\n const actionOutputDirectory = path.resolve(\n request.outputDirectory ?? path.join(projectRoot, \".openpond\", \"outputs\", runId),\n );\n assertWithinProject(projectRoot, actionOutputDirectory, \"Project Action output directory\");\n await fs.mkdir(actionOutputDirectory, { recursive: true });\n const release = await acquireLocalActionSlot(\n `${projectRoot}\\0${request.actionId}`,\n catalogAction.implementation.concurrency,\n resolvedRequest.signal,\n );\n const responseFile = path.join(built.outputDirectory, `.run-${randomUUID()}.json`);\n const startedAt = Date.now();\n let childResult: Awaited<ReturnType<typeof executeChild>>;\n let payload: {\n ok: true;\n output: TOutput;\n traces: ProjectActionRunResult[\"traces\"];\n outputs: ProjectActionRunResult[\"outputs\"];\n };\n try {\n childResult = await executeChild({\n runnerPath: built.runnerPath,\n cwd: projectRoot,\n signal: resolvedRequest.signal,\n request: {\n actionId: request.actionId,\n input: resolvedRequest.input ?? {},\n runId,\n idempotencyKey: resolvedRequest.idempotencyKey ?? null,\n timeoutMs: resolvedRequest.timeoutMs,\n projectRoot,\n outputDirectory: actionOutputDirectory,\n responseFile,\n environment: resolvedRequest.environment ?? {},\n connections: resolvedRequest.connections ?? {},\n },\n });\n payload = JSON.parse(await fs.readFile(responseFile, \"utf8\")) as typeof payload;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(redactRuntimeValues(message, resolvedRequest));\n } finally {\n await fs.rm(responseFile, { force: true }).catch(() => undefined);\n release();\n }\n return {\n runId,\n actionId: request.actionId,\n status: \"succeeded\",\n output: payload.output,\n stdout: redactRuntimeValues(childResult.stdout, resolvedRequest),\n stderr: redactRuntimeValues(childResult.stderr, resolvedRequest),\n traces: redactRuntimeValue(payload.traces, resolvedRequest),\n outputs: redactRuntimeValue(payload.outputs, resolvedRequest),\n outputDirectory: actionOutputDirectory,\n durationMs: Date.now() - startedAt,\n } satisfies ProjectActionRunResult<TOutput>;\n },\n };\n}\n\nasync function acquireLocalActionSlot(\n key: string,\n limit: number | null,\n signal?: AbortSignal,\n): Promise<() => void> {\n if (limit === null) return () => undefined;\n const state = localConcurrency.get(key) ?? { active: 0, waiting: [] };\n localConcurrency.set(key, state);\n if (state.active >= limit) {\n await new Promise<void>((resolve, reject) => {\n const resume = () => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n };\n const abort = () => {\n const index = state.waiting.indexOf(resume);\n if (index >= 0) state.waiting.splice(index, 1);\n reject(signal?.reason instanceof Error ? signal.reason : new Error(\"Project Action was cancelled.\"));\n };\n if (signal?.aborted) {\n abort();\n return;\n }\n state.waiting.push(resume);\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n } else {\n state.active += 1;\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const next = state.waiting.shift();\n if (next) {\n next();\n return;\n }\n state.active -= 1;\n if (state.active === 0 && state.waiting.length === 0) localConcurrency.delete(key);\n };\n}\n\nasync function loadBuild(\n projectRoot: string,\n outputDirectory: string,\n): Promise<ProjectActionBuildResult | null> {\n const manifestPath = path.join(outputDirectory, \"build-manifest.json\");\n const registryPath = path.join(outputDirectory, \"action-registry.json\");\n const [manifestText, registryText] = await Promise.all([\n fs.readFile(manifestPath, \"utf8\").catch(() => null),\n fs.readFile(registryPath, \"utf8\").catch(() => null),\n ]);\n if (!manifestText || !registryText) return null;\n const manifest = JSON.parse(manifestText) as ProjectActionBuildResult[\"manifest\"];\n const registry = JSON.parse(registryText) as ProjectActionRegistry;\n return {\n projectRoot,\n outputDirectory,\n bundlePath: path.join(outputDirectory, manifest.bundleFile),\n runnerPath: path.join(outputDirectory, manifest.runnerFile),\n registryPath,\n manifestPath,\n registry,\n manifest,\n };\n}\n\nfunction redactRuntimeValues(value: string, request: ProjectActionRunRequest): string {\n let redacted = value;\n for (const secret of runtimeStringValues(request)) {\n if (secret.length >= 4) redacted = redacted.split(secret).join(\"[REDACTED]\");\n }\n return redacted;\n}\n\nfunction redactRuntimeValue<T>(value: T, request: ProjectActionRunRequest): T {\n const serialized = JSON.stringify(value);\n return JSON.parse(redactRuntimeValues(serialized, request)) as T;\n}\n\nfunction runtimeStringValues(request: ProjectActionRunRequest): string[] {\n const values = new Set<string>(Object.values(request.environment ?? {}));\n const visit = (value: unknown) => {\n if (typeof value === \"string\") values.add(value);\n else if (Array.isArray(value)) value.forEach(visit);\n else if (value && typeof value === \"object\") Object.values(value).forEach(visit);\n };\n visit(request.connections ?? {});\n return [...values].filter(Boolean).sort((left, right) => right.length - left.length);\n}\n\nfunction executeChild(input: {\n runnerPath: string;\n cwd: string;\n signal?: AbortSignal;\n request: Record<string, unknown>;\n}): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n if (input.signal?.aborted) {\n reject(input.signal.reason instanceof Error ? input.signal.reason : new Error(\"Project Action was cancelled.\"));\n return;\n }\n let requestJson: string;\n try {\n requestJson = JSON.stringify(input.request);\n } catch (error) {\n reject(new Error(`Project Action request is not serializable: ${error instanceof Error ? error.message : String(error)}`));\n return;\n }\n const child = spawn(process.execPath, [input.runnerPath], {\n cwd: input.cwd,\n env: minimalEnvironment(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => { stdout += chunk; });\n child.stderr.on(\"data\", (chunk: string) => { stderr += chunk; });\n const abort = () => child.kill(\"SIGTERM\");\n input.signal?.addEventListener(\"abort\", abort, { once: true });\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n input.signal?.removeEventListener(\"abort\", abort);\n if (input.signal?.aborted) {\n reject(input.signal.reason instanceof Error ? input.signal.reason : new Error(\"Project Action was cancelled.\"));\n return;\n }\n if (code !== 0) {\n reject(new Error(`Project Action process failed (${code ?? signal ?? \"unknown\"}): ${stderr.trim() || stdout.trim()}`));\n return;\n }\n resolve({ stdout, stderr });\n });\n child.stdin.end(requestJson);\n });\n}\n\nfunction assertWithinProject(projectRoot: string, target: string, label: string): void {\n const relative = path.relative(projectRoot, target);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`${label} must stay inside the Project root.`);\n }\n}\n\nfunction minimalEnvironment(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n for (const name of [\"PATH\", \"SystemRoot\", \"WINDIR\", \"TMPDIR\", \"TEMP\", \"TMP\"]) {\n if (process.env[name] !== undefined) env[name] = process.env[name];\n }\n return env;\n}\n\nexport { buildProjectActions } from \"./build.js\";\nexport {\n loadProjectActionConfiguration,\n PROJECT_ACTION_CONFIG_PATH,\n resolveProjectActionRuntime,\n} from \"./configuration.js\";\nexport type {\n LocalProjectActionRunner,\n ProjectActionBuildManifest,\n ProjectActionBuildResult,\n ProjectActionCatalogEntry,\n ProjectActionRegistry,\n ProjectActionRunRequest,\n ProjectActionRunResult,\n ProjectActionRunnerOptions,\n} from \"./types.js\";\n", "import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { build } from \"esbuild\";\n\nimport { collectProjectActions, createProjectActionRegistry } from \"./catalog.js\";\nimport { loadProjectActionConfiguration } from \"./configuration.js\";\nimport { discoverProjectActionFiles } from \"./discovery.js\";\nimport { canonicalJson, sha256 } from \"./hash.js\";\nimport { validateProjectActionStaticSetup } from \"./setup.js\";\nimport type {\n ProjectActionBuildManifest,\n ProjectActionBuildResult,\n ProjectActionDefinition,\n} from \"./types.js\";\n\nexport const DEFAULT_PROJECT_ACTION_OUTPUT_DIRECTORY = \".openpond/actions\";\n\nexport async function buildProjectActions(input: {\n projectRoot: string;\n sourceDirectory?: string;\n outputDirectory?: string;\n}): Promise<ProjectActionBuildResult> {\n const configuration = await loadProjectActionConfiguration(input.projectRoot);\n const discovered = await discoverProjectActionFiles({\n projectRoot: input.projectRoot,\n sourceDirectory: input.sourceDirectory ?? configuration.sourceDirectory,\n });\n const outputDirectory = path.resolve(\n discovered.projectRoot,\n input.outputDirectory ?? configuration.outputDirectory ?? DEFAULT_PROJECT_ACTION_OUTPUT_DIRECTORY,\n );\n assertWithinProject(discovered.projectRoot, outputDirectory);\n await fs.mkdir(outputDirectory, { recursive: true });\n\n const entryPath = path.join(outputDirectory, \"entry.mjs\");\n const bundlePath = path.join(outputDirectory, \"bundle.mjs\");\n const runnerPath = path.join(outputDirectory, \"runner.mjs\");\n const registryPath = path.join(outputDirectory, \"action-registry.json\");\n const manifestPath = path.join(outputDirectory, \"build-manifest.json\");\n const imports = discovered.files.map((file, index) => {\n const relative = path.relative(outputDirectory, path.join(discovered.projectRoot, file)).split(path.sep).join(\"/\");\n const specifier = relative.startsWith(\".\") ? relative : `./${relative}`;\n return `import * as actionModule${index} from ${JSON.stringify(specifier)};`;\n });\n const modules = discovered.files.map((_file, index) => `actionModule${index}`).join(\", \");\n await fs.writeFile(\n entryPath,\n [\n ...imports,\n `export const projectActionModules = [${modules}];`,\n \"export default projectActionModules;\",\n \"\",\n ].join(\"\\n\"),\n \"utf8\",\n );\n await build({\n entryPoints: [entryPath],\n outfile: bundlePath,\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n target: \"node22.14\",\n sourcemap: false,\n legalComments: \"none\",\n logLevel: \"silent\",\n nodePaths: dependencySearchPaths(discovered.projectRoot),\n });\n const cacheKey = `openpond_action_build=${Date.now()}_${Math.random().toString(16).slice(2)}`;\n const loaded = await import(`${pathToFileURL(bundlePath).href}?${cacheKey}`) as {\n projectActionModules?: unknown[];\n default?: unknown[];\n };\n const actions = collectProjectActions(loaded.projectActionModules ?? loaded.default ?? []);\n for (const action of actions) {\n await validateProjectActionStaticSetup(discovered.projectRoot, action.setup);\n }\n const registry = createProjectActionRegistry(actions);\n await fs.writeFile(registryPath, canonicalJson(registry), \"utf8\");\n await fs.writeFile(runnerPath, runtimeSource(), { encoding: \"utf8\", mode: 0o755 });\n\n const bundleHash = sha256(await fs.readFile(bundlePath));\n const registryHash = sha256(canonicalJson(registry));\n const manifest: ProjectActionBuildManifest = {\n schemaVersion: \"openpond.projectActionBuild.v1\",\n sourceDirectory: path.relative(discovered.projectRoot, discovered.sourceRoot).split(path.sep).join(\"/\"),\n sourceFiles: discovered.files,\n bundleFile: path.basename(bundlePath),\n runnerFile: path.basename(runnerPath),\n registryFile: path.basename(registryPath),\n bundleHash,\n registryHash,\n };\n await fs.writeFile(manifestPath, canonicalJson(manifest), \"utf8\");\n await fs.rm(entryPath, { force: true });\n return {\n projectRoot: discovered.projectRoot,\n outputDirectory,\n bundlePath,\n runnerPath,\n registryPath,\n manifestPath,\n registry,\n manifest,\n };\n}\n\nfunction dependencySearchPaths(projectRoot: string): string[] {\n const candidates: string[] = [];\n let current = projectRoot;\n while (true) {\n candidates.push(path.join(current, \"node_modules\"));\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n candidates.push(path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../../../node_modules\"));\n return [...new Set(candidates)];\n}\n\nexport async function loadBuiltProjectActions(\n bundlePath: string,\n): Promise<ProjectActionDefinition[]> {\n const stats = await fs.stat(bundlePath).catch(() => null);\n if (!stats?.isFile()) throw new Error(`Project Action bundle does not exist: ${bundlePath}`);\n const loaded = await import(`${pathToFileURL(bundlePath).href}?openpond_action_load=${Date.now()}`) as {\n projectActionModules?: unknown[];\n default?: unknown[];\n };\n return collectProjectActions(loaded.projectActionModules ?? loaded.default ?? []);\n}\n\nfunction assertWithinProject(projectRoot: string, target: string): void {\n const relative = path.relative(projectRoot, target);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(\"Project Action output directory must stay inside the Project root.\");\n }\n}\n\nfunction runtimeSource(): string {\n return `#!/usr/bin/env node\nimport { promises as fs } from \"node:fs\";\nimport { stdin } from \"node:process\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nlet requestText = \"\";\nstdin.setEncoding(\"utf8\");\nfor await (const chunk of stdin) requestText += chunk;\nconst request = JSON.parse(requestText);\nconst bundlePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"bundle.mjs\");\nconst loaded = await import(pathToFileURL(bundlePath).href);\nconst values = [];\nconst seen = new Set();\nconst visit = (value) => {\n if (seen.has(value)) return;\n if (value && (typeof value === \"object\" || typeof value === \"function\")) seen.add(value);\n if (value?.kind === \"openpond-project-action\" && typeof value.run === \"function\") { values.push(value); return; }\n if (Array.isArray(value)) { value.forEach(visit); return; }\n if (value && typeof value === \"object\") Object.values(value).forEach(visit);\n};\n(loaded.projectActionModules ?? loaded.default ?? []).forEach(visit);\nconst action = values.find((candidate) => candidate.id === request.actionId);\nif (!action) throw new Error(\\`Unknown Project Action: \\${request.actionId}\\`);\nconst controller = new AbortController();\nconst timeoutMs = Math.min(request.timeoutMs ?? action.timeoutMs, action.timeoutMs);\nconst timer = setTimeout(() => controller.abort(new Error(\\`Project Action timed out after \\${timeoutMs}ms.\\`)), timeoutMs);\nconst traces = [];\nconst outputs = [];\nconst env = request.environment ?? {};\nconst connections = request.connections ?? {};\nconst context = {\n runId: request.runId,\n actionId: action.id,\n idempotencyKey: request.idempotencyKey ?? null,\n projectRoot: request.projectRoot,\n outputDirectory: request.outputDirectory,\n signal: controller.signal,\n env(name) { return Object.prototype.hasOwnProperty.call(env, name) ? env[name] : undefined; },\n connection(name) {\n if (!Object.prototype.hasOwnProperty.call(connections, name)) throw new Error(\\`Project Action connection is not configured: \\${name}\\`);\n return connections[name];\n },\n trace(name, payload) { traces.push({ name, ...(payload ? { payload } : {}), timestamp: new Date().toISOString() }); },\n output(value) {\n if (!value || typeof value.path !== \"string\" || !value.path.trim()) throw new Error(\"Project Action output requires a path.\");\n const outputPath = path.resolve(request.outputDirectory, value.path);\n const relative = path.relative(request.outputDirectory, outputPath);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) throw new Error(\"Project Action output must stay inside the run output directory.\");\n outputs.push({ ...value, path: relative.split(path.sep).join(\"/\") });\n },\n};\ntry {\n const input = action.inputSchema.parse(request.input ?? {});\n const result = await Promise.race([\n Promise.resolve(action.run(context, input)),\n new Promise((_, reject) => controller.signal.addEventListener(\"abort\", () => reject(controller.signal.reason), { once: true })),\n ]);\n const output = action.outputSchema.parse(result);\n for (const artifact of outputs) {\n const stats = await fs.stat(path.resolve(request.outputDirectory, artifact.path)).catch(() => null);\n if (!stats?.isFile()) throw new Error(\\`Project Action output does not exist: \\${artifact.path}\\`);\n }\n await fs.writeFile(request.responseFile, JSON.stringify({ ok: true, output, traces, outputs }), \"utf8\");\n} finally {\n clearTimeout(timer);\n}\n`;\n}\n", "import { z } from \"zod\";\n\nimport type { ProjectActionSchema } from \"./types.js\";\n\nexport function projectActionJsonSchema(schema: ProjectActionSchema): Record<string, unknown> {\n return z.toJSONSchema(schema, { unrepresentable: \"any\" }) as Record<string, unknown>;\n}\n\nexport function parseProjectActionValue(schema: ProjectActionSchema, value: unknown): unknown {\n return schema.parse(value);\n}\n", "import { isProjectActionDefinition } from \"./define-action.js\";\nimport { projectActionJsonSchema } from \"./schema.js\";\nimport type {\n ProjectActionCatalogEntry,\n ProjectActionDefinition,\n ProjectActionRegistry,\n} from \"./types.js\";\n\nexport function collectProjectActions(modules: unknown[]): ProjectActionDefinition[] {\n const actions: ProjectActionDefinition[] = [];\n const seenObjects = new Set<unknown>();\n const visit = (value: unknown) => {\n if (seenObjects.has(value)) return;\n if (value && (typeof value === \"object\" || typeof value === \"function\")) seenObjects.add(value);\n if (isProjectActionDefinition(value)) {\n actions.push(value);\n return;\n }\n if (Array.isArray(value)) {\n value.forEach(visit);\n return;\n }\n if (value && typeof value === \"object\") Object.values(value).forEach(visit);\n };\n modules.forEach(visit);\n const byId = new Map<string, ProjectActionDefinition>();\n for (const action of actions) {\n if (byId.has(action.id)) throw new Error(`Duplicate Project Action id: ${action.id}`);\n byId.set(action.id, action);\n }\n return [...byId.values()].sort((left, right) => left.id.localeCompare(right.id));\n}\n\nexport function createProjectActionRegistry(\n actions: readonly ProjectActionDefinition[],\n): ProjectActionRegistry {\n return {\n schemaVersion: \"openpond.projectActionRegistry.v1\",\n actions: actions.map(toCatalogEntry),\n };\n}\n\nfunction toCatalogEntry(action: ProjectActionDefinition): ProjectActionCatalogEntry {\n return {\n id: action.id,\n sourceActionId: action.id,\n name: action.id,\n label: action.label,\n description: action.description,\n visibility: \"default\",\n inputSchema: projectActionJsonSchema(action.inputSchema),\n outputSchema: projectActionJsonSchema(action.outputSchema),\n approvalPolicy: {\n ...action.approval,\n required: action.approval.mode === \"always\" || action.approval.mode === \"sensitive\" ||\n (action.approval.mode === \"writes\" && action.behavior === \"write\"),\n risk: action.behavior,\n },\n artifactPolicy: {\n outputArtifacts: [],\n persistRunSummary: true,\n persistTrace: true,\n },\n setupRequirements: [...action.setup],\n mcp: { enabled: false },\n schedulePolicy: { enabled: false, allowAdHoc: true },\n trace: { name: action.id, namespace: \"project-actions\" },\n implementation: {\n type: \"openpond-project-action\",\n actionId: action.id,\n behavior: action.behavior,\n timeoutMs: action.timeoutMs,\n concurrency: action.concurrency,\n },\n invokesModel: action.invokesModel,\n };\n}\n", "import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nconst ACTION_FILE = /\\.(?:[cm]?[jt]s)$/i;\nconst IGNORED_FILE = /(?:\\.d\\.ts|\\.test\\.[cm]?[jt]s|\\.spec\\.[cm]?[jt]s)$/i;\n\nexport async function discoverProjectActionFiles(input: {\n projectRoot: string;\n sourceDirectory?: string;\n}): Promise<{ projectRoot: string; sourceRoot: string; files: string[] }> {\n const projectRoot = path.resolve(input.projectRoot);\n const sourceRoot = path.resolve(projectRoot, input.sourceDirectory ?? \"openpond/actions\");\n if (!isWithin(projectRoot, sourceRoot)) {\n throw new Error(\"Project Action source directory must stay inside the Project root.\");\n }\n const stats = await fs.stat(sourceRoot).catch(() => null);\n if (!stats?.isDirectory()) {\n throw new Error(`Project Action source directory does not exist: ${sourceRoot}`);\n }\n const files = await walk(sourceRoot);\n const actions = files\n .filter((file) => ACTION_FILE.test(file) && !IGNORED_FILE.test(file))\n .map((file) => path.relative(projectRoot, file).split(path.sep).join(\"/\"))\n .sort();\n if (actions.length === 0) {\n throw new Error(`No Project Action files were found under ${sourceRoot}.`);\n }\n return { projectRoot, sourceRoot, files: actions };\n}\n\nasync function walk(directory: string): Promise<string[]> {\n const entries = await fs.readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const target = path.join(directory, entry.name);\n if (entry.isDirectory()) files.push(...(await walk(target)));\n else if (entry.isFile()) files.push(target);\n }\n return files;\n}\n\nfunction isWithin(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n", "import { createHash } from \"node:crypto\";\n\nexport function sha256(value: string | Uint8Array): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function canonicalJson(value: unknown): string {\n return `${JSON.stringify(sortValue(value), null, 2)}\\n`;\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, child]) => [key, sortValue(child)]),\n );\n}\n", "import { promises as fs } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport type {\n ProjectActionRunRequest,\n ProjectActionSetupRequirement,\n} from \"./types.js\";\n\nexport async function validateProjectActionStaticSetup(\n projectRoot: string,\n requirements: readonly ProjectActionSetupRequirement[],\n): Promise<void> {\n for (const requirement of requirements) {\n if (requirement.required === false) continue;\n if (requirement.kind === \"package\") {\n try {\n createRequire(path.join(projectRoot, \"package.json\")).resolve(requirement.name);\n } catch {\n throw new Error(`Project Action package is not installed: ${requirement.name}`);\n }\n }\n if (requirement.kind === \"native_tool\" && !(await executableExists(requirement.name))) {\n throw new Error(`Project Action native tool is not installed: ${requirement.name}`);\n }\n }\n}\n\nexport async function validateProjectActionRunSetup(\n projectRoot: string,\n requirements: readonly ProjectActionSetupRequirement[],\n request: ProjectActionRunRequest,\n): Promise<void> {\n await validateProjectActionStaticSetup(projectRoot, requirements);\n for (const requirement of requirements) {\n if (requirement.required === false) continue;\n if (requirement.kind === \"connection\" && !(requirement.name in (request.connections ?? {}))) {\n throw new Error(`Project Action connection is not configured: ${requirement.name}`);\n }\n if (requirement.kind === \"env\" && !(requirement.name in (request.environment ?? {}))) {\n throw new Error(`Project Action environment value is not configured: ${requirement.name}`);\n }\n }\n}\n\nasync function executableExists(name: string): Promise<boolean> {\n if (!name.trim() || name.includes(\"/\") || name.includes(\"\\\\\")) return false;\n for (const directory of (process.env.PATH ?? \"\").split(path.delimiter).filter(Boolean)) {\n const candidates = process.platform === \"win32\"\n ? (process.env.PATHEXT ?? \".EXE;.CMD;.BAT;.COM\").split(\";\").map((extension) => path.join(directory, `${name}${extension}`))\n : [path.join(directory, name)];\n for (const candidate of candidates) {\n if (await fs.access(candidate).then(() => true).catch(() => false)) return true;\n }\n }\n return false;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fs", "path", "fs", "path", "fs", "path", "path", "fs", "path", "path", "assertWithinProject", "fs"]
|
|
7
7
|
}
|
package/dist/actions.js
CHANGED
|
@@ -1,95 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const normalizedId = id.trim();
|
|
6
|
-
if (!ACTION_ID.test(normalizedId) || normalizedId.length > 191) {
|
|
7
|
-
throw new Error(
|
|
8
|
-
`Invalid Project Action id ${JSON.stringify(id)}. Use a lowercase stable id such as analytics.get_summary.`
|
|
9
|
-
);
|
|
10
|
-
}
|
|
11
|
-
const description = options.description.trim();
|
|
12
|
-
if (!description) throw new Error(`Project Action ${normalizedId} requires a description.`);
|
|
13
|
-
if (description.length > 1e3) throw new Error(`Project Action ${normalizedId} description must be at most 1000 characters.`);
|
|
14
|
-
if (!(options.input instanceof z.ZodType)) {
|
|
15
|
-
throw new Error(`Project Action ${normalizedId} input must be a Zod schema.`);
|
|
16
|
-
}
|
|
17
|
-
if (!(options.output instanceof z.ZodType)) {
|
|
18
|
-
throw new Error(`Project Action ${normalizedId} output must be a Zod schema.`);
|
|
19
|
-
}
|
|
20
|
-
if (typeof options.run !== "function") {
|
|
21
|
-
throw new Error(`Project Action ${normalizedId} requires a run function.`);
|
|
22
|
-
}
|
|
23
|
-
const behavior = options.behavior ?? "read";
|
|
24
|
-
if (behavior !== "read" && behavior !== "write") {
|
|
25
|
-
throw new Error(`Project Action ${normalizedId} behavior must be read or write.`);
|
|
26
|
-
}
|
|
27
|
-
const approval = options.approval ?? {
|
|
28
|
-
mode: behavior === "write" ? "writes" : "never"
|
|
29
|
-
};
|
|
30
|
-
if (!["never", "always", "writes", "sensitive"].includes(approval.mode)) {
|
|
31
|
-
throw new Error(`Project Action ${normalizedId} has an invalid approval mode.`);
|
|
32
|
-
}
|
|
33
|
-
const label = options.label?.trim() || titleFromId(normalizedId);
|
|
34
|
-
if (label.length > 160) throw new Error(`Project Action ${normalizedId} label must be at most 160 characters.`);
|
|
35
|
-
const timeoutMs = options.timeoutMs ?? 6e4;
|
|
36
|
-
if (!Number.isInteger(timeoutMs) || timeoutMs < 1e3 || timeoutMs > 36e5) {
|
|
37
|
-
throw new Error(`Project Action ${normalizedId} timeoutMs must be between 1000 and 3600000.`);
|
|
38
|
-
}
|
|
39
|
-
const concurrency = options.concurrency ?? null;
|
|
40
|
-
if (concurrency !== null && (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 1e3)) {
|
|
41
|
-
throw new Error(`Project Action ${normalizedId} concurrency must be null or an integer from 1 to 1000.`);
|
|
42
|
-
}
|
|
43
|
-
const setup = [...options.setup ?? []];
|
|
44
|
-
const setupKeys = /* @__PURE__ */ new Set();
|
|
45
|
-
for (const requirement of setup) {
|
|
46
|
-
if (!["connection", "env", "package", "native_tool"].includes(requirement.kind)) {
|
|
47
|
-
throw new Error(`Project Action ${normalizedId} has an invalid setup requirement kind.`);
|
|
48
|
-
}
|
|
49
|
-
if (!requirement.name?.trim()) {
|
|
50
|
-
throw new Error(`Project Action ${normalizedId} has a setup requirement without a name.`);
|
|
51
|
-
}
|
|
52
|
-
const key = `${requirement.kind}:${requirement.name}`;
|
|
53
|
-
if (setupKeys.has(key)) throw new Error(`Project Action ${normalizedId} repeats setup requirement ${key}.`);
|
|
54
|
-
setupKeys.add(key);
|
|
55
|
-
}
|
|
56
|
-
return Object.freeze({
|
|
57
|
-
kind: "openpond-project-action",
|
|
58
|
-
id: normalizedId,
|
|
59
|
-
label,
|
|
60
|
-
description,
|
|
61
|
-
behavior,
|
|
62
|
-
inputSchema: options.input,
|
|
63
|
-
outputSchema: options.output,
|
|
64
|
-
approval,
|
|
65
|
-
setup: Object.freeze(setup),
|
|
66
|
-
invokesModel: options.invokesModel ?? false,
|
|
67
|
-
timeoutMs,
|
|
68
|
-
concurrency,
|
|
69
|
-
run: options.run
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
function isProjectActionDefinition(value) {
|
|
73
|
-
return Boolean(
|
|
74
|
-
value && typeof value === "object" && value.kind === "openpond-project-action" && typeof value.id === "string" && typeof value.run === "function"
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
function titleFromId(id) {
|
|
78
|
-
return id.split(/[._-]/g).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// ../actions/src/configuration.ts
|
|
82
|
-
import { z as z2 } from "zod";
|
|
83
|
-
var connectionSchema = z2.object({
|
|
84
|
-
values: z2.record(z2.string(), z2.unknown()).optional().default({}),
|
|
85
|
-
environment: z2.record(z2.string(), z2.string().trim().min(1)).optional().default({})
|
|
86
|
-
}).strict();
|
|
87
|
-
var configSchema = z2.object({
|
|
88
|
-
sourceDirectory: z2.string().trim().min(1).optional(),
|
|
89
|
-
outputDirectory: z2.string().trim().min(1).optional(),
|
|
90
|
-
environment: z2.record(z2.string(), z2.string().trim().min(1)).optional().default({}),
|
|
91
|
-
connections: z2.record(z2.string(), connectionSchema).optional().default({})
|
|
92
|
-
}).strict();
|
|
1
|
+
import {
|
|
2
|
+
defineAction,
|
|
3
|
+
isProjectActionDefinition
|
|
4
|
+
} from "./chunk-P27DQ65Z.js";
|
|
93
5
|
export {
|
|
94
6
|
defineAction,
|
|
95
7
|
isProjectActionDefinition
|
package/dist/actions.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": [
|
|
3
|
+
"sources": [],
|
|
4
|
+
"sourcesContent": [],
|
|
5
|
+
"mappings": "",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {
|
|
2
|
+
apiFetch,
|
|
3
|
+
readApiJson
|
|
4
|
+
} from "./chunk-APHPXQEA.js";
|
|
5
|
+
|
|
6
|
+
// src/project-actions.ts
|
|
7
|
+
import { promises as fs } from "node:fs";
|
|
8
|
+
var OpenPondProjectActionsClient = class {
|
|
9
|
+
#apiKey;
|
|
10
|
+
#apiBaseUrl;
|
|
11
|
+
constructor(input) {
|
|
12
|
+
this.#apiKey = input.apiKey;
|
|
13
|
+
this.#apiBaseUrl = input.apiBaseUrl.replace(/\/+$/, "");
|
|
14
|
+
}
|
|
15
|
+
async list(input) {
|
|
16
|
+
const response = await apiFetch(
|
|
17
|
+
this.#apiBaseUrl,
|
|
18
|
+
this.#apiKey,
|
|
19
|
+
projectActionPath(input.projectId, "releases", input.teamId)
|
|
20
|
+
);
|
|
21
|
+
return (await readApiJson(response, "List Project Action releases")).releases;
|
|
22
|
+
}
|
|
23
|
+
async catalog(input) {
|
|
24
|
+
const response = await apiFetch(
|
|
25
|
+
this.#apiBaseUrl,
|
|
26
|
+
this.#apiKey,
|
|
27
|
+
projectActionPath(input.projectId, "catalog", input.teamId)
|
|
28
|
+
);
|
|
29
|
+
return (await readApiJson(response, "Get Project Action catalog")).catalog;
|
|
30
|
+
}
|
|
31
|
+
async publish(input) {
|
|
32
|
+
const [bundle, runner] = await Promise.all([
|
|
33
|
+
fs.readFile(input.build.bundlePath),
|
|
34
|
+
fs.readFile(input.build.runnerPath)
|
|
35
|
+
]);
|
|
36
|
+
const response = await apiFetch(
|
|
37
|
+
this.#apiBaseUrl,
|
|
38
|
+
this.#apiKey,
|
|
39
|
+
projectActionPath(input.projectId, "releases", input.teamId),
|
|
40
|
+
{
|
|
41
|
+
method: "POST",
|
|
42
|
+
body: JSON.stringify({
|
|
43
|
+
sourceRef: input.sourceRef,
|
|
44
|
+
sourceCommitSha: input.sourceCommitSha,
|
|
45
|
+
bundleBase64: bundle.toString("base64"),
|
|
46
|
+
runnerBase64: runner.toString("base64"),
|
|
47
|
+
registry: input.build.registry,
|
|
48
|
+
manifest: input.build.manifest,
|
|
49
|
+
metadata: input.metadata
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
return (await readApiJson(response, "Publish Project Actions")).release;
|
|
54
|
+
}
|
|
55
|
+
async run(input) {
|
|
56
|
+
const response = await apiFetch(
|
|
57
|
+
this.#apiBaseUrl,
|
|
58
|
+
this.#apiKey,
|
|
59
|
+
projectActionPath(input.projectId, `actions/${encodeURIComponent(input.actionId)}`, input.teamId),
|
|
60
|
+
{
|
|
61
|
+
method: "POST",
|
|
62
|
+
body: JSON.stringify({
|
|
63
|
+
input: input.value ?? {},
|
|
64
|
+
releaseId: input.releaseId,
|
|
65
|
+
idempotencyKey: input.idempotencyKey,
|
|
66
|
+
callerType: input.callerType ?? "sdk",
|
|
67
|
+
callerId: input.callerId
|
|
68
|
+
}),
|
|
69
|
+
signal: input.signal,
|
|
70
|
+
timeoutMs: 15 * 60 * 1e3
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
return (await readApiJson(response, "Run Project Action")).invocation;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
function projectActionPath(projectId, suffix, teamId) {
|
|
77
|
+
return `/v1/project-actions/${encodeURIComponent(projectId)}/${suffix}?teamId=${encodeURIComponent(teamId)}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
OpenPondProjectActionsClient
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=chunk-27ETSPHQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/project-actions.ts"],
|
|
4
|
+
"sourcesContent": ["import { promises as fs } from \"node:fs\";\n\nimport { apiFetch, readApiJson } from \"@openpond/cloud/api/core\";\n\nimport type { ProjectActionBuildResult, ProjectActionRegistry } from \"../../actions/src/types.js\";\n\nexport type ProjectActionRelease = {\n id: string;\n projectId: string;\n sourceCommitSha: string;\n bundleHash: string;\n registryHash: string;\n status: string;\n createdAt: string;\n};\n\nexport type HostedProjectActionCatalog = {\n releaseId: string;\n sourceCommitSha: string;\n bundleHash: string;\n registryHash: string;\n registry: ProjectActionRegistry;\n};\n\nexport type ProjectActionInvocation<TOutput = Record<string, unknown>> = {\n id: string;\n releaseId: string;\n projectId: string;\n actionId: string;\n status: \"running\" | \"succeeded\" | \"failed\";\n resultJson: TOutput;\n traceJson: Record<string, unknown>[];\n outputJson: Record<string, unknown>[];\n failureCode?: string | null;\n failureMessage?: string | null;\n};\n\ntype ProjectActionClientInput = {\n apiKey: string;\n apiBaseUrl: string;\n};\n\nexport class OpenPondProjectActionsClient {\n readonly #apiKey: string;\n readonly #apiBaseUrl: string;\n\n constructor(input: ProjectActionClientInput) {\n this.#apiKey = input.apiKey;\n this.#apiBaseUrl = input.apiBaseUrl.replace(/\\/+$/, \"\");\n }\n\n async list(input: { projectId: string; teamId: string }): Promise<ProjectActionRelease[]> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"releases\", input.teamId),\n );\n return (await readApiJson<{ releases: ProjectActionRelease[] }>(response, \"List Project Action releases\")).releases;\n }\n\n async catalog(input: { projectId: string; teamId: string }): Promise<HostedProjectActionCatalog> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"catalog\", input.teamId),\n );\n return (await readApiJson<{ catalog: HostedProjectActionCatalog }>(response, \"Get Project Action catalog\")).catalog;\n }\n\n async publish(input: {\n projectId: string;\n teamId: string;\n sourceRef: string;\n sourceCommitSha: string;\n build: ProjectActionBuildResult;\n metadata?: Record<string, unknown>;\n }): Promise<ProjectActionRelease> {\n const [bundle, runner] = await Promise.all([\n fs.readFile(input.build.bundlePath),\n fs.readFile(input.build.runnerPath),\n ]);\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"releases\", input.teamId),\n {\n method: \"POST\",\n body: JSON.stringify({\n sourceRef: input.sourceRef,\n sourceCommitSha: input.sourceCommitSha,\n bundleBase64: bundle.toString(\"base64\"),\n runnerBase64: runner.toString(\"base64\"),\n registry: input.build.registry,\n manifest: input.build.manifest,\n metadata: input.metadata,\n }),\n },\n );\n return (await readApiJson<{ release: ProjectActionRelease }>(response, \"Publish Project Actions\")).release;\n }\n\n async run<TOutput = Record<string, unknown>>(input: {\n projectId: string;\n teamId: string;\n actionId: string;\n value?: Record<string, unknown>;\n releaseId?: string;\n idempotencyKey?: string;\n callerType?: \"sdk\" | \"work\" | \"scheduled_work\" | \"website\" | \"internal\";\n callerId?: string;\n signal?: AbortSignal;\n }): Promise<ProjectActionInvocation<TOutput>> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, `actions/${encodeURIComponent(input.actionId)}`, input.teamId),\n {\n method: \"POST\",\n body: JSON.stringify({\n input: input.value ?? {},\n releaseId: input.releaseId,\n idempotencyKey: input.idempotencyKey,\n callerType: input.callerType ?? \"sdk\",\n callerId: input.callerId,\n }),\n signal: input.signal,\n timeoutMs: 15 * 60 * 1000,\n },\n );\n return (await readApiJson<{ invocation: ProjectActionInvocation<TOutput> }>(response, \"Run Project Action\")).invocation;\n }\n}\n\nfunction projectActionPath(projectId: string, suffix: string, teamId: string): string {\n return `/v1/project-actions/${encodeURIComponent(projectId)}/${suffix}?teamId=${encodeURIComponent(teamId)}`;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AAAA,SAAS,YAAY,UAAU;AA0CxB,IAAM,+BAAN,MAAmC;AAAA,EAC/B;AAAA,EACA;AAAA,EAET,YAAY,OAAiC;AAC3C,SAAK,UAAU,MAAM;AACrB,SAAK,cAAc,MAAM,WAAW,QAAQ,QAAQ,EAAE;AAAA,EACxD;AAAA,EAEA,MAAM,KAAK,OAA+E;AACxF,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,kBAAkB,MAAM,WAAW,YAAY,MAAM,MAAM;AAAA,IAC7D;AACA,YAAQ,MAAM,YAAkD,UAAU,8BAA8B,GAAG;AAAA,EAC7G;AAAA,EAEA,MAAM,QAAQ,OAAmF;AAC/F,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,kBAAkB,MAAM,WAAW,WAAW,MAAM,MAAM;AAAA,IAC5D;AACA,YAAQ,MAAM,YAAqD,UAAU,4BAA4B,GAAG;AAAA,EAC9G;AAAA,EAEA,MAAM,QAAQ,OAOoB;AAChC,UAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACzC,GAAG,SAAS,MAAM,MAAM,UAAU;AAAA,MAClC,GAAG,SAAS,MAAM,MAAM,UAAU;AAAA,IACpC,CAAC;AACD,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,kBAAkB,MAAM,WAAW,YAAY,MAAM,MAAM;AAAA,MAC3D;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB,WAAW,MAAM;AAAA,UACjB,iBAAiB,MAAM;AAAA,UACvB,cAAc,OAAO,SAAS,QAAQ;AAAA,UACtC,cAAc,OAAO,SAAS,QAAQ;AAAA,UACtC,UAAU,MAAM,MAAM;AAAA,UACtB,UAAU,MAAM,MAAM;AAAA,UACtB,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AACA,YAAQ,MAAM,YAA+C,UAAU,yBAAyB,GAAG;AAAA,EACrG;AAAA,EAEA,MAAM,IAAuC,OAUC;AAC5C,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,kBAAkB,MAAM,WAAW,WAAW,mBAAmB,MAAM,QAAQ,CAAC,IAAI,MAAM,MAAM;AAAA,MAChG;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,MAAM,SAAS,CAAC;AAAA,UACvB,WAAW,MAAM;AAAA,UACjB,gBAAgB,MAAM;AAAA,UACtB,YAAY,MAAM,cAAc;AAAA,UAChC,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA,QACD,QAAQ,MAAM;AAAA,QACd,WAAW,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AACA,YAAQ,MAAM,YAA8D,UAAU,oBAAoB,GAAG;AAAA,EAC/G;AACF;AAEA,SAAS,kBAAkB,WAAmB,QAAgB,QAAwB;AACpF,SAAO,uBAAuB,mBAAmB,SAAS,CAAC,IAAI,MAAM,WAAW,mBAAmB,MAAM,CAAC;AAC5G;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|