{"version":3,"file":"interrupts.cjs","names":["normalizeHitlInterruptPayload","filterOutHeadlessToolInterrupts"],"sources":["../../src/ui/interrupts.ts"],"sourcesContent":["import { normalizeHitlInterruptPayload } from \"./hitl-interrupt-payload.js\";\nimport { filterOutHeadlessToolInterrupts } from \"../headless-tools.js\";\nimport { Interrupt, ThreadState } from \"../schema.js\";\n\n/**\n * Normalizes HITL interrupt payloads to expose camelCase fields plus deprecated\n * snake_case aliases for compatibility during migration.\n */\nexport function normalizeInterruptForClient<T = unknown>(\n  interrupt: Interrupt<T>\n): Interrupt<T> {\n  if (interrupt.value === undefined) {\n    return interrupt;\n  }\n  return {\n    ...interrupt,\n    value: normalizeHitlInterruptPayload(interrupt.value) as T,\n  };\n}\n\n/**\n * Applies {@link normalizeInterruptForClient} to each interrupt.\n */\nexport function normalizeInterruptsList<T = unknown>(\n  interrupts: Interrupt<T>[]\n): Interrupt<T>[] {\n  return interrupts.map((i) => normalizeInterruptForClient(i));\n}\n\nexport function userFacingInterruptsFromValuesArray<InterruptType = unknown>(\n  valueInterrupts: Interrupt<InterruptType>[]\n): Interrupt<InterruptType>[] {\n  if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n\n  const filtered = filterOutHeadlessToolInterrupts(valueInterrupts);\n  if (filtered.length === 0) return [];\n\n  return normalizeInterruptsList(filtered as Interrupt<InterruptType>[]);\n}\n\nexport function userFacingInterruptsFromThreadTasks<InterruptType = unknown>(\n  allInterrupts: Interrupt<InterruptType>[]\n): Interrupt<InterruptType>[] | null {\n  if (allInterrupts.length === 0) return null;\n\n  const filtered = filterOutHeadlessToolInterrupts(allInterrupts);\n  if (filtered.length === 0) return [];\n\n  return normalizeInterruptsList(filtered as Interrupt<InterruptType>[]);\n}\n\nexport function extractInterrupts<InterruptType = unknown>(\n  values: unknown,\n  options?: {\n    isLoading: boolean;\n    threadState: ThreadState | undefined;\n    error: unknown;\n  }\n): Interrupt<InterruptType> | undefined {\n  if (\n    typeof values === \"object\" &&\n    values != null &&\n    \"__interrupt__\" in values &&\n    Array.isArray(values.__interrupt__)\n  ) {\n    const valueInterrupts = values.__interrupt__ as Interrupt<InterruptType>[];\n    if (valueInterrupts.length === 0) return { when: \"breakpoint\" };\n\n    const filtered = filterOutHeadlessToolInterrupts(valueInterrupts);\n    if (filtered.length === 0) return undefined;\n    if (filtered.length === 1) {\n      return normalizeInterruptForClient(\n        filtered[0] as Interrupt<InterruptType>\n      );\n    }\n\n    // TODO: fix the typing of interrupts if multiple interrupts are returned\n    const normalized = filtered.map((i) => normalizeInterruptForClient(i));\n    return normalized as unknown as Interrupt<InterruptType> | undefined;\n  }\n\n  // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n  if (options?.isLoading) return undefined;\n\n  const interrupts = options?.threadState?.tasks?.at(-1)?.interrupts;\n  if (interrupts == null || interrupts.length === 0) {\n    // check if there's a next task present\n    const next = options?.threadState?.next ?? [];\n    if (!next.length || options?.error != null) return undefined;\n    return { when: \"breakpoint\" };\n  }\n\n  const filtered = filterOutHeadlessToolInterrupts(\n    interrupts as Interrupt<InterruptType>[]\n  );\n  if (filtered.length === 0) {\n    const next = options?.threadState?.next ?? [];\n    if (!next.length || options?.error != null) return undefined;\n    return { when: \"breakpoint\" };\n  }\n\n  // Return only the current interrupt\n  return normalizeInterruptForClient(\n    filtered.at(-1) as Interrupt<InterruptType>\n  );\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,4BACd,WACc;AACd,KAAI,UAAU,UAAU,KAAA,EACtB,QAAO;AAET,QAAO;EACL,GAAG;EACH,OAAOA,+BAAAA,8BAA8B,UAAU,MAAM;EACtD;;;;;AAMH,SAAgB,wBACd,YACgB;AAChB,QAAO,WAAW,KAAK,MAAM,4BAA4B,EAAE,CAAC;;AAG9D,SAAgB,oCACd,iBAC4B;AAC5B,KAAI,gBAAgB,WAAW,EAAG,QAAO,CAAC,EAAE,MAAM,cAAc,CAAC;CAEjE,MAAM,WAAWC,uBAAAA,gCAAgC,gBAAgB;AACjE,KAAI,SAAS,WAAW,EAAG,QAAO,EAAE;AAEpC,QAAO,wBAAwB,SAAuC;;AAGxE,SAAgB,oCACd,eACmC;AACnC,KAAI,cAAc,WAAW,EAAG,QAAO;CAEvC,MAAM,WAAWA,uBAAAA,gCAAgC,cAAc;AAC/D,KAAI,SAAS,WAAW,EAAG,QAAO,EAAE;AAEpC,QAAO,wBAAwB,SAAuC;;AAGxE,SAAgB,kBACd,QACA,SAKsC;AACtC,KACE,OAAO,WAAW,YAClB,UAAU,QACV,mBAAmB,UACnB,MAAM,QAAQ,OAAO,cAAc,EACnC;EACA,MAAM,kBAAkB,OAAO;AAC/B,MAAI,gBAAgB,WAAW,EAAG,QAAO,EAAE,MAAM,cAAc;EAE/D,MAAM,WAAWA,uBAAAA,gCAAgC,gBAAgB;AACjE,MAAI,SAAS,WAAW,EAAG,QAAO,KAAA;AAClC,MAAI,SAAS,WAAW,EACtB,QAAO,4BACL,SAAS,GACV;AAKH,SADmB,SAAS,KAAK,MAAM,4BAA4B,EAAE,CAAC;;AAKxE,KAAI,SAAS,UAAW,QAAO,KAAA;CAE/B,MAAM,aAAa,SAAS,aAAa,OAAO,GAAG,GAAG,EAAE;AACxD,KAAI,cAAc,QAAQ,WAAW,WAAW,GAAG;AAGjD,MAAI,EADS,SAAS,aAAa,QAAQ,EAAE,EACnC,UAAU,SAAS,SAAS,KAAM,QAAO,KAAA;AACnD,SAAO,EAAE,MAAM,cAAc;;CAG/B,MAAM,WAAWA,uBAAAA,gCACf,WACD;AACD,KAAI,SAAS,WAAW,GAAG;AAEzB,MAAI,EADS,SAAS,aAAa,QAAQ,EAAE,EACnC,UAAU,SAAS,SAAS,KAAM,QAAO,KAAA;AACnD,SAAO,EAAE,MAAM,cAAc;;AAI/B,QAAO,4BACL,SAAS,GAAG,GAAG,CAChB"}