@jiggai/kitchen 0.3.8 → 0.3.9
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +1 -1
- package/.next/server/app/channels.segments/_full.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/goals/new.html +2 -2
- package/.next/server/app/goals/new.rsc +1 -1
- package/.next/server/app/goals/new.segments/_full.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +1 -1
- package/.next/server/app/goals.segments/_full.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map +1 -1
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +1 -1
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/static/chunks/{8683ed0404be8cb7.js → 42b3230688d0834c.js} +1 -1
- package/README.md +4 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- /package/.next/static/{rZ9CCEgFiMjcIjsKtAtE0 → AKnetF2w3rOYqZBVpzsLP}/_buildManifest.js +0 -0
- /package/.next/static/{rZ9CCEgFiMjcIjsKtAtE0 → AKnetF2w3rOYqZBVpzsLP}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{rZ9CCEgFiMjcIjsKtAtE0 → AKnetF2w3rOYqZBVpzsLP}/_ssgManifest.js +0 -0
package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../src/app/api/teams/workflow-runs/route.ts","../../../src/lib/workflows/runs-storage.ts"],"sourcesContent":["import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/teams/workflow-runs/route\",\n pathname: \"/api/teams/workflow-runs\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/src/app/api/teams/workflow-runs/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/teams/workflow-runs/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import { NextResponse } from \"next/server\";\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { jsonOkRest, parseJsonBody } from \"@/lib/api-route-helpers\";\nimport { handleWorkflowRunsGet } from \"@/lib/workflows/api-handlers\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { toolsInvoke } from \"@/lib/gateway\";\nimport { runOpenClaw } from \"@/lib/openclaw\";\nimport { assertSafeRelativeFileName, getTeamWorkspaceDir } from \"@/lib/paths\";\nimport { listWorkflowRuns, readWorkflowRun, writeWorkflowRun } from \"@/lib/workflows/runs-storage\";\nimport type { WorkflowRunFileV1, WorkflowRunNodeResultV1 } from \"@/lib/workflows/runs-types\";\nimport { readWorkflow } from \"@/lib/workflows/storage\";\nimport type { WorkflowFileV1 } from \"@/lib/workflows/types\";\n\nfunction nowIso() {\n return new Date().toISOString();\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === \"object\" && !Array.isArray(v);\n}\n\nasync function appendTeamFile(teamId: string, relPath: string, content: string) {\n const safe = assertSafeRelativeFileName(relPath);\n const teamDir = await getTeamWorkspaceDir(teamId);\n const full = path.join(teamDir, safe);\n await fs.mkdir(path.dirname(full), { recursive: true });\n await fs.appendFile(full, content, \"utf8\");\n return { full };\n}\n\nfunction templateReplace(input: string, vars: Record<string, string>) {\n let out = input;\n for (const [k, v] of Object.entries(vars)) {\n out = out.replaceAll(`{{${k}}}`, v);\n }\n return out;\n}\n\n\n// v2 runner-only execution: Kitchen never executes workflow tool nodes.\n// These helpers exist only to support approval node UX (best-effort outbound notification metadata).\nasync function resolveApprovalChannel({\n workflow,\n}: {\n workflow: WorkflowFileV1;\n}): Promise<{ provider: string | null; target: string | null }> {\n // Best-effort: allow workflow.meta.approvalChannel to declare a delivery target.\n const meta = workflow.meta && typeof workflow.meta === \"object\" ? (workflow.meta as Record<string, unknown>) : {};\n const approvalChannel = typeof meta.approvalChannel === \"string\" ? meta.approvalChannel.trim() : \"\";\n if (!approvalChannel) return { provider: null, target: null };\n\n // Format: \"telegram:-100123456\" or just \"-100123456\".\n if (approvalChannel.includes(\":\")) {\n const [provider, target] = approvalChannel.split(\":\", 2);\n return { provider: provider || null, target: target || null };\n }\n\n return { provider: \"telegram\", target: approvalChannel };\n}\n\nasync function maybeSendApprovalRequest(_args: {\n teamId: string;\n workflow: WorkflowFileV1;\n run: WorkflowRunFileV1;\n approvalNodeId: string;\n}) {\n // Intentionally NO-OP for now.\n // The runner will handle any external messaging; Kitchen only records state.\n if (!_args) return;\n}\n\nfunction asStringArray(v: unknown): string[] {\n if (!Array.isArray(v)) return [];\n return v.map((x) => String(x ?? \"\").trim()).filter(Boolean);\n}\n\nfunction parseExecCommandFromArgs(\n args: Record<string, unknown>\n): { command: string; bin: string; argv?: string[] } {\n const commandArray = Array.isArray(args.commandArray) ? args.commandArray : Array.isArray(args.command) ? args.command : null;\n if (commandArray && commandArray.length) {\n const parts = commandArray.map((x: unknown) => String(x ?? \"\").trim()).filter(Boolean);\n if (!parts.length) throw new Error(\"runtime.exec requires a non-empty command\");\n return { command: parts.join(\" \"), bin: path.basename(parts[0]), argv: parts };\n }\n\n const cmd = String(args.command ?? \"\").trim();\n if (!cmd) throw new Error(\"runtime.exec requires args.command\");\n const first = cmd.split(/\\s+/)[0] || \"\";\n const bin = path.basename(first);\n return { command: cmd, bin };\n}\n\nasync function execLocal({\n command,\n argv,\n cwd,\n timeoutMs,\n}: {\n command: string;\n argv?: string[];\n cwd?: string;\n timeoutMs: number;\n}): Promise<{ stdout: string; stderr: string; exitCode: number | null; signal: string | null }> {\n // Keep this intentionally simple + safe:\n // - default to argv (no shell) when provided\n // - if only a string is provided, split on whitespace (still no shell)\n const parts = argv && argv.length ? argv : command.split(/\\s+/).filter(Boolean);\n const file = parts[0];\n const fileArgs = parts.slice(1);\n\n return await new Promise((resolve, reject) => {\n const child = spawn(file, fileArgs, {\n cwd,\n shell: false,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n const maxBytes = 64 * 1024;\n child.stdout?.on(\"data\", (b: Buffer) => {\n if (stdout.length < maxBytes) stdout += b.toString(\"utf8\").slice(0, maxBytes - stdout.length);\n });\n child.stderr?.on(\"data\", (b: Buffer) => {\n if (stderr.length < maxBytes) stderr += b.toString(\"utf8\").slice(0, maxBytes - stderr.length);\n });\n\n const t = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, Math.max(0, timeoutMs));\n\n child.on(\"error\", (e) => {\n clearTimeout(t);\n reject(e);\n });\n\n child.on(\"close\", (code, signal) => {\n clearTimeout(t);\n resolve({ stdout, stderr, exitCode: code, signal });\n });\n });\n}\n\nfunction resolveExecPolicy(workflow: WorkflowFileV1, nodeCfg: Record<string, unknown>) {\n const meta = isRecord(workflow.meta) ? workflow.meta : {};\n\n const metaAllowBins = asStringArray((meta as Record<string, unknown>).execAllowBins);\n const metaAllowCommands = asStringArray((meta as Record<string, unknown>).execAllowCommands);\n\n // Node overrides/adds.\n const nodeAllowBins = asStringArray(nodeCfg.execAllowBins);\n const nodeAllowCommands = asStringArray(nodeCfg.execAllowCommands);\n\n return {\n allowBins: new Set([...metaAllowBins, ...nodeAllowBins]),\n allowCommands: new Set([...metaAllowCommands, ...nodeAllowCommands]),\n host: String(nodeCfg.execHost ?? (meta as Record<string, unknown>).execHost ?? \"gateway\"),\n security: String(nodeCfg.execSecurity ?? (meta as Record<string, unknown>).execSecurity ?? \"allowlist\"),\n ask: String(nodeCfg.execAsk ?? (meta as Record<string, unknown>).execAsk ?? \"on-miss\"),\n timeout: Number(nodeCfg.execTimeoutSeconds ?? (meta as Record<string, unknown>).execTimeoutSeconds ?? 300),\n };\n}\n\nasync function executeToolNode({\n teamId,\n workflow,\n run,\n nodeId,\n startedAt,\n endedAt,\n}: {\n teamId: string;\n workflow: WorkflowFileV1;\n run: WorkflowRunFileV1;\n nodeId: string;\n startedAt: string;\n endedAt: string;\n}): Promise<WorkflowRunNodeResultV1> {\n const wfNode = Array.isArray(workflow.nodes) ? workflow.nodes.find((n) => n.id === nodeId) : undefined;\n const cfg = wfNode?.config && typeof wfNode.config === \"object\" ? (wfNode.config as Record<string, unknown>) : {};\n const tool = typeof cfg.tool === \"string\" && cfg.tool.trim() ? cfg.tool.trim() : \"(unknown)\";\n const args = cfg.args && typeof cfg.args === \"object\" ? (cfg.args as Record<string, unknown>) : {};\n\n const vars = {\n date: endedAt,\n \"run.id\": run.id,\n \"workflow.id\": workflow.id,\n \"workflow.name\": workflow.name || workflow.id,\n };\n\n if (tool === \"fs.append\") {\n const pVal = typeof args.path === \"string\" ? args.path : \"\";\n const cVal = typeof args.content === \"string\" ? args.content : \"\";\n if (!pVal) throw new Error(\"fs.append requires args.path\");\n if (!cVal) throw new Error(\"fs.append requires args.content\");\n\n const content = templateReplace(cVal, vars);\n const { full } = await appendTeamFile(teamId, pVal, content);\n return {\n nodeId,\n status: \"success\",\n startedAt,\n endedAt,\n output: { tool, appendedTo: full, bytes: content.length },\n };\n }\n\n if (tool === \"runtime.exec\") {\n const pol = resolveExecPolicy(workflow, cfg);\n const { command, bin, argv } = parseExecCommandFromArgs(args);\n\n if (pol.allowCommands.size && !pol.allowCommands.has(command)) {\n throw new Error(`runtime.exec command not allowlisted: ${command}`);\n }\n if (!pol.allowCommands.size && (pol.allowBins.size === 0 || !pol.allowBins.has(bin))) {\n throw new Error(`runtime.exec bin not allowlisted: ${bin} (set workflow.meta.execAllowBins or node.config.execAllowBins)`);\n }\n\n const workdirRel = typeof args.cwd === \"string\" ? args.cwd : typeof args.workdir === \"string\" ? args.workdir : \"\";\n let workdir: string | undefined;\n if (workdirRel) {\n const teamDir = await getTeamWorkspaceDir(teamId);\n const resolved = path.resolve(teamDir, workdirRel);\n if (!resolved.startsWith(teamDir + path.sep) && resolved !== teamDir) {\n throw new Error(\"runtime.exec cwd must be within the team workspace\");\n }\n workdir = resolved;\n }\n\n const execEnabled = process.env.KITCHEN_ENABLE_WORKFLOW_RUNTIME_EXEC === \"1\";\n if (!execEnabled) {\n throw new Error(\"Tool not available: exec\");\n }\n\n const backend = (process.env.KITCHEN_WORKFLOW_EXEC_BACKEND || \"gateway-first\").trim();\n\n let result: unknown;\n if (backend === \"local\") {\n result = await execLocal({ command, argv, cwd: workdir, timeoutMs: pol.timeout * 1000 });\n } else {\n try {\n result = await toolsInvoke({\n tool: \"exec\",\n args: {\n command,\n workdir,\n timeout: pol.timeout,\n host: pol.host,\n security: pol.security,\n ask: pol.ask,\n },\n });\n } catch (e: unknown) {\n // For dev/testing, fall back to local execution if the gateway doesn't expose exec.\n if (backend === \"gateway-first\" && /Tool not available:\\s*exec/i.test(errorMessage(e))) {\n result = await execLocal({ command, argv, cwd: workdir, timeoutMs: pol.timeout * 1000 });\n } else {\n throw e;\n }\n }\n }\n\n return {\n nodeId,\n status: \"success\",\n startedAt,\n endedAt,\n output: { tool, command, result },\n };\n }\n\n return {\n nodeId,\n status: \"success\",\n startedAt,\n endedAt,\n output: { tool, result: \"(no-op: tool not implemented)\" },\n };\n}\n\nasync function maybeExecutePendingNodesAfterApproval({\n teamId,\n workflow,\n run,\n approvalNodeId,\n decidedAt,\n}: {\n teamId: string;\n workflow: WorkflowFileV1;\n run: WorkflowRunFileV1;\n approvalNodeId: string;\n decidedAt: string;\n}) {\n const wfNodes = Array.isArray(workflow.nodes) ? workflow.nodes : [];\n const approvalIdx = wfNodes.findIndex((n) => n.id === approvalNodeId);\n if (approvalIdx < 0) return run;\n\n const nextNodes: WorkflowRunNodeResultV1[] = Array.isArray(run.nodes)\n ? await Promise.all(\n run.nodes.map(async (n) => {\n const wfIdx = wfNodes.findIndex((wfn) => wfn.id === n.nodeId);\n const afterApproval = wfIdx >= 0 && wfIdx > approvalIdx;\n\n if (!afterApproval || n.status !== \"pending\") return n;\n\n const wfNode = wfIdx >= 0 ? wfNodes[wfIdx] : undefined;\n const startedAt = n.startedAt ?? decidedAt;\n\n if (wfNode?.type === \"tool\") {\n try {\n return await executeToolNode({\n teamId,\n workflow,\n run,\n nodeId: n.nodeId,\n startedAt,\n endedAt: decidedAt,\n });\n } catch (e: unknown) {\n return {\n ...n,\n status: \"error\",\n startedAt,\n endedAt: decidedAt,\n output: { error: errorMessage(e) },\n };\n }\n }\n\n return {\n ...n,\n status: \"success\",\n startedAt,\n endedAt: decidedAt,\n output: n.output ?? { note: \"(resumed after approval)\" },\n };\n })\n )\n : [];\n\n return { ...run, nodes: nextNodes };\n}\n\n\nexport async function GET(req: Request) {\n return handleWorkflowRunsGet(req, readWorkflowRun, listWorkflowRuns);\n}\n\nexport async function POST(req: Request) {\n const parsed = await parseJsonBody(req);\n if (parsed instanceof NextResponse) return parsed;\n const { body: o } = parsed;\n\n const teamId = String(o.teamId ?? \"\").trim();\n const workflowId = String(o.workflowId ?? \"\").trim();\n const mode = String(o.mode ?? \"\").trim();\n const action = String(o.action ?? \"\").trim();\n const runIdFromBody = String(o.runId ?? \"\").trim();\n const note = typeof o.note === \"string\" ? o.note : undefined;\n const decidedBy = typeof o.decidedBy === \"string\" ? o.decidedBy : undefined;\n\n // Canonical execution mode:\n // - enqueue: create run only\n // - run_now: create run + kick runner loop\n // (future) execute/run_now option is handled in the runner, not Kitchen.\n\n if (!teamId) return NextResponse.json({ ok: false, error: \"teamId is required\" }, { status: 400 });\n if (!workflowId) return NextResponse.json({ ok: false, error: \"workflowId is required\" }, { status: 400 });\n\n try {\n // Action mode: approve/request_changes/cancel (file-first) updates an existing run.\n if (action) {\n if (!runIdFromBody) return NextResponse.json({ ok: false, error: \"runId is required for action\" }, { status: 400 });\n if (![\"approve\", \"request_changes\", \"cancel\"].includes(action)) {\n return NextResponse.json({ ok: false, error: `Unsupported action: ${action}` }, { status: 400 });\n }\n\n const existing = await readWorkflowRun(teamId, workflowId, runIdFromBody);\n const run = existing.run;\n\n const approvalNodeId = run.approval?.nodeId || (Array.isArray(run.nodes) ? run.nodes.find((n) => n.status === \"waiting\")?.nodeId : undefined);\n if (!approvalNodeId) {\n return NextResponse.json({ ok: false, error: \"Run is not awaiting approval\" }, { status: 400 });\n }\n\n const decidedAt = nowIso();\n const nextState = action === \"approve\" ? \"approved\" : action === \"request_changes\" ? \"changes_requested\" : \"canceled\";\n\n const nextStatus: WorkflowRunFileV1[\"status\"] =\n nextState === \"approved\" ? \"success\" : nextState === \"canceled\" ? \"canceled\" : \"waiting_for_approval\";\n\n const nextNodes: WorkflowRunNodeResultV1[] = Array.isArray(run.nodes)\n ? run.nodes.map((n) => {\n if (n.nodeId === approvalNodeId) {\n const existingOutput = typeof n.output === \"object\" && n.output ? (n.output as Record<string, unknown>) : {};\n return {\n ...n,\n status: nextState === \"approved\" ? \"success\" : nextState === \"canceled\" ? \"error\" : \"waiting\",\n endedAt: nextState === \"changes_requested\" ? n.endedAt : decidedAt,\n output: {\n ...existingOutput,\n decision: nextState,\n note,\n decidedBy,\n },\n };\n }\n\n if (nextState === \"canceled\" && n.status === \"pending\") {\n return {\n ...n,\n status: \"skipped\",\n startedAt: n.startedAt ?? decidedAt,\n endedAt: decidedAt,\n output: n.output ?? { note: \"skipped due to cancel\" },\n };\n }\n\n return n;\n })\n : [];\n\n const nextRun: WorkflowRunFileV1 = {\n ...run,\n status: nextStatus,\n endedAt: nextStatus === \"success\" || nextStatus === \"canceled\" ? decidedAt : run.endedAt,\n approval: {\n nodeId: approvalNodeId,\n state: nextState,\n requestedAt: run.approval?.requestedAt,\n decidedAt: nextState === \"changes_requested\" ? undefined : decidedAt,\n note,\n decidedBy,\n },\n nodes: nextNodes,\n };\n\n\n let finalRun: WorkflowRunFileV1 = nextRun;\n\n // Best-effort: for sample runs, simulate resuming execution after approval by resolving\n // pending nodes and performing file-first writeback steps (fs.append).\n if (action === \"approve\") {\n try {\n const wf = (await readWorkflow(teamId, workflowId)).workflow;\n finalRun = await maybeExecutePendingNodesAfterApproval({\n teamId,\n workflow: wf,\n run: nextRun,\n approvalNodeId,\n decidedAt,\n });\n const hasError = Array.isArray(finalRun.nodes) && finalRun.nodes.some((n) => n.status === \"error\");\n if (hasError) {\n finalRun = { ...finalRun, status: \"error\", endedAt: decidedAt };\n }\n } catch {\n // ignore; keep file-first decision recorded\n }\n }\n\n return jsonOkRest({ ...(await writeWorkflowRun(teamId, workflowId, finalRun)), runId: run.id });\n }\n\n // Create mode\n const runId = `run-${nowIso().replace(/[:.]/g, \"-\")}-${crypto.randomBytes(3).toString(\"hex\")}`.toLowerCase();\n\n const run: WorkflowRunFileV1 =\n mode === \"sample\"\n ? await (async () => {\n const wf = (await readWorkflow(teamId, workflowId)).workflow;\n const t0 = Date.now();\n\n const templateId =\n wf.meta && typeof wf.meta === \"object\" && \"templateId\" in wf.meta ? (wf.meta as Record<string, unknown>).templateId : undefined;\n const isMarketingCadence = templateId === \"marketing-cadence-v1\";\n\n const marketingDrafts = isMarketingCadence\n ? {\n x: {\n hook: \"Stop losing hours to repetitive agent setup.\",\n body: \"ClawRecipes scaffolds entire teams of agents in one command — workflows, roles, conventions, and a human-approval gate before posting.\",\n },\n instagram: {\n hook: \"Ship agent workflows faster.\",\n body: \"From idea → drafted assets → brand QC → approval → posting. File-first workflows you can export and version.\",\n assetNotes: \"Square image: diagram of workflow nodes + approval gate.\",\n },\n tiktok: {\n hook: \"POV: you stop copy/pasting prompts.\",\n script: \"Today I’m building a marketing cadence workflow that researches, drafts, QC’s, then waits for human approval before it posts. File-first. Portable. No magic.\",\n assetNotes: \"15–25s screen recording of the canvas + approval buttons.\",\n },\n youtube: {\n hook: \"Build a marketing cadence workflow (with human approval) in 2 minutes.\",\n script: \"We’ll wire research → drafts → QC → approval → post nodes, and persist the whole thing to shared-context/workflows/*.workflow.json so it’s portable.\",\n assetNotes: \"Thumbnail: workflow canvas with 'Approve & Post' highlighted.\",\n },\n }\n : null;\n\n const approvalIdx = wf.nodes.findIndex((n) => n.type === \"human_approval\");\n const approvalNodeId = approvalIdx >= 0 ? wf.nodes[approvalIdx]?.id : undefined;\n\n const nodeResults: WorkflowRunNodeResultV1[] = wf.nodes.map((n, idx) => {\n const startedAt = new Date(t0 + idx * 350).toISOString();\n const endedAt = new Date(t0 + idx * 350 + 200).toISOString();\n\n const beforeApproval = approvalIdx < 0 ? true : idx < approvalIdx;\n const isApproval = approvalNodeId ? n.id === approvalNodeId : false;\n const afterApproval = approvalIdx >= 0 && idx > approvalIdx;\n\n const base: WorkflowRunNodeResultV1 = {\n nodeId: n.id,\n status: beforeApproval ? \"success\" : afterApproval ? \"pending\" : isApproval ? \"waiting\" : \"success\",\n startedAt,\n endedAt: beforeApproval ? endedAt : undefined,\n };\n\n if (n.type === \"llm\") {\n const marketingOutput =\n beforeApproval && isMarketingCadence\n ? n.id === \"research\"\n ? {\n model: \"(sample)\",\n kind: \"research\",\n bullets: [\n \"New agent teams are compelling when they’re portable + file-first.\",\n \"Human approval gates are mandatory for auto-post workflows.\",\n \"Cron triggers need timezone + preset suggestions.\",\n ],\n }\n : n.id === \"draft_assets\"\n ? {\n model: \"(sample)\",\n kind: \"draft_assets\",\n drafts: marketingDrafts,\n }\n : n.id === \"qc_brand\"\n ? {\n model: \"(sample)\",\n kind: \"qc_brand\",\n notes: [\n \"Keep claims concrete (no ‘magic’).\",\n \"Mention ClawRecipes before OpenClaw.\",\n \"Explicitly state: no posting without approval.\",\n ],\n }\n : {\n model: \"(sample)\",\n text: `Sample output for ${n.id}`,\n }\n : null;\n\n return {\n ...base,\n output: beforeApproval\n ? marketingOutput ?? {\n model: \"(sample)\",\n text: `Sample output for ${n.id}`,\n }\n : undefined,\n };\n }\n\n if (n.type === \"tool\") {\n const toolVal = n.config && typeof n.config === \"object\" ? (n.config as Record<string, unknown>).tool : undefined;\n const tool = typeof toolVal === \"string\" && toolVal.trim() ? toolVal.trim() : \"(unknown)\";\n return {\n ...base,\n output: beforeApproval\n ? {\n tool,\n result: \"(sample tool result)\",\n }\n : undefined,\n };\n }\n\n if (n.type === \"human_approval\") {\n const approvalPacket = isMarketingCadence\n ? {\n channel: \"(sample)\",\n decision: \"pending\",\n options: [\"approve\", \"request_changes\", \"cancel\"],\n packet: {\n templateId: \"marketing-cadence-v1\",\n note: \"Per-platform drafts (sample) — approve to post, request changes to loop, or cancel.\",\n platforms: {\n x: marketingDrafts?.x,\n instagram: marketingDrafts?.instagram,\n tiktok: marketingDrafts?.tiktok,\n youtube: marketingDrafts?.youtube,\n },\n },\n }\n : {\n channel: \"(sample)\",\n decision: \"pending\",\n options: [\"approve\", \"request_changes\", \"cancel\"],\n };\n\n return {\n ...base,\n output: approvalPacket,\n };\n }\n\n return base;\n });\n\n const status: WorkflowRunFileV1[\"status\"] = approvalNodeId ? \"waiting_for_approval\" : \"success\";\n\n const baseRun: WorkflowRunFileV1 = {\n schema: \"clawkitchen.workflow-run.v1\",\n id: runId,\n workflowId,\n startedAt: new Date(t0).toISOString(),\n endedAt: approvalNodeId ? undefined : new Date(t0 + wf.nodes.length * 350 + 200).toISOString(),\n status,\n summary: approvalNodeId\n ? \"Sample run (awaiting approval)\"\n : \"Sample run (generated by ClawKitchen UI)\",\n nodes: nodeResults,\n approval: approvalNodeId\n ? {\n nodeId: approvalNodeId,\n state: \"pending\",\n requestedAt: new Date(t0 + approvalIdx * 350).toISOString(),\n }\n : undefined,\n };\n\n if (approvalNodeId) {\n // Resolve the channel we *intend* to send to so we can record outbound metadata,\n // even though delivery is best-effort.\n const { provider, target } = await resolveApprovalChannel({ workflow: wf });\n\n if (target) {\n try {\n await maybeSendApprovalRequest({ teamId, workflow: wf, run: baseRun, approvalNodeId });\n baseRun.approval = {\n ...baseRun.approval,\n outbound: { provider, target, sentAt: nowIso() },\n } as WorkflowRunFileV1[\"approval\"];\n } catch (e: unknown) {\n baseRun.approval = {\n ...baseRun.approval,\n outbound: { provider, target, error: errorMessage(e), attemptedAt: nowIso() },\n } as WorkflowRunFileV1[\"approval\"];\n }\n }\n }\n\n return baseRun satisfies WorkflowRunFileV1;\n })()\n : await (async () => {\n\n // v2: delegate to CLI for enqueue/run-now (Kitchen should not author run artifacts).\n const modeNorm = mode || \"enqueue\";\n if (![\"execute\", \"enqueue\", \"run_now\", \"sample\"].includes(modeNorm)) {\n throw new Error(`Unsupported mode: ${modeNorm}`);\n }\n\n const wf = (await readWorkflow(teamId, workflowId)).workflow;\n\n // Preflight: nodes (excluding start/end) must be assigned to an agent.\n const missing = (Array.isArray(wf.nodes) ? wf.nodes : [])\n .filter((n) =>\n n &&\n typeof n === \"object\" &&\n (n as { type?: unknown }).type !== \"start\" &&\n (n as { type?: unknown }).type !== \"end\" &&\n (n as { type?: unknown }).type !== \"human_approval\"\n )\n .filter((n) => {\n const cfg = (n as { config?: unknown }).config;\n const o = cfg && typeof cfg === \"object\" && !Array.isArray(cfg) ? (cfg as Record<string, unknown>) : {};\n return !String(o.agentId ?? \"\").trim();\n })\n .map((n) => String((n as { id?: unknown }).id ?? \"\"))\n .filter(Boolean);\n if (missing.length) {\n throw new Error(`All nodes must be assigned to an agent. Missing agentId on: ${missing.join(\", \")}`);\n }\n\n const workflowFile = `${workflowId}.workflow.json`;\n\n // Delegate enqueue to ClawRecipes (CLI) which owns the canonical run folder/files.\n const enqueueRes = await runOpenClaw([\n \"recipes\",\n \"workflows\",\n \"run\",\n \"--team-id\",\n teamId,\n \"--workflow-file\",\n workflowFile,\n ]);\n if (!enqueueRes.ok) throw new Error(enqueueRes.stderr || enqueueRes.stdout || \"Failed to enqueue workflow run\");\n\n const enqueueJson = JSON.parse(String(enqueueRes.stdout ?? \"{}\")) as {\n ok?: boolean;\n runId?: string;\n runLogPath?: string;\n };\n const enqRunId = String(enqueueJson.runId ?? \"\").trim();\n if (!enqRunId) throw new Error(\"Enqueue succeeded but did not return runId\");\n\n if (modeNorm === \"run_now\") {\n // Run now = enqueue + runner + workers.\n // NOTE: `worker-tick --agent-id` must match a real agent id (queue file name).\n // If workflow node agentIds are aliases, we fail with a clear message.\n\n const agentListRes = await runOpenClaw([\"agents\", \"list\", \"--json\"]);\n if (!agentListRes.ok) throw new Error(agentListRes.stderr || agentListRes.stdout || \"Failed to list agents\");\n const agentList = JSON.parse(String(agentListRes.stdout ?? \"[]\")) as Array<{ id?: unknown }>;\n const knownAgentIds = new Set(agentList.map((a) => String(a.id ?? \"\").trim()).filter(Boolean));\n\n // Kick workers for all required agents referenced by the workflow file.\n const requiredAgentIds = (Array.isArray(wf.nodes) ? wf.nodes : [])\n .filter((n) =>\n n &&\n typeof n === \"object\" &&\n (n as { type?: unknown }).type !== \"start\" &&\n (n as { type?: unknown }).type !== \"end\" &&\n (n as { type?: unknown }).type !== \"human_approval\"\n )\n .map((n) => {\n const cfg = (n as { config?: unknown }).config;\n const o = cfg && typeof cfg === \"object\" && !Array.isArray(cfg) ? (cfg as Record<string, unknown>) : {};\n return String(o.agentId ?? \"\").trim();\n })\n .filter(Boolean);\n\n const uniq = Array.from(new Set(requiredAgentIds));\n const missing = uniq.filter((id) => !knownAgentIds.has(id));\n if (missing.length) {\n throw new Error(\n `Unknown agentId(s) in workflow node assignments: ${missing.join(\", \")}. ` +\n `These must match real OpenClaw agent ids (see openclaw agents list).`\n );\n }\n\n const runnerRes = await runOpenClaw([\"recipes\", \"workflows\", \"runner-once\", \"--team-id\", teamId]);\n if (!runnerRes.ok) throw new Error(runnerRes.stderr || runnerRes.stdout || \"Failed to run runner-once\");\n\n for (const agentId of uniq) {\n const workerRes = await runOpenClaw([\n \"recipes\",\n \"workflows\",\n \"worker-tick\",\n \"--team-id\",\n teamId,\n \"--agent-id\",\n agentId,\n \"--limit\",\n \"5\",\n \"--worker-id\",\n \"kitchen-run-now\",\n ]);\n if (!workerRes.ok) throw new Error(workerRes.stderr || workerRes.stdout || `Failed worker-tick for ${agentId}`);\n }\n }\n\n // Return a lightweight Kitchen-schema run so the UI can immediately navigate to it.\n return {\n schema: \"clawkitchen.workflow-run.v1\",\n id: enqRunId,\n workflowId,\n teamId,\n startedAt: nowIso(),\n status: \"running\",\n summary: modeNorm === \"run_now\" ? \"Queued + kicked runner/workers\" : \"Queued for workflow runner\",\n nodes: Array.isArray(wf.nodes)\n ? wf.nodes.map((n) => ({ nodeId: String(n.id), status: \"pending\" as const }))\n : [],\n } satisfies WorkflowRunFileV1;\n })();\n\n return jsonOkRest({ ...(await writeWorkflowRun(teamId, workflowId, run)), runId });\n } catch (err: unknown) {\n const msg = errorMessage(err);\n if (/^All nodes must be assigned to an agent\\./i.test(msg) || /^Unknown agentId\\(s\\)/i.test(msg)) {\n return NextResponse.json({ ok: false, error: msg }, { status: 400 });\n }\n return NextResponse.json({ ok: false, error: msg }, { status: 500 });\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getTeamWorkspaceDir } from \"@/lib/paths\";\nimport { readdirFiles } from \"@/lib/workflows/readdir\";\nimport { assertSafeWorkflowId } from \"@/lib/workflows/storage\";\nimport type { WorkflowRunFileV1, WorkflowRunNodeResultV1 } from \"@/lib/workflows/runs-types\";\n\nconst RUNS_DIR = path.join(\"shared-context\", \"workflow-runs\");\n\n/**\n * Back-compat:\n * - Legacy Kitchen layout: shared-context/workflow-runs/<workflowId>/*.run.json\n * - Runner layout (preferred): shared-context/workflow-runs/*.run.json\n */\nconst LEGACY_PER_WORKFLOW_LAYOUT = true;\n\nexport function assertSafeRunId(runId: string) {\n const id = String(runId ?? \"\").trim();\n if (!id) throw new Error(\"run id is required\");\n\n // Accept both Kitchen-style run ids (lowercase) and runner ids that include ISO timestamps (T/Z).\n // We still keep it conservative: only letters/numbers/dashes.\n if (!/^[A-Za-z0-9][A-Za-z0-9-]{0,120}$/.test(id)) {\n throw new Error(\"Invalid run id. Use letters, numbers, and dashes.\"\n );\n }\n return id;\n}\n\nexport async function getWorkflowRunsDir(teamId: string, workflowId: string) {\n // Validate workflowId (we no longer use it for the directory name).\n void assertSafeWorkflowId(workflowId);\n const teamDir = await getTeamWorkspaceDir(teamId);\n return path.join(teamDir, RUNS_DIR);\n}\n\nexport function workflowRunFileName(runId: string) {\n return `${runId}.run.json`;\n}\n\nexport async function listWorkflowRuns(teamId: string, workflowId: string) {\n const wfId = assertSafeWorkflowId(workflowId);\n const dir = await getWorkflowRunsDir(teamId, wfId);\n\n const runIds: string[] = [];\n\n // Preferred: runner directory-per-run layout: shared-context/workflow-runs/<runId>/run.json\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const runDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n\n for (const runId of runDirs) {\n const p = path.join(dir, runId, \"run.json\");\n try {\n const raw = await fs.readFile(p, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const normalized = normalizeRunFile(teamId, wfId, parsed, runId);\n if (normalized.workflowId === wfId) runIds.push(runId);\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n\n // Legacy: flat *.run.json at root\n try {\n const { files } = await readdirFiles(dir, \".run.json\", true);\n for (const f of files) {\n const runId = f.replace(/\\.run\\.json$/i, \"\");\n try {\n const raw = await fs.readFile(path.join(dir, f), \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const normalized = normalizeRunFile(teamId, wfId, parsed, runId);\n if (normalized.workflowId === wfId) runIds.push(runId);\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n\n // Back-compat: legacy per-workflow directory.\n if (LEGACY_PER_WORKFLOW_LAYOUT) {\n try {\n const legacyDir = path.join(dir, wfId);\n const { files } = await readdirFiles(legacyDir, \".run.json\", true);\n for (const f of files) runIds.push(f.replace(/\\.run\\.json$/i, \"\"));\n } catch {\n // ignore\n }\n }\n\n const uniq = Array.from(new Set(runIds)).sort().reverse();\n return { ok: true as const, dir, runIds: uniq };\n}\n\nexport async function readWorkflowRun(teamId: string, workflowId: string, runId: string) {\n const wfId = assertSafeWorkflowId(workflowId);\n const rId = assertSafeRunId(runId);\n const dir = await getWorkflowRunsDir(teamId, wfId);\n\n // Preferred (runner) layout: shared-context/workflow-runs/<runId>/run.json\n const pRunner = path.join(dir, rId, \"run.json\");\n try {\n const raw = await fs.readFile(pRunner, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const run = normalizeRunFile(teamId, wfId, parsed, rId);\n\n // Runner stores rich node outputs as files under:\n // workflow-runs/<runId>/node-outputs/*-<nodeId>.json\n // Normalize by hydrating node.output from those files when missing.\n if (Array.isArray(run.nodes) && run.nodes.length) {\n const outputsDir = path.join(dir, rId, \"node-outputs\");\n let files: string[] = [];\n try {\n files = await fs.readdir(outputsDir);\n } catch {\n files = [];\n }\n\n // Multiple output files may exist for the same nodeId when a workflow executes a node\n // more than once. Preserve ordering by assigning outputs sequentially per nodeId.\n //\n // NOTE: Runner output filenames are typically prefixed with a sortable counter (e.g. 001-<nodeId>.json).\n // We rely on lexicographic order of filenames within node-outputs.\n const byNodeId = new Map<string, string[]>();\n for (const f of files.slice().sort()) {\n const m = f.match(/-([^/]+)\\.json$/);\n if (!m) continue;\n const nodeId = m[1];\n if (!nodeId) continue;\n const existing = byNodeId.get(nodeId) ?? [];\n existing.push(path.join(outputsDir, f));\n byNodeId.set(nodeId, existing);\n }\n\n await Promise.all(\n run.nodes.map(async (n) => {\n if (!n || typeof n !== \"object\") return;\n // Only hydrate if output is truly missing.\n if (typeof n.output !== \"undefined\") return;\n\n const arr = byNodeId.get(n.nodeId);\n if (!arr || !arr.length) return;\n\n const pOut = arr.shift();\n if (!pOut) return;\n\n try {\n const outRaw = await fs.readFile(pOut, \"utf8\");\n n.output = JSON.parse(outRaw) as unknown;\n } catch {\n // ignore\n }\n })\n );\n }\n\n return { ok: true as const, path: pRunner, run };\n } catch (err: unknown) {\n // fallthrough\n if (!(err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\")) throw err;\n }\n\n // Legacy flat layout: shared-context/workflow-runs/<runId>.run.json\n const p0 = path.join(dir, workflowRunFileName(rId));\n try {\n const raw = await fs.readFile(p0, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return { ok: true as const, path: p0, run: normalizeRunFile(teamId, wfId, parsed, rId) };\n } catch (err: unknown) {\n if (LEGACY_PER_WORKFLOW_LAYOUT && err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\") {\n const legacy = path.join(dir, wfId, workflowRunFileName(rId));\n const raw = await fs.readFile(legacy, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return { ok: true as const, path: legacy, run: normalizeRunFile(teamId, wfId, parsed, rId) };\n }\n throw err;\n }\n}\n\nexport async function writeWorkflowRun(teamId: string, workflowId: string, run: WorkflowRunFileV1) {\n const wfId = assertSafeWorkflowId(workflowId);\n const rId = assertSafeRunId(run.id);\n const dir = await getWorkflowRunsDir(teamId, wfId);\n await fs.mkdir(dir, { recursive: true });\n\n // Default layout: write to shared-context/workflow-runs/<runId>.run.json\n //\n // IMPORTANT: that filename may already be occupied by a runner-owned run log (different schema).\n // In that case, keep the runner log intact and write the Kitchen run file to the legacy\n // per-workflow directory shared-context/workflow-runs/<workflowId>/<runId>.run.json.\n const p0 = path.join(dir, workflowRunFileName(rId));\n\n let p = p0;\n try {\n const raw = await fs.readFile(p0, \"utf8\");\n const existing = JSON.parse(raw) as unknown;\n const isRunnerLog =\n Boolean(existing) &&\n typeof existing === \"object\" &&\n !Array.isArray(existing) &&\n \"runId\" in (existing as Record<string, unknown>) &&\n !(\"schema\" in (existing as Record<string, unknown>));\n\n if (isRunnerLog && LEGACY_PER_WORKFLOW_LAYOUT) {\n const legacyDir = path.join(dir, wfId);\n await fs.mkdir(legacyDir, { recursive: true });\n p = path.join(legacyDir, workflowRunFileName(rId));\n }\n } catch {\n // ignore read/parse errors; we'll write to p0\n }\n\n const toWrite: WorkflowRunFileV1 = {\n ...run,\n schema: \"clawkitchen.workflow-run.v1\",\n id: rId,\n workflowId: wfId,\n teamId,\n };\n await fs.writeFile(p, JSON.stringify(toWrite, null, 2) + \"\\n\", \"utf8\");\n return { ok: true as const, path: p };\n}\n\nexport type WorkflowRunSummary = {\n workflowId: string;\n runId: string;\n status?: WorkflowRunFileV1[\"status\"];\n startedAt?: string;\n endedAt?: string;\n /** ISO timestamp derived from file mtime (best-effort) */\n updatedAt?: string;\n /** Absolute path to the run file on disk (server-side only) */\n path: string;\n};\n\nexport async function listAllWorkflowRuns(teamId: string): Promise<{ ok: true; dir: string; runs: WorkflowRunSummary[] }> {\n const teamDir = await getTeamWorkspaceDir(teamId);\n const dir = path.join(teamDir, RUNS_DIR);\n\n const runs: WorkflowRunSummary[] = [];\n\n // Preferred: runner directory-per-run layout:\n // shared-context/workflow-runs/<runId>/run.json\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const runDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n\n for (const runId of runDirs) {\n const full = path.join(dir, runId, \"run.json\");\n try {\n const [raw, st] = await Promise.all([fs.readFile(full, \"utf8\"), fs.stat(full)]);\n const normalized = normalizeRunFile(teamId, \"(unknown)\", JSON.parse(raw) as unknown, runId);\n runs.push({\n workflowId: normalized.workflowId,\n runId: normalized.id,\n status: normalized.status,\n startedAt: normalized.startedAt,\n endedAt: normalized.endedAt,\n updatedAt: st.mtime ? new Date(st.mtime).toISOString() : undefined,\n path: full,\n });\n } catch {\n // ignore missing run.json/parse errors; keep going\n }\n }\n } catch (err: unknown) {\n if (!(err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\")) throw err;\n }\n\n // Legacy: flat run files at root: shared-context/workflow-runs/<runId>.run.json\n try {\n const entries = (await fs.readdir(dir)).filter((n) => n.endsWith(\".run.json\")).sort();\n for (const fileName of entries) {\n const runId = fileName.replace(/\\.run\\.json$/i, \"\");\n const full = path.join(dir, fileName);\n try {\n const [raw, st] = await Promise.all([fs.readFile(full, \"utf8\"), fs.stat(full)]);\n const normalized = normalizeRunFile(teamId, \"(unknown)\", JSON.parse(raw) as unknown, runId);\n runs.push({\n workflowId: normalized.workflowId,\n runId: normalized.id,\n status: normalized.status,\n startedAt: normalized.startedAt,\n endedAt: normalized.endedAt,\n updatedAt: st.mtime ? new Date(st.mtime).toISOString() : undefined,\n path: full,\n });\n } catch {\n runs.push({ workflowId: \"(unknown)\", runId, path: full });\n }\n }\n } catch (err: unknown) {\n if (!(err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\")) throw err;\n }\n\n // Back-compat: legacy per-workflow directory.\n if (LEGACY_PER_WORKFLOW_LAYOUT) {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const wfDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n\n for (const workflowId of wfDirs) {\n const wfDir = path.join(dir, workflowId);\n let entries2: string[] = [];\n try {\n entries2 = (await fs.readdir(wfDir)).filter((n) => n.endsWith(\".run.json\")).sort();\n } catch (err: unknown) {\n if (err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\") continue;\n throw err;\n }\n\n for (const fileName of entries2) {\n const runId = fileName.replace(/\\.run\\.json$/i, \"\");\n const full = path.join(wfDir, fileName);\n try {\n const [raw, st] = await Promise.all([fs.readFile(full, \"utf8\"), fs.stat(full)]);\n const parsed = JSON.parse(raw) as Partial<WorkflowRunFileV1>;\n runs.push({\n workflowId,\n runId,\n status: parsed.status as WorkflowRunFileV1[\"status\"],\n startedAt: typeof parsed.startedAt === \"string\" ? parsed.startedAt : undefined,\n endedAt: typeof parsed.endedAt === \"string\" ? parsed.endedAt : undefined,\n updatedAt: st.mtime ? new Date(st.mtime).toISOString() : undefined,\n path: full,\n });\n } catch {\n runs.push({ workflowId, runId, path: full });\n }\n }\n }\n } catch (err: unknown) {\n if (!(err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\")) throw err;\n }\n }\n\n runs.sort((a, b) => String(b.updatedAt ?? b.startedAt ?? \"\").localeCompare(String(a.updatedAt ?? a.startedAt ?? \"\")));\n return { ok: true as const, dir, runs };\n}\n\nfunction normalizeRunFile(teamId: string, workflowId: string, parsed: unknown, runIdFallback: string): WorkflowRunFileV1 {\n // Kitchen schema\n if (parsed && typeof parsed === \"object\" && (parsed as { schema?: unknown }).schema === \"clawkitchen.workflow-run.v1\") {\n return parsed as WorkflowRunFileV1;\n }\n\n // Runner schema (RunLog from ClawRecipes). Convert to Kitchen's display schema.\n if (parsed && typeof parsed === \"object\" && \"runId\" in parsed && \"workflow\" in parsed) {\n const o = parsed as {\n runId?: unknown;\n createdAt?: unknown;\n updatedAt?: unknown;\n status?: unknown;\n workflow?: { id?: unknown; file?: unknown };\n nodeResults?: unknown;\n };\n\n const wfObj = o.workflow && typeof o.workflow === \"object\" ? o.workflow : {};\n const file = typeof wfObj.file === \"string\" ? wfObj.file : \"\";\n const inferredWfId = file ? path.basename(file).replace(/\\.workflow\\.json$/i, \"\") : \"\";\n const wfId = typeof wfObj.id === \"string\" && wfObj.id ? wfObj.id : inferredWfId || workflowId;\n\n const statusRaw = String(o.status ?? \"\");\n const status: WorkflowRunFileV1[\"status\"] =\n statusRaw === \"awaiting_approval\"\n ? \"waiting_for_approval\"\n : statusRaw === \"completed\"\n ? \"success\"\n : statusRaw === \"rejected\"\n ? \"error\"\n : statusRaw === \"error\"\n ? \"error\"\n : statusRaw === \"canceled\"\n ? \"canceled\"\n : \"running\";\n\n const nodes = Array.isArray(o.nodeResults)\n ? o.nodeResults\n .map((nr) => {\n if (!nr || typeof nr !== \"object\") return null;\n const r = nr as {\n nodeId?: unknown;\n status?: unknown;\n startedAt?: unknown;\n endedAt?: unknown;\n output?: unknown;\n error?: unknown;\n };\n const nodeId = typeof r.nodeId === \"string\" ? r.nodeId : \"\";\n if (!nodeId) return null;\n\n const st = String(r.status ?? \"pending\");\n const mapped =\n st === \"awaiting_approval\"\n ? \"waiting\"\n : st === \"completed\"\n ? \"success\"\n : st === \"error\"\n ? \"error\"\n : st;\n\n const allowed = [\"pending\", \"running\", \"waiting\", \"success\", \"error\", \"skipped\"] as const;\n const status = (allowed as readonly string[]).includes(mapped) ? (mapped as (typeof allowed)[number]) : \"pending\";\n\n const error =\n typeof r.error === \"string\"\n ? r.error\n : r.error && typeof r.error === \"object\" && \"message\" in r.error\n ? { message: String((r.error as { message?: unknown }).message ?? \"\") }\n : undefined;\n\n const startedAt = typeof r.startedAt === \"string\" ? r.startedAt : undefined;\n const endedAt = typeof r.endedAt === \"string\" ? r.endedAt : undefined;\n\n return {\n nodeId,\n status,\n ...(startedAt ? { startedAt } : {}),\n ...(endedAt ? { endedAt } : {}),\n ...(typeof r.output !== \"undefined\" ? { output: r.output } : {}),\n ...(typeof error !== \"undefined\" ? { error } : {}),\n } satisfies WorkflowRunNodeResultV1;\n })\n .filter((x): x is WorkflowRunNodeResultV1 => x !== null)\n : undefined;\n\n return {\n schema: \"clawkitchen.workflow-run.v1\",\n id: typeof o.runId === \"string\" ? o.runId : runIdFallback,\n workflowId: wfId,\n teamId,\n startedAt: typeof o.createdAt === \"string\" ? o.createdAt : new Date().toISOString(),\n endedAt:\n status === \"success\" || status === \"error\" || status === \"canceled\"\n ? typeof o.updatedAt === \"string\"\n ? o.updatedAt\n : undefined\n : undefined,\n status,\n summary: \"Executed by workflow runner\",\n nodes,\n };\n }\n\n // Unknown schema; keep a placeholder so UI can still render.\n return {\n schema: \"clawkitchen.workflow-run.v1\",\n id: runIdFallback,\n workflowId,\n teamId,\n startedAt: new Date().toISOString(),\n status: \"error\",\n summary: \"Malformed run file\",\n };\n}"],"names":[],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../src/app/api/teams/workflow-runs/route.ts","../../../src/lib/workflows/runs-storage.ts"],"sourcesContent":["import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/teams/workflow-runs/route\",\n pathname: \"/api/teams/workflow-runs\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/src/app/api/teams/workflow-runs/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/teams/workflow-runs/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import { NextResponse } from \"next/server\";\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { jsonOkRest, parseJsonBody } from \"@/lib/api-route-helpers\";\nimport { handleWorkflowRunsGet } from \"@/lib/workflows/api-handlers\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { toolsInvoke } from \"@/lib/gateway\";\nimport { runOpenClaw } from \"@/lib/openclaw\";\nimport { assertSafeRelativeFileName, getTeamWorkspaceDir } from \"@/lib/paths\";\nimport { listWorkflowRuns, readWorkflowRun, writeWorkflowRun } from \"@/lib/workflows/runs-storage\";\nimport type { WorkflowRunFileV1, WorkflowRunNodeResultV1 } from \"@/lib/workflows/runs-types\";\nimport { readWorkflow } from \"@/lib/workflows/storage\";\nimport type { WorkflowFileV1 } from \"@/lib/workflows/types\";\n\nfunction nowIso() {\n return new Date().toISOString();\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === \"object\" && !Array.isArray(v);\n}\n\nasync function appendTeamFile(teamId: string, relPath: string, content: string) {\n const safe = assertSafeRelativeFileName(relPath);\n const teamDir = await getTeamWorkspaceDir(teamId);\n const full = path.join(teamDir, safe);\n await fs.mkdir(path.dirname(full), { recursive: true });\n await fs.appendFile(full, content, \"utf8\");\n return { full };\n}\n\nfunction templateReplace(input: string, vars: Record<string, string>) {\n let out = input;\n for (const [k, v] of Object.entries(vars)) {\n out = out.replaceAll(`{{${k}}}`, v);\n }\n return out;\n}\n\n\n// v2 runner-only execution: Kitchen never executes workflow tool nodes.\n// These helpers exist only to support approval node UX (best-effort outbound notification metadata).\nasync function resolveApprovalChannel({\n workflow,\n}: {\n workflow: WorkflowFileV1;\n}): Promise<{ provider: string | null; target: string | null }> {\n // Best-effort: allow workflow.meta.approvalChannel to declare a delivery target.\n const meta = workflow.meta && typeof workflow.meta === \"object\" ? (workflow.meta as Record<string, unknown>) : {};\n const approvalChannel = typeof meta.approvalChannel === \"string\" ? meta.approvalChannel.trim() : \"\";\n if (!approvalChannel) return { provider: null, target: null };\n\n // Format: \"telegram:-100123456\" or just \"-100123456\".\n if (approvalChannel.includes(\":\")) {\n const [provider, target] = approvalChannel.split(\":\", 2);\n return { provider: provider || null, target: target || null };\n }\n\n return { provider: \"telegram\", target: approvalChannel };\n}\n\nasync function maybeSendApprovalRequest(_args: {\n teamId: string;\n workflow: WorkflowFileV1;\n run: WorkflowRunFileV1;\n approvalNodeId: string;\n}) {\n // Intentionally NO-OP for now.\n // The runner will handle any external messaging; Kitchen only records state.\n if (!_args) return;\n}\n\nfunction asStringArray(v: unknown): string[] {\n if (!Array.isArray(v)) return [];\n return v.map((x) => String(x ?? \"\").trim()).filter(Boolean);\n}\n\nfunction parseExecCommandFromArgs(\n args: Record<string, unknown>\n): { command: string; bin: string; argv?: string[] } {\n const commandArray = Array.isArray(args.commandArray) ? args.commandArray : Array.isArray(args.command) ? args.command : null;\n if (commandArray && commandArray.length) {\n const parts = commandArray.map((x: unknown) => String(x ?? \"\").trim()).filter(Boolean);\n if (!parts.length) throw new Error(\"runtime.exec requires a non-empty command\");\n return { command: parts.join(\" \"), bin: path.basename(parts[0]), argv: parts };\n }\n\n const cmd = String(args.command ?? \"\").trim();\n if (!cmd) throw new Error(\"runtime.exec requires args.command\");\n const first = cmd.split(/\\s+/)[0] || \"\";\n const bin = path.basename(first);\n return { command: cmd, bin };\n}\n\nasync function execLocal({\n command,\n argv,\n cwd,\n timeoutMs,\n}: {\n command: string;\n argv?: string[];\n cwd?: string;\n timeoutMs: number;\n}): Promise<{ stdout: string; stderr: string; exitCode: number | null; signal: string | null }> {\n // Keep this intentionally simple + safe:\n // - default to argv (no shell) when provided\n // - if only a string is provided, split on whitespace (still no shell)\n const parts = argv && argv.length ? argv : command.split(/\\s+/).filter(Boolean);\n const file = parts[0];\n const fileArgs = parts.slice(1);\n\n return await new Promise((resolve, reject) => {\n const child = spawn(file, fileArgs, {\n cwd,\n shell: false,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n const maxBytes = 64 * 1024;\n child.stdout?.on(\"data\", (b: Buffer) => {\n if (stdout.length < maxBytes) stdout += b.toString(\"utf8\").slice(0, maxBytes - stdout.length);\n });\n child.stderr?.on(\"data\", (b: Buffer) => {\n if (stderr.length < maxBytes) stderr += b.toString(\"utf8\").slice(0, maxBytes - stderr.length);\n });\n\n const t = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, Math.max(0, timeoutMs));\n\n child.on(\"error\", (e) => {\n clearTimeout(t);\n reject(e);\n });\n\n child.on(\"close\", (code, signal) => {\n clearTimeout(t);\n resolve({ stdout, stderr, exitCode: code, signal });\n });\n });\n}\n\nfunction resolveExecPolicy(workflow: WorkflowFileV1, nodeCfg: Record<string, unknown>) {\n const meta = isRecord(workflow.meta) ? workflow.meta : {};\n\n const metaAllowBins = asStringArray((meta as Record<string, unknown>).execAllowBins);\n const metaAllowCommands = asStringArray((meta as Record<string, unknown>).execAllowCommands);\n\n // Node overrides/adds.\n const nodeAllowBins = asStringArray(nodeCfg.execAllowBins);\n const nodeAllowCommands = asStringArray(nodeCfg.execAllowCommands);\n\n return {\n allowBins: new Set([...metaAllowBins, ...nodeAllowBins]),\n allowCommands: new Set([...metaAllowCommands, ...nodeAllowCommands]),\n host: String(nodeCfg.execHost ?? (meta as Record<string, unknown>).execHost ?? \"gateway\"),\n security: String(nodeCfg.execSecurity ?? (meta as Record<string, unknown>).execSecurity ?? \"allowlist\"),\n ask: String(nodeCfg.execAsk ?? (meta as Record<string, unknown>).execAsk ?? \"on-miss\"),\n timeout: Number(nodeCfg.execTimeoutSeconds ?? (meta as Record<string, unknown>).execTimeoutSeconds ?? 300),\n };\n}\n\nasync function executeToolNode({\n teamId,\n workflow,\n run,\n nodeId,\n startedAt,\n endedAt,\n}: {\n teamId: string;\n workflow: WorkflowFileV1;\n run: WorkflowRunFileV1;\n nodeId: string;\n startedAt: string;\n endedAt: string;\n}): Promise<WorkflowRunNodeResultV1> {\n const wfNode = Array.isArray(workflow.nodes) ? workflow.nodes.find((n) => n.id === nodeId) : undefined;\n const cfg = wfNode?.config && typeof wfNode.config === \"object\" ? (wfNode.config as Record<string, unknown>) : {};\n const tool = typeof cfg.tool === \"string\" && cfg.tool.trim() ? cfg.tool.trim() : \"(unknown)\";\n const args = cfg.args && typeof cfg.args === \"object\" ? (cfg.args as Record<string, unknown>) : {};\n\n const vars = {\n date: endedAt,\n \"run.id\": run.id,\n \"workflow.id\": workflow.id,\n \"workflow.name\": workflow.name || workflow.id,\n };\n\n if (tool === \"fs.append\") {\n const pVal = typeof args.path === \"string\" ? args.path : \"\";\n const cVal = typeof args.content === \"string\" ? args.content : \"\";\n if (!pVal) throw new Error(\"fs.append requires args.path\");\n if (!cVal) throw new Error(\"fs.append requires args.content\");\n\n const content = templateReplace(cVal, vars);\n const { full } = await appendTeamFile(teamId, pVal, content);\n return {\n nodeId,\n status: \"success\",\n startedAt,\n endedAt,\n output: { tool, appendedTo: full, bytes: content.length },\n };\n }\n\n if (tool === \"runtime.exec\") {\n const pol = resolveExecPolicy(workflow, cfg);\n const { command, bin, argv } = parseExecCommandFromArgs(args);\n\n if (pol.allowCommands.size && !pol.allowCommands.has(command)) {\n throw new Error(`runtime.exec command not allowlisted: ${command}`);\n }\n if (!pol.allowCommands.size && (pol.allowBins.size === 0 || !pol.allowBins.has(bin))) {\n throw new Error(`runtime.exec bin not allowlisted: ${bin} (set workflow.meta.execAllowBins or node.config.execAllowBins)`);\n }\n\n const workdirRel = typeof args.cwd === \"string\" ? args.cwd : typeof args.workdir === \"string\" ? args.workdir : \"\";\n let workdir: string | undefined;\n if (workdirRel) {\n const teamDir = await getTeamWorkspaceDir(teamId);\n const resolved = path.resolve(teamDir, workdirRel);\n if (!resolved.startsWith(teamDir + path.sep) && resolved !== teamDir) {\n throw new Error(\"runtime.exec cwd must be within the team workspace\");\n }\n workdir = resolved;\n }\n\n const execEnabled = process.env.KITCHEN_ENABLE_WORKFLOW_RUNTIME_EXEC === \"1\";\n if (!execEnabled) {\n throw new Error(\"Tool not available: exec\");\n }\n\n const backend = (process.env.KITCHEN_WORKFLOW_EXEC_BACKEND || \"gateway-first\").trim();\n\n let result: unknown;\n if (backend === \"local\") {\n result = await execLocal({ command, argv, cwd: workdir, timeoutMs: pol.timeout * 1000 });\n } else {\n try {\n result = await toolsInvoke({\n tool: \"exec\",\n args: {\n command,\n workdir,\n timeout: pol.timeout,\n host: pol.host,\n security: pol.security,\n ask: pol.ask,\n },\n });\n } catch (e: unknown) {\n // For dev/testing, fall back to local execution if the gateway doesn't expose exec.\n if (backend === \"gateway-first\" && /Tool not available:\\s*exec/i.test(errorMessage(e))) {\n result = await execLocal({ command, argv, cwd: workdir, timeoutMs: pol.timeout * 1000 });\n } else {\n throw e;\n }\n }\n }\n\n return {\n nodeId,\n status: \"success\",\n startedAt,\n endedAt,\n output: { tool, command, result },\n };\n }\n\n return {\n nodeId,\n status: \"success\",\n startedAt,\n endedAt,\n output: { tool, result: \"(no-op: tool not implemented)\" },\n };\n}\n\nasync function maybeExecutePendingNodesAfterApproval({\n teamId,\n workflow,\n run,\n approvalNodeId,\n decidedAt,\n}: {\n teamId: string;\n workflow: WorkflowFileV1;\n run: WorkflowRunFileV1;\n approvalNodeId: string;\n decidedAt: string;\n}) {\n const wfNodes = Array.isArray(workflow.nodes) ? workflow.nodes : [];\n const approvalIdx = wfNodes.findIndex((n) => n.id === approvalNodeId);\n if (approvalIdx < 0) return run;\n\n const nextNodes: WorkflowRunNodeResultV1[] = Array.isArray(run.nodes)\n ? await Promise.all(\n run.nodes.map(async (n) => {\n const wfIdx = wfNodes.findIndex((wfn) => wfn.id === n.nodeId);\n const afterApproval = wfIdx >= 0 && wfIdx > approvalIdx;\n\n if (!afterApproval || n.status !== \"pending\") return n;\n\n const wfNode = wfIdx >= 0 ? wfNodes[wfIdx] : undefined;\n const startedAt = n.startedAt ?? decidedAt;\n\n if (wfNode?.type === \"tool\") {\n try {\n return await executeToolNode({\n teamId,\n workflow,\n run,\n nodeId: n.nodeId,\n startedAt,\n endedAt: decidedAt,\n });\n } catch (e: unknown) {\n return {\n ...n,\n status: \"error\",\n startedAt,\n endedAt: decidedAt,\n output: { error: errorMessage(e) },\n };\n }\n }\n\n return {\n ...n,\n status: \"success\",\n startedAt,\n endedAt: decidedAt,\n output: n.output ?? { note: \"(resumed after approval)\" },\n };\n })\n )\n : [];\n\n return { ...run, nodes: nextNodes };\n}\n\n\nexport async function GET(req: Request) {\n return handleWorkflowRunsGet(req, readWorkflowRun, listWorkflowRuns);\n}\n\nexport async function POST(req: Request) {\n const parsed = await parseJsonBody(req);\n if (parsed instanceof NextResponse) return parsed;\n const { body: o } = parsed;\n\n const teamId = String(o.teamId ?? \"\").trim();\n const workflowId = String(o.workflowId ?? \"\").trim();\n const mode = String(o.mode ?? \"\").trim();\n const action = String(o.action ?? \"\").trim();\n const runIdFromBody = String(o.runId ?? \"\").trim();\n const note = typeof o.note === \"string\" ? o.note : undefined;\n const decidedBy = typeof o.decidedBy === \"string\" ? o.decidedBy : undefined;\n\n // Canonical execution mode:\n // - enqueue: create run only\n // - run_now: create run + kick runner loop\n // (future) execute/run_now option is handled in the runner, not Kitchen.\n\n if (!teamId) return NextResponse.json({ ok: false, error: \"teamId is required\" }, { status: 400 });\n if (!workflowId) return NextResponse.json({ ok: false, error: \"workflowId is required\" }, { status: 400 });\n\n try {\n // Action mode: approve/request_changes/cancel (file-first) updates an existing run.\n if (action) {\n if (!runIdFromBody) return NextResponse.json({ ok: false, error: \"runId is required for action\" }, { status: 400 });\n if (![\"approve\", \"request_changes\", \"cancel\"].includes(action)) {\n return NextResponse.json({ ok: false, error: `Unsupported action: ${action}` }, { status: 400 });\n }\n\n const existing = await readWorkflowRun(teamId, workflowId, runIdFromBody);\n const run = existing.run;\n\n const approvalNodeId = run.approval?.nodeId || (Array.isArray(run.nodes) ? run.nodes.find((n) => n.status === \"waiting\")?.nodeId : undefined);\n if (!approvalNodeId) {\n return NextResponse.json({ ok: false, error: \"Run is not awaiting approval\" }, { status: 400 });\n }\n\n const decidedAt = nowIso();\n const nextState = action === \"approve\" ? \"approved\" : action === \"request_changes\" ? \"changes_requested\" : \"canceled\";\n\n const nextStatus: WorkflowRunFileV1[\"status\"] =\n nextState === \"approved\" ? \"success\" : nextState === \"canceled\" ? \"canceled\" : \"waiting_for_approval\";\n\n const nextNodes: WorkflowRunNodeResultV1[] = Array.isArray(run.nodes)\n ? run.nodes.map((n) => {\n if (n.nodeId === approvalNodeId) {\n const existingOutput = typeof n.output === \"object\" && n.output ? (n.output as Record<string, unknown>) : {};\n return {\n ...n,\n status: nextState === \"approved\" ? \"success\" : nextState === \"canceled\" ? \"error\" : \"waiting\",\n endedAt: nextState === \"changes_requested\" ? n.endedAt : decidedAt,\n output: {\n ...existingOutput,\n decision: nextState,\n note,\n decidedBy,\n },\n };\n }\n\n if (nextState === \"canceled\" && n.status === \"pending\") {\n return {\n ...n,\n status: \"skipped\",\n startedAt: n.startedAt ?? decidedAt,\n endedAt: decidedAt,\n output: n.output ?? { note: \"skipped due to cancel\" },\n };\n }\n\n return n;\n })\n : [];\n\n const nextRun: WorkflowRunFileV1 = {\n ...run,\n status: nextStatus,\n endedAt: nextStatus === \"success\" || nextStatus === \"canceled\" ? decidedAt : run.endedAt,\n approval: {\n nodeId: approvalNodeId,\n state: nextState,\n requestedAt: run.approval?.requestedAt,\n decidedAt: nextState === \"changes_requested\" ? undefined : decidedAt,\n note,\n decidedBy,\n },\n nodes: nextNodes,\n };\n\n\n let finalRun: WorkflowRunFileV1 = nextRun;\n\n // Best-effort: for sample runs, simulate resuming execution after approval by resolving\n // pending nodes and performing file-first writeback steps (fs.append).\n if (action === \"approve\") {\n try {\n const wf = (await readWorkflow(teamId, workflowId)).workflow;\n finalRun = await maybeExecutePendingNodesAfterApproval({\n teamId,\n workflow: wf,\n run: nextRun,\n approvalNodeId,\n decidedAt,\n });\n const hasError = Array.isArray(finalRun.nodes) && finalRun.nodes.some((n) => n.status === \"error\");\n if (hasError) {\n finalRun = { ...finalRun, status: \"error\", endedAt: decidedAt };\n }\n } catch {\n // ignore; keep file-first decision recorded\n }\n }\n\n return jsonOkRest({ ...(await writeWorkflowRun(teamId, workflowId, finalRun)), runId: run.id });\n }\n\n // Create mode\n const runId = `run-${nowIso().replace(/[:.]/g, \"-\")}-${crypto.randomBytes(3).toString(\"hex\")}`.toLowerCase();\n\n const run: WorkflowRunFileV1 =\n mode === \"sample\"\n ? await (async () => {\n const wf = (await readWorkflow(teamId, workflowId)).workflow;\n const t0 = Date.now();\n\n const templateId =\n wf.meta && typeof wf.meta === \"object\" && \"templateId\" in wf.meta ? (wf.meta as Record<string, unknown>).templateId : undefined;\n const isMarketingCadence = templateId === \"marketing-cadence-v1\";\n\n const marketingDrafts = isMarketingCadence\n ? {\n x: {\n hook: \"Stop losing hours to repetitive agent setup.\",\n body: \"ClawRecipes scaffolds entire teams of agents in one command — workflows, roles, conventions, and a human-approval gate before posting.\",\n },\n instagram: {\n hook: \"Ship agent workflows faster.\",\n body: \"From idea → drafted assets → brand QC → approval → posting. File-first workflows you can export and version.\",\n assetNotes: \"Square image: diagram of workflow nodes + approval gate.\",\n },\n tiktok: {\n hook: \"POV: you stop copy/pasting prompts.\",\n script: \"Today I’m building a marketing cadence workflow that researches, drafts, QC’s, then waits for human approval before it posts. File-first. Portable. No magic.\",\n assetNotes: \"15–25s screen recording of the canvas + approval buttons.\",\n },\n youtube: {\n hook: \"Build a marketing cadence workflow (with human approval) in 2 minutes.\",\n script: \"We’ll wire research → drafts → QC → approval → post nodes, and persist the whole thing to shared-context/workflows/*.workflow.json so it’s portable.\",\n assetNotes: \"Thumbnail: workflow canvas with 'Approve & Post' highlighted.\",\n },\n }\n : null;\n\n const approvalIdx = wf.nodes.findIndex((n) => n.type === \"human_approval\");\n const approvalNodeId = approvalIdx >= 0 ? wf.nodes[approvalIdx]?.id : undefined;\n\n const nodeResults: WorkflowRunNodeResultV1[] = wf.nodes.map((n, idx) => {\n const startedAt = new Date(t0 + idx * 350).toISOString();\n const endedAt = new Date(t0 + idx * 350 + 200).toISOString();\n\n const beforeApproval = approvalIdx < 0 ? true : idx < approvalIdx;\n const isApproval = approvalNodeId ? n.id === approvalNodeId : false;\n const afterApproval = approvalIdx >= 0 && idx > approvalIdx;\n\n const base: WorkflowRunNodeResultV1 = {\n nodeId: n.id,\n status: beforeApproval ? \"success\" : afterApproval ? \"pending\" : isApproval ? \"waiting\" : \"success\",\n startedAt,\n endedAt: beforeApproval ? endedAt : undefined,\n };\n\n if (n.type === \"llm\") {\n const marketingOutput =\n beforeApproval && isMarketingCadence\n ? n.id === \"research\"\n ? {\n model: \"(sample)\",\n kind: \"research\",\n bullets: [\n \"New agent teams are compelling when they’re portable + file-first.\",\n \"Human approval gates are mandatory for auto-post workflows.\",\n \"Cron triggers need timezone + preset suggestions.\",\n ],\n }\n : n.id === \"draft_assets\"\n ? {\n model: \"(sample)\",\n kind: \"draft_assets\",\n drafts: marketingDrafts,\n }\n : n.id === \"qc_brand\"\n ? {\n model: \"(sample)\",\n kind: \"qc_brand\",\n notes: [\n \"Keep claims concrete (no ‘magic’).\",\n \"Mention ClawRecipes before OpenClaw.\",\n \"Explicitly state: no posting without approval.\",\n ],\n }\n : {\n model: \"(sample)\",\n text: `Sample output for ${n.id}`,\n }\n : null;\n\n return {\n ...base,\n output: beforeApproval\n ? marketingOutput ?? {\n model: \"(sample)\",\n text: `Sample output for ${n.id}`,\n }\n : undefined,\n };\n }\n\n if (n.type === \"tool\") {\n const toolVal = n.config && typeof n.config === \"object\" ? (n.config as Record<string, unknown>).tool : undefined;\n const tool = typeof toolVal === \"string\" && toolVal.trim() ? toolVal.trim() : \"(unknown)\";\n return {\n ...base,\n output: beforeApproval\n ? {\n tool,\n result: \"(sample tool result)\",\n }\n : undefined,\n };\n }\n\n if (n.type === \"human_approval\") {\n const approvalPacket = isMarketingCadence\n ? {\n channel: \"(sample)\",\n decision: \"pending\",\n options: [\"approve\", \"request_changes\", \"cancel\"],\n packet: {\n templateId: \"marketing-cadence-v1\",\n note: \"Per-platform drafts (sample) — approve to post, request changes to loop, or cancel.\",\n platforms: {\n x: marketingDrafts?.x,\n instagram: marketingDrafts?.instagram,\n tiktok: marketingDrafts?.tiktok,\n youtube: marketingDrafts?.youtube,\n },\n },\n }\n : {\n channel: \"(sample)\",\n decision: \"pending\",\n options: [\"approve\", \"request_changes\", \"cancel\"],\n };\n\n return {\n ...base,\n output: approvalPacket,\n };\n }\n\n return base;\n });\n\n const status: WorkflowRunFileV1[\"status\"] = approvalNodeId ? \"waiting_for_approval\" : \"success\";\n\n const baseRun: WorkflowRunFileV1 = {\n schema: \"clawkitchen.workflow-run.v1\",\n id: runId,\n workflowId,\n startedAt: new Date(t0).toISOString(),\n endedAt: approvalNodeId ? undefined : new Date(t0 + wf.nodes.length * 350 + 200).toISOString(),\n status,\n summary: approvalNodeId\n ? \"Sample run (awaiting approval)\"\n : \"Sample run (generated by ClawKitchen UI)\",\n nodes: nodeResults,\n approval: approvalNodeId\n ? {\n nodeId: approvalNodeId,\n state: \"pending\",\n requestedAt: new Date(t0 + approvalIdx * 350).toISOString(),\n }\n : undefined,\n };\n\n if (approvalNodeId) {\n // Resolve the channel we *intend* to send to so we can record outbound metadata,\n // even though delivery is best-effort.\n const { provider, target } = await resolveApprovalChannel({ workflow: wf });\n\n if (target) {\n try {\n await maybeSendApprovalRequest({ teamId, workflow: wf, run: baseRun, approvalNodeId });\n baseRun.approval = {\n ...baseRun.approval,\n outbound: { provider, target, sentAt: nowIso() },\n } as WorkflowRunFileV1[\"approval\"];\n } catch (e: unknown) {\n baseRun.approval = {\n ...baseRun.approval,\n outbound: { provider, target, error: errorMessage(e), attemptedAt: nowIso() },\n } as WorkflowRunFileV1[\"approval\"];\n }\n }\n }\n\n return baseRun satisfies WorkflowRunFileV1;\n })()\n : await (async () => {\n\n // v2: delegate to CLI for enqueue/run-now (Kitchen should not author run artifacts).\n const modeNorm = mode || \"enqueue\";\n if (![\"execute\", \"enqueue\", \"run_now\", \"sample\"].includes(modeNorm)) {\n throw new Error(`Unsupported mode: ${modeNorm}`);\n }\n\n const wf = (await readWorkflow(teamId, workflowId)).workflow;\n\n // Preflight: nodes (excluding start/end) must be assigned to an agent.\n const missing = (Array.isArray(wf.nodes) ? wf.nodes : [])\n .filter((n) =>\n n &&\n typeof n === \"object\" &&\n (n as { type?: unknown }).type !== \"start\" &&\n (n as { type?: unknown }).type !== \"end\" &&\n (n as { type?: unknown }).type !== \"human_approval\"\n )\n .filter((n) => {\n const cfg = (n as { config?: unknown }).config;\n const o = cfg && typeof cfg === \"object\" && !Array.isArray(cfg) ? (cfg as Record<string, unknown>) : {};\n return !String(o.agentId ?? \"\").trim();\n })\n .map((n) => String((n as { id?: unknown }).id ?? \"\"))\n .filter(Boolean);\n if (missing.length) {\n throw new Error(`All nodes must be assigned to an agent. Missing agentId on: ${missing.join(\", \")}`);\n }\n\n const workflowFile = `${workflowId}.workflow.json`;\n\n // Delegate enqueue to ClawRecipes (CLI) which owns the canonical run folder/files.\n const enqueueRes = await runOpenClaw([\n \"recipes\",\n \"workflows\",\n \"run\",\n \"--team-id\",\n teamId,\n \"--workflow-file\",\n workflowFile,\n ]);\n if (!enqueueRes.ok) throw new Error(enqueueRes.stderr || enqueueRes.stdout || \"Failed to enqueue workflow run\");\n\n const enqueueJson = JSON.parse(String(enqueueRes.stdout ?? \"{}\")) as {\n ok?: boolean;\n runId?: string;\n runLogPath?: string;\n };\n const enqRunId = String(enqueueJson.runId ?? \"\").trim();\n if (!enqRunId) throw new Error(\"Enqueue succeeded but did not return runId\");\n\n if (modeNorm === \"run_now\") {\n // Run now = enqueue + runner + workers.\n // NOTE: `worker-tick --agent-id` must match a real agent id (queue file name).\n // If workflow node agentIds are aliases, we fail with a clear message.\n\n const agentListRes = await runOpenClaw([\"agents\", \"list\", \"--json\"]);\n if (!agentListRes.ok) throw new Error(agentListRes.stderr || agentListRes.stdout || \"Failed to list agents\");\n const agentList = JSON.parse(String(agentListRes.stdout ?? \"[]\")) as Array<{ id?: unknown }>;\n const knownAgentIds = new Set(agentList.map((a) => String(a.id ?? \"\").trim()).filter(Boolean));\n\n // Kick workers for all required agents referenced by the workflow file.\n const requiredAgentIds = (Array.isArray(wf.nodes) ? wf.nodes : [])\n .filter((n) =>\n n &&\n typeof n === \"object\" &&\n (n as { type?: unknown }).type !== \"start\" &&\n (n as { type?: unknown }).type !== \"end\" &&\n (n as { type?: unknown }).type !== \"human_approval\"\n )\n .map((n) => {\n const cfg = (n as { config?: unknown }).config;\n const o = cfg && typeof cfg === \"object\" && !Array.isArray(cfg) ? (cfg as Record<string, unknown>) : {};\n return String(o.agentId ?? \"\").trim();\n })\n .filter(Boolean);\n\n const uniq = Array.from(new Set(requiredAgentIds));\n const missing = uniq.filter((id) => !knownAgentIds.has(id));\n if (missing.length) {\n throw new Error(\n `Unknown agentId(s) in workflow node assignments: ${missing.join(\", \")}. ` +\n `These must match real OpenClaw agent ids (see openclaw agents list).`\n );\n }\n\n // Kick the runner. If the team queue already contains older runs, runner-once may claim\n // the oldest run first. For \"run_now\" semantics we want to ensure the *newly enqueued*\n // run gets claimed before we tick workers.\n for (let attempt = 0; attempt < 4; attempt++) {\n const runnerRes = await runOpenClaw([\"recipes\", \"workflows\", \"runner-once\", \"--team-id\", teamId]);\n if (!runnerRes.ok) throw new Error(runnerRes.stderr || runnerRes.stdout || \"Failed to run runner-once\");\n\n try {\n const { run } = await readWorkflowRun(teamId, workflowId, enqRunId);\n const statusAny = (run as unknown as { status?: unknown }).status;\n if (statusAny && String(statusAny) != \"queued\") break;\n } catch {\n // If we can't read the run yet, fall through to retry after a short delay.\n }\n\n // Give the filesystem a moment to settle (enqueue/runner writes are file-based).\n await new Promise((r) => setTimeout(r, 250));\n }\n\n // After retries, ensure our run is no longer queued.\n try {\n const { run } = await readWorkflowRun(teamId, workflowId, enqRunId);\n const statusAny = (run as unknown as { status?: unknown }).status;\n if (String(statusAny) === \"queued\") {\n throw new Error(\n `Run now enqueued runId=${enqRunId}, but runner did not claim it yet (queue may contain older runs). ` +\n `Please retry, or run: openclaw recipes workflows runner-once --team-id ${teamId}`\n );\n }\n } catch (e: unknown) {\n // If read fails, still proceed; worker-tick will be a no-op until runner claims.\n // But surface a helpful error if the read error is explicit.\n if (e instanceof Error && e.message.startsWith(\"Run now enqueued\")) throw e;\n }\n\n for (const agentId of uniq) {\n const workerRes = await runOpenClaw([\n \"recipes\",\n \"workflows\",\n \"worker-tick\",\n \"--team-id\",\n teamId,\n \"--agent-id\",\n agentId,\n \"--limit\",\n \"5\",\n \"--worker-id\",\n \"kitchen-run-now\",\n ]);\n if (!workerRes.ok) throw new Error(workerRes.stderr || workerRes.stdout || `Failed worker-tick for ${agentId}`);\n }\n }\n\n // Return a lightweight Kitchen-schema run so the UI can immediately navigate to it.\n return {\n schema: \"clawkitchen.workflow-run.v1\",\n id: enqRunId,\n workflowId,\n teamId,\n startedAt: nowIso(),\n status: \"running\",\n summary: modeNorm === \"run_now\" ? \"Queued + kicked runner/workers\" : \"Queued for workflow runner\",\n nodes: Array.isArray(wf.nodes)\n ? wf.nodes.map((n) => ({ nodeId: String(n.id), status: \"pending\" as const }))\n : [],\n } satisfies WorkflowRunFileV1;\n })();\n\n return jsonOkRest({ ...(await writeWorkflowRun(teamId, workflowId, run)), runId });\n } catch (err: unknown) {\n const msg = errorMessage(err);\n if (/^All nodes must be assigned to an agent\\./i.test(msg) || /^Unknown agentId\\(s\\)/i.test(msg)) {\n return NextResponse.json({ ok: false, error: msg }, { status: 400 });\n }\n return NextResponse.json({ ok: false, error: msg }, { status: 500 });\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getTeamWorkspaceDir } from \"@/lib/paths\";\nimport { readdirFiles } from \"@/lib/workflows/readdir\";\nimport { assertSafeWorkflowId } from \"@/lib/workflows/storage\";\nimport type { WorkflowRunFileV1, WorkflowRunNodeResultV1 } from \"@/lib/workflows/runs-types\";\n\nconst RUNS_DIR = path.join(\"shared-context\", \"workflow-runs\");\n\n/**\n * Back-compat:\n * - Legacy Kitchen layout: shared-context/workflow-runs/<workflowId>/*.run.json\n * - Runner layout (preferred): shared-context/workflow-runs/*.run.json\n */\nconst LEGACY_PER_WORKFLOW_LAYOUT = true;\n\nexport function assertSafeRunId(runId: string) {\n const id = String(runId ?? \"\").trim();\n if (!id) throw new Error(\"run id is required\");\n\n // Accept both Kitchen-style run ids (lowercase) and runner ids that include ISO timestamps (T/Z).\n // We still keep it conservative: only letters/numbers/dashes.\n if (!/^[A-Za-z0-9][A-Za-z0-9-]{0,120}$/.test(id)) {\n throw new Error(\"Invalid run id. Use letters, numbers, and dashes.\"\n );\n }\n return id;\n}\n\nexport async function getWorkflowRunsDir(teamId: string, workflowId: string) {\n // Validate workflowId (we no longer use it for the directory name).\n void assertSafeWorkflowId(workflowId);\n const teamDir = await getTeamWorkspaceDir(teamId);\n return path.join(teamDir, RUNS_DIR);\n}\n\nexport function workflowRunFileName(runId: string) {\n return `${runId}.run.json`;\n}\n\nexport async function listWorkflowRuns(teamId: string, workflowId: string) {\n const wfId = assertSafeWorkflowId(workflowId);\n const dir = await getWorkflowRunsDir(teamId, wfId);\n\n const runIds: string[] = [];\n\n // Preferred: runner directory-per-run layout: shared-context/workflow-runs/<runId>/run.json\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const runDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n\n for (const runId of runDirs) {\n const p = path.join(dir, runId, \"run.json\");\n try {\n const raw = await fs.readFile(p, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const normalized = normalizeRunFile(teamId, wfId, parsed, runId);\n if (normalized.workflowId === wfId) runIds.push(runId);\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n\n // Legacy: flat *.run.json at root\n try {\n const { files } = await readdirFiles(dir, \".run.json\", true);\n for (const f of files) {\n const runId = f.replace(/\\.run\\.json$/i, \"\");\n try {\n const raw = await fs.readFile(path.join(dir, f), \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const normalized = normalizeRunFile(teamId, wfId, parsed, runId);\n if (normalized.workflowId === wfId) runIds.push(runId);\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n\n // Back-compat: legacy per-workflow directory.\n if (LEGACY_PER_WORKFLOW_LAYOUT) {\n try {\n const legacyDir = path.join(dir, wfId);\n const { files } = await readdirFiles(legacyDir, \".run.json\", true);\n for (const f of files) runIds.push(f.replace(/\\.run\\.json$/i, \"\"));\n } catch {\n // ignore\n }\n }\n\n const uniq = Array.from(new Set(runIds)).sort().reverse();\n return { ok: true as const, dir, runIds: uniq };\n}\n\nexport async function readWorkflowRun(teamId: string, workflowId: string, runId: string) {\n const wfId = assertSafeWorkflowId(workflowId);\n const rId = assertSafeRunId(runId);\n const dir = await getWorkflowRunsDir(teamId, wfId);\n\n // Preferred (runner) layout: shared-context/workflow-runs/<runId>/run.json\n const pRunner = path.join(dir, rId, \"run.json\");\n try {\n const raw = await fs.readFile(pRunner, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const run = normalizeRunFile(teamId, wfId, parsed, rId);\n\n // Runner stores rich node outputs as files under:\n // workflow-runs/<runId>/node-outputs/*-<nodeId>.json\n // Normalize by hydrating node.output from those files when missing.\n if (Array.isArray(run.nodes) && run.nodes.length) {\n const outputsDir = path.join(dir, rId, \"node-outputs\");\n let files: string[] = [];\n try {\n files = await fs.readdir(outputsDir);\n } catch {\n files = [];\n }\n\n // Multiple output files may exist for the same nodeId when a workflow executes a node\n // more than once. Preserve ordering by assigning outputs sequentially per nodeId.\n //\n // NOTE: Runner output filenames are typically prefixed with a sortable counter (e.g. 001-<nodeId>.json).\n // We rely on lexicographic order of filenames within node-outputs.\n const byNodeId = new Map<string, string[]>();\n for (const f of files.slice().sort()) {\n const m = f.match(/-([^/]+)\\.json$/);\n if (!m) continue;\n const nodeId = m[1];\n if (!nodeId) continue;\n const existing = byNodeId.get(nodeId) ?? [];\n existing.push(path.join(outputsDir, f));\n byNodeId.set(nodeId, existing);\n }\n\n await Promise.all(\n run.nodes.map(async (n) => {\n if (!n || typeof n !== \"object\") return;\n // Only hydrate if output is truly missing.\n if (typeof n.output !== \"undefined\") return;\n\n const arr = byNodeId.get(n.nodeId);\n if (!arr || !arr.length) return;\n\n const pOut = arr.shift();\n if (!pOut) return;\n\n try {\n const outRaw = await fs.readFile(pOut, \"utf8\");\n n.output = JSON.parse(outRaw) as unknown;\n } catch {\n // ignore\n }\n })\n );\n }\n\n return { ok: true as const, path: pRunner, run };\n } catch (err: unknown) {\n // fallthrough\n if (!(err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\")) throw err;\n }\n\n // Legacy flat layout: shared-context/workflow-runs/<runId>.run.json\n const p0 = path.join(dir, workflowRunFileName(rId));\n try {\n const raw = await fs.readFile(p0, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return { ok: true as const, path: p0, run: normalizeRunFile(teamId, wfId, parsed, rId) };\n } catch (err: unknown) {\n if (LEGACY_PER_WORKFLOW_LAYOUT && err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\") {\n const legacy = path.join(dir, wfId, workflowRunFileName(rId));\n const raw = await fs.readFile(legacy, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return { ok: true as const, path: legacy, run: normalizeRunFile(teamId, wfId, parsed, rId) };\n }\n throw err;\n }\n}\n\nexport async function writeWorkflowRun(teamId: string, workflowId: string, run: WorkflowRunFileV1) {\n const wfId = assertSafeWorkflowId(workflowId);\n const rId = assertSafeRunId(run.id);\n const dir = await getWorkflowRunsDir(teamId, wfId);\n await fs.mkdir(dir, { recursive: true });\n\n // Default layout: write to shared-context/workflow-runs/<runId>.run.json\n //\n // IMPORTANT: that filename may already be occupied by a runner-owned run log (different schema).\n // In that case, keep the runner log intact and write the Kitchen run file to the legacy\n // per-workflow directory shared-context/workflow-runs/<workflowId>/<runId>.run.json.\n const p0 = path.join(dir, workflowRunFileName(rId));\n\n let p = p0;\n try {\n const raw = await fs.readFile(p0, \"utf8\");\n const existing = JSON.parse(raw) as unknown;\n const isRunnerLog =\n Boolean(existing) &&\n typeof existing === \"object\" &&\n !Array.isArray(existing) &&\n \"runId\" in (existing as Record<string, unknown>) &&\n !(\"schema\" in (existing as Record<string, unknown>));\n\n if (isRunnerLog && LEGACY_PER_WORKFLOW_LAYOUT) {\n const legacyDir = path.join(dir, wfId);\n await fs.mkdir(legacyDir, { recursive: true });\n p = path.join(legacyDir, workflowRunFileName(rId));\n }\n } catch {\n // ignore read/parse errors; we'll write to p0\n }\n\n const toWrite: WorkflowRunFileV1 = {\n ...run,\n schema: \"clawkitchen.workflow-run.v1\",\n id: rId,\n workflowId: wfId,\n teamId,\n };\n await fs.writeFile(p, JSON.stringify(toWrite, null, 2) + \"\\n\", \"utf8\");\n return { ok: true as const, path: p };\n}\n\nexport type WorkflowRunSummary = {\n workflowId: string;\n runId: string;\n status?: WorkflowRunFileV1[\"status\"];\n startedAt?: string;\n endedAt?: string;\n /** ISO timestamp derived from file mtime (best-effort) */\n updatedAt?: string;\n /** Absolute path to the run file on disk (server-side only) */\n path: string;\n};\n\nexport async function listAllWorkflowRuns(teamId: string): Promise<{ ok: true; dir: string; runs: WorkflowRunSummary[] }> {\n const teamDir = await getTeamWorkspaceDir(teamId);\n const dir = path.join(teamDir, RUNS_DIR);\n\n const runs: WorkflowRunSummary[] = [];\n\n // Preferred: runner directory-per-run layout:\n // shared-context/workflow-runs/<runId>/run.json\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const runDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n\n for (const runId of runDirs) {\n const full = path.join(dir, runId, \"run.json\");\n try {\n const [raw, st] = await Promise.all([fs.readFile(full, \"utf8\"), fs.stat(full)]);\n const normalized = normalizeRunFile(teamId, \"(unknown)\", JSON.parse(raw) as unknown, runId);\n runs.push({\n workflowId: normalized.workflowId,\n runId: normalized.id,\n status: normalized.status,\n startedAt: normalized.startedAt,\n endedAt: normalized.endedAt,\n updatedAt: st.mtime ? new Date(st.mtime).toISOString() : undefined,\n path: full,\n });\n } catch {\n // ignore missing run.json/parse errors; keep going\n }\n }\n } catch (err: unknown) {\n if (!(err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\")) throw err;\n }\n\n // Legacy: flat run files at root: shared-context/workflow-runs/<runId>.run.json\n try {\n const entries = (await fs.readdir(dir)).filter((n) => n.endsWith(\".run.json\")).sort();\n for (const fileName of entries) {\n const runId = fileName.replace(/\\.run\\.json$/i, \"\");\n const full = path.join(dir, fileName);\n try {\n const [raw, st] = await Promise.all([fs.readFile(full, \"utf8\"), fs.stat(full)]);\n const normalized = normalizeRunFile(teamId, \"(unknown)\", JSON.parse(raw) as unknown, runId);\n runs.push({\n workflowId: normalized.workflowId,\n runId: normalized.id,\n status: normalized.status,\n startedAt: normalized.startedAt,\n endedAt: normalized.endedAt,\n updatedAt: st.mtime ? new Date(st.mtime).toISOString() : undefined,\n path: full,\n });\n } catch {\n runs.push({ workflowId: \"(unknown)\", runId, path: full });\n }\n }\n } catch (err: unknown) {\n if (!(err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\")) throw err;\n }\n\n // Back-compat: legacy per-workflow directory.\n if (LEGACY_PER_WORKFLOW_LAYOUT) {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const wfDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n\n for (const workflowId of wfDirs) {\n const wfDir = path.join(dir, workflowId);\n let entries2: string[] = [];\n try {\n entries2 = (await fs.readdir(wfDir)).filter((n) => n.endsWith(\".run.json\")).sort();\n } catch (err: unknown) {\n if (err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\") continue;\n throw err;\n }\n\n for (const fileName of entries2) {\n const runId = fileName.replace(/\\.run\\.json$/i, \"\");\n const full = path.join(wfDir, fileName);\n try {\n const [raw, st] = await Promise.all([fs.readFile(full, \"utf8\"), fs.stat(full)]);\n const parsed = JSON.parse(raw) as Partial<WorkflowRunFileV1>;\n runs.push({\n workflowId,\n runId,\n status: parsed.status as WorkflowRunFileV1[\"status\"],\n startedAt: typeof parsed.startedAt === \"string\" ? parsed.startedAt : undefined,\n endedAt: typeof parsed.endedAt === \"string\" ? parsed.endedAt : undefined,\n updatedAt: st.mtime ? new Date(st.mtime).toISOString() : undefined,\n path: full,\n });\n } catch {\n runs.push({ workflowId, runId, path: full });\n }\n }\n }\n } catch (err: unknown) {\n if (!(err && typeof err === \"object\" && (err as { code?: unknown }).code === \"ENOENT\")) throw err;\n }\n }\n\n runs.sort((a, b) => String(b.updatedAt ?? b.startedAt ?? \"\").localeCompare(String(a.updatedAt ?? a.startedAt ?? \"\")));\n return { ok: true as const, dir, runs };\n}\n\nfunction normalizeRunFile(teamId: string, workflowId: string, parsed: unknown, runIdFallback: string): WorkflowRunFileV1 {\n // Kitchen schema\n if (parsed && typeof parsed === \"object\" && (parsed as { schema?: unknown }).schema === \"clawkitchen.workflow-run.v1\") {\n return parsed as WorkflowRunFileV1;\n }\n\n // Runner schema (RunLog from ClawRecipes). Convert to Kitchen's display schema.\n if (parsed && typeof parsed === \"object\" && \"runId\" in parsed && \"workflow\" in parsed) {\n const o = parsed as {\n runId?: unknown;\n createdAt?: unknown;\n updatedAt?: unknown;\n status?: unknown;\n workflow?: { id?: unknown; file?: unknown };\n nodeResults?: unknown;\n };\n\n const wfObj = o.workflow && typeof o.workflow === \"object\" ? o.workflow : {};\n const file = typeof wfObj.file === \"string\" ? wfObj.file : \"\";\n const inferredWfId = file ? path.basename(file).replace(/\\.workflow\\.json$/i, \"\") : \"\";\n const wfId = typeof wfObj.id === \"string\" && wfObj.id ? wfObj.id : inferredWfId || workflowId;\n\n const statusRaw = String(o.status ?? \"\");\n const status: WorkflowRunFileV1[\"status\"] =\n statusRaw === \"awaiting_approval\"\n ? \"waiting_for_approval\"\n : statusRaw === \"completed\"\n ? \"success\"\n : statusRaw === \"rejected\"\n ? \"error\"\n : statusRaw === \"error\"\n ? \"error\"\n : statusRaw === \"canceled\"\n ? \"canceled\"\n : \"running\";\n\n const nodes = Array.isArray(o.nodeResults)\n ? o.nodeResults\n .map((nr) => {\n if (!nr || typeof nr !== \"object\") return null;\n const r = nr as {\n nodeId?: unknown;\n status?: unknown;\n startedAt?: unknown;\n endedAt?: unknown;\n output?: unknown;\n error?: unknown;\n };\n const nodeId = typeof r.nodeId === \"string\" ? r.nodeId : \"\";\n if (!nodeId) return null;\n\n const st = String(r.status ?? \"pending\");\n const mapped =\n st === \"awaiting_approval\"\n ? \"waiting\"\n : st === \"completed\"\n ? \"success\"\n : st === \"error\"\n ? \"error\"\n : st;\n\n const allowed = [\"pending\", \"running\", \"waiting\", \"success\", \"error\", \"skipped\"] as const;\n const status = (allowed as readonly string[]).includes(mapped) ? (mapped as (typeof allowed)[number]) : \"pending\";\n\n const error =\n typeof r.error === \"string\"\n ? r.error\n : r.error && typeof r.error === \"object\" && \"message\" in r.error\n ? { message: String((r.error as { message?: unknown }).message ?? \"\") }\n : undefined;\n\n const startedAt = typeof r.startedAt === \"string\" ? r.startedAt : undefined;\n const endedAt = typeof r.endedAt === \"string\" ? r.endedAt : undefined;\n\n return {\n nodeId,\n status,\n ...(startedAt ? { startedAt } : {}),\n ...(endedAt ? { endedAt } : {}),\n ...(typeof r.output !== \"undefined\" ? { output: r.output } : {}),\n ...(typeof error !== \"undefined\" ? { error } : {}),\n } satisfies WorkflowRunNodeResultV1;\n })\n .filter((x): x is WorkflowRunNodeResultV1 => x !== null)\n : undefined;\n\n return {\n schema: \"clawkitchen.workflow-run.v1\",\n id: typeof o.runId === \"string\" ? o.runId : runIdFallback,\n workflowId: wfId,\n teamId,\n startedAt: typeof o.createdAt === \"string\" ? o.createdAt : new Date().toISOString(),\n endedAt:\n status === \"success\" || status === \"error\" || status === \"canceled\"\n ? typeof o.updatedAt === \"string\"\n ? o.updatedAt\n : undefined\n : undefined,\n status,\n summary: \"Executed by workflow runner\",\n nodes,\n };\n }\n\n // Unknown schema; keep a placeholder so UI can still render.\n return {\n schema: \"clawkitchen.workflow-run.v1\",\n id: runIdFallback,\n workflowId,\n teamId,\n startedAt: new Date().toISOString(),\n status: \"error\",\n summary: \"Malformed run file\",\n };\n}"],"names":[],"mappings":"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","ignoreList":[0]}
|