UNPKG

@langchain/langgraph-sdk

Version:

Client library for interacting with the LangGraph API

1 lines • 5.17 kB
{"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"}