aui-agent-builder 0.3.55 → 0.3.57

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.
Files changed (50) hide show
  1. package/dist/api-client/index.d.ts +0 -4
  2. package/dist/api-client/index.d.ts.map +1 -1
  3. package/dist/api-client/index.js +2 -34
  4. package/dist/api-client/index.js.map +1 -1
  5. package/dist/api-client/kb-view-client.d.ts +22 -1
  6. package/dist/api-client/kb-view-client.d.ts.map +1 -1
  7. package/dist/api-client/kb-view-client.js +73 -5
  8. package/dist/api-client/kb-view-client.js.map +1 -1
  9. package/dist/commands/import-agent.js +1 -5
  10. package/dist/commands/import-agent.js.map +1 -1
  11. package/dist/commands/pull-agent.js +1 -7
  12. package/dist/commands/pull-agent.js.map +1 -1
  13. package/dist/commands/push.d.ts.map +1 -1
  14. package/dist/commands/push.js +89 -272
  15. package/dist/commands/push.js.map +1 -1
  16. package/dist/commands/validate.d.ts.map +1 -1
  17. package/dist/commands/validate.js +0 -1
  18. package/dist/commands/validate.js.map +1 -1
  19. package/dist/commands/version.d.ts.map +1 -1
  20. package/dist/commands/version.js +47 -0
  21. package/dist/commands/version.js.map +1 -1
  22. package/dist/services/diff.service.d.ts.map +1 -1
  23. package/dist/services/diff.service.js +2 -7
  24. package/dist/services/diff.service.js.map +1 -1
  25. package/dist/services/pull-schema.service.d.ts.map +1 -1
  26. package/dist/services/pull-schema.service.js +0 -2
  27. package/dist/services/pull-schema.service.js.map +1 -1
  28. package/dist/types/agent.d.ts +0 -1
  29. package/dist/types/agent.d.ts.map +1 -1
  30. package/dist/types/tool.d.ts +3 -0
  31. package/dist/types/tool.d.ts.map +1 -1
  32. package/dist/types/widget.d.ts +1 -3
  33. package/dist/types/widget.d.ts.map +1 -1
  34. package/dist/types/widget.js +1 -1
  35. package/dist/ui/views/PullAgentView.d.ts +0 -1
  36. package/dist/ui/views/PullAgentView.d.ts.map +1 -1
  37. package/dist/ui/views/PullAgentView.js +1 -1
  38. package/dist/ui/views/PullAgentView.js.map +1 -1
  39. package/dist/utils/git.d.ts +1 -0
  40. package/dist/utils/git.d.ts.map +1 -1
  41. package/dist/utils/git.js +15 -2
  42. package/dist/utils/git.js.map +1 -1
  43. package/dist/utils/index.d.ts.map +1 -1
  44. package/dist/utils/index.js +0 -10
  45. package/dist/utils/index.js.map +1 -1
  46. package/dist/utils/request-capture.d.ts +2 -0
  47. package/dist/utils/request-capture.d.ts.map +1 -1
  48. package/dist/utils/request-capture.js +13 -1
  49. package/dist/utils/request-capture.js.map +1 -1
  50. package/package.json +1 -1
@@ -1,7 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as fs from "fs";
3
3
  import * as path from "path";
4
- import * as crypto from "crypto";
5
4
  import { render } from "ink";
6
5
  import { Box, Text } from "ink";
7
6
  import inquirer from "inquirer";
@@ -14,7 +13,7 @@ import { getItemLevelDiff } from "../utils/git.js";
14
13
  import { AuthenticationError, ConfigError, ValidationError } from "../errors/index.js";
15
14
  import { StatusLine, Spinner, ErrorDisplay, Hint, } from "../ui/components/index.js";
16
15
  import { colors, icons } from "../ui/theme.js";
17
- import { PushFileSummary, PushChangesView, PushRagSummary, PushTaskLine, PushFinalSummary, } from "../ui/views/PushView.js";
16
+ import { PushFileSummary, PushChangesView, PushTaskLine, PushFinalSummary, } from "../ui/views/PushView.js";
18
17
  import { isJsonMode, outputJson, stderrLog } from "../utils/json-output.js";
19
18
  // ─── Ink Rendering Helpers ───
20
19
  function log(node) {
@@ -124,8 +123,6 @@ async function _push(pushSpan, agentCode, options = {}) {
124
123
  type = "integrations";
125
124
  else if (parsed.rules)
126
125
  type = "rules";
127
- else if (parsed.widgets)
128
- type = "widgets";
129
126
  fileData.push({ file: relativePath, type, data: parsed });
130
127
  }
131
128
  if (json)
@@ -171,7 +168,8 @@ async function _push(pushSpan, agentCode, options = {}) {
171
168
  file: change.file,
172
169
  status: change.status,
173
170
  };
174
- if (change.status === "modified" || change.status === "added") {
171
+ if ((change.status === "modified" || change.status === "added") &&
172
+ !change.file.startsWith("knowledge-hubs/")) {
175
173
  const arrayFileInfo = getArrayFileInfoForPush(change.file, projectRoot);
176
174
  if (arrayFileInfo) {
177
175
  const itemChanges = getItemDiff(projectRoot, change.file, arrayFileInfo.arrayKey, arrayFileInfo.itemKey);
@@ -234,7 +232,7 @@ async function _push(pushSpan, agentCode, options = {}) {
234
232
  log(_jsx(Box, { paddingX: 1, children: _jsx(StatusLine, { kind: "muted", label: "Dry run \u2014 no changes pushed." }) }));
235
233
  return;
236
234
  }
237
- // ─── Push integrations before RAG/KB ───
235
+ // ─── Push integrations before KB ───
238
236
  // Integrations must be created/updated first, since knowledge hub
239
237
  // uploads depend on the integration's knowledge base already existing.
240
238
  let integrationsAlreadyPushed = false;
@@ -288,71 +286,8 @@ async function _push(pushSpan, agentCode, options = {}) {
288
286
  }
289
287
  }
290
288
  }
291
- // ─── RAG file upload ───
292
- const ragFiles = detectRagFileChanges(fileData, projectRoot);
293
- if (ragFiles.total > 0) {
294
- const ragStats = {
295
- newFiles: ragFiles.newFiles,
296
- changedFiles: ragFiles.changedFiles,
297
- unchangedFiles: ragFiles.unchangedFiles,
298
- urlSources: ragFiles.urlSources,
299
- };
300
- log(_jsx(PushRagSummary, { stats: ragStats }));
301
- const { loadKbmApiKey } = await import("../config/index.js");
302
- const kbmKey = loadKbmApiKey();
303
- const session = (await import("../config/index.js")).loadSession();
304
- if (kbmKey && session?.network_id && session?.user_id) {
305
- const { RAGClient } = await import("../api-client/rag-client.js");
306
- const ragClient = new RAGClient(kbmKey);
307
- const pendingUploads = ragFiles.pendingFiles || [];
308
- const pendingUrls = ragFiles.pendingUrls || [];
309
- if (pendingUploads.length > 0) {
310
- const ragSpinner = startSpinner(`Uploading ${pendingUploads.length} RAG file(s)...`);
311
- try {
312
- for (const upload of pendingUploads) {
313
- await ragClient.uploadFiles({
314
- filePaths: [upload.path],
315
- createdBy: session.user_id,
316
- scopeType: "NETWORK",
317
- networkId: session.network_id,
318
- knowledgeBaseId: upload.kbId,
319
- knowledgeBaseName: upload.kbName,
320
- });
321
- }
322
- ragSpinner.succeed(`${pendingUploads.length} RAG file(s) uploaded`);
323
- }
324
- catch (error) {
325
- ragSpinner.fail("RAG file upload failed");
326
- log(_jsx(ErrorDisplay, { error: error }));
327
- }
328
- }
329
- if (pendingUrls.length > 0) {
330
- const urlSpinner = startSpinner(`Scraping ${pendingUrls.length} URL(s)...`);
331
- try {
332
- for (const urlUpload of pendingUrls) {
333
- await ragClient.uploadWebsites({
334
- urls: [{ url: urlUpload.url }],
335
- createdBy: session.user_id,
336
- scopeType: "NETWORK",
337
- networkId: session.network_id,
338
- knowledgeBaseId: urlUpload.kbId,
339
- knowledgeBaseName: urlUpload.kbName,
340
- });
341
- }
342
- urlSpinner.succeed(`${pendingUrls.length} URL(s) submitted for scraping`);
343
- }
344
- catch (error) {
345
- urlSpinner.fail("URL scraping failed");
346
- log(_jsx(ErrorDisplay, { error: error }));
347
- }
348
- }
349
- }
350
- else if (!kbmKey) {
351
- log(_jsx(Box, { paddingX: 1, children: _jsx(Hint, { message: "RAG API key not set. Run", command: "aui rag" }) }));
352
- }
353
- }
354
- // ─── Knowledge Hubs Push ───
355
- const { getKnowledgeHubChanges, getBaselineRawContent } = await import("../utils/git.js");
289
+ // ─── Knowledge Hubs Push (full files) ───
290
+ const { getKnowledgeHubChanges } = await import("../utils/git.js");
356
291
  const kbChanges = getKnowledgeHubChanges(projectRoot);
357
292
  if (kbChanges.length > 0) {
358
293
  const kbConfig = getConfig();
@@ -360,7 +295,7 @@ async function _push(pushSpan, agentCode, options = {}) {
360
295
  const kbNetworkId = projectConfig.agent_id || kbSession?.network_id;
361
296
  if (kbNetworkId && kbConfig.authToken) {
362
297
  const { KBViewClient } = await import("../api-client/kb-view-client.js");
363
- const { diffResources, buildScope, readKbFolder } = await import("../services/kb-view.service.js");
298
+ const { buildScope, readKbFolder } = await import("../services/kb-view.service.js");
364
299
  const { loadAgentSettingsApiKey: loadAsKey } = await import("../config/index.js");
365
300
  const kbViewClient = new KBViewClient({
366
301
  authToken: kbConfig.authToken,
@@ -377,111 +312,108 @@ async function _push(pushSpan, agentCode, options = {}) {
377
312
  accountId: projectConfig.account_id || kbConfig.accountId || "",
378
313
  });
379
314
  const userId = kbSession?.user_id || "cli";
380
- // Group changes by KB directory
381
- const changesByKB = new Map();
315
+ // Collect all changed KB directories (skip root-level files)
316
+ const changedKBDirs = new Set();
382
317
  for (const change of kbChanges) {
383
- const existing = changesByKB.get(change.kbDirName) || [];
384
- existing.push(change);
385
- changesByKB.set(change.kbDirName, existing);
386
- }
387
- // Warn about deletions
388
- const deletions = kbChanges.filter((c) => c.status === "deleted");
389
- for (const del of deletions) {
390
- log(_jsx(Box, { paddingX: 1, children: _jsx(StatusLine, { kind: "warning", label: `Deletion detected: ${del.file} — please delete via the UI` }) }));
318
+ if (change.kbDirName) {
319
+ changedKBDirs.add(change.kbDirName);
320
+ }
391
321
  }
392
- // Process non-deletion changes
393
- const kbJsonChanges = kbChanges.filter((c) => c.isKbJson && c.status !== "deleted");
394
- const binaryChanges = kbChanges.filter((c) => !c.isKbJson && c.status !== "deleted");
395
- // Push changed/added kb.json resources (resource-level diff)
396
- if (kbJsonChanges.length > 0) {
397
- const kbSpinner = startSpinner(`Pushing ${kbJsonChanges.length} knowledge base JSON change(s)...`);
322
+ // Split into existing (will upload) and deleted (will delete from server)
323
+ const existingKBDirs = [...changedKBDirs].filter((d) => fs.existsSync(path.join(projectRoot, "knowledge-hubs", d)));
324
+ const deletedKBDirs = [...changedKBDirs].filter((d) => !fs.existsSync(path.join(projectRoot, "knowledge-hubs", d)));
325
+ // Delete KBs that were removed locally
326
+ let kbDeleteSucceeded = true;
327
+ if (deletedKBDirs.length > 0) {
328
+ const { getBaselineFileContent } = await import("../utils/git.js");
329
+ const deleteSpinner = startSpinner(`Deleting ${deletedKBDirs.length} knowledge base(s) from server...`);
398
330
  try {
399
- for (const change of kbJsonChanges) {
400
- const kbDir = path.join(projectRoot, "knowledge-hubs", change.kbDirName);
401
- const kbData = readKbFolder(kbDir);
402
- if (!kbData)
331
+ for (const kbDirName of deletedKBDirs) {
332
+ const baselineKb = getBaselineFileContent(projectRoot, `knowledge-hubs/${kbDirName}/kb.json`);
333
+ const kbName = baselineKb?.name || kbDirName;
334
+ const kbId = baselineKb?.knowledge_base_id;
335
+ if (!kbId) {
336
+ log(_jsx(Box, { paddingX: 1, children: _jsx(StatusLine, { kind: "warning", label: `Cannot delete "${kbName}" — no knowledge_base_id stored. Push the KB first, then delete.` }) }));
403
337
  continue;
404
- let resourcesToSend = kbData.resources;
405
- // If modified, diff against baseline
406
- if (change.status === "modified") {
407
- const baselineRaw = getBaselineRawContent(projectRoot, change.file);
408
- if (baselineRaw) {
409
- try {
410
- const baselineJson = JSON.parse(baselineRaw);
411
- const baselineResources = baselineJson.resources || [];
412
- const resourceDiff = diffResources(baselineResources, kbData.resources);
413
- // Warn about removed resources
414
- for (const removed of resourceDiff.removed) {
415
- log(_jsx(Box, { paddingX: 1, children: _jsx(StatusLine, { kind: "warning", label: `Resource removed from ${kbData.name}: "${removed.title}" — please delete via the UI` }) }));
416
- }
417
- resourcesToSend = [
418
- ...resourceDiff.added,
419
- ...resourceDiff.changed,
420
- ];
421
- if (resourcesToSend.length === 0)
422
- continue;
423
- }
424
- catch {
425
- // If baseline parse fails, send all resources
426
- }
427
- }
428
338
  }
429
- await kbViewClient.importJson({
430
- scope,
431
- knowledge_bases: [
432
- { name: kbData.name, resources: resourcesToSend },
433
- ],
434
- created_by: userId,
435
- network_id: scope.network_id,
436
- });
339
+ await kbViewClient.deleteKnowledgeBase(kbId, scope, kbName);
340
+ log(_jsx(Box, { paddingX: 1, children: _jsx(StatusLine, { kind: "success", label: `Deleted: ${kbName}` }) }));
437
341
  }
438
- kbSpinner.succeed(`Knowledge base JSON changes pushed`);
342
+ deleteSpinner.succeed(`${deletedKBDirs.length} knowledge base(s) deleted`);
439
343
  }
440
344
  catch (error) {
441
- kbSpinner.fail("Knowledge base JSON push failed");
345
+ kbDeleteSucceeded = false;
346
+ deleteSpinner.fail("Knowledge base deletion failed");
442
347
  log(_jsx(ErrorDisplay, { error: error }));
443
348
  }
444
349
  }
445
- // Push changed/added binary files
446
- if (binaryChanges.length > 0) {
447
- const binSpinner = startSpinner(`Uploading ${binaryChanges.length} knowledge base file(s)...`);
350
+ // Upload full files for each changed KB
351
+ let kbUploadSucceeded = false;
352
+ if (existingKBDirs.length > 0) {
353
+ const kbSpinner = startSpinner(`Pushing ${existingKBDirs.length} knowledge base(s)...`);
448
354
  try {
449
- // Group binary files by KB
450
- const binByKB = new Map();
451
- for (const change of binaryChanges) {
452
- const filePath = path.join(projectRoot, change.file);
453
- if (!fs.existsSync(filePath))
454
- continue;
455
- const existing = binByKB.get(change.kbDirName) || [];
456
- existing.push(filePath);
457
- binByKB.set(change.kbDirName, existing);
458
- }
459
- for (const [kbDirName, files] of binByKB) {
355
+ for (const kbDirName of existingKBDirs) {
460
356
  const kbDir = path.join(projectRoot, "knowledge-hubs", kbDirName);
461
357
  const kbData = readKbFolder(kbDir);
462
- const kbName = kbData?.name || kbDirName;
463
- await kbViewClient.importFiles({
464
- files,
465
- scope,
466
- created_by: userId,
467
- knowledge_base_name: kbName,
468
- knowledge_base_description: kbData?.description,
469
- });
358
+ if (!kbData)
359
+ continue;
360
+ const SUPPORTED_EXTENSIONS = new Set([".pdf", ".md", ".txt", ".json"]);
361
+ const supportedFiles = kbData.binaryFiles.filter((f) => SUPPORTED_EXTENSIONS.has(path.extname(f).toLowerCase()));
362
+ const skippedFiles = kbData.binaryFiles.filter((f) => !SUPPORTED_EXTENSIONS.has(path.extname(f).toLowerCase()));
363
+ for (const skipped of skippedFiles) {
364
+ log(_jsx(Box, { paddingX: 1, children: _jsx(StatusLine, { kind: "warning", label: `Skipped unsupported file: ${path.basename(skipped)} (only .pdf, .md, .txt, .json)` }) }));
365
+ }
366
+ if (supportedFiles.length > 0) {
367
+ const importResult = await kbViewClient.importFiles({
368
+ files: supportedFiles,
369
+ scope,
370
+ created_by: userId,
371
+ knowledge_base_name: kbData.name,
372
+ knowledge_base_description: kbData.description,
373
+ });
374
+ if (importResult.knowledge_base_id) {
375
+ const kbJsonPath = path.join(kbDir, "kb.json");
376
+ try {
377
+ const raw = JSON.parse(fs.readFileSync(kbJsonPath, "utf-8"));
378
+ raw.knowledge_base_id = importResult.knowledge_base_id;
379
+ fs.writeFileSync(kbJsonPath, JSON.stringify(raw, null, 2) + "\n");
380
+ }
381
+ catch { /* kb.json write failed, non-fatal */ }
382
+ }
383
+ }
470
384
  }
471
- binSpinner.succeed(`Knowledge base file(s) uploaded`);
385
+ kbSpinner.succeed(`Knowledge base(s) pushed`);
386
+ kbUploadSucceeded = true;
472
387
  }
473
388
  catch (error) {
474
- binSpinner.fail("Knowledge base file upload failed");
389
+ kbSpinner.fail("Knowledge base push failed");
475
390
  log(_jsx(ErrorDisplay, { error: error }));
476
391
  }
477
392
  }
478
- // Commit KB changes to baseline
479
- const kbFilesToCommit = kbChanges
480
- .filter((c) => c.status !== "deleted")
481
- .map((c) => c.file);
482
- if (kbFilesToCommit.length > 0) {
483
- const { commitBaselineFiles: commitKBFiles } = await import("../utils/git.js");
484
- commitKBFiles(projectRoot, kbFilesToCommit, "pushed knowledge hub changes");
393
+ else {
394
+ kbUploadSucceeded = true;
395
+ }
396
+ const kbPushSucceeded = kbUploadSucceeded && kbDeleteSucceeded;
397
+ // Commit KB changes to baseline only if push succeeded
398
+ if (kbPushSucceeded) {
399
+ const kbFilesToAdd = kbChanges
400
+ .filter((c) => c.status !== "deleted")
401
+ .map((c) => c.file);
402
+ const kbFilesToDelete = kbChanges
403
+ .filter((c) => c.status === "deleted")
404
+ .map((c) => c.file);
405
+ if (kbFilesToAdd.length > 0 || kbFilesToDelete.length > 0) {
406
+ const { commitBaselineFiles: commitKBFiles, removeBaselineFiles } = await import("../utils/git.js");
407
+ if (kbFilesToDelete.length > 0) {
408
+ removeBaselineFiles(projectRoot, kbFilesToDelete);
409
+ }
410
+ if (kbFilesToAdd.length > 0) {
411
+ commitKBFiles(projectRoot, kbFilesToAdd, "pushed knowledge hub changes");
412
+ }
413
+ else {
414
+ commitKBFiles(projectRoot, [], "removed knowledge hub files");
415
+ }
416
+ }
485
417
  }
486
418
  }
487
419
  }
@@ -663,15 +595,11 @@ async function _push(pushSpan, agentCode, options = {}) {
663
595
  t.type === "delete-tool");
664
596
  const settingsTasks = pushTasks.filter((t) => t.type === "patch-general-settings");
665
597
  const rulesTasks = pushTasks.filter((t) => t.type === "put-rules");
666
- const widgetTasks = pushTasks.filter((t) => t.type === "create-widget" ||
667
- t.type === "patch-widget" ||
668
- t.type === "delete-widget");
669
598
  await pushStep(paramTasks, "Pushing parameters", false);
670
599
  await pushStep(entityTasks, "Pushing entities", false);
671
600
  if (!integrationsAlreadyPushed) {
672
601
  await pushStep(integrationTasks, "Pushing integrations", false);
673
602
  }
674
- await pushStep(widgetTasks, "Pushing widgets", false);
675
603
  await pushStep(toolTasks, "Pushing tools", true);
676
604
  await pushStep(settingsTasks, "Pushing general settings", false);
677
605
  await pushStep(rulesTasks, "Pushing rules", false);
@@ -965,8 +893,6 @@ function getArrayFileInfoForPush(filePath, dir) {
965
893
  };
966
894
  if (content.rules)
967
895
  return { arrayKey: "rules", itemKey: "code", label: "Rules" };
968
- if (content.widgets)
969
- return { arrayKey: "widgets", itemKey: "name", label: "Widgets" };
970
896
  return null;
971
897
  }
972
898
  catch {
@@ -1288,38 +1214,6 @@ function buildPushTasks(diff, fileData, projectRoot, getFileDiffFn) {
1288
1214
  body: rulesData,
1289
1215
  });
1290
1216
  }
1291
- else if (fd.type === "widgets") {
1292
- const itemDiffs = getItemLevelDiff(projectRoot, change.file, "widgets", "name");
1293
- for (const item of itemDiffs) {
1294
- if (item.status === "added") {
1295
- tasks.push({
1296
- type: "create-widget",
1297
- label: `Create widget: ${item.key}`,
1298
- file: change.file,
1299
- body: item.newItem,
1300
- itemCode: item.key,
1301
- });
1302
- }
1303
- else if (item.status === "modified") {
1304
- tasks.push({
1305
- type: "patch-widget",
1306
- label: `Update widget: ${item.key}`,
1307
- file: change.file,
1308
- body: item.newItem,
1309
- itemCode: item.key,
1310
- });
1311
- }
1312
- else if (item.status === "deleted") {
1313
- tasks.push({
1314
- type: "delete-widget",
1315
- label: `Delete widget: ${item.key}`,
1316
- file: change.file,
1317
- body: item.oldItem,
1318
- itemCode: item.key,
1319
- });
1320
- }
1321
- }
1322
- }
1323
1217
  }
1324
1218
  return tasks;
1325
1219
  }
@@ -1459,85 +1353,8 @@ async function _executePushTask(client, params, task) {
1459
1353
  return client.deleteIntegration(params, task.itemCode);
1460
1354
  case "put-rules":
1461
1355
  return client.putRules(params, task.body);
1462
- case "create-widget":
1463
- try {
1464
- return await client.createWidget(params, task.body);
1465
- }
1466
- catch (err) {
1467
- if ((err.statusCode ?? err.status) === 409) {
1468
- return client.patchWidget(params, task.itemCode, task.body);
1469
- }
1470
- throw err;
1471
- }
1472
- case "patch-widget":
1473
- return client.patchWidget(params, task.itemCode, task.body);
1474
- case "delete-widget":
1475
- return client.deleteWidget(params, task.itemCode);
1476
1356
  default:
1477
1357
  throw new Error(`Unknown push task type: ${task.type}`);
1478
1358
  }
1479
1359
  }
1480
- function detectRagFileChanges(fileData, projectRoot) {
1481
- const stats = {
1482
- total: 0,
1483
- newFiles: 0,
1484
- changedFiles: 0,
1485
- unchangedFiles: 0,
1486
- urlSources: 0,
1487
- pendingFiles: [],
1488
- pendingUrls: [],
1489
- };
1490
- for (const fd of fileData) {
1491
- if (fd.type !== "integrations")
1492
- continue;
1493
- const integrations = fd.data?.integrations;
1494
- if (!Array.isArray(integrations))
1495
- continue;
1496
- for (const integration of integrations) {
1497
- if (integration.type !== "RAG")
1498
- continue;
1499
- const kh = integration.settings?.knowledge_hub;
1500
- const kbId = integration.settings?.knowledge_base_id;
1501
- const kbName = kh?.name;
1502
- if (!kh?.files)
1503
- continue;
1504
- for (const file of kh.files) {
1505
- stats.total++;
1506
- if (file.source === "url") {
1507
- stats.urlSources++;
1508
- if (file.status === "pending") {
1509
- stats.pendingUrls.push({ url: file.url, kbId, kbName });
1510
- }
1511
- continue;
1512
- }
1513
- if (!file.path) {
1514
- stats.newFiles++;
1515
- continue;
1516
- }
1517
- const resolved = path.resolve(projectRoot, file.path);
1518
- if (!fs.existsSync(resolved)) {
1519
- stats.newFiles++;
1520
- continue;
1521
- }
1522
- const content = fs.readFileSync(resolved);
1523
- const currentHash = crypto
1524
- .createHash("sha256")
1525
- .update(content)
1526
- .digest("hex");
1527
- if (!file.content_hash) {
1528
- stats.newFiles++;
1529
- stats.pendingFiles.push({ path: resolved, kbId, kbName });
1530
- }
1531
- else if (file.content_hash !== currentHash) {
1532
- stats.changedFiles++;
1533
- stats.pendingFiles.push({ path: resolved, kbId, kbName });
1534
- }
1535
- else {
1536
- stats.unchangedFiles++;
1537
- }
1538
- }
1539
- }
1540
- }
1541
- return stats;
1542
- }
1543
1360
  //# sourceMappingURL=push.js.map