{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-34GRQBFC.cjs","../../src/routes/api/schedule-run.routes.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACPA;AAIC;AAAA,kCACM;AACP,oDAA4B;AAS5B,IAAM,mBAAA,EAAiD;AAAA,EACtD,UAAA;AAAA,EACA;AACD,CAAA;AACA,IAAM,sBAAA,EAAsD;AAAA,EAC3D,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACD,CAAA;AAEA,SAAS,cAAA,CACR,IAAA,EACA,KAAA,EACA,OAAA,EACgB;AAChB,EAAA,GAAA,CAAI,MAAA,IAAU,KAAA,CAAA,EAAW,OAAO,KAAA,CAAA;AAChC,EAAA,GAAA,CAAI,OAAO,MAAA,IAAU,SAAA,GAAY,CAAC,OAAA,CAAQ,QAAA,CAAS,KAAU,CAAA,EAAG;AAC/D,IAAA,MAAM,IAAI,mCAAA;AAAA,MACT,4BAAA,CAAY,WAAA;AAAA,MACZ,CAAA,QAAA,EAAW,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAAA;AAClC,EAAA;AAED,EAAA;AACD;AASO;AAIN,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACC,IAAA;AAAU,MAAA;AACG,MAAA;AACqB,IAAA;AAClC,EAAA;AAED,EAAA;AAIA,EAAA;AAAO,IAAA;AAC4B,IAAA;AAG/B,EAAA;AAEL;AAEO;AACN,EAAA;AAGA,EAAA;AACC,IAAA;AACC,MAAA;AACA,MAAA;AACC,QAAA;AAAU,UAAA;AACG,UAAA;AACZ,QAAA;AACD,MAAA;AAED,MAAA;AAA0B,QAAA;AACrB,MAAA;AAEL,MAAA;AACA,MAAA;AAAoC,IAAA;AAEpC,MAAA;AAAU,IAAA;AACX,EAAA;AAGD,EAAA;AACD;AD3BA;AACA;AACA;AACA;AACA","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-34GRQBFC.cjs","sourcesContent":[null,"import {\n\ttype NextFunction,\n\ttype Request,\n\ttype Response,\n\tRouter,\n} from \"express\";\nimport { StatusCodes } from \"http-status-codes\";\nimport { getMemoryModule } from \"@/config/modules\";\nimport { AinHttpError } from \"@/types/agent\";\nimport type {\n\tScheduleJobType,\n\tScheduleRunFilter,\n\tScheduleRunStatus,\n} from \"@/types/schedule\";\n\nconst SCHEDULE_JOB_TYPES: readonly ScheduleJobType[] = [\n\t\"WORKFLOW\",\n\t\"SLOT_REFRESH\",\n];\nconst SCHEDULE_RUN_STATUSES: readonly ScheduleRunStatus[] = [\n\t\"running\",\n\t\"success\",\n\t\"failed\",\n\t\"skipped_overlap\",\n];\n\nfunction parseEnumParam<T extends string>(\n\tname: string,\n\tvalue: unknown,\n\tallowed: readonly T[],\n): T | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"string\" || !allowed.includes(value as T)) {\n\t\tthrow new AinHttpError(\n\t\t\tStatusCodes.BAD_REQUEST,\n\t\t\t`invalid ${name}: ${String(value)}`,\n\t\t);\n\t}\n\treturn value as T;\n}\n\n/**\n * Validates/parses the list query params. Express's qs parser can produce\n * arrays (repeated keys) or nested objects — anything that is not a plain,\n * known enum/string value is rejected with a 400 instead of silently\n * mis-filtering. Absent params stay undefined (no filter). `limit` keeps its\n * lenient clamp: non-numeric → default 20, otherwise clamped to [1, 100].\n */\nexport function parseScheduleRunListQuery(query: Record<string, unknown>): {\n\tfilter: ScheduleRunFilter;\n\tlimit: number;\n} {\n\tconst jobType = parseEnumParam(\"jobType\", query.jobType, SCHEDULE_JOB_TYPES);\n\tconst status = parseEnumParam(\"status\", query.status, SCHEDULE_RUN_STATUSES);\n\tconst jobKey = query.jobKey;\n\tif (jobKey !== undefined && typeof jobKey !== \"string\") {\n\t\tthrow new AinHttpError(\n\t\t\tStatusCodes.BAD_REQUEST,\n\t\t\t`invalid jobKey: ${String(jobKey)}`,\n\t\t);\n\t}\n\tconst parsedLimit =\n\t\ttypeof query.limit === \"string\" && query.limit\n\t\t\t? Number.parseInt(query.limit, 10)\n\t\t\t: Number.NaN;\n\treturn {\n\t\tfilter: { jobType, jobKey, status },\n\t\tlimit: Number.isFinite(parsedLimit)\n\t\t\t? Math.min(Math.max(parsedLimit, 1), 100)\n\t\t\t: 20,\n\t};\n}\n\nexport const createScheduleRunApiRouter = (): Router => {\n\tconst router = Router();\n\n\t// APIs (prefix: /api/schedule-runs)\n\trouter.get(\"/\", async (req: Request, res: Response, next: NextFunction) => {\n\t\ttry {\n\t\t\tconst memory = getMemoryModule().getScheduleRunMemory();\n\t\t\tif (!memory) {\n\t\t\t\tthrow new AinHttpError(\n\t\t\t\t\tStatusCodes.SERVICE_UNAVAILABLE,\n\t\t\t\t\t\"Schedule run memory is not initialized\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst { filter, limit } = parseScheduleRunListQuery(\n\t\t\t\treq.query as Record<string, unknown>,\n\t\t\t);\n\t\t\tconst runs = await memory.listScheduleRuns(filter, limit);\n\t\t\tres.status(StatusCodes.OK).json(runs);\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t});\n\n\treturn router;\n};\n"]}