@elqnt/kg 3.0.0 → 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 +94 -5
- package/dist/api/index.d.ts +94 -5
- 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 +4 -3
- package/dist/api/server.d.ts +4 -3
- package/dist/api/server.js.map +1 -1
- package/dist/{chunk-HCDFJCQL.mjs → chunk-5D7RJC7D.mjs} +105 -5
- package/dist/chunk-5D7RJC7D.mjs.map +1 -0
- package/dist/chunk-67SUELDR.js.map +1 -1
- package/dist/chunk-ADIKUMMI.js.map +1 -1
- package/dist/chunk-B33SF6DB.js +2 -0
- package/dist/chunk-B33SF6DB.js.map +1 -0
- 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-UCKE66GB.js.map +1 -1
- 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.js.map +1 -1
- package/dist/models/index.mjs +1 -1
- package/dist/models/kg-designer.js.map +1 -1
- package/dist/models/kg.js.map +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.js.map +1 -1
- package/dist/utils/index.mjs +1 -1
- package/package.json +15 -13
- 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-W4XVBGE7.js.map +0 -1
- /package/dist/{chunk-NJNBEGDB.mjs.map → chunk-SUDQ45LY.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eloquent/eloquent/packages/@elqnt/kg/dist/chunk-BP2I7KWY.js","../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"],"names":["useApiAsync","useCallback","useMemo","useRef","useState"],"mappings":"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","file":"/home/runner/work/eloquent/eloquent/packages/@elqnt/kg/dist/chunk-BP2I7KWY.js","sourcesContent":[null,"\"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"]}
|
|
@@ -76,8 +76,8 @@ async function ingestDocumentApi(document, options) {
|
|
|
76
76
|
...options
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
|
-
async function deleteKGDocumentApi(documentId, options) {
|
|
80
|
-
const queryString = buildQueryString({ graphId: options.graphId });
|
|
79
|
+
async function deleteKGDocumentApi(documentId, options, cascade = false) {
|
|
80
|
+
const queryString = buildQueryString({ graphId: options.graphId, cascade: cascade ? "true" : void 0 });
|
|
81
81
|
return _browser.browserApiRequest.call(void 0, `/api/v1/kg/documents/${documentId}${queryString}`, { method: "DELETE", ...options });
|
|
82
82
|
}
|
|
83
83
|
async function optimizeGraphApi(options) {
|
|
@@ -177,6 +177,106 @@ async function getCrawledPagesApi(jobId, options) {
|
|
|
177
177
|
const queryString = buildQueryString({ graphId: options.graphId });
|
|
178
178
|
return _browser.browserApiRequest.call(void 0, `/api/v1/kg/crawl/jobs/${jobId}/pages${queryString}`, { method: "GET", ...options });
|
|
179
179
|
}
|
|
180
|
+
async function startQuickIngestApi(request, options, onEvent) {
|
|
181
|
+
const token = await _browser.getGatewayToken.call(void 0, );
|
|
182
|
+
if (!token) {
|
|
183
|
+
throw new Error("Failed to get authentication token");
|
|
184
|
+
}
|
|
185
|
+
const headers = {
|
|
186
|
+
"Content-Type": "application/json",
|
|
187
|
+
"Authorization": `Bearer ${token}`,
|
|
188
|
+
"X-Org-ID": options.orgId
|
|
189
|
+
};
|
|
190
|
+
if (options.graphId) {
|
|
191
|
+
headers["X-Graph-ID"] = options.graphId;
|
|
192
|
+
}
|
|
193
|
+
const response = await fetch(`${options.baseUrl}/api/v1/kg/quick-ingest/start`, {
|
|
194
|
+
method: "POST",
|
|
195
|
+
headers,
|
|
196
|
+
body: JSON.stringify(request)
|
|
197
|
+
});
|
|
198
|
+
if (!response.ok) {
|
|
199
|
+
const errorText = await response.text();
|
|
200
|
+
throw new Error(`HTTP ${response.status}: ${errorText}`);
|
|
201
|
+
}
|
|
202
|
+
const reader = _optionalChain([response, 'access', _7 => _7.body, 'optionalAccess', _8 => _8.getReader, 'call', _9 => _9()]);
|
|
203
|
+
if (!reader) {
|
|
204
|
+
throw new Error("No response body");
|
|
205
|
+
}
|
|
206
|
+
const decoder = new TextDecoder();
|
|
207
|
+
let buffer = "";
|
|
208
|
+
while (true) {
|
|
209
|
+
const { done, value } = await reader.read();
|
|
210
|
+
if (done) break;
|
|
211
|
+
buffer += decoder.decode(value, { stream: true });
|
|
212
|
+
const lines = buffer.split("\n");
|
|
213
|
+
buffer = lines.pop() || "";
|
|
214
|
+
for (const line of lines) {
|
|
215
|
+
if (line.startsWith("data: ")) {
|
|
216
|
+
try {
|
|
217
|
+
const data = JSON.parse(line.slice(6));
|
|
218
|
+
onEvent(data);
|
|
219
|
+
} catch (e) {
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async function cancelQuickIngestApi(jobId, options) {
|
|
226
|
+
return _browser.browserApiRequest.call(void 0, `/api/v1/kg/quick-ingest/${jobId}/cancel`, {
|
|
227
|
+
method: "POST",
|
|
228
|
+
body: {},
|
|
229
|
+
headers: buildHeaders(options.graphId),
|
|
230
|
+
...options
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
async function startFullIngestExtractionApi(request, options) {
|
|
234
|
+
return _browser.browserApiRequest.call(void 0, "/api/v1/kg/full-ingest/extract", {
|
|
235
|
+
method: "POST",
|
|
236
|
+
body: request,
|
|
237
|
+
headers: buildHeaders(options.graphId),
|
|
238
|
+
...options
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
async function cancelFullIngestExtractionApi(jobId, options) {
|
|
242
|
+
return _browser.browserApiRequest.call(void 0, `/api/v1/kg/full-ingest/${jobId}/cancel`, {
|
|
243
|
+
method: "POST",
|
|
244
|
+
body: {},
|
|
245
|
+
headers: buildHeaders(options.graphId),
|
|
246
|
+
...options
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
async function ingestFullIngestNodesApi(request, options) {
|
|
250
|
+
return _browser.browserApiRequest.call(void 0, "/api/v1/kg/full-ingest/ingest", {
|
|
251
|
+
method: "POST",
|
|
252
|
+
body: request,
|
|
253
|
+
headers: buildHeaders(options.graphId),
|
|
254
|
+
...options
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async function listFullIngestJobsApi(options) {
|
|
258
|
+
const queryString = buildQueryString({
|
|
259
|
+
graphId: options.graphId,
|
|
260
|
+
limit: _optionalChain([options, 'access', _10 => _10.limit, 'optionalAccess', _11 => _11.toString, 'call', _12 => _12()])
|
|
261
|
+
});
|
|
262
|
+
return _browser.browserApiRequest.call(void 0, `/api/v1/kg/full-ingest/jobs${queryString}`, {
|
|
263
|
+
method: "GET",
|
|
264
|
+
...options
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
async function getFullIngestJobApi(jobId, options) {
|
|
268
|
+
return _browser.browserApiRequest.call(void 0, `/api/v1/kg/full-ingest/jobs/${jobId}`, {
|
|
269
|
+
method: "GET",
|
|
270
|
+
...options
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
|
|
180
280
|
|
|
181
281
|
|
|
182
282
|
|
|
@@ -208,5 +308,5 @@ async function getCrawledPagesApi(jobId, options) {
|
|
|
208
308
|
|
|
209
309
|
|
|
210
310
|
|
|
211
|
-
exports.listGraphsApi = listGraphsApi; exports.getGraphApi = getGraphApi; exports.createGraphApi = createGraphApi; exports.updateGraphApi = updateGraphApi; exports.deleteGraphApi = deleteGraphApi; exports.queryGraphApi = queryGraphApi; exports.getGraphLabelsApi = getGraphLabelsApi; exports.getKGNodeApi = getKGNodeApi; exports.ingestKGNodeApi = ingestKGNodeApi; exports.updateKGNodeApi = updateKGNodeApi; exports.getNodeConnectionStatsApi = getNodeConnectionStatsApi; exports.ingestDocumentApi = ingestDocumentApi; exports.deleteKGDocumentApi = deleteKGDocumentApi; exports.optimizeGraphApi = optimizeGraphApi; exports.listDesignerNodesApi = listDesignerNodesApi; exports.getDesignerNodeApi = getDesignerNodeApi; exports.createDesignerNodeApi = createDesignerNodeApi; exports.updateDesignerNodeApi = updateDesignerNodeApi; exports.deleteDesignerNodeApi = deleteDesignerNodeApi; exports.listDesignerEdgesApi = listDesignerEdgesApi; exports.getDesignerEdgeApi = getDesignerEdgeApi; exports.createDesignerEdgeApi = createDesignerEdgeApi; exports.updateDesignerEdgeApi = updateDesignerEdgeApi; exports.deleteDesignerEdgeApi = deleteDesignerEdgeApi; exports.listCrawlJobsApi = listCrawlJobsApi; exports.startCrawlJobApi = startCrawlJobApi; exports.getCrawlJobStatusApi = getCrawlJobStatusApi; exports.cancelCrawlJobApi = cancelCrawlJobApi; exports.getCrawledPagesApi = getCrawledPagesApi;
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
311
|
+
exports.listGraphsApi = listGraphsApi; exports.getGraphApi = getGraphApi; exports.createGraphApi = createGraphApi; exports.updateGraphApi = updateGraphApi; exports.deleteGraphApi = deleteGraphApi; exports.queryGraphApi = queryGraphApi; exports.getGraphLabelsApi = getGraphLabelsApi; exports.getKGNodeApi = getKGNodeApi; exports.ingestKGNodeApi = ingestKGNodeApi; exports.updateKGNodeApi = updateKGNodeApi; exports.getNodeConnectionStatsApi = getNodeConnectionStatsApi; exports.ingestDocumentApi = ingestDocumentApi; exports.deleteKGDocumentApi = deleteKGDocumentApi; exports.optimizeGraphApi = optimizeGraphApi; exports.listDesignerNodesApi = listDesignerNodesApi; exports.getDesignerNodeApi = getDesignerNodeApi; exports.createDesignerNodeApi = createDesignerNodeApi; exports.updateDesignerNodeApi = updateDesignerNodeApi; exports.deleteDesignerNodeApi = deleteDesignerNodeApi; exports.listDesignerEdgesApi = listDesignerEdgesApi; exports.getDesignerEdgeApi = getDesignerEdgeApi; exports.createDesignerEdgeApi = createDesignerEdgeApi; exports.updateDesignerEdgeApi = updateDesignerEdgeApi; exports.deleteDesignerEdgeApi = deleteDesignerEdgeApi; exports.listCrawlJobsApi = listCrawlJobsApi; exports.startCrawlJobApi = startCrawlJobApi; exports.getCrawlJobStatusApi = getCrawlJobStatusApi; exports.cancelCrawlJobApi = cancelCrawlJobApi; exports.getCrawledPagesApi = getCrawledPagesApi; exports.startQuickIngestApi = startQuickIngestApi; exports.cancelQuickIngestApi = cancelQuickIngestApi; exports.startFullIngestExtractionApi = startFullIngestExtractionApi; exports.cancelFullIngestExtractionApi = cancelFullIngestExtractionApi; exports.ingestFullIngestNodesApi = ingestFullIngestNodesApi; exports.listFullIngestJobsApi = listFullIngestJobsApi; exports.getFullIngestJobApi = getFullIngestJobApi;
|
|
312
|
+
//# sourceMappingURL=chunk-CNWOI7LX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eloquent/eloquent/packages/@elqnt/kg/dist/chunk-CNWOI7LX.js","../api/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/eloquent/eloquent/packages/@elqnt/kg/dist/chunk-CNWOI7LX.js","sourcesContent":[null,"/**\n * Knowledge Graph Browser API\n *\n * Browser-side API client for KG operations.\n * Uses @elqnt/api-client for HTTP requests with automatic token management.\n *\n * @example\n * ```ts\n * import { listGraphsApi, queryGraphApi } from \"@elqnt/kg/api\";\n *\n * const graphs = await listGraphsApi({ baseUrl, orgId });\n * const result = await queryGraphApi(query, { baseUrl, orgId, graphId });\n * ```\n *\n * @packageDocumentation\n */\n\nimport { browserApiRequest, getGatewayToken } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type { ResponseMetadata } from \"@elqnt/types\";\nimport type {\n Graph,\n ListGraphsResult,\n GetGraphResult,\n CreateGraphResult,\n CreateGraphRequest,\n UpdateGraphResult,\n DeleteGraphResult,\n KGNode,\n KGQuery,\n KGQueryResult,\n KGLabelInfo,\n KGNodeIngestRequest,\n KGSyncIngestResponse,\n DeleteDocumentResponse,\n GraphNodeDefinition,\n GraphNodeResponse,\n GraphEdgeDefinition,\n GraphEdgeResponse,\n QuickIngestStartRequest,\n QuickIngestJobResult,\n QuickIngestCancelResult,\n FullIngestExtractionRequest,\n FullIngestExtractionResult,\n FullIngestNodesRequest,\n FullIngestNodesResult,\n FullIngestCancelResult,\n FullIngestJob,\n FullIngestJobsListResponse,\n} from \"../models\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Options for KG API calls that may include a graph ID\n */\nexport interface KGApiOptions extends ApiClientOptions {\n /** Optional graph ID for graph-scoped operations */\n graphId?: string;\n}\n\n/**\n * Crawl job information\n */\nexport interface CrawlJob {\n id: string;\n baseUrl: string;\n depth: number;\n maxPages: number;\n status: string;\n pagesProcessed: number;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Response for listing crawl jobs\n */\nexport interface CrawlJobsListResponse {\n jobs: CrawlJob[];\n total: number;\n}\n\n/**\n * Response for crawl job status\n */\nexport interface CrawlJobStatusResponse {\n job: CrawlJob;\n success: boolean;\n}\n\n/**\n * Response for starting a crawl job\n */\nexport interface CrawlJobStartResponse {\n jobId: string;\n success: boolean;\n}\n\n/**\n * Response for listing crawled pages\n */\nexport interface CrawledPagesResponse {\n pages: Array<{\n url: string;\n title: string;\n status: string;\n processedAt: string;\n }>;\n total: number;\n}\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\n/**\n * Build query string from parameters, filtering out undefined values\n */\nfunction buildQueryString(params: Record<string, string | undefined>): string {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n searchParams.set(key, value);\n }\n }\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n/**\n * Build headers including X-Graph-ID if provided\n */\nfunction buildHeaders(graphId?: string): Record<string, string> | undefined {\n return graphId ? { \"X-Graph-ID\": graphId } : undefined;\n}\n\n// =============================================================================\n// GRAPHS\n// =============================================================================\n\n/**\n * List all knowledge graphs for the organization\n *\n * @param options - API client options (baseUrl, orgId)\n * @returns List of graphs\n *\n * @example\n * ```ts\n * const response = await listGraphsApi({ baseUrl: \"http://api-gateway:80\", orgId: \"org-123\" });\n * if (response.data?.graphs) {\n * console.log(\"Graphs:\", response.data.graphs);\n * }\n * ```\n */\nexport async function listGraphsApi(options: ApiClientOptions): Promise<ApiResponse<ListGraphsResult>> {\n return browserApiRequest(\"/api/v1/kg/graphs\", { method: \"GET\", ...options });\n}\n\n/**\n * Get a specific knowledge graph by ID\n *\n * @param graphId - The graph ID\n * @param options - API client options\n * @returns The graph details\n */\nexport async function getGraphApi(graphId: string, options: ApiClientOptions): Promise<ApiResponse<GetGraphResult>> {\n return browserApiRequest(`/api/v1/kg/graphs/${graphId}`, { method: \"GET\", ...options });\n}\n\n/**\n * Create a new knowledge graph\n *\n * @param graph - Graph creation request\n * @param options - API client options\n * @returns The created graph\n */\nexport async function createGraphApi(graph: CreateGraphRequest, options: ApiClientOptions): Promise<ApiResponse<CreateGraphResult>> {\n return browserApiRequest(\"/api/v1/kg/graphs\", { method: \"POST\", body: graph, ...options });\n}\n\n/**\n * Update an existing knowledge graph\n *\n * @param graphId - The graph ID to update\n * @param updates - Partial graph updates\n * @param options - API client options\n * @returns The updated graph\n */\nexport async function updateGraphApi(\n graphId: string,\n updates: Partial<Graph>,\n options: ApiClientOptions\n): Promise<ApiResponse<UpdateGraphResult>> {\n return browserApiRequest(`/api/v1/kg/graphs/${graphId}`, { method: \"PUT\", body: updates, ...options });\n}\n\n/**\n * Delete a knowledge graph\n *\n * @param graphId - The graph ID to delete\n * @param options - API client options\n * @returns Success/failure result\n */\nexport async function deleteGraphApi(graphId: string, options: ApiClientOptions): Promise<ApiResponse<DeleteGraphResult>> {\n return browserApiRequest(`/api/v1/kg/graphs/${graphId}`, { method: \"DELETE\", ...options });\n}\n\n// =============================================================================\n// QUERY & LABELS\n// =============================================================================\n\n/**\n * Query knowledge graph nodes\n *\n * @param query - The KG query parameters\n * @param options - API options including optional graphId\n * @returns Query results with matching nodes and edges\n *\n * @example\n * ```ts\n * const result = await queryGraphApi(\n * { label: \"Person\", fields: [], limit: 10, depth: 1, sortBy: \"\", sortOrder: \"\" },\n * { baseUrl, orgId, graphId }\n * );\n * ```\n */\nexport async function queryGraphApi(query: KGQuery, options: KGApiOptions): Promise<ApiResponse<KGQueryResult>> {\n return browserApiRequest(\"/api/v1/kg/query\", {\n method: \"POST\",\n body: query,\n timeout: 30000,\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Get all node labels in the knowledge graph\n *\n * @param options - API options including optional graphId\n * @returns List of labels with counts\n */\nexport async function getGraphLabelsApi(options: KGApiOptions): Promise<ApiResponse<{ labels: KGLabelInfo[] }>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/labels${queryString}`, { method: \"GET\", ...options });\n}\n\n// =============================================================================\n// NODES\n// =============================================================================\n\n/**\n * Get a specific KG node by ID\n *\n * @param nodeId - The node ID\n * @param options - API options including optional graphId\n * @returns The node details\n */\nexport async function getKGNodeApi(\n nodeId: string,\n options: KGApiOptions\n): Promise<ApiResponse<{ node: KGNode }>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/nodes/${nodeId}${queryString}`, { method: \"GET\", ...options });\n}\n\n/**\n * Ingest a new node into the knowledge graph\n *\n * @param node - Node ingest request\n * @param options - API options including optional graphId\n * @returns The created node ID\n */\nexport async function ingestKGNodeApi(\n node: KGNodeIngestRequest,\n options: KGApiOptions\n): Promise<ApiResponse<KGSyncIngestResponse>> {\n return browserApiRequest(\"/api/v1/kg/nodes\", {\n method: \"POST\",\n body: node,\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Update an existing KG node\n *\n * @param nodeId - The node ID to update\n * @param updates - Partial node updates\n * @param options - API options including optional graphId\n * @returns Success/failure result\n */\nexport async function updateKGNodeApi(\n nodeId: string,\n updates: Partial<KGNode>,\n options: KGApiOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n return browserApiRequest(`/api/v1/kg/nodes/${nodeId}`, {\n method: \"PUT\",\n body: updates,\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Get connection statistics for a node\n *\n * @param nodeId - The node ID\n * @param edgeLabel - The edge label to filter by\n * @param options - API options including optional graphId\n * @returns Connection counts by label\n */\nexport async function getNodeConnectionStatsApi(\n nodeId: string,\n edgeLabel: string,\n options: KGApiOptions\n): Promise<ApiResponse<Record<string, number>>> {\n const queryString = buildQueryString({ edgeLabel, graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/nodes/${nodeId}/connections${queryString}`, { method: \"GET\", ...options });\n}\n\n// =============================================================================\n// DOCUMENTS\n// =============================================================================\n\n/**\n * Ingest a document into the knowledge graph\n *\n * @param document - Document to ingest\n * @param options - API options including optional graphId\n * @returns Success/failure result\n */\nexport async function ingestDocumentApi(\n document: { id: string; title: string; content: string; docUrl?: string; lang?: string },\n options: KGApiOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n return browserApiRequest(\"/api/v1/kg/ingest\", {\n method: \"POST\",\n body: document,\n timeout: 120000,\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Delete a document from the knowledge graph\n *\n * @param documentId - The document ID to delete\n * @param options - API options including optional graphId and cascade\n * @param cascade - If true, also delete all connected nodes (articles, etc.). Default: false\n * @returns Deletion result with counts\n */\nexport async function deleteKGDocumentApi(\n documentId: string,\n options: KGApiOptions,\n cascade: boolean = false\n): Promise<ApiResponse<DeleteDocumentResponse>> {\n const queryString = buildQueryString({ graphId: options.graphId, cascade: cascade ? \"true\" : undefined });\n return browserApiRequest(`/api/v1/kg/documents/${documentId}${queryString}`, { method: \"DELETE\", ...options });\n}\n\n/**\n * Optimize the knowledge graph\n *\n * @param options - API options including optional graphId\n * @returns Success/failure result\n */\nexport async function optimizeGraphApi(options: KGApiOptions): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n return browserApiRequest(\"/api/v1/kg/graph/optimize\", {\n method: \"POST\",\n body: {},\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n// =============================================================================\n// DESIGNER - NODES\n// =============================================================================\n\n/**\n * List all node definitions in the graph designer\n *\n * @param options - API options including optional graphId\n * @returns List of node definitions\n */\nexport async function listDesignerNodesApi(options: KGApiOptions): Promise<ApiResponse<GraphNodeResponse>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/designer/nodes${queryString}`, { method: \"GET\", ...options });\n}\n\n/**\n * Get a specific node definition by label\n *\n * @param label - The node label\n * @param options - API options including optional graphId\n * @returns The node definition\n */\nexport async function getDesignerNodeApi(label: string, options: KGApiOptions): Promise<ApiResponse<GraphNodeResponse>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/designer/nodes/${label}${queryString}`, { method: \"GET\", ...options });\n}\n\n/**\n * Create a new node definition\n *\n * @param node - Node definition to create\n * @param options - API options including optional graphId\n * @returns The created node definition\n */\nexport async function createDesignerNodeApi(\n node: Omit<GraphNodeDefinition, \"createdAt\" | \"updatedAt\">,\n options: KGApiOptions\n): Promise<ApiResponse<GraphNodeResponse>> {\n return browserApiRequest(\"/api/v1/kg/designer/nodes\", {\n method: \"POST\",\n body: { node },\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Update an existing node definition\n *\n * @param label - The node label to update\n * @param node - Partial node definition updates\n * @param options - API options including optional graphId\n * @returns The updated node definition\n */\nexport async function updateDesignerNodeApi(\n label: string,\n node: Partial<GraphNodeDefinition>,\n options: KGApiOptions\n): Promise<ApiResponse<GraphNodeResponse>> {\n return browserApiRequest(`/api/v1/kg/designer/nodes/${label}`, {\n method: \"PUT\",\n body: { node },\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Delete a node definition\n *\n * @param label - The node label to delete\n * @param options - API options including optional graphId\n * @returns Success/failure result\n */\nexport async function deleteDesignerNodeApi(\n label: string,\n options: KGApiOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/designer/nodes/${label}${queryString}`, { method: \"DELETE\", ...options });\n}\n\n// =============================================================================\n// DESIGNER - EDGES\n// =============================================================================\n\n/**\n * List all edge definitions in the graph designer\n *\n * @param options - API options including optional graphId\n * @returns List of edge definitions\n */\nexport async function listDesignerEdgesApi(options: KGApiOptions): Promise<ApiResponse<GraphEdgeResponse>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/designer/edges${queryString}`, { method: \"GET\", ...options });\n}\n\n/**\n * Get a specific edge definition by label\n *\n * @param label - The edge label\n * @param options - API options including optional graphId\n * @returns The edge definition\n */\nexport async function getDesignerEdgeApi(label: string, options: KGApiOptions): Promise<ApiResponse<GraphEdgeResponse>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/designer/edges/${label}${queryString}`, { method: \"GET\", ...options });\n}\n\n/**\n * Create a new edge definition\n *\n * @param edge - Edge definition to create\n * @param options - API options including optional graphId\n * @returns The created edge definition\n */\nexport async function createDesignerEdgeApi(\n edge: Omit<GraphEdgeDefinition, \"createdAt\" | \"updatedAt\">,\n options: KGApiOptions\n): Promise<ApiResponse<GraphEdgeResponse>> {\n return browserApiRequest(\"/api/v1/kg/designer/edges\", {\n method: \"POST\",\n body: { edge },\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Update an existing edge definition\n *\n * @param label - The edge label to update\n * @param edge - Partial edge definition updates\n * @param options - API options including optional graphId\n * @returns The updated edge definition\n */\nexport async function updateDesignerEdgeApi(\n label: string,\n edge: Partial<GraphEdgeDefinition>,\n options: KGApiOptions\n): Promise<ApiResponse<GraphEdgeResponse>> {\n return browserApiRequest(`/api/v1/kg/designer/edges/${label}`, {\n method: \"PUT\",\n body: { edge },\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Delete an edge definition\n *\n * @param label - The edge label to delete\n * @param options - API options including optional graphId\n * @returns Success/failure result\n */\nexport async function deleteDesignerEdgeApi(\n label: string,\n options: KGApiOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/designer/edges/${label}${queryString}`, { method: \"DELETE\", ...options });\n}\n\n// =============================================================================\n// CRAWL JOBS\n// =============================================================================\n\n/**\n * List crawl jobs\n *\n * @param options - API options including optional graphId, limit, offset, status\n * @returns List of crawl jobs with total count\n */\nexport async function listCrawlJobsApi(\n options: KGApiOptions & { limit?: number; offset?: number; status?: string }\n): Promise<ApiResponse<CrawlJobsListResponse>> {\n const queryString = buildQueryString({\n graphId: options.graphId,\n limit: options.limit?.toString(),\n offset: options.offset?.toString(),\n status: options.status,\n });\n return browserApiRequest(`/api/v1/kg/crawl/jobs${queryString}`, { method: \"GET\", ...options });\n}\n\n/**\n * Start a new crawl job\n *\n * @param params - Crawl job parameters\n * @param options - API options including optional graphId\n * @returns The created job ID\n */\nexport async function startCrawlJobApi(\n params: { baseUrl: string; depth: number; maxPages: number },\n options: KGApiOptions\n): Promise<ApiResponse<CrawlJobStartResponse>> {\n return browserApiRequest(\"/api/v1/kg/crawl/jobs\", {\n method: \"POST\",\n body: params,\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Get crawl job status\n *\n * @param jobId - The job ID\n * @param options - API options including optional graphId\n * @returns The job status\n */\nexport async function getCrawlJobStatusApi(\n jobId: string,\n options: KGApiOptions\n): Promise<ApiResponse<CrawlJobStatusResponse>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/crawl/jobs/${jobId}${queryString}`, { method: \"GET\", ...options });\n}\n\n/**\n * Cancel a crawl job\n *\n * @param jobId - The job ID to cancel\n * @param options - API options including optional graphId\n * @returns The updated job status\n */\nexport async function cancelCrawlJobApi(\n jobId: string,\n options: KGApiOptions\n): Promise<ApiResponse<CrawlJobStatusResponse>> {\n return browserApiRequest(`/api/v1/kg/crawl/jobs/${jobId}/cancel`, {\n method: \"POST\",\n body: {},\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Get pages crawled by a job\n *\n * @param jobId - The job ID\n * @param options - API options including optional graphId\n * @returns List of crawled pages\n */\nexport async function getCrawledPagesApi(\n jobId: string,\n options: KGApiOptions\n): Promise<ApiResponse<CrawledPagesResponse>> {\n const queryString = buildQueryString({ graphId: options.graphId });\n return browserApiRequest(`/api/v1/kg/crawl/jobs/${jobId}/pages${queryString}`, { method: \"GET\", ...options });\n}\n\n// =============================================================================\n// QUICK INGESTION\n// =============================================================================\n\n// Note: File uploads are handled directly by the frontend to S3/Azure storage.\n// The backend receives file URLs, not files.\n\n/**\n * Quick ingest SSE event types\n */\nexport interface QuickIngestEvent {\n type: \"started\" | \"item_start\" | \"item_progress\" | \"item_complete\" | \"item_error\" | \"job_complete\" | \"error\" | \"cancelled\";\n itemId?: string;\n message?: string;\n progress?: number;\n text?: string;\n error?: string;\n articles?: number;\n topics?: number;\n nodesCreated?: number;\n nodesByLabel?: Record<string, number>;\n timestamp: number;\n}\n\n/**\n * Start a quick ingestion job with SSE streaming response\n *\n * @param request - Quick ingestion start request\n * @param options - API options including optional graphId\n * @param onEvent - Callback for each SSE event\n * @returns Promise that resolves when streaming completes\n *\n * @example\n * ```ts\n * await startQuickIngestApi(\n * { items: [...], options: {...}, graphId: \"default\" },\n * { baseUrl, orgId },\n * (event) => {\n * if (event.type === \"item_complete\") {\n * console.log(`Completed: ${event.itemId}`);\n * }\n * }\n * );\n * ```\n */\nexport async function startQuickIngestApi(\n request: QuickIngestStartRequest,\n options: KGApiOptions,\n onEvent: (event: QuickIngestEvent) => void\n): Promise<void> {\n // Get auth token for API Gateway\n const token = await getGatewayToken();\n if (!token) {\n throw new Error(\"Failed to get authentication token\");\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`,\n \"X-Org-ID\": options.orgId,\n };\n if (options.graphId) {\n headers[\"X-Graph-ID\"] = options.graphId;\n }\n\n const response = await fetch(`${options.baseUrl}/api/v1/kg/quick-ingest/start`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const data = JSON.parse(line.slice(6)) as QuickIngestEvent;\n onEvent(data);\n } catch {\n // Skip malformed events\n }\n }\n }\n }\n}\n\n/**\n * Cancel a quick ingestion job\n *\n * @param jobId - The job ID to cancel\n * @param options - API options including optional graphId\n * @returns Cancel result with status\n */\nexport async function cancelQuickIngestApi(\n jobId: string,\n options: KGApiOptions\n): Promise<ApiResponse<QuickIngestCancelResult>> {\n return browserApiRequest(`/api/v1/kg/quick-ingest/${jobId}/cancel`, {\n method: \"POST\",\n body: {},\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n// =============================================================================\n// FULL INGESTION\n// =============================================================================\n\n/**\n * Start full ingestion extraction\n *\n * @param request - Extraction request with source and labels\n * @param options - API options including optional graphId\n * @returns Extraction job result\n */\nexport async function startFullIngestExtractionApi(\n request: FullIngestExtractionRequest,\n options: KGApiOptions\n): Promise<ApiResponse<FullIngestExtractionResult>> {\n return browserApiRequest(\"/api/v1/kg/full-ingest/extract\", {\n method: \"POST\",\n body: request,\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Cancel full ingestion extraction\n *\n * @param jobId - The job ID to cancel\n * @param options - API options including optional graphId\n * @returns Cancel result with status\n */\nexport async function cancelFullIngestExtractionApi(\n jobId: string,\n options: KGApiOptions\n): Promise<ApiResponse<FullIngestCancelResult>> {\n return browserApiRequest(`/api/v1/kg/full-ingest/${jobId}/cancel`, {\n method: \"POST\",\n body: {},\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * Ingest extracted nodes into the knowledge graph\n *\n * @param request - Nodes to ingest\n * @param options - API options including optional graphId\n * @returns Ingest result with counts\n */\nexport async function ingestFullIngestNodesApi(\n request: FullIngestNodesRequest,\n options: KGApiOptions\n): Promise<ApiResponse<FullIngestNodesResult>> {\n return browserApiRequest(\"/api/v1/kg/full-ingest/ingest\", {\n method: \"POST\",\n body: request,\n headers: buildHeaders(options.graphId),\n ...options,\n });\n}\n\n/**\n * List full ingestion jobs for the organization\n *\n * @param options - API options including optional limit\n * @returns List of job summaries\n */\nexport async function listFullIngestJobsApi(\n options: KGApiOptions & { limit?: number }\n): Promise<ApiResponse<FullIngestJobsListResponse>> {\n const queryString = buildQueryString({\n graphId: options.graphId,\n limit: options.limit?.toString(),\n });\n return browserApiRequest(`/api/v1/kg/full-ingest/jobs${queryString}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get a specific full ingestion job by ID\n *\n * @param jobId - The job ID\n * @param options - API options\n * @returns The job details including nodes, edges, and events\n */\nexport async function getFullIngestJobApi(\n jobId: string,\n options: KGApiOptions\n): Promise<ApiResponse<FullIngestJob>> {\n return browserApiRequest(`/api/v1/kg/full-ingest/jobs/${jobId}`, {\n method: \"GET\",\n ...options,\n });\n}\n"]}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// transport/quick-ingest.ts
|
|
4
|
+
function createQuickIngestTransport(options = {}) {
|
|
5
|
+
const { debug = false } = options;
|
|
6
|
+
let eventSource;
|
|
7
|
+
let config;
|
|
8
|
+
let state = "disconnected";
|
|
9
|
+
let currentJobId;
|
|
10
|
+
const typeHandlers = /* @__PURE__ */ new Map();
|
|
11
|
+
const log = debug ? (msg, ...args) => console.log(`[kg-quick-ingest] ${msg}`, ...args) : () => {
|
|
12
|
+
};
|
|
13
|
+
function emit(event) {
|
|
14
|
+
const handlers = typeHandlers.get(event.type);
|
|
15
|
+
if (handlers) {
|
|
16
|
+
handlers.forEach((handler) => {
|
|
17
|
+
try {
|
|
18
|
+
handler(event);
|
|
19
|
+
} catch (err) {
|
|
20
|
+
console.error(`[kg-quick-ingest] Error in ${event.type} handler:`, err);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function handleMessage(event) {
|
|
26
|
+
if (!event.data || event.data === "") return;
|
|
27
|
+
try {
|
|
28
|
+
const data = JSON.parse(event.data);
|
|
29
|
+
log("Received:", data.type);
|
|
30
|
+
emit(data);
|
|
31
|
+
if (data.type === "job_complete") {
|
|
32
|
+
state = "connected";
|
|
33
|
+
currentJobId = void 0;
|
|
34
|
+
}
|
|
35
|
+
} catch (err) {
|
|
36
|
+
console.error("[kg-quick-ingest] Failed to parse SSE message:", err);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function setupEventListeners(es) {
|
|
40
|
+
es.addEventListener("message", handleMessage);
|
|
41
|
+
const eventTypes = ["item_start", "item_progress", "item_complete", "item_error", "job_complete"];
|
|
42
|
+
eventTypes.forEach((type) => {
|
|
43
|
+
es.addEventListener(type, handleMessage);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const transport = {
|
|
47
|
+
async connect(opts) {
|
|
48
|
+
config = {
|
|
49
|
+
baseUrl: opts.baseUrl,
|
|
50
|
+
orgId: opts.orgId,
|
|
51
|
+
graphId: opts.graphId,
|
|
52
|
+
userId: opts.userId
|
|
53
|
+
};
|
|
54
|
+
state = "connected";
|
|
55
|
+
log("Transport ready");
|
|
56
|
+
},
|
|
57
|
+
subscribeToJob(jobId) {
|
|
58
|
+
if (!config) {
|
|
59
|
+
throw new Error("Transport not connected");
|
|
60
|
+
}
|
|
61
|
+
if (eventSource) {
|
|
62
|
+
eventSource.close();
|
|
63
|
+
eventSource = void 0;
|
|
64
|
+
}
|
|
65
|
+
currentJobId = jobId;
|
|
66
|
+
state = "connecting";
|
|
67
|
+
const params = new URLSearchParams({
|
|
68
|
+
orgId: config.orgId
|
|
69
|
+
});
|
|
70
|
+
if (config.graphId) {
|
|
71
|
+
params.set("graphId", config.graphId);
|
|
72
|
+
}
|
|
73
|
+
const streamUrl = `${config.baseUrl}/api/v1/kg/quick-ingest/${jobId}/progress?${params.toString()}`;
|
|
74
|
+
log("Connecting to stream:", streamUrl);
|
|
75
|
+
const es = new EventSource(streamUrl);
|
|
76
|
+
setupEventListeners(es);
|
|
77
|
+
es.onopen = () => {
|
|
78
|
+
log("Stream connected");
|
|
79
|
+
state = "connected";
|
|
80
|
+
};
|
|
81
|
+
es.onerror = () => {
|
|
82
|
+
if (es.readyState === EventSource.CLOSED) {
|
|
83
|
+
log("Stream closed");
|
|
84
|
+
state = "disconnected";
|
|
85
|
+
currentJobId = void 0;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
eventSource = es;
|
|
89
|
+
},
|
|
90
|
+
on(eventType, handler) {
|
|
91
|
+
if (!typeHandlers.has(eventType)) {
|
|
92
|
+
typeHandlers.set(eventType, /* @__PURE__ */ new Set());
|
|
93
|
+
}
|
|
94
|
+
typeHandlers.get(eventType).add(handler);
|
|
95
|
+
return () => {
|
|
96
|
+
const handlers = typeHandlers.get(eventType);
|
|
97
|
+
if (handlers) {
|
|
98
|
+
handlers.delete(handler);
|
|
99
|
+
if (handlers.size === 0) {
|
|
100
|
+
typeHandlers.delete(eventType);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
disconnect() {
|
|
106
|
+
log("Disconnecting");
|
|
107
|
+
if (eventSource) {
|
|
108
|
+
eventSource.close();
|
|
109
|
+
eventSource = void 0;
|
|
110
|
+
}
|
|
111
|
+
state = "disconnected";
|
|
112
|
+
currentJobId = void 0;
|
|
113
|
+
},
|
|
114
|
+
getState() {
|
|
115
|
+
return state;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
return transport;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// transport/full-ingest.ts
|
|
122
|
+
function createFullIngestTransport(options = {}) {
|
|
123
|
+
const { debug = false } = options;
|
|
124
|
+
let eventSource;
|
|
125
|
+
let config;
|
|
126
|
+
let state = "disconnected";
|
|
127
|
+
let currentJobId;
|
|
128
|
+
const typeHandlers = /* @__PURE__ */ new Map();
|
|
129
|
+
const log = debug ? (msg, ...args) => console.log(`[kg-full-ingest] ${msg}`, ...args) : () => {
|
|
130
|
+
};
|
|
131
|
+
function emit(event) {
|
|
132
|
+
const handlers = typeHandlers.get(event.type);
|
|
133
|
+
if (handlers) {
|
|
134
|
+
handlers.forEach((handler) => {
|
|
135
|
+
try {
|
|
136
|
+
handler(event);
|
|
137
|
+
} catch (err) {
|
|
138
|
+
console.error(`[kg-full-ingest] Error in ${event.type} handler:`, err);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function handleMessage(event) {
|
|
144
|
+
if (!event.data || event.data === "") return;
|
|
145
|
+
try {
|
|
146
|
+
const data = JSON.parse(event.data);
|
|
147
|
+
log("Received:", data.type);
|
|
148
|
+
emit(data);
|
|
149
|
+
if (data.type === "complete" || data.type === "error") {
|
|
150
|
+
state = "connected";
|
|
151
|
+
currentJobId = void 0;
|
|
152
|
+
}
|
|
153
|
+
} catch (err) {
|
|
154
|
+
console.error("[kg-full-ingest] Failed to parse SSE message:", err);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function setupEventListeners(es) {
|
|
158
|
+
es.addEventListener("message", handleMessage);
|
|
159
|
+
const eventTypes = [
|
|
160
|
+
"progress",
|
|
161
|
+
"node",
|
|
162
|
+
"consolidating",
|
|
163
|
+
"consolidate_progress",
|
|
164
|
+
"consolidated",
|
|
165
|
+
"linking",
|
|
166
|
+
"linked",
|
|
167
|
+
"edge",
|
|
168
|
+
"complete",
|
|
169
|
+
"error",
|
|
170
|
+
"ingesting",
|
|
171
|
+
"ingest_progress",
|
|
172
|
+
"ingest_complete"
|
|
173
|
+
];
|
|
174
|
+
eventTypes.forEach((type) => {
|
|
175
|
+
es.addEventListener(type, handleMessage);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
const transport = {
|
|
179
|
+
async connect(opts) {
|
|
180
|
+
config = {
|
|
181
|
+
baseUrl: opts.baseUrl,
|
|
182
|
+
orgId: opts.orgId,
|
|
183
|
+
graphId: opts.graphId,
|
|
184
|
+
userId: opts.userId
|
|
185
|
+
};
|
|
186
|
+
state = "connected";
|
|
187
|
+
log("Transport ready");
|
|
188
|
+
},
|
|
189
|
+
subscribeToJob(jobId) {
|
|
190
|
+
if (!config) {
|
|
191
|
+
throw new Error("Transport not connected");
|
|
192
|
+
}
|
|
193
|
+
if (eventSource) {
|
|
194
|
+
eventSource.close();
|
|
195
|
+
eventSource = void 0;
|
|
196
|
+
}
|
|
197
|
+
currentJobId = jobId;
|
|
198
|
+
state = "connecting";
|
|
199
|
+
const params = new URLSearchParams({
|
|
200
|
+
orgId: config.orgId
|
|
201
|
+
});
|
|
202
|
+
if (config.graphId) {
|
|
203
|
+
params.set("graphId", config.graphId);
|
|
204
|
+
}
|
|
205
|
+
const streamUrl = `${config.baseUrl}/api/v1/kg/full-ingest/${jobId}/progress?${params.toString()}`;
|
|
206
|
+
log("Connecting to stream:", streamUrl);
|
|
207
|
+
const es = new EventSource(streamUrl);
|
|
208
|
+
es.onopen = () => {
|
|
209
|
+
log("Stream connected");
|
|
210
|
+
state = "connected";
|
|
211
|
+
setupEventListeners(es);
|
|
212
|
+
};
|
|
213
|
+
es.onerror = () => {
|
|
214
|
+
if (es.readyState === EventSource.CLOSED) {
|
|
215
|
+
log("Stream closed");
|
|
216
|
+
state = "disconnected";
|
|
217
|
+
currentJobId = void 0;
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
eventSource = es;
|
|
221
|
+
},
|
|
222
|
+
on(eventType, handler) {
|
|
223
|
+
if (!typeHandlers.has(eventType)) {
|
|
224
|
+
typeHandlers.set(eventType, /* @__PURE__ */ new Set());
|
|
225
|
+
}
|
|
226
|
+
typeHandlers.get(eventType).add(handler);
|
|
227
|
+
return () => {
|
|
228
|
+
const handlers = typeHandlers.get(eventType);
|
|
229
|
+
if (handlers) {
|
|
230
|
+
handlers.delete(handler);
|
|
231
|
+
if (handlers.size === 0) {
|
|
232
|
+
typeHandlers.delete(eventType);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
},
|
|
237
|
+
disconnect() {
|
|
238
|
+
log("Disconnecting");
|
|
239
|
+
if (eventSource) {
|
|
240
|
+
eventSource.close();
|
|
241
|
+
eventSource = void 0;
|
|
242
|
+
}
|
|
243
|
+
state = "disconnected";
|
|
244
|
+
currentJobId = void 0;
|
|
245
|
+
},
|
|
246
|
+
getState() {
|
|
247
|
+
return state;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
return transport;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export {
|
|
254
|
+
createQuickIngestTransport,
|
|
255
|
+
createFullIngestTransport
|
|
256
|
+
};
|
|
257
|
+
//# sourceMappingURL=chunk-MAEB7UOW.mjs.map
|