{"version":3,"file":"reduced.cjs","names":[],"sources":["../../../src/state/values/reduced.ts"],"sourcesContent":["import type { SerializableSchema } from \"../types.js\";\n\n/**\n * Symbol for runtime identification of ReducedValue instances.\n */\nexport const REDUCED_VALUE_SYMBOL: symbol = Symbol.for(\n  \"langgraph.state.reduced_value\"\n);\n\ninterface ReducedValueInitBase<Value = unknown> {\n  /**\n   * The reducer function that determines how new input values are combined with the current state.\n   * Receives the current output value and a new input value, and must return the updated output.\n   *\n   * @param current - The current value held in state.\n   * @param next - The new input value to apply to the reducer.\n   * @returns The next value to be stored in state.\n   *\n   * @remarks\n   * - The logic for updating state in response to new inputs lives in this function.\n   */\n  reducer: (current: Value, next: Value) => Value;\n\n  /**\n   * Optional extra fields to be added to the exported JSON Schema for documentation or additional constraints.\n   *\n   * @remarks\n   * - Use this property to attach metadata or documentation to the generated JSON Schema representation\n   *   of this value.\n   * - These fields are merged into the generated schema, which can assist with code generation, UI hints,\n   *   or external documentation.\n   */\n  jsonSchemaExtra?: Record<string, unknown>;\n}\n\ninterface ReducedValueInitWithSchema<Value = unknown, Input = Value> {\n  /**\n   * Schema describing the type and validation logic for reducer input values.\n   *\n   * @remarks\n   * - If provided, new values passed to the reducer will be validated using this schema before reduction.\n   * - This allows the reducer to accept inputs distinct from the type stored in the state (output type).\n   */\n  inputSchema: SerializableSchema<unknown, Input>;\n\n  /**\n   * The reducer function that determines how new input values are combined with the current state.\n   * Receives the current output value and a new input value (validated using `inputSchema`), and returns the updated output.\n   *\n   * @param current - The current value held in state.\n   * @param next - The new validated input value to be applied.\n   * @returns The next value to be stored in state.\n   *\n   * @remarks\n   * - The logic for updating state in response to new inputs lives in this function.\n   */\n  reducer: (current: Value, next: Input) => Value;\n\n  /**\n   * Optional extra fields to be added to the exported JSON Schema for documentation or additional constraints.\n   *\n   * @remarks\n   * - Use this property to attach metadata or documentation to the generated JSON Schema representation\n   *   of this value.\n   * - These fields are merged into the generated schema, which can assist with code generation, UI hints,\n   *   or external documentation.\n   */\n  jsonSchemaExtra?: Record<string, unknown>;\n}\n\n/**\n * Initialization options for {@link ReducedValue}.\n *\n * Two forms are supported:\n * 1. Provide only a reducer (and optionally `jsonSchemaExtra`)—in this case, the reducer's inputs are validated using the output value schema.\n * 2. Provide an explicit `inputSchema` field to distinguish the reducer's input type from the stored/output type.\n *\n * @template Value - The type of value stored and produced after reduction.\n * @template Input - The type of inputs accepted by the reducer.\n *\n * @property inputSchema - The schema describing reducer inputs. If omitted, will use the value schema.\n * @property reducer - A function that receives the current output value and a new input, and returns the new output.\n * @property jsonSchemaExtra - (Optional) Extra fields to merge into the exported JSON Schema for documentation or additional constraints.\n */\nexport type ReducedValueInit<Value = unknown, Input = Value> =\n  | ReducedValueInitWithSchema<Value, Input>\n  | ReducedValueInitBase<Value>;\n\n/**\n * Represents a state field whose value is computed and updated using a reducer function.\n *\n * {@link ReducedValue} allows you to define accumulators, counters, aggregators, or other fields\n * whose value is determined incrementally by applying a reducer to incoming updates.\n *\n * Each time a new input is provided, the reducer function is called with the current output\n * and the new input, producing an updated value. Input validation can be controlled separately\n * from output validation by providing an explicit input schema.\n *\n * @template Value - The type of the value stored in state and produced by reduction.\n * @template Input - The type of updates accepted by the reducer.\n *\n * @example\n * // Accumulator with distinct input validation\n * const Sum = new ReducedValue(z.number(), {\n *   inputSchema: z.number().min(1),\n *   reducer: (total, toAdd) => total + toAdd\n * });\n *\n * @example\n * // Simple running max, using only the value schema\n * const Max = new ReducedValue(z.number(), {\n *   reducer: (current, next) => Math.max(current, next)\n * });\n */\nexport class ReducedValue<Value = unknown, Input = Value> {\n  /**\n   * Instance marker for runtime identification.\n   * @internal\n   */\n  protected readonly [REDUCED_VALUE_SYMBOL] = true as const;\n\n  /**\n   * The schema that describes the type of value stored in state (i.e., after reduction).\n   * Note: We use `unknown` for the input type to allow schemas with `.default()` wrappers,\n   * where the input type includes `undefined`.\n   */\n  readonly valueSchema: SerializableSchema<unknown, Value>;\n\n  /**\n   * The schema used to validate reducer inputs.\n   * If not specified explicitly, this defaults to `valueSchema`.\n   */\n  readonly inputSchema: SerializableSchema<unknown, Input | Value>;\n\n  /**\n   * The reducer function that combines a current output value and an incoming input.\n   */\n  readonly reducer: (current: Value, next: Input) => Value;\n\n  /**\n   * Optional extra fields to merge into the generated JSON Schema (e.g., for documentation or constraints).\n   */\n  readonly jsonSchemaExtra?: Record<string, unknown>;\n\n  /**\n   * Represents the value stored after all reductions.\n   */\n  declare ValueType: Value;\n\n  /**\n   * Represents the type that may be provided as input on each update.\n   */\n  declare InputType: Input;\n\n  /**\n   * Constructs a ReducedValue instance, which combines a value schema and a reducer function (plus optional input schema).\n   *\n   * @param valueSchema - The schema that describes the type of value stored in state (the \"running total\").\n   * @param init - An object specifying the reducer function (required), inputSchema (optional), and jsonSchemaExtra (optional).\n   */\n  constructor(\n    valueSchema: SerializableSchema<unknown, Value>,\n    init: ReducedValueInitWithSchema<Value, Input>\n  );\n\n  constructor(\n    valueSchema: SerializableSchema<Input, Value>,\n    init: ReducedValueInitBase<Value>\n  );\n\n  constructor(\n    valueSchema: SerializableSchema<unknown, Value>,\n    init: ReducedValueInit<Value, Input>\n  ) {\n    this.reducer = init.reducer as (current: Value, next: Input) => Value;\n    this.jsonSchemaExtra = init.jsonSchemaExtra;\n    this.valueSchema = valueSchema;\n    this.inputSchema = \"inputSchema\" in init ? init.inputSchema : valueSchema;\n    this.jsonSchemaExtra = init.jsonSchemaExtra;\n  }\n\n  /**\n   * Type guard to check if a value is a ReducedValue instance.\n   */\n  static isInstance<Value = unknown, Input = Value>(\n    value: ReducedValue<Value, Input>\n  ): value is ReducedValue<Value, Input>;\n\n  static isInstance(value: unknown): value is ReducedValue;\n\n  static isInstance<Value = unknown, Input = Value>(\n    value: ReducedValue<Value, Input> | unknown\n  ): value is ReducedValue<Value, Input> {\n    return (\n      typeof value === \"object\" &&\n      value !== null &&\n      REDUCED_VALUE_SYMBOL in value &&\n      (value as Record<symbol, unknown>)[REDUCED_VALUE_SYMBOL] === true\n    );\n  }\n}\n"],"mappings":";;;;AAKA,MAAa,uBAA+B,OAAO,IACjD,gCACD;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2GD,IAAa,eAAb,MAA0D;;;;;CAKxD,CAAoB,wBAAwB;;;;;;CAO5C;;;;;CAMA;;;;CAKA;;;;CAKA;CA4BA,YACE,aACA,MACA;AACA,OAAK,UAAU,KAAK;AACpB,OAAK,kBAAkB,KAAK;AAC5B,OAAK,cAAc;AACnB,OAAK,cAAc,iBAAiB,OAAO,KAAK,cAAc;AAC9D,OAAK,kBAAkB,KAAK;;CAY9B,OAAO,WACL,OACqC;AACrC,SACE,OAAO,UAAU,YACjB,UAAU,QACV,wBAAwB,SACvB,MAAkC,0BAA0B"}