{"version":3,"file":"state-delta.cjs","names":["EventType"],"sources":["../../src/agent/state-delta.ts"],"sourcesContent":["import type {\n  BaseEvent,\n  StateDeltaEvent,\n  StateSnapshotEvent,\n} from \"@ag-ui/client\";\nimport { EventType } from \"@ag-ui/client\";\n\ntype StateDeltaOperation = {\n  op?: string;\n  path?: string;\n  from?: string;\n  value?: unknown;\n};\n\ntype PointerResult = {\n  exists: boolean;\n  value?: unknown;\n};\n\ntype OperationResult = {\n  root: unknown;\n  applied: boolean;\n};\n\nfunction parseJsonPointer(pointer: string): string[] | undefined {\n  if (pointer === \"\") return [];\n  if (!pointer.startsWith(\"/\")) return undefined;\n\n  const segments = pointer.slice(1).split(\"/\");\n  if (segments.some((segment) => /~(?![01])/.test(segment))) {\n    return undefined;\n  }\n\n  return segments.map((segment) =>\n    segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"),\n  );\n}\n\nfunction encodeJsonPointer(segments: string[]): string {\n  if (segments.length === 0) return \"\";\n  return `/${segments\n    .map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\"))\n    .join(\"/\")}`;\n}\n\nfunction getArrayIndex(segment: string, length: number): number | undefined {\n  if (segment !== \"0\" && !/^[1-9]\\d*$/.test(segment)) return undefined;\n  const index = Number(segment);\n  return Number.isSafeInteger(index) && index < length ? index : undefined;\n}\n\nfunction getJsonPointerValue(root: unknown, pointer: string): PointerResult {\n  const segments = parseJsonPointer(pointer);\n  if (segments === undefined) return { exists: false };\n\n  let current = root;\n  for (const segment of segments) {\n    if (current === null || typeof current !== \"object\") {\n      return { exists: false };\n    }\n\n    if (Array.isArray(current)) {\n      const index = getArrayIndex(segment, current.length);\n      if (index === undefined) return { exists: false };\n      current = current[index];\n    } else {\n      if (!Object.prototype.hasOwnProperty.call(current, segment)) {\n        return { exists: false };\n      }\n      current = (current as Record<string, unknown>)[segment];\n    }\n  }\n\n  return { exists: true, value: current };\n}\n\nfunction getParent(root: unknown, segments: string[]): PointerResult {\n  return getJsonPointerValue(root, encodeJsonPointer(segments.slice(0, -1)));\n}\n\nfunction cloneStateFallback(\n  state: unknown,\n  seen = new WeakMap<object, unknown>(),\n): unknown {\n  if (state === null || typeof state !== \"object\") return state;\n\n  const existing = seen.get(state);\n  if (existing !== undefined) return existing;\n\n  let clone: object;\n  try {\n    clone = Array.isArray(state)\n      ? []\n      : Object.create(Object.getPrototypeOf(state));\n  } catch {\n    clone = Array.isArray(state) ? [] : {};\n  }\n  seen.set(state, clone);\n\n  let keys: (string | symbol)[] = [];\n  try {\n    keys = Reflect.ownKeys(state);\n  } catch {\n    return clone;\n  }\n\n  for (const key of keys) {\n    try {\n      const descriptor = Object.getOwnPropertyDescriptor(state, key);\n      if (!descriptor) continue;\n      if (\"value\" in descriptor) {\n        descriptor.value = cloneStateFallback(descriptor.value, seen);\n      }\n      Object.defineProperty(clone, key, descriptor);\n    } catch {\n      // Keep the cloned container distinct when a property is inaccessible.\n    }\n  }\n\n  return clone;\n}\n\nfunction cloneState(state: unknown): unknown {\n  try {\n    return structuredClone(state);\n  } catch {\n    return cloneStateFallback(state);\n  }\n}\n\nfunction addValue(\n  root: unknown,\n  segments: string[],\n  value: unknown,\n): OperationResult {\n  if (segments.length === 0) {\n    return { root: cloneState(value), applied: true };\n  }\n\n  const parent = getParent(root, segments);\n  if (\n    !parent.exists ||\n    parent.value === null ||\n    typeof parent.value !== \"object\"\n  ) {\n    return { root, applied: false };\n  }\n\n  const segment = segments[segments.length - 1];\n  if (Array.isArray(parent.value)) {\n    if (segment === \"-\") {\n      parent.value.push(cloneState(value));\n      return { root, applied: true };\n    }\n\n    const index =\n      segment === \"0\"\n        ? 0\n        : /^[1-9]\\d*$/.test(segment)\n          ? Number(segment)\n          : undefined;\n    if (\n      index === undefined ||\n      !Number.isSafeInteger(index) ||\n      index > parent.value.length\n    ) {\n      return { root, applied: false };\n    }\n    parent.value.splice(index, 0, cloneState(value));\n    return { root, applied: true };\n  }\n\n  (parent.value as Record<string, unknown>)[segment] = cloneState(value);\n  return { root, applied: true };\n}\n\nfunction removeValue(root: unknown, segments: string[]): OperationResult {\n  if (segments.length === 0) return { root: undefined, applied: true };\n\n  const parent = getParent(root, segments);\n  if (\n    !parent.exists ||\n    parent.value === null ||\n    typeof parent.value !== \"object\"\n  ) {\n    return { root, applied: false };\n  }\n\n  const segment = segments[segments.length - 1];\n  if (Array.isArray(parent.value)) {\n    const index = getArrayIndex(segment, parent.value.length);\n    if (index === undefined) return { root, applied: false };\n    parent.value.splice(index, 1);\n    return { root, applied: true };\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(parent.value, segment)) {\n    return { root, applied: false };\n  }\n  delete (parent.value as Record<string, unknown>)[segment];\n  return { root, applied: true };\n}\n\nfunction replaceValue(\n  root: unknown,\n  segments: string[],\n  value: unknown,\n): OperationResult {\n  if (segments.length === 0) {\n    return { root: cloneState(value), applied: true };\n  }\n\n  const parent = getParent(root, segments);\n  if (\n    !parent.exists ||\n    parent.value === null ||\n    typeof parent.value !== \"object\"\n  ) {\n    return { root, applied: false };\n  }\n\n  const segment = segments[segments.length - 1];\n  if (Array.isArray(parent.value)) {\n    const index = getArrayIndex(segment, parent.value.length);\n    if (index === undefined) return { root, applied: false };\n    parent.value[index] = cloneState(value);\n    return { root, applied: true };\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(parent.value, segment)) {\n    return { root, applied: false };\n  }\n  (parent.value as Record<string, unknown>)[segment] = cloneState(value);\n  return { root, applied: true };\n}\n\nfunction jsonValueEqual(left: unknown, right: unknown): boolean {\n  if (Object.is(left, right)) return true;\n  if (\n    left === null ||\n    right === null ||\n    typeof left !== \"object\" ||\n    typeof right !== \"object\"\n  ) {\n    return false;\n  }\n  if (Array.isArray(left) !== Array.isArray(right)) return false;\n\n  const leftKeys = Object.keys(left as object);\n  const rightKeys = Object.keys(right as object);\n  if (leftKeys.length !== rightKeys.length) return false;\n\n  return leftKeys.every(\n    (key) =>\n      Object.prototype.hasOwnProperty.call(right, key) &&\n      jsonValueEqual(\n        (left as Record<string, unknown>)[key],\n        (right as Record<string, unknown>)[key],\n      ),\n  );\n}\n\nfunction applyStateDeltaOperation(\n  root: unknown,\n  operation: StateDeltaOperation,\n): OperationResult {\n  if (typeof operation.path !== \"string\") return { root, applied: false };\n\n  const path = parseJsonPointer(operation.path);\n  if (path === undefined) return { root, applied: false };\n\n  switch (operation.op) {\n    case \"add\":\n      return addValue(root, path, operation.value);\n    case \"remove\":\n      return removeValue(root, path);\n    case \"replace\":\n      return replaceValue(root, path, operation.value);\n    case \"test\": {\n      const actual = getJsonPointerValue(root, operation.path);\n      return {\n        root,\n        applied: actual.exists && jsonValueEqual(actual.value, operation.value),\n      };\n    }\n    case \"copy\": {\n      if (typeof operation.from !== \"string\") return { root, applied: false };\n      const source = getJsonPointerValue(root, operation.from);\n      if (!source.exists) return { root, applied: false };\n      return addValue(root, path, source.value);\n    }\n    case \"move\": {\n      if (typeof operation.from !== \"string\") return { root, applied: false };\n      const from = parseJsonPointer(operation.from);\n      if (from === undefined) return { root, applied: false };\n      const source = getJsonPointerValue(root, operation.from);\n      if (!source.exists) return { root, applied: false };\n      if (operation.from === operation.path) return { root, applied: true };\n\n      const nextRoot = cloneState(root);\n      const removed = removeValue(nextRoot, from);\n      if (!removed.applied) return { root, applied: false };\n      const added = addValue(removed.root, path, source.value);\n      return added.applied ? added : { root, applied: false };\n    }\n    default:\n      return { root, applied: false };\n  }\n}\n\nfunction normalizeStateDelta(\n  delta: unknown[],\n  initialState: unknown,\n): { delta: unknown[]; state: unknown } {\n  let state = cloneState(initialState);\n  const normalized: unknown[] = [];\n\n  for (const operation of delta) {\n    const candidate =\n      operation !== null && typeof operation === \"object\"\n        ? (operation as StateDeltaOperation)\n        : undefined;\n    if (\n      candidate?.op === \"add\" &&\n      typeof candidate.path === \"string\" &&\n      candidate.path.endsWith(\"/-\")\n    ) {\n      const arrayPath = candidate.path.slice(0, -2);\n      const array = getJsonPointerValue(state, arrayPath);\n      if (!array.exists) {\n        const lastSlash = arrayPath.lastIndexOf(\"/\");\n        const parentPath = lastSlash > 0 ? arrayPath.slice(0, lastSlash) : \"\";\n        if (getJsonPointerValue(state, parentPath).exists) {\n          const initializer: StateDeltaOperation = {\n            op: \"add\",\n            path: arrayPath,\n            value: [],\n          };\n          const applied = applyStateDeltaOperation(state, initializer);\n          if (applied.applied) {\n            normalized.push(initializer);\n            state = applied.root;\n          }\n        }\n      }\n    }\n\n    normalized.push(operation);\n    if (candidate) {\n      const applied = applyStateDeltaOperation(state, candidate);\n      if (applied.applied) state = applied.root;\n    }\n  }\n\n  return { delta: normalized, state };\n}\n\nexport function createStateEventNormalizer(\n  initialState: unknown,\n): (event: BaseEvent) => BaseEvent[] {\n  let state = cloneState(initialState);\n  let hasEmittedState = false;\n\n  return (event) => {\n    if (event.type === EventType.STATE_SNAPSHOT) {\n      state = cloneState((event as StateSnapshotEvent).snapshot);\n      hasEmittedState = true;\n      return [event];\n    }\n\n    if (event.type !== EventType.STATE_DELTA) return [event];\n\n    const stateDeltaEvent = event as StateDeltaEvent;\n    const initialSnapshot: StateSnapshotEvent[] =\n      !hasEmittedState && initialState !== undefined\n        ? [\n            {\n              type: EventType.STATE_SNAPSHOT,\n              snapshot: cloneState(state),\n            },\n          ]\n        : [];\n    const normalized = Array.isArray(stateDeltaEvent.delta)\n      ? normalizeStateDelta(stateDeltaEvent.delta, state)\n      : { delta: stateDeltaEvent.delta, state };\n    state = normalized.state;\n    hasEmittedState = true;\n\n    return [\n      ...initialSnapshot,\n      {\n        ...stateDeltaEvent,\n        delta: normalized.delta as StateDeltaEvent[\"delta\"],\n      },\n    ];\n  };\n}\n"],"mappings":"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"}