{"version":3,"file":"nested-path.d.ts","sourceRoot":"","sources":["../../../../src/runs/shared/nested-path.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAUlE;AAUD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,EAAE,CAepE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,EAAE,CAO/E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CAGpE","sourcesContent":["import * as path from \"node:path\";\n\nconst MAX_NESTED_ID_LENGTH = 128;\nexport const MAX_NESTED_PATH_ENTRIES = 4;\n\nexport type NestedPathEntry = { runId: string; stepIndex?: number; agent?: string };\n\nexport function isSafeNestedPathId(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\tvalue.length <= MAX_NESTED_ID_LENGTH &&\n\t\t!path.isAbsolute(value) &&\n\t\t!value.includes(\"/\") &&\n\t\t!value.includes(\"\\\\\") &&\n\t\t!value.includes(\"..\")\n\t);\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction nonEmptyString(value: unknown, max: number): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value.slice(0, max) : undefined;\n}\n\nexport function sanitizeNestedPath(value: unknown): NestedPathEntry[] {\n\tif (!Array.isArray(value)) return [];\n\treturn value\n\t\t.map((part) => {\n\t\t\tif (!part || typeof part !== \"object\") return undefined;\n\t\t\tconst record = part as Record<string, unknown>;\n\t\t\tif (!isSafeNestedPathId(record.runId)) return undefined;\n\t\t\treturn {\n\t\t\t\trunId: record.runId,\n\t\t\t\t...(finiteNumber(record.stepIndex) !== undefined ? { stepIndex: finiteNumber(record.stepIndex) } : {}),\n\t\t\t\t...(nonEmptyString(record.agent, 128) ? { agent: nonEmptyString(record.agent, 128) } : {}),\n\t\t\t};\n\t\t})\n\t\t.filter((part): part is NestedPathEntry => Boolean(part))\n\t\t.slice(0, MAX_NESTED_PATH_ENTRIES);\n}\n\nexport function parseNestedPathEnv(value: string | undefined): NestedPathEntry[] {\n\tif (!value) return [];\n\ttry {\n\t\treturn sanitizeNestedPath(JSON.parse(value) as unknown);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport function encodeNestedPathEnv(value: NestedPathEntry[]): string {\n\tconst sanitized = sanitizeNestedPath(value);\n\treturn sanitized.length ? JSON.stringify(sanitized) : \"\";\n}\n"]}