@sweetoburrito/backstage-plugin-ai-assistant-backend-module-ingestor-azure-devops 0.5.2 → 0.6.0
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.
|
@@ -91,13 +91,12 @@ const createAzureDevOpsService = async ({
|
|
|
91
91
|
);
|
|
92
92
|
return allPages;
|
|
93
93
|
};
|
|
94
|
-
const getWikiPageContent = async (wikiName,
|
|
95
|
-
const pageStream = await wikiApi.
|
|
94
|
+
const getWikiPageContent = async (wikiName, pagePath) => {
|
|
95
|
+
const pageStream = await wikiApi.getPageText(
|
|
96
96
|
project,
|
|
97
97
|
wikiName,
|
|
98
|
-
|
|
99
|
-
GitInterfaces.VersionControlRecursionType.None
|
|
100
|
-
true
|
|
98
|
+
pagePath,
|
|
99
|
+
GitInterfaces.VersionControlRecursionType.None
|
|
101
100
|
);
|
|
102
101
|
return pageStream;
|
|
103
102
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/services/azure-devops/index.ts"],"sourcesContent":["import {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { streamToString } from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { getPersonalAccessTokenHandler, WebApi } from 'azure-devops-node-api';\nimport { VersionControlRecursionType } from 'azure-devops-node-api/interfaces/GitInterfaces';\nimport { WikiPage } from 'azure-devops-node-api/interfaces/WikiInterfaces';\nimport { flattenWikiPages } from '../../utils/flatten-wiki-pages';\n\nexport type AzureDevOpsService = Awaited<\n ReturnType<typeof createAzureDevOpsService>\n>;\n\nexport const createAzureDevOpsService = async ({\n config,\n logger,\n}: {\n config: RootConfigService;\n logger: LoggerService;\n}) => {\n // Get configuration values\n const organization = config.getString(\n 'aiAssistant.ingestors.azureDevOps.organization',\n );\n const project = config.getString('aiAssistant.ingestors.azureDevOps.project');\n const token = config.getString('aiAssistant.ingestors.azureDevOps.token');\n\n // Construct organization URL\n const orgUrl = `https://dev.azure.com/${organization}`;\n\n logger.info(\n `Connecting to Azure DevOps organization: ${organization}, project: ${project}`,\n );\n\n if (!organization || !project || !token) {\n throw new Error(\n 'Azure DevOps organization, project, and token are required',\n );\n }\n\n // Create authentication handler and connection\n const authHandler = getPersonalAccessTokenHandler(token);\n\n const connection = new WebApi(orgUrl, authHandler);\n\n logger.info(\n `Connected to Azure DevOps organization: ${organization}, project: ${project}`,\n );\n\n // Get Git API for repository operations\n const gitApi = await connection.getGitApi();\n\n // Get Wiki API for wiki operations\n const wikiApi = await connection.getWikiApi();\n\n /**\n * Get a list of repositories in the specified Azure DevOps project\n * @returns List of repositories in the specified Azure DevOps project\n */\n const getRepos = async () => {\n const repos = await gitApi.getRepositories(project);\n\n logger.info(`Found ${repos.length} repositories in project ${project}`);\n\n return repos;\n };\n\n /**\n * Get a list of items in the specified Azure DevOps repository\n * @param repoId The ID of the repository\n * @param fileTypes Optional list of file types to filter by\n * @returns List of items in the specified Azure DevOps repository\n */\n const getRepoItems = async (repoId: string, fileTypes?: string[]) => {\n const items = await gitApi.getItems(\n repoId,\n project,\n undefined,\n VersionControlRecursionType.Full,\n );\n\n // Handle case where repository is empty or returns null\n if (!items || items.length === 0) {\n logger.info(`No items found in Azure DevOps repository ${repoId}`);\n return [];\n }\n\n logger.info(\n `Found ${items.length} items in Azure DevOps repository ${repoId}`,\n );\n\n if (fileTypes && fileTypes.length > 0) {\n const filteredItems = items.filter(\n item =>\n !item.isFolder && fileTypes.some(type => item.path?.endsWith(type)),\n );\n logger.info(\n `Filtered to ${filteredItems.length} items with types: ${fileTypes.join(\n ', ',\n )}`,\n );\n return filteredItems;\n }\n\n return items;\n };\n\n /**\n * Get the content of a specific item in an Azure DevOps repository\n * @param repoId The ID of the repository\n * @param path The path of the item\n * @returns The content of the item\n */\n const getRepoItemContent = async (repoId: string, path: string) => {\n const itemContent = await gitApi.getItemContent(\n repoId,\n path,\n project,\n undefined,\n VersionControlRecursionType.None,\n );\n\n return itemContent;\n };\n\n /* Gets all wikis in the specified Azure DevOps project */\n const getWikis = async () => {\n const wikis = await wikiApi.getAllWikis(project);\n logger.info(`Found ${wikis.length} wikis in project ${project}`);\n return wikis;\n };\n\n /**\n * Retrieves all pages and subpages in a specific Azure DevOps wiki and flattens them into a single list\n * @param wikiName The name of the wiki to get pages from\n * @returns A list of all pages in the specified wiki\n */\n const getWikiPages = async (wikiName: string) => {\n const pagesStream = await wikiApi.getPageText(\n project,\n wikiName,\n undefined,\n VersionControlRecursionType.Full,\n );\n\n const rootPage = JSON.parse(await streamToString(pagesStream)) as WikiPage;\n\n // Flatten all pages including subpages into a single array\n const allPages = flattenWikiPages(rootPage);\n\n logger.info(\n `Found ${allPages.length} pages in Azure DevOps wiki: ${wikiName}`,\n );\n\n return allPages;\n };\n\n /**\n * Get the content of a specific page in an Azure DevOps wiki\n * @param wikiName The name of the wiki\n * @param
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/services/azure-devops/index.ts"],"sourcesContent":["import {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { streamToString } from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { getPersonalAccessTokenHandler, WebApi } from 'azure-devops-node-api';\nimport { VersionControlRecursionType } from 'azure-devops-node-api/interfaces/GitInterfaces';\nimport { WikiPage } from 'azure-devops-node-api/interfaces/WikiInterfaces';\nimport { flattenWikiPages } from '../../utils/flatten-wiki-pages';\n\nexport type AzureDevOpsService = Awaited<\n ReturnType<typeof createAzureDevOpsService>\n>;\n\nexport const createAzureDevOpsService = async ({\n config,\n logger,\n}: {\n config: RootConfigService;\n logger: LoggerService;\n}) => {\n // Get configuration values\n const organization = config.getString(\n 'aiAssistant.ingestors.azureDevOps.organization',\n );\n const project = config.getString('aiAssistant.ingestors.azureDevOps.project');\n const token = config.getString('aiAssistant.ingestors.azureDevOps.token');\n\n // Construct organization URL\n const orgUrl = `https://dev.azure.com/${organization}`;\n\n logger.info(\n `Connecting to Azure DevOps organization: ${organization}, project: ${project}`,\n );\n\n if (!organization || !project || !token) {\n throw new Error(\n 'Azure DevOps organization, project, and token are required',\n );\n }\n\n // Create authentication handler and connection\n const authHandler = getPersonalAccessTokenHandler(token);\n\n const connection = new WebApi(orgUrl, authHandler);\n\n logger.info(\n `Connected to Azure DevOps organization: ${organization}, project: ${project}`,\n );\n\n // Get Git API for repository operations\n const gitApi = await connection.getGitApi();\n\n // Get Wiki API for wiki operations\n const wikiApi = await connection.getWikiApi();\n\n /**\n * Get a list of repositories in the specified Azure DevOps project\n * @returns List of repositories in the specified Azure DevOps project\n */\n const getRepos = async () => {\n const repos = await gitApi.getRepositories(project);\n\n logger.info(`Found ${repos.length} repositories in project ${project}`);\n\n return repos;\n };\n\n /**\n * Get a list of items in the specified Azure DevOps repository\n * @param repoId The ID of the repository\n * @param fileTypes Optional list of file types to filter by\n * @returns List of items in the specified Azure DevOps repository\n */\n const getRepoItems = async (repoId: string, fileTypes?: string[]) => {\n const items = await gitApi.getItems(\n repoId,\n project,\n undefined,\n VersionControlRecursionType.Full,\n );\n\n // Handle case where repository is empty or returns null\n if (!items || items.length === 0) {\n logger.info(`No items found in Azure DevOps repository ${repoId}`);\n return [];\n }\n\n logger.info(\n `Found ${items.length} items in Azure DevOps repository ${repoId}`,\n );\n\n if (fileTypes && fileTypes.length > 0) {\n const filteredItems = items.filter(\n item =>\n !item.isFolder && fileTypes.some(type => item.path?.endsWith(type)),\n );\n logger.info(\n `Filtered to ${filteredItems.length} items with types: ${fileTypes.join(\n ', ',\n )}`,\n );\n return filteredItems;\n }\n\n return items;\n };\n\n /**\n * Get the content of a specific item in an Azure DevOps repository\n * @param repoId The ID of the repository\n * @param path The path of the item\n * @returns The content of the item\n */\n const getRepoItemContent = async (repoId: string, path: string) => {\n const itemContent = await gitApi.getItemContent(\n repoId,\n path,\n project,\n undefined,\n VersionControlRecursionType.None,\n );\n\n return itemContent;\n };\n\n /* Gets all wikis in the specified Azure DevOps project */\n const getWikis = async () => {\n const wikis = await wikiApi.getAllWikis(project);\n logger.info(`Found ${wikis.length} wikis in project ${project}`);\n return wikis;\n };\n\n /**\n * Retrieves all pages and subpages in a specific Azure DevOps wiki and flattens them into a single list\n * @param wikiName The name of the wiki to get pages from\n * @returns A list of all pages in the specified wiki\n */\n const getWikiPages = async (wikiName: string) => {\n const pagesStream = await wikiApi.getPageText(\n project,\n wikiName,\n undefined,\n VersionControlRecursionType.Full,\n );\n\n const rootPage = JSON.parse(await streamToString(pagesStream)) as WikiPage;\n\n // Flatten all pages including subpages into a single array\n const allPages = flattenWikiPages(rootPage);\n\n logger.info(\n `Found ${allPages.length} pages in Azure DevOps wiki: ${wikiName}`,\n );\n\n return allPages;\n };\n\n /**\n * Get the content of a specific page in an Azure DevOps wiki\n * @param wikiName The name of the wiki\n * @param pagePath The path of the page (e.g., \"/My-Page\" or \"/Folder/Sub-Page\")\n * @returns The content of the specified wiki page as plain markdown text\n */\n const getWikiPageContent = async (wikiName: string, pagePath: string) => {\n // Use getPageText with the page path to get raw markdown content\n // The path-based method with Accept: text/plain returns the actual markdown content\n const pageStream = await wikiApi.getPageText(\n project,\n wikiName,\n pagePath,\n VersionControlRecursionType.None,\n );\n\n return pageStream;\n };\n\n return {\n organization,\n project,\n getRepos,\n getRepoItems,\n getRepoItemContent,\n getWikis,\n getWikiPages,\n getWikiPageContent,\n };\n};\n"],"names":["getPersonalAccessTokenHandler","WebApi","VersionControlRecursionType","streamToString","flattenWikiPages"],"mappings":"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"}
|
|
@@ -37,24 +37,37 @@ const createWikiIngestor = async ({
|
|
|
37
37
|
const globalIndex = batchStart + index;
|
|
38
38
|
const content = await azureDevOpsService.getWikiPageContent(
|
|
39
39
|
wiki.id,
|
|
40
|
-
page.
|
|
40
|
+
page.path
|
|
41
41
|
);
|
|
42
42
|
const completionStats = backstagePluginAiAssistantCommon.getProgressStats(globalIndex + 1, pages.length);
|
|
43
43
|
logger.info(
|
|
44
44
|
`Retrieved content for Azure DevOps page: "${page.path}" in wiki: "${wiki.name}" [Progress: ${completionStats.completed}/${completionStats.total} (${completionStats.percentage}%) completed of wiki]`
|
|
45
45
|
);
|
|
46
|
-
const
|
|
46
|
+
const pageContent = await backstagePluginAiAssistantNode.streamToString(content);
|
|
47
|
+
logger.debug(
|
|
48
|
+
`Raw response for page "${page.path}" (length: ${pageContent.length})`
|
|
49
|
+
);
|
|
50
|
+
const pageUrl = page.remoteUrl || page.url;
|
|
51
|
+
if (!pageContent || pageContent.trim().length === 0) {
|
|
52
|
+
logger.warn(
|
|
53
|
+
`No content found for Azure DevOps page: "${page.path}" in wiki: "${wiki.name}". Skipping.`
|
|
54
|
+
);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
47
57
|
const document = {
|
|
48
58
|
metadata: {
|
|
49
59
|
source: module$1.MODULE_ID,
|
|
50
60
|
id: `${wiki.id}:${page.path}`,
|
|
51
|
-
url:
|
|
61
|
+
url: pageUrl,
|
|
52
62
|
organization: azureDevOpsService.organization,
|
|
53
63
|
project: azureDevOpsService.project,
|
|
54
64
|
wiki: wiki.name
|
|
55
65
|
},
|
|
56
|
-
content:
|
|
66
|
+
content: pageContent
|
|
57
67
|
};
|
|
68
|
+
logger.debug(
|
|
69
|
+
`Created embedding document for Azure DevOps page: "${page.path}" in wiki: "${wiki.name}" content length: "${document.content.length}", page url: "${document.metadata.url}"`
|
|
70
|
+
);
|
|
58
71
|
documents.push(document);
|
|
59
72
|
}
|
|
60
73
|
await saveDocumentsBatch(documents);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki.cjs.js","sources":["../../../src/services/ingestor/wiki.ts"],"sourcesContent":["import {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport {\n EmbeddingDocument,\n IngestorOptions,\n streamToString,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { AzureDevOpsService } from '../azure-devops';\nimport { Config } from '../../../config';\nimport { MODULE_ID } from '../../constants/module';\nimport { getProgressStats } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { DEFAULT_WIKI_PAGE_BATCH_SIZE } from '../../constants/default-wiki-page-batch-size';\nimport {\n WikiPage,\n WikiV2,\n} from 'azure-devops-node-api/interfaces/WikiInterfaces';\n\ntype WikiIngestorOptions = {\n config: RootConfigService;\n logger: LoggerService;\n azureDevOpsService: AzureDevOpsService;\n};\n\nexport const createWikiIngestor = async ({\n config,\n logger,\n azureDevOpsService,\n}: WikiIngestorOptions) => {\n // Get configuration values\n const wikisFilter = config.getOptional<\n Config['aiAssistant']['ingestors']['azureDevOps']['wikis']\n >('aiAssistant.ingestors.azureDevOps.wikis');\n\n // Get batch size for processing pages (default to 50 pages per batch)\n const pagesBatchSize =\n config.getOptionalNumber(\n 'aiAssistant.ingestors.azureDevOps.pagesBatchSize',\n ) ?? DEFAULT_WIKI_PAGE_BATCH_SIZE;\n\n /** Ingest Azure DevOps wiki pages in batches\n * @param wiki - The wiki to ingest pages from\n * @param pages - The list of pages to ingest from the wiki\n * @param saveDocumentsBatch - Function to save a batch of embedding documents\n * @returns Total number of documents ingested and sent for embedding from the wiki\n */\n const ingestWikiByPageBatch = async ({\n wiki,\n pages,\n saveDocumentsBatch,\n }: {\n wiki: WikiV2;\n pages: WikiPage[];\n saveDocumentsBatch: IngestorOptions['saveDocumentsBatch'];\n }) => {\n logger.info(\n `Processing ${pages.length} pages from wiki \"${wiki.name}\" in batches of ${pagesBatchSize}`,\n );\n\n let totalDocumentsIngested = 0;\n\n // Process pages in batches to manage memory and performance\n\n // Calculate total number of batches\n const totalBatches = Math.ceil(pages.length / pagesBatchSize);\n\n // Process each batch\n for (\n let batchStart = 0;\n batchStart < pages.length;\n batchStart += pagesBatchSize\n ) {\n const batchEnd = Math.min(batchStart + pagesBatchSize, pages.length);\n const pagesBatch = pages.slice(batchStart, batchEnd);\n const batchNumber = Math.floor(batchStart / pagesBatchSize) + 1;\n\n logger.info(\n `Processing batch ${batchNumber}/${totalBatches} (${pagesBatch.length} pages) for wiki \"${wiki.name}\"`,\n );\n\n // Generate embedding documents for each page in the current batch\n const documents: EmbeddingDocument[] = [];\n\n for (let index = 0; index < pagesBatch.length; index++) {\n const page = pagesBatch[index];\n const globalIndex = batchStart + index;\n\n const content = await azureDevOpsService.getWikiPageContent(\n wiki.id!,\n page.id!,\n );\n\n const completionStats = getProgressStats(globalIndex + 1, pages.length);\n\n logger.info(\n `Retrieved content for Azure DevOps page: \"${page.path}\" in wiki: \"${wiki.name}\" [Progress: ${completionStats.completed}/${completionStats.total} (${completionStats.percentage}%) completed of wiki]`,\n );\n\n const text = await streamToString(content);\n\n const document: EmbeddingDocument = {\n metadata: {\n source: MODULE_ID,\n id: `${wiki.id}:${page.path}`,\n url: page.url!,\n organization: azureDevOpsService.organization,\n project: azureDevOpsService.project,\n wiki: wiki.name!,\n },\n content: text,\n };\n\n documents.push(document);\n }\n\n // Save the current batch of documents\n await saveDocumentsBatch(documents);\n\n totalDocumentsIngested += documents.length;\n\n logger.info(\n `Batch ${batchNumber}/${totalBatches} completed: ${documents.length} documents ingested for Azure DevOps wiki: ${wiki.name}`,\n );\n }\n\n return { totalDocumentsIngested };\n };\n\n /** Ingest Azure DevOps wikis in batches */\n const ingestWikisBatch = async (\n saveDocumentsBatch: IngestorOptions['saveDocumentsBatch'],\n ) => {\n const wikisList = await azureDevOpsService.getWikis();\n\n if (wikisList.length === 0) {\n logger.warn('No wikis found in the Azure DevOps project');\n return;\n }\n\n logger.info(\n `Filtering for wikis: ${wikisFilter?.map(repo => repo.name).join(', ')}`,\n );\n\n // Filter wikis if a filter is provided in the config\n const wikisToIngest = wikisFilter\n ? wikisList.filter(wiki =>\n wikisFilter?.some(\n filteredWiki =>\n filteredWiki.name.toLowerCase() === wiki.name!.toLowerCase(),\n ),\n )\n : wikisList;\n\n if (wikisToIngest.length === 0) {\n logger.warn('No wikis found for ingestion after applying the filter');\n return;\n }\n\n logger.info(`Ingesting ${wikisToIngest.length} wikis from Azure DevOps`);\n\n // Get items from each wiki and create documents to be embedded\n for (const wiki of wikisToIngest) {\n logger.info(`Beginning ingestion for wiki: ${wiki.name} (${wiki.id})`);\n\n // Get the pages to be ingested from the wiki based on the file types filter\n const pages = await azureDevOpsService.getWikiPages(wiki.id!);\n\n if (pages.length === 0) {\n logger.warn(\n `No pages found for ingestion in the Azure DevOps wiki ${wiki.name} (${wiki.id})`,\n );\n continue;\n }\n\n const { totalDocumentsIngested } = await ingestWikiByPageBatch({\n wiki,\n pages,\n saveDocumentsBatch,\n });\n\n if (totalDocumentsIngested === 0) {\n logger.warn(\n `No documents were ingested and sent for embedding from the Azure DevOps wiki ${wiki.name} (${wiki.id})`,\n );\n continue;\n }\n\n logger.info(\n `Wiki ingestion completed: ${totalDocumentsIngested} total documents ingested and sent for embedding for Azure DevOps wiki: ${wiki.name}`,\n );\n }\n };\n\n return { ingestWikisBatch };\n};\n"],"names":["DEFAULT_WIKI_PAGE_BATCH_SIZE","getProgressStats","streamToString","MODULE_ID"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wiki.cjs.js","sources":["../../../src/services/ingestor/wiki.ts"],"sourcesContent":["import {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport {\n EmbeddingDocument,\n IngestorOptions,\n streamToString,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { AzureDevOpsService } from '../azure-devops';\nimport { Config } from '../../../config';\nimport { MODULE_ID } from '../../constants/module';\nimport { getProgressStats } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { DEFAULT_WIKI_PAGE_BATCH_SIZE } from '../../constants/default-wiki-page-batch-size';\nimport {\n WikiPage,\n WikiV2,\n} from 'azure-devops-node-api/interfaces/WikiInterfaces';\n\ntype WikiIngestorOptions = {\n config: RootConfigService;\n logger: LoggerService;\n azureDevOpsService: AzureDevOpsService;\n};\n\nexport const createWikiIngestor = async ({\n config,\n logger,\n azureDevOpsService,\n}: WikiIngestorOptions) => {\n // Get configuration values\n const wikisFilter = config.getOptional<\n Config['aiAssistant']['ingestors']['azureDevOps']['wikis']\n >('aiAssistant.ingestors.azureDevOps.wikis');\n\n // Get batch size for processing pages (default to 50 pages per batch)\n const pagesBatchSize =\n config.getOptionalNumber(\n 'aiAssistant.ingestors.azureDevOps.pagesBatchSize',\n ) ?? DEFAULT_WIKI_PAGE_BATCH_SIZE;\n\n /** Ingest Azure DevOps wiki pages in batches\n * @param wiki - The wiki to ingest pages from\n * @param pages - The list of pages to ingest from the wiki\n * @param saveDocumentsBatch - Function to save a batch of embedding documents\n * @returns Total number of documents ingested and sent for embedding from the wiki\n */\n const ingestWikiByPageBatch = async ({\n wiki,\n pages,\n saveDocumentsBatch,\n }: {\n wiki: WikiV2;\n pages: WikiPage[];\n saveDocumentsBatch: IngestorOptions['saveDocumentsBatch'];\n }) => {\n logger.info(\n `Processing ${pages.length} pages from wiki \"${wiki.name}\" in batches of ${pagesBatchSize}`,\n );\n\n let totalDocumentsIngested = 0;\n\n // Process pages in batches to manage memory and performance\n\n // Calculate total number of batches\n const totalBatches = Math.ceil(pages.length / pagesBatchSize);\n\n // Process each batch\n for (\n let batchStart = 0;\n batchStart < pages.length;\n batchStart += pagesBatchSize\n ) {\n const batchEnd = Math.min(batchStart + pagesBatchSize, pages.length);\n const pagesBatch = pages.slice(batchStart, batchEnd);\n const batchNumber = Math.floor(batchStart / pagesBatchSize) + 1;\n\n logger.info(\n `Processing batch ${batchNumber}/${totalBatches} (${pagesBatch.length} pages) for wiki \"${wiki.name}\"`,\n );\n\n // Generate embedding documents for each page in the current batch\n const documents: EmbeddingDocument[] = [];\n\n for (let index = 0; index < pagesBatch.length; index++) {\n const page = pagesBatch[index];\n const globalIndex = batchStart + index;\n\n const content = await azureDevOpsService.getWikiPageContent(\n wiki.id!,\n page.path!,\n );\n\n const completionStats = getProgressStats(globalIndex + 1, pages.length);\n\n logger.info(\n `Retrieved content for Azure DevOps page: \"${page.path}\" in wiki: \"${wiki.name}\" [Progress: ${completionStats.completed}/${completionStats.total} (${completionStats.percentage}%) completed of wiki]`,\n );\n\n // The API returns plain markdown text directly\n const pageContent = await streamToString(content);\n\n logger.debug(\n `Raw response for page \"${page.path}\" (length: ${pageContent.length})`,\n );\n // Use remoteUrl which points to the user-facing wiki page, not the API endpoint\n const pageUrl = page.remoteUrl || page.url!;\n\n // Check if we have actual content (not empty or just whitespace)\n if (!pageContent || pageContent.trim().length === 0) {\n logger.warn(\n `No content found for Azure DevOps page: \"${page.path}\" in wiki: \"${wiki.name}\". Skipping.`,\n );\n continue;\n }\n\n const document: EmbeddingDocument = {\n metadata: {\n source: MODULE_ID,\n id: `${wiki.id}:${page.path}`,\n url: pageUrl,\n organization: azureDevOpsService.organization,\n project: azureDevOpsService.project,\n wiki: wiki.name!,\n },\n content: pageContent,\n };\n\n logger.debug(\n `Created embedding document for Azure DevOps page: \"${page.path}\" in wiki: \"${wiki.name}\" content length: \"${document.content.length}\", page url: \"${document.metadata.url}\"`,\n );\n\n documents.push(document);\n }\n\n // Save the current batch of documents\n await saveDocumentsBatch(documents);\n\n totalDocumentsIngested += documents.length;\n\n logger.info(\n `Batch ${batchNumber}/${totalBatches} completed: ${documents.length} documents ingested for Azure DevOps wiki: ${wiki.name}`,\n );\n }\n\n return { totalDocumentsIngested };\n };\n\n /** Ingest Azure DevOps wikis in batches */\n const ingestWikisBatch = async (\n saveDocumentsBatch: IngestorOptions['saveDocumentsBatch'],\n ) => {\n const wikisList = await azureDevOpsService.getWikis();\n\n if (wikisList.length === 0) {\n logger.warn('No wikis found in the Azure DevOps project');\n return;\n }\n\n logger.info(\n `Filtering for wikis: ${wikisFilter?.map(repo => repo.name).join(', ')}`,\n );\n\n // Filter wikis if a filter is provided in the config\n const wikisToIngest = wikisFilter\n ? wikisList.filter(wiki =>\n wikisFilter?.some(\n filteredWiki =>\n filteredWiki.name.toLowerCase() === wiki.name!.toLowerCase(),\n ),\n )\n : wikisList;\n\n if (wikisToIngest.length === 0) {\n logger.warn('No wikis found for ingestion after applying the filter');\n return;\n }\n\n logger.info(`Ingesting ${wikisToIngest.length} wikis from Azure DevOps`);\n\n // Get items from each wiki and create documents to be embedded\n for (const wiki of wikisToIngest) {\n logger.info(`Beginning ingestion for wiki: ${wiki.name} (${wiki.id})`);\n\n // Get the pages to be ingested from the wiki based on the file types filter\n const pages = await azureDevOpsService.getWikiPages(wiki.id!);\n\n if (pages.length === 0) {\n logger.warn(\n `No pages found for ingestion in the Azure DevOps wiki ${wiki.name} (${wiki.id})`,\n );\n continue;\n }\n\n const { totalDocumentsIngested } = await ingestWikiByPageBatch({\n wiki,\n pages,\n saveDocumentsBatch,\n });\n\n if (totalDocumentsIngested === 0) {\n logger.warn(\n `No documents were ingested and sent for embedding from the Azure DevOps wiki ${wiki.name} (${wiki.id})`,\n );\n continue;\n }\n\n logger.info(\n `Wiki ingestion completed: ${totalDocumentsIngested} total documents ingested and sent for embedding for Azure DevOps wiki: ${wiki.name}`,\n );\n }\n };\n\n return { ingestWikisBatch };\n};\n"],"names":["DEFAULT_WIKI_PAGE_BATCH_SIZE","getProgressStats","streamToString","MODULE_ID"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sweetoburrito/backstage-plugin-ai-assistant-backend-module-ingestor-azure-devops",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "The ingestor-azure-devops backend module for the ai-assistant plugin.",
|
|
6
6
|
"main": "dist/index.cjs.js",
|