@elqnt/kg 3.0.1 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.mts +92 -3
- package/dist/api/index.d.ts +92 -3
- package/dist/api/index.js +16 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/index.mjs +15 -1
- package/dist/api/server.d.mts +1 -0
- package/dist/api/server.d.ts +1 -0
- package/dist/{chunk-HCDFJCQL.mjs → chunk-5D7RJC7D.mjs} +105 -5
- package/dist/chunk-5D7RJC7D.mjs.map +1 -0
- package/dist/chunk-B33SF6DB.js +2 -0
- package/dist/{chunk-W4XVBGE7.js.map → chunk-B33SF6DB.js.map} +1 -1
- package/dist/chunk-BP2I7KWY.js +1031 -0
- package/dist/chunk-BP2I7KWY.js.map +1 -0
- package/dist/{chunk-2TJCYLTP.js → chunk-CNWOI7LX.js} +104 -4
- package/dist/chunk-CNWOI7LX.js.map +1 -0
- package/dist/chunk-MAEB7UOW.mjs +257 -0
- package/dist/chunk-MAEB7UOW.mjs.map +1 -0
- package/dist/chunk-SUDQ45LY.mjs +2 -0
- package/dist/chunk-WYRCAPY4.js +257 -0
- package/dist/chunk-WYRCAPY4.js.map +1 -0
- package/dist/chunk-ZEPJC46Z.mjs +1031 -0
- package/dist/chunk-ZEPJC46Z.mjs.map +1 -0
- package/dist/hooks/index.d.mts +446 -79
- package/dist/hooks/index.d.ts +446 -79
- package/dist/hooks/index.js +8 -3
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +9 -4
- package/dist/index.d.mts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +24 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +31 -12
- package/dist/index.mjs.map +1 -1
- package/dist/models/index.d.mts +213 -0
- package/dist/models/index.d.ts +213 -0
- package/dist/models/index.js +1 -1
- package/dist/models/index.mjs +1 -1
- package/dist/transport/index.d.mts +365 -0
- package/dist/transport/index.d.ts +365 -0
- package/dist/transport/index.js +10 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/index.mjs +10 -0
- package/dist/transport/index.mjs.map +1 -0
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.mjs +1 -1
- package/package.json +3 -3
- package/dist/chunk-2TJCYLTP.js.map +0 -1
- package/dist/chunk-7RW5MHP5.js +0 -497
- package/dist/chunk-7RW5MHP5.js.map +0 -1
- package/dist/chunk-HCDFJCQL.mjs.map +0 -1
- package/dist/chunk-JZ7UXVRW.mjs +0 -497
- package/dist/chunk-JZ7UXVRW.mjs.map +0 -1
- package/dist/chunk-NJNBEGDB.mjs +0 -2
- package/dist/chunk-W4XVBGE7.js +0 -2
- /package/dist/{chunk-NJNBEGDB.mjs.map → chunk-SUDQ45LY.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../hooks/use-graphs.ts","../hooks/use-options-ref.ts","../hooks/use-kg-query.ts","../hooks/use-kg-designer.ts","../hooks/use-crawl-jobs.ts","../hooks/use-quick-ingest.ts","../hooks/use-full-ingest.ts","../hooks/index.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type { Graph, CreateGraphRequest } from \"../models\";\nimport {\n listGraphsApi,\n getGraphApi,\n createGraphApi,\n updateGraphApi,\n deleteGraphApi,\n} from \"../api\";\nimport { useApiAsync } from \"@elqnt/api-client/hooks\";\nimport { useOptionsRef } from \"./use-options-ref\";\n\n/**\n * Hook for knowledge graph CRUD operations\n *\n * @example\n * ```tsx\n * const { loading, error, listGraphs, createGraph } = useGraphs({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * });\n *\n * const graphs = await listGraphs();\n * ```\n */\nexport function useGraphs(options: ApiClientOptions) {\n const optionsRef = useOptionsRef(options);\n\n const {\n execute: listGraphs,\n loading: listLoading,\n error: listError,\n } = useApiAsync(\n () => listGraphsApi(optionsRef.current),\n (data) => data.graphs || [],\n []\n );\n\n const {\n execute: getGraphInternal,\n loading: getLoading,\n error: getError,\n } = useApiAsync(\n (graphId: string) => getGraphApi(graphId, optionsRef.current),\n (data) => data.graph || null,\n null\n );\n const getGraph = useCallback((graphId: string) => getGraphInternal(graphId), [getGraphInternal]);\n\n const {\n execute: createGraphInternal,\n loading: createLoading,\n error: createError,\n } = useApiAsync(\n (graph: CreateGraphRequest) => createGraphApi(graph, optionsRef.current),\n (data) => data.graph || null,\n null\n );\n const createGraph = useCallback(\n (graph: CreateGraphRequest) => createGraphInternal(graph),\n [createGraphInternal]\n );\n\n const {\n execute: updateGraphInternal,\n loading: updateLoading,\n error: updateError,\n } = useApiAsync(\n (graphId: string, updates: Partial<Graph>) => updateGraphApi(graphId, updates, optionsRef.current),\n (data) => data.graph || null,\n null\n );\n const updateGraph = useCallback(\n (graphId: string, updates: Partial<Graph>) => updateGraphInternal(graphId, updates),\n [updateGraphInternal]\n );\n\n const {\n execute: deleteGraphInternal,\n loading: deleteLoading,\n error: deleteError,\n } = useApiAsync(\n (graphId: string) => deleteGraphApi(graphId, optionsRef.current),\n (data) => data.success ?? true,\n false\n );\n const deleteGraph = useCallback(\n (graphId: string) => deleteGraphInternal(graphId),\n [deleteGraphInternal]\n );\n\n // Combine loading and error states\n const loading = listLoading || getLoading || createLoading || updateLoading || deleteLoading;\n const error = listError || getError || createError || updateError || deleteError;\n\n return useMemo(\n () => ({\n loading,\n error,\n listGraphs,\n getGraph,\n createGraph,\n updateGraph,\n deleteGraph,\n }),\n [loading, error, listGraphs, getGraph, createGraph, updateGraph, deleteGraph]\n );\n}\n","\"use client\";\n\n/**\n * Hook to keep a mutable ref of options in sync\n *\n * This pattern allows callbacks created with useCallback to always access\n * the latest options without needing to re-create the callback when options change.\n *\n * This is useful for API hooks where:\n * - Options (baseUrl, orgId, graphId) may change over time\n * - Callbacks are memoized and shouldn't be recreated on every options change\n * - The callback should always use the current options when called\n */\n\nimport { useRef, useEffect } from \"react\";\n\n/**\n * Keep a mutable ref synchronized with the latest value\n *\n * @example\n * ```tsx\n * function useGraphs(options: ApiClientOptions) {\n * const optionsRef = useOptionsRef(options);\n *\n * const listGraphs = useCallback(async () => {\n * // Always uses latest options\n * return listGraphsApi(optionsRef.current);\n * }, []); // No dependency on options - callback never changes\n *\n * return { listGraphs };\n * }\n * ```\n */\nexport function useOptionsRef<T>(options: T): React.MutableRefObject<T> {\n const ref = useRef(options);\n\n useEffect(() => {\n ref.current = options;\n }, [options]);\n\n return ref;\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type { KGNode, KGQuery, KGQueryResult, KGNodeIngestRequest } from \"../models\";\nimport {\n queryGraphApi,\n getGraphLabelsApi,\n getKGNodeApi,\n ingestKGNodeApi,\n updateKGNodeApi,\n} from \"../api\";\nimport { useApiAsync } from \"@elqnt/api-client/hooks\";\nimport { useOptionsRef } from \"./use-options-ref\";\n\n/** Options for KG hooks that require a graph ID */\nexport type UseKGOptions = ApiClientOptions & { graphId?: string };\n\n/**\n * Hook for querying knowledge graph nodes\n *\n * @example\n * ```tsx\n * const { query, getLabels, loading, error } = useKGQuery({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * graphId: selectedGraphId,\n * });\n *\n * const result = await query({ label: \"Person\", fields: [], limit: 10 });\n * ```\n */\nexport function useKGQuery(options: UseKGOptions) {\n const optionsRef = useOptionsRef(options);\n\n const {\n execute: queryInternal,\n loading: queryLoading,\n error: queryError,\n } = useApiAsync(\n (queryParams: KGQuery) => queryGraphApi(queryParams, optionsRef.current),\n (data) => data,\n null\n );\n const query = useCallback(\n (queryParams: KGQuery): Promise<KGQueryResult | null> => queryInternal(queryParams),\n [queryInternal]\n );\n\n const {\n execute: getLabels,\n loading: labelsLoading,\n error: labelsError,\n } = useApiAsync(\n () => getGraphLabelsApi(optionsRef.current),\n (data) => data.labels || [],\n []\n );\n\n const {\n execute: getNodeInternal,\n loading: nodeLoading,\n error: nodeError,\n } = useApiAsync(\n (nodeId: string) => getKGNodeApi(nodeId, optionsRef.current),\n (data) => data.node || null,\n null\n );\n const getNode = useCallback((nodeId: string) => getNodeInternal(nodeId), [getNodeInternal]);\n\n const {\n execute: ingestNodeInternal,\n loading: ingestLoading,\n error: ingestError,\n } = useApiAsync(\n (node: KGNodeIngestRequest) => ingestKGNodeApi(node, optionsRef.current),\n (data) => data.nodeId || null,\n null\n );\n const ingestNode = useCallback(\n (node: KGNodeIngestRequest) => ingestNodeInternal(node),\n [ingestNodeInternal]\n );\n\n const {\n execute: updateNodeInternal,\n loading: updateLoading,\n error: updateError,\n } = useApiAsync(\n (nodeId: string, updates: Partial<KGNode>) => updateKGNodeApi(nodeId, updates, optionsRef.current),\n (data) => data.success ?? true,\n false\n );\n const updateNode = useCallback(\n (nodeId: string, updates: Partial<KGNode>) => updateNodeInternal(nodeId, updates),\n [updateNodeInternal]\n );\n\n const loading = queryLoading || labelsLoading || nodeLoading || ingestLoading || updateLoading;\n const error = queryError || labelsError || nodeError || ingestError || updateError;\n\n return useMemo(\n () => ({\n loading,\n error,\n query,\n getLabels,\n getNode,\n ingestNode,\n updateNode,\n }),\n [loading, error, query, getLabels, getNode, ingestNode, updateNode]\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport type { GraphNodeDefinition, GraphEdgeDefinition } from \"../models\";\nimport {\n listDesignerNodesApi,\n getDesignerNodeApi,\n createDesignerNodeApi,\n updateDesignerNodeApi,\n deleteDesignerNodeApi,\n listDesignerEdgesApi,\n createDesignerEdgeApi,\n updateDesignerEdgeApi,\n deleteDesignerEdgeApi,\n} from \"../api\";\nimport { useApiAsync } from \"@elqnt/api-client/hooks\";\nimport { useOptionsRef } from \"./use-options-ref\";\nimport type { UseKGOptions } from \"./use-kg-query\";\n\n/**\n * Hook for KG designer operations (node and edge definitions)\n *\n * @example\n * ```tsx\n * const { listNodes, createNode, listEdges, createEdge } = useKGDesigner({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * graphId: selectedGraphId,\n * });\n *\n * const nodes = await listNodes();\n * ```\n */\nexport function useKGDesigner(options: UseKGOptions) {\n const optionsRef = useOptionsRef(options);\n\n // Node operations\n const {\n execute: listNodes,\n loading: listNodesLoading,\n error: listNodesError,\n } = useApiAsync(\n () => listDesignerNodesApi(optionsRef.current),\n (data) => data.nodes || [],\n []\n );\n\n const {\n execute: getNodeInternal,\n loading: getNodeLoading,\n error: getNodeError,\n } = useApiAsync(\n (label: string) => getDesignerNodeApi(label, optionsRef.current),\n (data) => data.node || null,\n null\n );\n const getNode = useCallback((label: string) => getNodeInternal(label), [getNodeInternal]);\n\n const {\n execute: createNodeInternal,\n loading: createNodeLoading,\n error: createNodeError,\n } = useApiAsync(\n (node: Omit<GraphNodeDefinition, \"createdAt\" | \"updatedAt\">) =>\n createDesignerNodeApi(node, optionsRef.current),\n (data) => data.node || null,\n null\n );\n const createNode = useCallback(\n (node: Omit<GraphNodeDefinition, \"createdAt\" | \"updatedAt\">) => createNodeInternal(node),\n [createNodeInternal]\n );\n\n const {\n execute: updateNodeInternal,\n loading: updateNodeLoading,\n error: updateNodeError,\n } = useApiAsync(\n (label: string, updates: Partial<GraphNodeDefinition>) =>\n updateDesignerNodeApi(label, updates, optionsRef.current),\n (data) => data.node || null,\n null\n );\n const updateNode = useCallback(\n (label: string, updates: Partial<GraphNodeDefinition>) => updateNodeInternal(label, updates),\n [updateNodeInternal]\n );\n\n const {\n execute: deleteNodeInternal,\n loading: deleteNodeLoading,\n error: deleteNodeError,\n } = useApiAsync(\n (label: string) => deleteDesignerNodeApi(label, optionsRef.current),\n (data) => data.success ?? true,\n false\n );\n const deleteNode = useCallback((label: string) => deleteNodeInternal(label), [deleteNodeInternal]);\n\n // Edge operations\n const {\n execute: listEdges,\n loading: listEdgesLoading,\n error: listEdgesError,\n } = useApiAsync(\n () => listDesignerEdgesApi(optionsRef.current),\n (data) => data.edges || [],\n []\n );\n\n const {\n execute: createEdgeInternal,\n loading: createEdgeLoading,\n error: createEdgeError,\n } = useApiAsync(\n (edge: Omit<GraphEdgeDefinition, \"createdAt\" | \"updatedAt\">) =>\n createDesignerEdgeApi(edge, optionsRef.current),\n (data) => data.edge || null,\n null\n );\n const createEdge = useCallback(\n (edge: Omit<GraphEdgeDefinition, \"createdAt\" | \"updatedAt\">) => createEdgeInternal(edge),\n [createEdgeInternal]\n );\n\n const {\n execute: updateEdgeInternal,\n loading: updateEdgeLoading,\n error: updateEdgeError,\n } = useApiAsync(\n (label: string, updates: Partial<GraphEdgeDefinition>) =>\n updateDesignerEdgeApi(label, updates, optionsRef.current),\n (data) => data.edge || null,\n null\n );\n const updateEdge = useCallback(\n (label: string, updates: Partial<GraphEdgeDefinition>) => updateEdgeInternal(label, updates),\n [updateEdgeInternal]\n );\n\n const {\n execute: deleteEdgeInternal,\n loading: deleteEdgeLoading,\n error: deleteEdgeError,\n } = useApiAsync(\n (label: string) => deleteDesignerEdgeApi(label, optionsRef.current),\n (data) => data.success ?? true,\n false\n );\n const deleteEdge = useCallback((label: string) => deleteEdgeInternal(label), [deleteEdgeInternal]);\n\n const loading =\n listNodesLoading ||\n getNodeLoading ||\n createNodeLoading ||\n updateNodeLoading ||\n deleteNodeLoading ||\n listEdgesLoading ||\n createEdgeLoading ||\n updateEdgeLoading ||\n deleteEdgeLoading;\n\n const error =\n listNodesError ||\n getNodeError ||\n createNodeError ||\n updateNodeError ||\n deleteNodeError ||\n listEdgesError ||\n createEdgeError ||\n updateEdgeError ||\n deleteEdgeError;\n\n return useMemo(\n () => ({\n loading,\n error,\n // Nodes\n listNodes,\n getNode,\n createNode,\n updateNode,\n deleteNode,\n // Edges\n listEdges,\n createEdge,\n updateEdge,\n deleteEdge,\n }),\n [\n loading,\n error,\n listNodes,\n getNode,\n createNode,\n updateNode,\n deleteNode,\n listEdges,\n createEdge,\n updateEdge,\n deleteEdge,\n ]\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n listCrawlJobsApi,\n startCrawlJobApi,\n getCrawlJobStatusApi,\n cancelCrawlJobApi,\n getCrawledPagesApi,\n type CrawlJob,\n} from \"../api\";\nimport { useApiAsync } from \"@elqnt/api-client/hooks\";\nimport { useOptionsRef } from \"./use-options-ref\";\nimport type { UseKGOptions } from \"./use-kg-query\";\n\n/**\n * Hook for web crawl job operations\n *\n * @example\n * ```tsx\n * const { listJobs, startJob, getJobStatus } = useCrawlJobs({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * graphId: selectedGraphId,\n * });\n *\n * const jobId = await startJob({ baseUrl: \"https://example.com\", depth: 2, maxPages: 100 });\n * ```\n */\nexport function useCrawlJobs(options: UseKGOptions) {\n const optionsRef = useOptionsRef(options);\n\n const {\n execute: listJobsInternal,\n loading: listLoading,\n error: listError,\n } = useApiAsync(\n (params?: { limit?: number; offset?: number; status?: string }) =>\n listCrawlJobsApi({ ...optionsRef.current, ...params }),\n (data) => ({ jobs: data.jobs || [], total: data.total || 0 }),\n { jobs: [], total: 0 }\n );\n const listJobs = useCallback(\n (params?: { limit?: number; offset?: number; status?: string }) => listJobsInternal(params),\n [listJobsInternal]\n );\n\n const {\n execute: startJobInternal,\n loading: startLoading,\n error: startError,\n } = useApiAsync(\n (params: { baseUrl: string; depth: number; maxPages: number }) =>\n startCrawlJobApi(params, optionsRef.current),\n (data) => data.jobId || null,\n null\n );\n const startJob = useCallback(\n (params: { baseUrl: string; depth: number; maxPages: number }) => startJobInternal(params),\n [startJobInternal]\n );\n\n const {\n execute: getJobStatusInternal,\n loading: statusLoading,\n error: statusError,\n } = useApiAsync(\n (jobId: string) => getCrawlJobStatusApi(jobId, optionsRef.current),\n (data) => data.job || null,\n null\n );\n const getJobStatus = useCallback(\n (jobId: string): Promise<CrawlJob | null> => getJobStatusInternal(jobId),\n [getJobStatusInternal]\n );\n\n const {\n execute: cancelJobInternal,\n loading: cancelLoading,\n error: cancelError,\n } = useApiAsync(\n (jobId: string) => cancelCrawlJobApi(jobId, optionsRef.current),\n (data) => data.success ?? true,\n false\n );\n const cancelJob = useCallback((jobId: string) => cancelJobInternal(jobId), [cancelJobInternal]);\n\n const {\n execute: getCrawledPagesInternal,\n loading: pagesLoading,\n error: pagesError,\n } = useApiAsync(\n (jobId: string) => getCrawledPagesApi(jobId, optionsRef.current),\n (data) => data.pages || [],\n []\n );\n const getCrawledPages = useCallback(\n (jobId: string) => getCrawledPagesInternal(jobId),\n [getCrawledPagesInternal]\n );\n\n const loading = listLoading || startLoading || statusLoading || cancelLoading || pagesLoading;\n const error = listError || startError || statusError || cancelError || pagesError;\n\n return useMemo(\n () => ({\n loading,\n error,\n listJobs,\n startJob,\n getJobStatus,\n cancelJob,\n getCrawledPages,\n }),\n [loading, error, listJobs, startJob, getJobStatus, cancelJob, getCrawledPages]\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState, useRef } from \"react\";\nimport { startQuickIngestApi } from \"../api\";\nimport type { QuickIngestItem, QuickIngestStartRequest } from \"../models\";\nimport { useOptionsRef } from \"./use-options-ref\";\nimport type { UseKGOptions } from \"./use-kg-query\";\n\n/**\n * Result from file upload to storage (S3/Azure)\n */\nexport interface FileUploadResult {\n /** URL where the file was uploaded */\n url: string;\n /** Optional error if upload failed */\n error?: string;\n /** Page count (for PDFs) */\n pageCount?: number;\n}\n\n/**\n * Options for the useQuickIngest hook\n */\nexport interface UseQuickIngestOptions extends UseKGOptions {\n /**\n * Function to upload a file to storage (S3/Azure).\n * This should be provided by the consumer using server actions.\n * Example: uploadFile from @/actions\n */\n onUploadFile: (file: File) => Promise<FileUploadResult>;\n}\n\n/**\n * Return type for the useQuickIngest hook\n */\nexport interface UseQuickIngestReturn {\n /** List of items in the ingestion queue */\n items: QuickIngestItem[];\n /** Whether ingestion is currently processing */\n isProcessing: boolean;\n /** Any error that occurred */\n error: string | null;\n /** Upload a file to the queue */\n uploadFile: (file: File) => Promise<QuickIngestItem>;\n /** Add a URL to the queue */\n addUrl: (url: string) => void;\n /** Remove an item from the queue */\n removeItem: (id: string) => void;\n /** Start the ingestion process */\n startIngestion: (options: QuickIngestStartRequest[\"options\"]) => Promise<void>;\n /** Cancel the current ingestion */\n cancelIngestion: () => void;\n /** Clear all items from the queue */\n clearQueue: () => void;\n}\n\n/**\n * Hook for Quick Ingestion operations with SSE streaming\n *\n * @example\n * ```tsx\n * const {\n * items,\n * isProcessing,\n * uploadFile,\n * startIngestion,\n * } = useQuickIngest({\n * baseUrl,\n * orgId,\n * graphId,\n * onUploadFile: async (file) => {\n * const formData = new FormData();\n * formData.append(\"file\", file);\n * const result = await uploadToStorage(formData);\n * return { url: result.fileUrl, error: result.error };\n * },\n * });\n *\n * // Upload a file\n * await uploadFile(file);\n *\n * // Start processing (streams progress via SSE)\n * await startIngestion({\n * selectedLabels: [\"article\", \"topic\"],\n * websiteCrawlDepth: 2,\n * websiteMaxPages: 50,\n * });\n * ```\n */\nexport function useQuickIngest(options: UseQuickIngestOptions): UseQuickIngestReturn {\n const optionsRef = useOptionsRef(options);\n const [items, setItems] = useState<QuickIngestItem[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Upload a file to storage and add to queue\n const uploadFile = useCallback(async (file: File): Promise<QuickIngestItem> => {\n const tempId = `temp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Add placeholder item with uploading status\n const placeholderItem: QuickIngestItem = {\n id: tempId,\n type: \"document\",\n name: file.name,\n sizeBytes: file.size,\n status: \"uploading\",\n progress: 0,\n };\n setItems((prev) => [...prev, placeholderItem]);\n\n try {\n // Upload to storage using the provided callback\n const result = await optionsRef.current.onUploadFile(file);\n\n if (result.error) {\n throw new Error(result.error);\n }\n\n const uploadedItem: QuickIngestItem = {\n id: tempId,\n type: \"document\",\n name: file.name,\n url: result.url,\n sizeBytes: file.size,\n pageCount: result.pageCount,\n status: \"ready\",\n progress: 100,\n };\n\n // Replace placeholder with actual item\n setItems((prev) =>\n prev.map((item) => (item.id === tempId ? uploadedItem : item))\n );\n\n return uploadedItem;\n } catch (err) {\n // Update placeholder to error state\n setItems((prev) =>\n prev.map((item) =>\n item.id === tempId\n ? { ...item, status: \"error\" as const, error: String(err) }\n : item\n )\n );\n throw err;\n }\n }, []);\n\n // Add a URL\n const addUrl = useCallback((url: string): void => {\n const id = `url_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const item: QuickIngestItem = {\n id,\n type: \"url\",\n name: url,\n url: url,\n status: \"ready\",\n progress: 0,\n };\n setItems((prev) => [...prev, item]);\n }, []);\n\n // Remove an item\n const removeItem = useCallback((id: string): void => {\n setItems((prev) => prev.filter((item) => item.id !== id));\n }, []);\n\n // Clear the queue\n const clearQueue = useCallback((): void => {\n setItems([]);\n setError(null);\n }, []);\n\n // Start ingestion with SSE streaming\n const startIngestion = useCallback(\n async (ingestionOptions: QuickIngestStartRequest[\"options\"]): Promise<void> => {\n const readyItems = items.filter((item) => item.status === \"ready\" && item.url);\n if (readyItems.length === 0) {\n setError(\"No items ready for ingestion\");\n return;\n }\n\n setError(null);\n setIsProcessing(true);\n abortControllerRef.current = new AbortController();\n\n // Update items to processing immediately\n setItems((prev) =>\n prev.map((item) =>\n item.status === \"ready\" ? { ...item, status: \"processing\" as const } : item\n )\n );\n\n try {\n const request: QuickIngestStartRequest = {\n items: readyItems.map((item) => ({\n id: item.id,\n type: item.type,\n name: item.name,\n url: item.url!,\n })),\n options: ingestionOptions,\n graphId: optionsRef.current.graphId || \"default\",\n };\n\n // Start streaming - events come through the callback\n await startQuickIngestApi(request, optionsRef.current, (event) => {\n switch (event.type) {\n case \"item_start\":\n setItems((prev) =>\n prev.map((item) =>\n item.id === event.itemId\n ? { ...item, status: \"processing\" as const, progress: 0 }\n : item\n )\n );\n break;\n\n case \"item_progress\":\n setItems((prev) =>\n prev.map((item) =>\n item.id === event.itemId\n ? { ...item, progress: event.progress || 0, progressText: event.text }\n : item\n )\n );\n break;\n\n case \"item_complete\":\n setItems((prev) =>\n prev.map((item) =>\n item.id === event.itemId\n ? {\n ...item,\n status: \"complete\" as const,\n progress: 100,\n result: {\n articlesCreated: event.articles,\n topicsCreated: event.topics,\n nodesCreated: event.nodesCreated,\n nodesByLabel: event.nodesByLabel,\n },\n }\n : item\n )\n );\n break;\n\n case \"item_error\":\n setItems((prev) =>\n prev.map((item) =>\n item.id === event.itemId\n ? { ...item, status: \"error\" as const, error: event.error }\n : item\n )\n );\n break;\n\n case \"job_complete\":\n setIsProcessing(false);\n break;\n\n case \"error\":\n setError(event.message || event.error || \"Unknown error\");\n setIsProcessing(false);\n break;\n\n case \"cancelled\":\n setIsProcessing(false);\n // Revert processing items to ready\n setItems((prev) =>\n prev.map((item) =>\n item.status === \"processing\" ? { ...item, status: \"ready\" as const } : item\n )\n );\n break;\n }\n });\n\n // Stream completed\n setIsProcessing(false);\n } catch (err) {\n setError(String(err));\n setIsProcessing(false);\n\n // Revert items to ready state\n setItems((prev) =>\n prev.map((item) =>\n item.status === \"processing\" ? { ...item, status: \"ready\" as const } : item\n )\n );\n }\n },\n [items]\n );\n\n // Cancel ingestion\n const cancelIngestion = useCallback((): void => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsProcessing(false);\n\n // Update processing items to ready\n setItems((prev) =>\n prev.map((item) =>\n item.status === \"processing\" ? { ...item, status: \"ready\" as const } : item\n )\n );\n }, []);\n\n return useMemo(\n () => ({\n items,\n isProcessing,\n error,\n uploadFile,\n addUrl,\n removeItem,\n startIngestion,\n cancelIngestion,\n clearQueue,\n }),\n [\n items,\n isProcessing,\n error,\n uploadFile,\n addUrl,\n removeItem,\n startIngestion,\n cancelIngestion,\n clearQueue,\n ]\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState, useEffect, useRef } from \"react\";\nimport {\n startFullIngestExtractionApi,\n cancelFullIngestExtractionApi,\n ingestFullIngestNodesApi,\n startCrawlJobApi,\n getCrawlJobStatusApi,\n type CrawlJob,\n} from \"../api\";\nimport type {\n ExtractedNode,\n ExtractedEdge,\n FullIngestExtractionRequest,\n FullIngestNodesRequest,\n} from \"../models\";\nimport {\n createFullIngestTransport,\n type FullIngestTransport,\n} from \"../transport\";\nimport { useOptionsRef } from \"./use-options-ref\";\nimport type { UseKGOptions } from \"./use-kg-query\";\n\n/**\n * Result from file upload to storage (S3/Azure)\n */\nexport interface FileUploadResult {\n /** URL where the file was uploaded */\n url: string;\n /** Optional error if upload failed */\n error?: string;\n /** Page count (for PDFs) */\n pageCount?: number;\n}\n\n/**\n * Options for the useFullIngest hook\n */\nexport interface UseFullIngestOptions extends UseKGOptions {\n /** Enable debug logging for transport */\n debug?: boolean;\n /**\n * Function to upload a file to storage (S3/Azure).\n * This should be provided by the consumer using server actions.\n * Example: uploadFile from @/actions\n */\n onUploadFile?: (file: File) => Promise<FileUploadResult>;\n}\n\n/**\n * Document info after upload\n */\nexport interface DocumentInfo {\n url: string;\n pageCount: number;\n sizeBytes: number;\n}\n\n/**\n * Extraction progress info\n */\nexport interface ExtractionProgress {\n current: number;\n total: number;\n /** Current processing phase */\n phase?: \"extracting\" | \"consolidating\" | \"linking\" | \"complete\";\n /** Status message */\n message?: string;\n}\n\n/**\n * Ingestion progress info\n */\nexport interface IngestProgress {\n currentNode: number;\n totalNodes: number;\n currentEdge: number;\n totalEdges: number;\n /** Status message */\n message?: string;\n}\n\n/**\n * Return type for the useFullIngest hook\n */\nexport interface UseFullIngestReturn {\n /** Current source type */\n sourceType: \"document\" | \"website\" | null;\n /** Uploaded document info */\n document: DocumentInfo | null;\n /** Crawl job info */\n crawlJob: CrawlJob | null;\n /** Selected label names for extraction */\n selectedLabels: string[];\n /** Extracted nodes */\n extractedNodes: ExtractedNode[];\n /** Extracted edges/relationships */\n extractedEdges: ExtractedEdge[];\n /** Whether extraction is in progress */\n isExtracting: boolean;\n /** Extraction progress */\n extractionProgress: ExtractionProgress | null;\n /** Whether ingestion is in progress */\n isIngesting: boolean;\n /** Ingestion progress */\n ingestProgress: IngestProgress | null;\n /** Current job ID */\n jobId: string | null;\n /** Any error that occurred */\n error: string | null;\n /** Upload a document */\n uploadDocument: (file: File) => Promise<void>;\n /** Set document URL directly (for already uploaded docs) */\n setDocumentUrl: (url: string, pageCount: number, sizeBytes: number) => void;\n /** Start a website crawl */\n startCrawl: (url: string, depth: number, maxPages: number) => Promise<void>;\n /** Set selected labels */\n setSelectedLabels: (labels: string[]) => void;\n /** Start extraction */\n startExtraction: () => Promise<void>;\n /** Cancel extraction */\n cancelExtraction: () => Promise<void>;\n /** Remove an extracted node */\n removeNode: (id: string) => void;\n /** Update an extracted node */\n updateNode: (id: string, fields: Record<string, unknown>) => void;\n /** Remove an extracted edge */\n removeEdge: (id: string) => void;\n /** Ingest all extracted nodes and edges */\n ingestNodes: () => Promise<void>;\n /** Reset to initial state */\n reset: () => void;\n}\n\n/**\n * Hook for Full Ingestion operations\n *\n * @example\n * ```tsx\n * const {\n * sourceType,\n * document,\n * selectedLabels,\n * extractedNodes,\n * isExtracting,\n * uploadDocument,\n * setSelectedLabels,\n * startExtraction,\n * ingestNodes,\n * } = useFullIngest({ baseUrl, orgId, graphId });\n *\n * // Upload a document\n * await uploadDocument(file);\n *\n * // Select labels to extract\n * setSelectedLabels([\"Product\", \"Category\"]);\n *\n * // Start extraction\n * await startExtraction();\n *\n * // Ingest extracted nodes\n * await ingestNodes();\n * ```\n */\nexport function useFullIngest(options: UseFullIngestOptions): UseFullIngestReturn {\n const optionsRef = useOptionsRef(options);\n\n // State\n const [sourceType, setSourceType] = useState<\"document\" | \"website\" | null>(null);\n const [document, setDocument] = useState<DocumentInfo | null>(null);\n const [crawlJob, setCrawlJob] = useState<CrawlJob | null>(null);\n const [selectedLabels, setSelectedLabels] = useState<string[]>([]);\n const [extractedNodes, setExtractedNodes] = useState<ExtractedNode[]>([]);\n const [extractedEdges, setExtractedEdges] = useState<ExtractedEdge[]>([]);\n const [isExtracting, setIsExtracting] = useState(false);\n const [extractionProgress, setExtractionProgress] = useState<ExtractionProgress | null>(null);\n const [isIngesting, setIsIngesting] = useState(false);\n const [ingestProgress, setIngestProgress] = useState<IngestProgress | null>(null);\n const [jobId, setJobId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Transport ref\n const transportRef = useRef<FullIngestTransport | null>(null);\n\n // Cleanup transport on unmount\n useEffect(() => {\n return () => {\n if (transportRef.current) {\n transportRef.current.disconnect();\n transportRef.current = null;\n }\n };\n }, []);\n\n // Upload a document\n const uploadDocument = useCallback(async (file: File): Promise<void> => {\n setError(null);\n\n try {\n const { onUploadFile } = optionsRef.current;\n\n if (onUploadFile) {\n // Use provided upload callback (server action)\n const result = await onUploadFile(file);\n\n if (result.error) {\n throw new Error(result.error);\n }\n\n setDocument({\n url: result.url,\n pageCount: result.pageCount || 0,\n sizeBytes: file.size,\n });\n } else {\n // Fallback: create local blob URL (for testing only)\n const url = URL.createObjectURL(file);\n setDocument({\n url,\n pageCount: 0,\n sizeBytes: file.size,\n });\n }\n\n setSourceType(\"document\");\n } catch (err) {\n setError(String(err));\n throw err;\n }\n }, []);\n\n // Set document URL directly\n const setDocumentUrl = useCallback(\n (url: string, pageCount: number, sizeBytes: number): void => {\n setDocument({ url, pageCount, sizeBytes });\n setSourceType(\"document\");\n setError(null);\n },\n []\n );\n\n // Start a website crawl\n const startCrawl = useCallback(\n async (url: string, depth: number, maxPages: number): Promise<void> => {\n setError(null);\n\n try {\n const response = await startCrawlJobApi(\n { baseUrl: url, depth, maxPages },\n optionsRef.current\n );\n\n if (!response.data?.jobId) {\n throw new Error(response.error || \"Failed to start crawl\");\n }\n\n // Poll for crawl completion\n const pollInterval = setInterval(async () => {\n const statusResponse = await getCrawlJobStatusApi(\n response.data!.jobId,\n optionsRef.current\n );\n\n if (statusResponse.data?.job) {\n setCrawlJob(statusResponse.data.job);\n\n if (\n statusResponse.data.job.status === \"completed\" ||\n statusResponse.data.job.status === \"failed\"\n ) {\n clearInterval(pollInterval);\n\n if (statusResponse.data.job.status === \"failed\") {\n setError(\"Crawl job failed\");\n }\n }\n }\n }, 2000);\n\n setSourceType(\"website\");\n setCrawlJob({\n id: response.data.jobId,\n baseUrl: url,\n depth,\n maxPages,\n status: \"pending\",\n pagesProcessed: 0,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n } catch (err) {\n setError(String(err));\n throw err;\n }\n },\n []\n );\n\n // Start extraction\n const startExtraction = useCallback(async (): Promise<void> => {\n if (!sourceType) {\n setError(\"No source selected\");\n return;\n }\n\n if (selectedLabels.length === 0) {\n setError(\"No labels selected\");\n return;\n }\n\n let sourceId: string;\n if (sourceType === \"document\") {\n if (!document) {\n setError(\"No document uploaded\");\n return;\n }\n sourceId = document.url;\n } else {\n if (!crawlJob) {\n setError(\"No crawl job\");\n return;\n }\n sourceId = crawlJob.id;\n }\n\n setError(null);\n setIsExtracting(true);\n setExtractedNodes([]);\n setExtractedEdges([]);\n setExtractionProgress(null);\n\n try {\n const request: FullIngestExtractionRequest = {\n sourceType,\n sourceId,\n labels: selectedLabels,\n graphId: optionsRef.current.graphId || \"default\",\n };\n\n const response = await startFullIngestExtractionApi(request, optionsRef.current);\n\n if (!response.data) {\n throw new Error(response.error || \"Failed to start extraction\");\n }\n\n const newJobId = response.data.jobId;\n setJobId(newJobId);\n\n // Setup SSE transport\n const transport = createFullIngestTransport({ debug: options.debug });\n await transport.connect(optionsRef.current);\n transportRef.current = transport;\n\n // Subscribe to events\n transport.on(\"progress\", (event) => {\n setExtractionProgress({\n current: event.currentPage,\n total: event.totalPages,\n phase: \"extracting\",\n });\n });\n\n transport.on(\"node\", (event) => {\n const node: ExtractedNode = {\n id: event.id,\n label: event.label,\n fields: event.fields,\n };\n setExtractedNodes((prev) => [...prev, node]);\n });\n\n // Post-processing events\n transport.on(\"consolidating\", (event) => {\n setExtractionProgress((prev) => ({\n current: prev?.current || 0,\n total: prev?.total || 0,\n phase: \"consolidating\",\n message: event.message,\n }));\n });\n\n transport.on(\"consolidated\", (event) => {\n // Update nodes list with consolidated nodes\n // Note: The complete event will have the final node count\n setExtractionProgress((prev) => ({\n current: prev?.current || 0,\n total: prev?.total || 0,\n phase: \"consolidating\",\n message: event.message,\n }));\n });\n\n transport.on(\"linking\", (event) => {\n setExtractionProgress((prev) => ({\n current: prev?.current || 0,\n total: prev?.total || 0,\n phase: \"linking\",\n message: event.message,\n }));\n });\n\n transport.on(\"edge\", (event) => {\n const edge: ExtractedEdge = {\n id: event.id,\n fromLabel: event.fromLabel,\n fromName: event.fromName,\n toLabel: event.toLabel,\n toName: event.toName,\n edgeLabel: event.edgeLabel,\n confidence: event.confidence,\n };\n setExtractedEdges((prev) => [...prev, edge]);\n });\n\n transport.on(\"linked\", (event) => {\n setExtractionProgress((prev) => ({\n current: prev?.current || 0,\n total: prev?.total || 0,\n phase: \"linking\",\n message: event.message,\n }));\n });\n\n transport.on(\"complete\", (event) => {\n setExtractionProgress((prev) => ({\n current: prev?.current || 0,\n total: prev?.total || 0,\n phase: \"complete\",\n message: event.message,\n }));\n setIsExtracting(false);\n setJobId(null);\n transport.disconnect();\n transportRef.current = null;\n });\n\n transport.on(\"error\", (event) => {\n setError(event.message);\n setIsExtracting(false);\n setJobId(null);\n transport.disconnect();\n transportRef.current = null;\n });\n\n // Subscribe to job\n transport.subscribeToJob(newJobId);\n } catch (err) {\n setError(String(err));\n setIsExtracting(false);\n setJobId(null);\n }\n }, [sourceType, document, crawlJob, selectedLabels, options.debug]);\n\n // Cancel extraction\n const cancelExtraction = useCallback(async (): Promise<void> => {\n if (!jobId) return;\n\n try {\n await cancelFullIngestExtractionApi(jobId, optionsRef.current);\n\n if (transportRef.current) {\n transportRef.current.disconnect();\n transportRef.current = null;\n }\n\n setIsExtracting(false);\n setJobId(null);\n } catch (err) {\n setError(String(err));\n }\n }, [jobId]);\n\n // Remove a node\n const removeNode = useCallback((id: string): void => {\n setExtractedNodes((prev) => prev.filter((node) => node.id !== id));\n }, []);\n\n // Update a node\n const updateNode = useCallback((id: string, fields: Record<string, unknown>): void => {\n setExtractedNodes((prev) =>\n prev.map((node) => (node.id === id ? { ...node, fields } : node))\n );\n }, []);\n\n // Remove an edge\n const removeEdge = useCallback((id: string): void => {\n setExtractedEdges((prev) => prev.filter((edge) => edge.id !== id));\n }, []);\n\n // Ingest nodes and edges (uses server state via jobId) with SSE progress\n const ingestNodes = useCallback(async (): Promise<void> => {\n if (!jobId) {\n setError(\"No job ID - extraction must be started first\");\n return;\n }\n\n if (extractedNodes.length === 0) {\n setError(\"No nodes to ingest\");\n return;\n }\n\n setError(null);\n setIsIngesting(true);\n setIngestProgress(null);\n\n try {\n const request: FullIngestNodesRequest = {\n jobId,\n };\n\n const response = await ingestFullIngestNodesApi(request, optionsRef.current);\n\n if (!response.data) {\n throw new Error(response.error || \"Failed to start ingestion\");\n }\n\n // Setup SSE transport for ingestion progress\n const transport = createFullIngestTransport({ debug: options.debug });\n await transport.connect(optionsRef.current);\n transportRef.current = transport;\n\n // Subscribe to ingestion events\n transport.on(\"ingest_progress\", (event) => {\n setIngestProgress({\n currentNode: event.currentNode,\n totalNodes: event.totalNodes,\n currentEdge: event.currentEdge,\n totalEdges: event.totalEdges,\n message: event.message,\n });\n });\n\n transport.on(\"ingest_complete\", (event) => {\n setIngestProgress({\n currentNode: event.nodesIngested,\n totalNodes: event.nodesIngested,\n currentEdge: event.edgesIngested,\n totalEdges: event.edgesIngested,\n message: event.message,\n });\n setIsIngesting(false);\n // Clear extracted nodes and edges after successful ingest\n setExtractedNodes([]);\n setExtractedEdges([]);\n transport.disconnect();\n transportRef.current = null;\n });\n\n transport.on(\"error\", (event) => {\n setError(event.message);\n setIsIngesting(false);\n transport.disconnect();\n transportRef.current = null;\n });\n\n // Subscribe to job\n transport.subscribeToJob(jobId);\n } catch (err) {\n setError(String(err));\n setIsIngesting(false);\n throw err;\n }\n }, [jobId, extractedNodes, options.debug]);\n\n // Reset to initial state\n const reset = useCallback((): void => {\n if (transportRef.current) {\n transportRef.current.disconnect();\n transportRef.current = null;\n }\n\n setSourceType(null);\n setDocument(null);\n setCrawlJob(null);\n setSelectedLabels([]);\n setExtractedNodes([]);\n setExtractedEdges([]);\n setIsExtracting(false);\n setExtractionProgress(null);\n setIsIngesting(false);\n setIngestProgress(null);\n setJobId(null);\n setError(null);\n }, []);\n\n return useMemo(\n () => ({\n sourceType,\n document,\n crawlJob,\n selectedLabels,\n extractedNodes,\n extractedEdges,\n isExtracting,\n extractionProgress,\n isIngesting,\n ingestProgress,\n jobId,\n error,\n uploadDocument,\n setDocumentUrl,\n startCrawl,\n setSelectedLabels,\n startExtraction,\n cancelExtraction,\n removeNode,\n updateNode,\n removeEdge,\n ingestNodes,\n reset,\n }),\n [\n sourceType,\n document,\n crawlJob,\n selectedLabels,\n extractedNodes,\n extractedEdges,\n isExtracting,\n extractionProgress,\n isIngesting,\n ingestProgress,\n jobId,\n error,\n uploadDocument,\n setDocumentUrl,\n startCrawl,\n startExtraction,\n cancelExtraction,\n removeNode,\n updateNode,\n removeEdge,\n ingestNodes,\n reset,\n ]\n );\n}\n","\"use client\";\n\n/**\n * Knowledge Graph React Hooks\n *\n * Provides React hooks for KG operations with loading/error states.\n * All hooks use the useOptionsRef pattern to always access the latest options.\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// HOOK EXPORTS\n// =============================================================================\n\nexport { useGraphs } from \"./use-graphs\";\nexport { useKGQuery, type UseKGOptions } from \"./use-kg-query\";\nexport { useKGDesigner } from \"./use-kg-designer\";\nexport { useCrawlJobs } from \"./use-crawl-jobs\";\nexport { useQuickIngest, type UseQuickIngestOptions, type UseQuickIngestReturn } from \"./use-quick-ingest\";\nexport { useFullIngest, type UseFullIngestOptions, type UseFullIngestReturn, type DocumentInfo, type ExtractionProgress } from \"./use-full-ingest\";\n\n// =============================================================================\n// UTILITY EXPORTS\n// =============================================================================\n\nexport { useApiAsync, useAsync } from \"@elqnt/api-client/hooks\";\nexport type { UseAsyncOptions, UseAsyncReturn } from \"@elqnt/api-client/hooks\";\nexport { useOptionsRef } from \"./use-options-ref\";\n"],"mappings":"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","names":["useCallback","useMemo","useApiAsync","useApiAsync","useCallback","useMemo","useCallback","useMemo","useApiAsync","useApiAsync","useCallback","useMemo","useCallback","useMemo","useApiAsync","useApiAsync","useCallback","useMemo","useCallback","useMemo","useRef","useRef","useCallback","useMemo","useCallback","useMemo","useState","useEffect","useRef","useState","useRef","useEffect","useCallback","useMemo","useApiAsync"]}
|