{"version":3,"file":"useAgentState.mjs","sources":["../../../../pro-components/chat/chat-engine/hooks/useAgentState.ts"],"sourcesContent":["import { ref, onMounted, onUnmounted, computed, provide, inject, watch, type Ref, type InjectionKey } from 'vue';\nimport { stateManager } from 'tdesign-web-components/lib/chat-engine';\n\n/**\n * 状态订阅相关类型定义\n */\n\nexport interface StateActionOptions {\n  /**\n   * 初始状态\n   */\n  initialState?: Record<string, any>;\n  /**\n   * 只订阅特定key的变化\n   */\n  subscribeKey?: string;\n}\n\nexport interface UseStateActionReturn {\n  /**\n   * 全量状态Map - 包含所有stateKey的状态\n   * 格式: { [stateKey]: stateData }\n   */\n  stateMap: Ref<Record<string, any>>;\n  /**\n   * 当前最新的状态key\n   */\n  currentStateKey: Ref<string | null>;\n  /**\n   * 设置状态Map，用于加载历史对话消息中的state数据\n   */\n  setStateMap: (stateMap: Record<string, any> | ((prev: Record<string, any>) => Record<string, any>)) => void;\n  /**\n   * 获取当前完整状态的方法\n   */\n  getCurrentState: () => Record<string, any>;\n  /**\n   * 获取特定 key 状态的方法\n   */\n  getStateByKey: (key: string) => any;\n}\n\nexport const useAgentState = <T = any>(options: StateActionOptions = {}): UseStateActionReturn => {\n  const { initialState, subscribeKey } = options;\n  const stateMap = ref<Record<string, any>>(initialState || {});\n  const currentStateKey = ref<string | null>(null);\n\n  // 使用 ref 来避免不必要的重新渲染\n  const stateMapRef = ref(stateMap.value);\n\n  // 订阅管理\n  let unsubscribe: (() => void) | null = null;\n\n  onMounted(() => {\n    unsubscribe = stateManager.subscribeToLatest((newState: T, newStateKey: string) => {\n      // 如果指定了 subscribeKey，只有匹配时才更新状态\n      if (subscribeKey && newStateKey !== subscribeKey) {\n        // 仍然更新内部状态，但不触发重新渲染\n        stateMapRef.value = {\n          ...stateMapRef.value,\n          [newStateKey]: newState,\n        };\n        return;\n      }\n\n      stateMap.value = {\n        ...stateMap.value,\n        [newStateKey]: newState,\n      };\n      currentStateKey.value = newStateKey;\n      stateMapRef.value = stateMap.value;\n    });\n  });\n\n  onUnmounted(() => {\n    if (unsubscribe) {\n      unsubscribe();\n    }\n  });\n\n  // 监听 subscribeKey 变化\n  watch(\n    () => subscribeKey,\n    () => {\n      // 重新订阅\n      if (unsubscribe) {\n        unsubscribe();\n      }\n\n      unsubscribe = stateManager.subscribeToLatest((newState: T, newStateKey: string) => {\n        if (subscribeKey && newStateKey !== subscribeKey) {\n          stateMapRef.value = {\n            ...stateMapRef.value,\n            [newStateKey]: newState,\n          };\n          return;\n        }\n\n        stateMap.value = {\n          ...stateMap.value,\n          [newStateKey]: newState,\n        };\n        currentStateKey.value = newStateKey;\n        stateMapRef.value = stateMap.value;\n      });\n    },\n  );\n\n  const setStateMap = (newStateMap: Record<string, any> | ((prev: Record<string, any>) => Record<string, any>)) => {\n    if (typeof newStateMap === 'function') {\n      stateMap.value = newStateMap(stateMap.value);\n    } else {\n      stateMap.value = newStateMap;\n    }\n    stateMapRef.value = stateMap.value;\n  };\n\n  return {\n    stateMap,\n    currentStateKey,\n    setStateMap,\n    getCurrentState: () => stateMapRef.value,\n    getStateByKey: (key: string) => stateMapRef.value[key],\n  };\n};\n\n// 创建 InjectionKey 用于 Provide/Inject\nexport const AgentStateKey: InjectionKey<UseStateActionReturn> = Symbol('AgentState');\n\n// 提供 AgentState 到后代组件\nexport const provideAgentState = (state: UseStateActionReturn) => {\n  provide(AgentStateKey, state);\n};\n\n// 简化的状态选择器，支持响应式 stateKey\nexport const useAgentStateDataByKey = (stateKey?: Ref<string | undefined> | string) => {\n  const contextState = inject<UseStateActionReturn | null>(AgentStateKey, null);\n\n  // 解析 stateKey，支持 Ref 和普通字符串\n  const resolvedKey = computed(() => {\n    if (stateKey === undefined) return undefined;\n    if (typeof stateKey === 'string') return stateKey;\n    return stateKey.value;\n  });\n\n  // 独立状态订阅（当没有 Provider 时使用）\n  const stateMap = ref<Record<string, any>>({});\n  const currentStateKey = ref<string | null>(null);\n  let unsubscribe: (() => void) | null = null;\n\n  onMounted(() => {\n    unsubscribe = stateManager.subscribeToLatest((newState: any, newStateKey: string) => {\n      stateMap.value = {\n        ...stateMap.value,\n        [newStateKey]: newState,\n      };\n      currentStateKey.value = newStateKey;\n    });\n  });\n\n  onUnmounted(() => {\n    if (unsubscribe) {\n      unsubscribe();\n    }\n  });\n\n  return computed(() => {\n    const key = resolvedKey.value;\n\n    if (contextState) {\n      // 有 Provider，使用 Provide 状态\n      const { stateMap: contextStateMap } = contextState;\n      return key ? contextStateMap.value[key] : contextStateMap.value;\n    }\n\n    // 没有 Provider，使用独立状态\n    return key ? stateMap.value[key] : stateMap.value;\n  });\n};\n\n// 导出 Provide Hook\nexport const useAgentStateContext = (): UseStateActionReturn => {\n  const context = inject<UseStateActionReturn | null>(AgentStateKey, null);\n\n  if (!context) {\n    throw new Error('useAgentState must be used within AgentStateProvider (component that calls provideAgentState)');\n  }\n\n  return context;\n};\n"],"names":["useAgentState","options","arguments","length","undefined","initialState","subscribeKey","stateMap","ref","currentStateKey","stateMapRef","value","unsubscribe","onMounted","stateManager","subscribeToLatest","newState","newStateKey","_objectSpread","_defineProperty","onUnmounted","watch","setStateMap","newStateMap","getCurrentState","getStateByKey","key","AgentStateKey","Symbol","provideAgentState","state","provide","useAgentStateDataByKey","stateKey","contextState","inject","resolvedKey","computed","contextStateMap","useAgentStateContext","context","Error"],"mappings":"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"}