{"version":3,"file":"client.cjs","names":["React","ReactDOM","JsxRuntime"],"sources":["../../src/react-ui/client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport * as JsxRuntime from \"react/jsx-runtime\";\nimport type { BagTemplate } from \"@langchain/langgraph-sdk\";\nimport { useStream } from \"../react/index.js\";\nimport type { UIMessage } from \"./types.js\";\nimport type { UseStream } from \"../react/types.js\";\n\nconst UseStreamContext = React.createContext<{\n  stream: ReturnType<typeof useStream>;\n  meta: unknown;\n}>(null!);\n\ntype GetMetaType<Bag extends BagTemplate> = Bag extends { MetaType: unknown }\n  ? Bag[\"MetaType\"]\n  : unknown;\n\ninterface UseStreamContext<\n  StateType extends Record<string, unknown> = Record<string, unknown>,\n  Bag extends BagTemplate = BagTemplate,\n> extends UseStream<StateType, Bag> {\n  meta?: GetMetaType<Bag>;\n}\n\nexport function useStreamContext<\n  StateType extends Record<string, unknown> = Record<string, unknown>,\n  Bag extends BagTemplate = BagTemplate,\n>(): UseStreamContext<StateType, Bag> {\n  const ctx = React.useContext(UseStreamContext);\n  if (!ctx) {\n    throw new Error(\n      \"useStreamContext must be used within a LoadExternalComponent\"\n    );\n  }\n\n  return new Proxy(ctx, {\n    get(target, prop: keyof UseStreamContext<StateType, Bag>) {\n      if (prop === \"meta\") return target.meta;\n      return target.stream[prop as keyof typeof target.stream];\n    },\n  }) as unknown as UseStreamContext<StateType, Bag>;\n}\n\ninterface ComponentTarget {\n  comp: React.FunctionComponent | React.ComponentClass;\n  target: HTMLElement;\n}\n\nclass ComponentStore {\n  private cache: Record<string, ComponentTarget> = {};\n\n  private boundCache: Record<\n    string,\n    {\n      subscribe: (onStoreChange: () => void) => () => void;\n      getSnapshot: () => ComponentTarget | undefined;\n    }\n  > = {};\n\n  private callbacks: Record<\n    string,\n    ((\n      comp: React.FunctionComponent | React.ComponentClass,\n      el: HTMLElement\n    ) => void)[]\n  > = {};\n\n  respond(\n    shadowRootId: string,\n    comp: React.FunctionComponent | React.ComponentClass,\n    targetElement: HTMLElement\n  ) {\n    this.cache[shadowRootId] = { comp, target: targetElement };\n    this.callbacks[shadowRootId]?.forEach((c) => c(comp, targetElement));\n  }\n\n  getBoundStore(shadowRootId: string) {\n    this.boundCache[shadowRootId] ??= {\n      subscribe: (onStoreChange: () => void) => {\n        this.callbacks[shadowRootId] ??= [];\n        this.callbacks[shadowRootId].push(onStoreChange);\n        return () => {\n          this.callbacks[shadowRootId] = this.callbacks[shadowRootId].filter(\n            (c) => c !== onStoreChange\n          );\n        };\n      },\n      getSnapshot: () => this.cache[shadowRootId],\n    };\n\n    return this.boundCache[shadowRootId];\n  }\n}\n\nconst COMPONENT_STORE = new ComponentStore();\nconst EXT_STORE_SYMBOL = Symbol.for(\"LGUI_EXT_STORE\");\nconst REQUIRE_SYMBOL = Symbol.for(\"LGUI_REQUIRE\");\nconst REQUIRE_EXTRA_SYMBOL = Symbol.for(\"LGUI_REQUIRE_EXTRA\");\n\ninterface LoadExternalComponentProps extends Pick<\n  React.HTMLAttributes<HTMLDivElement>,\n  \"style\" | \"className\"\n> {\n  stream: ReturnType<typeof useStream>;\n  namespace?: string;\n  message: UIMessage;\n  meta?: unknown;\n  fallback?: React.ReactNode | Record<string, React.ReactNode>;\n  components?: Record<string, React.FunctionComponent | React.ComponentClass>;\n}\n\nconst isIterable = (value: unknown): value is Iterable<unknown> =>\n  value != null && typeof value === \"object\" && Symbol.iterator in value;\n\nconst isPromise = (value: unknown): value is Promise<unknown> =>\n  value != null &&\n  typeof value === \"object\" &&\n  \"then\" in value &&\n  typeof value.then === \"function\";\n\nconst isReactNode = (value: unknown): value is React.ReactNode => {\n  if (React.isValidElement(value)) return true;\n  if (value == null) return true;\n  if (\n    typeof value === \"string\" ||\n    typeof value === \"number\" ||\n    typeof value === \"bigint\" ||\n    typeof value === \"boolean\"\n  ) {\n    return true;\n  }\n\n  if (isIterable(value)) return true;\n  if (isPromise(value)) return true;\n\n  return false;\n};\n\nexport function LoadExternalComponent({\n  stream,\n  namespace,\n  message,\n  meta,\n  fallback,\n  components,\n  ...props\n}: LoadExternalComponentProps) {\n  const ref = React.useRef<HTMLDivElement>(null);\n  const id = React.useId();\n  const shadowRootId = `child-shadow-${id}`;\n\n  const store = React.useMemo(\n    () => COMPONENT_STORE.getBoundStore(shadowRootId),\n    [shadowRootId]\n  );\n  const state = React.useSyncExternalStore(store.subscribe, store.getSnapshot);\n\n  const clientComponent = components?.[message.name];\n  const hasClientComponent = clientComponent != null;\n\n  let fallbackComponent = null;\n  if (isReactNode(fallback)) {\n    fallbackComponent = fallback;\n  } else if (typeof fallback === \"object\" && fallback != null) {\n    fallbackComponent = fallback?.[message.name];\n  }\n\n  const uiNamespace = namespace ?? stream.assistantId;\n  const uiClient = stream.client[\"~ui\"];\n  React.useEffect(() => {\n    if (hasClientComponent) return;\n    void uiClient.getComponent(uiNamespace, message.name).then((html) => {\n      const dom = ref.current;\n      if (!dom) return;\n      const root = dom.shadowRoot ?? dom.attachShadow({ mode: \"open\" });\n      const fragment = document\n        .createRange()\n        .createContextualFragment(\n          html.replace(\"{{shadowRootId}}\", shadowRootId)\n        );\n      root.appendChild(fragment);\n    });\n  }, [uiClient, uiNamespace, message.name, shadowRootId, hasClientComponent]);\n\n  if (hasClientComponent) {\n    return (\n      <UseStreamContext.Provider value={{ stream, meta }}>\n        {React.createElement(clientComponent, message.props)}\n      </UseStreamContext.Provider>\n    );\n  }\n\n  return (\n    <>\n      <div id={shadowRootId} ref={ref} {...props} />\n\n      <UseStreamContext.Provider value={{ stream, meta }}>\n        {state?.target != null\n          ? ReactDOM.createPortal(\n              React.createElement(state.comp, message.props),\n              state.target\n            )\n          : fallbackComponent}\n      </UseStreamContext.Provider>\n    </>\n  );\n}\n\ndeclare global {\n  interface Window {\n    [EXT_STORE_SYMBOL]: ComponentStore;\n    [REQUIRE_SYMBOL]: (name: string) => unknown;\n    [REQUIRE_EXTRA_SYMBOL]: Record<string, unknown>;\n  }\n}\n\nexport function experimental_loadShare(name: string, module: unknown) {\n  if (typeof window === \"undefined\") return;\n\n  window[REQUIRE_EXTRA_SYMBOL] ??= {};\n  window[REQUIRE_EXTRA_SYMBOL][name] = module;\n}\n\nexport function bootstrapUiContext() {\n  if (typeof window === \"undefined\") {\n    return;\n  }\n\n  window[EXT_STORE_SYMBOL] = COMPONENT_STORE;\n  window[REQUIRE_SYMBOL] = (name: string) => {\n    if (name === \"react\") return React;\n    if (name === \"react-dom\") return ReactDOM;\n    if (name === \"react/jsx-runtime\") return JsxRuntime;\n    if (name === \"@langchain/langgraph-sdk/react\") return { useStream };\n    if (name === \"@langchain/langgraph-sdk/react-ui\") {\n      return {\n        useStreamContext,\n        LoadExternalComponent: () => {\n          throw new Error(\"Nesting LoadExternalComponent is not supported\");\n        },\n      };\n    }\n\n    if (\n      window[REQUIRE_EXTRA_SYMBOL] != null &&\n      typeof window[REQUIRE_EXTRA_SYMBOL] === \"object\" &&\n      name in window[REQUIRE_EXTRA_SYMBOL]\n    ) {\n      return window[REQUIRE_EXTRA_SYMBOL][name];\n    }\n\n    throw new Error(`Unknown module...: ${name}`);\n  };\n}\n"],"mappings":"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"}