{"version":3,"file":"use-configure-suggestions.mjs","names":[],"sources":["../../src/hooks/use-configure-suggestions.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useCopilotKit } from \"@/providers/CopilotKitProvider\";\nimport { useCopilotChatConfiguration } from \"@/providers/CopilotChatConfigurationProvider\";\nimport { DEFAULT_AGENT_ID } from \"@copilotkitnext/shared\";\nimport {\n  DynamicSuggestionsConfig,\n  StaticSuggestionsConfig,\n  SuggestionsConfig,\n  Suggestion,\n} from \"@copilotkitnext/core\";\n\ntype StaticSuggestionInput = Omit<Suggestion, \"isLoading\"> &\n  Partial<Pick<Suggestion, \"isLoading\">>;\n\ntype StaticSuggestionsConfigInput = Omit<\n  StaticSuggestionsConfig,\n  \"suggestions\"\n> & {\n  suggestions: StaticSuggestionInput[];\n};\n\ntype SuggestionsConfigInput =\n  | DynamicSuggestionsConfig\n  | StaticSuggestionsConfigInput;\n\nexport function useConfigureSuggestions(\n  config: SuggestionsConfigInput | null | undefined,\n  deps?: ReadonlyArray<unknown>,\n): void {\n  const { copilotkit } = useCopilotKit();\n  const chatConfig = useCopilotChatConfiguration();\n  const extraDeps = deps ?? [];\n\n  const resolvedConsumerAgentId = useMemo(\n    () => chatConfig?.agentId ?? DEFAULT_AGENT_ID,\n    [chatConfig?.agentId],\n  );\n\n  const rawConsumerAgentId = useMemo(\n    () =>\n      config ? (config as SuggestionsConfigInput).consumerAgentId : undefined,\n    [config],\n  );\n\n  const normalizationCacheRef = useRef<{\n    serialized: string | null;\n    config: SuggestionsConfig | null;\n  }>({\n    serialized: null,\n    config: null,\n  });\n\n  const { normalizedConfig, serializedConfig } = useMemo(() => {\n    if (!config) {\n      normalizationCacheRef.current = { serialized: null, config: null };\n      return { normalizedConfig: null, serializedConfig: null };\n    }\n\n    if (config.available === \"disabled\") {\n      normalizationCacheRef.current = { serialized: null, config: null };\n      return { normalizedConfig: null, serializedConfig: null };\n    }\n\n    let built: SuggestionsConfig;\n    if (isDynamicConfig(config)) {\n      built = {\n        ...config,\n      } satisfies DynamicSuggestionsConfig;\n    } else {\n      const normalizedSuggestions = normalizeStaticSuggestions(\n        config.suggestions,\n      );\n      const baseConfig: StaticSuggestionsConfig = {\n        ...config,\n        suggestions: normalizedSuggestions,\n      };\n      built = baseConfig;\n    }\n\n    const serialized = JSON.stringify(built);\n    const cache = normalizationCacheRef.current;\n    if (cache.serialized === serialized && cache.config) {\n      return { normalizedConfig: cache.config, serializedConfig: serialized };\n    }\n\n    normalizationCacheRef.current = { serialized, config: built };\n    return { normalizedConfig: built, serializedConfig: serialized };\n  }, [config, resolvedConsumerAgentId, ...extraDeps]);\n  const latestConfigRef = useRef<SuggestionsConfig | null>(null);\n  latestConfigRef.current = normalizedConfig;\n  const previousSerializedConfigRef = useRef<string | null>(null);\n\n  const targetAgentId = useMemo(() => {\n    if (!normalizedConfig) {\n      return resolvedConsumerAgentId;\n    }\n    const consumer = (\n      normalizedConfig as StaticSuggestionsConfig | DynamicSuggestionsConfig\n    ).consumerAgentId;\n    if (!consumer || consumer === \"*\") {\n      return resolvedConsumerAgentId;\n    }\n    return consumer;\n  }, [normalizedConfig, resolvedConsumerAgentId]);\n\n  const isGlobalConfig =\n    rawConsumerAgentId === undefined || rawConsumerAgentId === \"*\";\n\n  const requestReload = useCallback(() => {\n    if (!normalizedConfig) {\n      return;\n    }\n\n    if (isGlobalConfig) {\n      const agents = Object.values(copilotkit.agents ?? {});\n      for (const entry of agents) {\n        const agentId = entry.agentId;\n        if (!agentId) {\n          continue;\n        }\n        if (!entry.isRunning) {\n          copilotkit.reloadSuggestions(agentId);\n        }\n      }\n      return;\n    }\n\n    if (!targetAgentId) {\n      return;\n    }\n\n    copilotkit.reloadSuggestions(targetAgentId);\n  }, [copilotkit, isGlobalConfig, normalizedConfig, targetAgentId]);\n\n  useEffect(() => {\n    if (!serializedConfig || !latestConfigRef.current) {\n      return;\n    }\n\n    const id = copilotkit.addSuggestionsConfig(latestConfigRef.current);\n\n    requestReload();\n\n    return () => {\n      copilotkit.removeSuggestionsConfig(id);\n    };\n  }, [copilotkit, serializedConfig, requestReload]);\n\n  useEffect(() => {\n    if (!normalizedConfig) {\n      previousSerializedConfigRef.current = null;\n      return;\n    }\n    if (\n      serializedConfig &&\n      previousSerializedConfigRef.current === serializedConfig\n    ) {\n      return;\n    }\n    if (serializedConfig) {\n      previousSerializedConfigRef.current = serializedConfig;\n    }\n    requestReload();\n  }, [normalizedConfig, requestReload, serializedConfig]);\n\n  useEffect(() => {\n    if (!normalizedConfig || extraDeps.length === 0) {\n      return;\n    }\n    requestReload();\n  }, [extraDeps.length, normalizedConfig, requestReload, ...extraDeps]);\n}\n\nfunction isDynamicConfig(\n  config: SuggestionsConfigInput,\n): config is DynamicSuggestionsConfig {\n  return \"instructions\" in config;\n}\n\nfunction normalizeStaticSuggestions(\n  suggestions: StaticSuggestionInput[],\n): Suggestion[] {\n  return suggestions.map((suggestion) => ({\n    ...suggestion,\n    isLoading: suggestion.isLoading ?? false,\n  }));\n}\n"],"mappings":"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"}