@absolutejs/rag 0.0.11 → 0.0.13

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 (135) hide show
  1. package/dist/angular/{ai/index.js → index.js} +13 -13
  2. package/dist/angular/index.js.map +18 -0
  3. package/dist/{ai/client → client}/index.js +10 -10
  4. package/dist/client/index.js.map +16 -0
  5. package/dist/{ai/client → client}/ui.js +7 -7
  6. package/dist/client/ui.js.map +13 -0
  7. package/dist/{ai/rag → rag}/index.js +143 -99
  8. package/dist/rag/index.js.map +42 -0
  9. package/dist/{ai/rag → rag}/quality.js +7 -7
  10. package/dist/rag/quality.js.map +13 -0
  11. package/dist/{ai/rag → rag}/ui.js +7 -7
  12. package/dist/rag/ui.js.map +13 -0
  13. package/dist/react/{ai/index.js → index.js} +27 -27
  14. package/dist/react/index.js.map +32 -0
  15. package/dist/src/angular/{ai/ai-rag-stream.service.d.ts → ai-rag-stream.service.d.ts} +1 -1
  16. package/dist/src/angular/{ai/ai-rag-workflow.service.d.ts → ai-rag-workflow.service.d.ts} +1 -1
  17. package/dist/src/angular/{ai/rag-client.service.d.ts → rag-client.service.d.ts} +2 -2
  18. package/dist/src/{ai/client → client}/index.d.ts +2 -1
  19. package/dist/src/{ai/client → client}/ragClient.d.ts +2 -35
  20. package/dist/src/{ai/rag → rag}/adapters/inMemory.d.ts +1 -4
  21. package/dist/src/rag/adapters/postgres.d.ts +3 -0
  22. package/dist/src/rag/adapters/sqlite.d.ts +3 -0
  23. package/dist/src/rag/collection.d.ts +6 -0
  24. package/dist/src/rag/emailProviders.d.ts +6 -0
  25. package/dist/src/{ai/rag → rag}/embedding.d.ts +1 -5
  26. package/dist/src/{ai/rag → rag}/embeddingProviders.d.ts +1 -24
  27. package/dist/src/rag/extractorProviders.d.ts +10 -0
  28. package/dist/src/{ai/rag → rag}/htmxWorkflowRenderers.d.ts +1 -1
  29. package/dist/src/{ai/rag → rag}/index.d.ts +3 -6
  30. package/dist/src/{ai/rag → rag}/presentation.d.ts +4 -24
  31. package/dist/src/{ai/rag → rag}/quality.d.ts +2 -109
  32. package/dist/src/{ai/rag → rag}/queryTransforms.d.ts +2 -10
  33. package/dist/src/{ai/rag → rag}/rerankerProviders.d.ts +1 -10
  34. package/dist/src/{ai/rag → rag}/reranking.d.ts +2 -10
  35. package/dist/src/{ai/rag → rag}/retrievalStrategies.d.ts +1 -4
  36. package/dist/src/{ai/rag → rag}/sync.d.ts +1 -1
  37. package/dist/src/{ai/rag → rag}/types.d.ts +4 -30
  38. package/dist/src/react/{ai/useRAG.d.ts → useRAG.d.ts} +1 -1
  39. package/dist/src/react/{ai/useRAGSearch.d.ts → useRAGSearch.d.ts} +1 -1
  40. package/dist/src/react/{ai/useRAGStreamProgress.d.ts → useRAGStreamProgress.d.ts} +1 -1
  41. package/dist/src/svelte/{ai/createRAG.d.ts → createRAG.d.ts} +3 -3
  42. package/dist/src/svelte/{ai/createRAGSearch.d.ts → createRAGSearch.d.ts} +1 -1
  43. package/dist/src/svelte/{ai/createRAGStream.d.ts → createRAGStream.d.ts} +1 -1
  44. package/dist/src/svelte/{ai/createRAGStreamProgress.d.ts → createRAGStreamProgress.d.ts} +1 -1
  45. package/dist/src/svelte/{ai/createRAGWorkflow.d.ts → createRAGWorkflow.d.ts} +1 -1
  46. package/dist/src/vue/{ai/useRAG.d.ts → useRAG.d.ts} +3 -3
  47. package/dist/src/vue/{ai/useRAGSearch.d.ts → useRAGSearch.d.ts} +1 -1
  48. package/dist/src/vue/{ai/useRAGStream.d.ts → useRAGStream.d.ts} +1 -1
  49. package/dist/src/vue/{ai/useRAGStreamProgress.d.ts → useRAGStreamProgress.d.ts} +1 -1
  50. package/dist/src/vue/{ai/useRAGWorkflow.d.ts → useRAGWorkflow.d.ts} +1 -1
  51. package/dist/svelte/{ai/index.js → index.js} +25 -25
  52. package/dist/svelte/index.js.map +30 -0
  53. package/dist/types/adapters.d.ts +37 -0
  54. package/dist/types/client.d.ts +33 -0
  55. package/dist/types/core.d.ts +7 -0
  56. package/dist/types/index.d.ts +9 -0
  57. package/dist/types/presentation.d.ts +24 -0
  58. package/dist/types/providers.d.ts +108 -0
  59. package/dist/types/quality.d.ts +41 -0
  60. package/dist/types/retrieval.d.ts +38 -0
  61. package/dist/types/sync.d.ts +23 -0
  62. package/dist/vue/{ai/index.js → index.js} +26 -26
  63. package/dist/vue/index.js.map +30 -0
  64. package/package.json +29 -29
  65. package/dist/ai/client/index.js.map +0 -16
  66. package/dist/ai/client/ui.js.map +0 -13
  67. package/dist/ai/rag/index.js.map +0 -42
  68. package/dist/ai/rag/quality.js.map +0 -13
  69. package/dist/ai/rag/ui.js.map +0 -13
  70. package/dist/angular/ai/index.js.map +0 -18
  71. package/dist/react/ai/index.js.map +0 -32
  72. package/dist/src/ai/rag/adapters/postgres.d.ts +0 -20
  73. package/dist/src/ai/rag/adapters/sqlite.d.ts +0 -24
  74. package/dist/src/ai/rag/collection.d.ts +0 -15
  75. package/dist/src/ai/rag/emailProviders.d.ts +0 -34
  76. package/dist/src/ai/rag/extractorProviders.d.ts +0 -58
  77. package/dist/svelte/ai/index.js.map +0 -30
  78. package/dist/vue/ai/index.js.map +0 -30
  79. /package/dist/src/angular/{ai/index.d.ts → index.d.ts} +0 -0
  80. /package/dist/src/{ai/client → client}/createRAGAnswerWorkflow.d.ts +0 -0
  81. /package/dist/src/{ai/client → client}/createRAGStream.d.ts +0 -0
  82. /package/dist/src/{ai/client → client}/createRAGWorkflow.d.ts +0 -0
  83. /package/dist/src/{ai/client → client}/ui.d.ts +0 -0
  84. /package/dist/src/{ai/rag → rag}/accessControl.d.ts +0 -0
  85. /package/dist/src/{ai/rag → rag}/adapters/filtering.d.ts +0 -0
  86. /package/dist/src/{ai/rag → rag}/adapters/queryPlanning.d.ts +0 -0
  87. /package/dist/src/{ai/rag → rag}/adapters/utils.d.ts +0 -0
  88. /package/dist/src/{ai/rag → rag}/atomicWrite.d.ts +0 -0
  89. /package/dist/src/{ai/rag → rag}/chat.d.ts +0 -0
  90. /package/dist/src/{ai/rag → rag}/constants.d.ts +0 -0
  91. /package/dist/src/{ai/rag → rag}/contactProviders.d.ts +0 -0
  92. /package/dist/src/{ai/rag → rag}/grounding.d.ts +0 -0
  93. /package/dist/src/{ai/rag → rag}/htmxConfig.d.ts +0 -0
  94. /package/dist/src/{ai/rag → rag}/ingestion.d.ts +0 -0
  95. /package/dist/src/{ai/rag → rag}/jobState.d.ts +0 -0
  96. /package/dist/src/{ai/rag → rag}/lexical.d.ts +0 -0
  97. /package/dist/src/{ai/rag → rag}/resolveAbsoluteSQLiteVec.d.ts +0 -0
  98. /package/dist/src/{ai/rag → rag}/socialProviders.d.ts +0 -0
  99. /package/dist/src/{ai/rag → rag}/ui.d.ts +0 -0
  100. /package/dist/src/{ai/rag → rag}/workflowState.d.ts +0 -0
  101. /package/dist/src/react/{ai/index.d.ts → index.d.ts} +0 -0
  102. /package/dist/src/react/{ai/useRAGChunkPreview.d.ts → useRAGChunkPreview.d.ts} +0 -0
  103. /package/dist/src/react/{ai/useRAGCitations.d.ts → useRAGCitations.d.ts} +0 -0
  104. /package/dist/src/react/{ai/useRAGDocuments.d.ts → useRAGDocuments.d.ts} +0 -0
  105. /package/dist/src/react/{ai/useRAGEvaluate.d.ts → useRAGEvaluate.d.ts} +0 -0
  106. /package/dist/src/react/{ai/useRAGGrounding.d.ts → useRAGGrounding.d.ts} +0 -0
  107. /package/dist/src/react/{ai/useRAGIndexAdmin.d.ts → useRAGIndexAdmin.d.ts} +0 -0
  108. /package/dist/src/react/{ai/useRAGIngest.d.ts → useRAGIngest.d.ts} +0 -0
  109. /package/dist/src/react/{ai/useRAGOps.d.ts → useRAGOps.d.ts} +0 -0
  110. /package/dist/src/react/{ai/useRAGSources.d.ts → useRAGSources.d.ts} +0 -0
  111. /package/dist/src/react/{ai/useRAGStatus.d.ts → useRAGStatus.d.ts} +0 -0
  112. /package/dist/src/react/{ai/useRAGStream.d.ts → useRAGStream.d.ts} +0 -0
  113. /package/dist/src/react/{ai/useRAGWorkflow.d.ts → useRAGWorkflow.d.ts} +0 -0
  114. /package/dist/src/svelte/{ai/createRAGChunkPreview.d.ts → createRAGChunkPreview.d.ts} +0 -0
  115. /package/dist/src/svelte/{ai/createRAGCitations.d.ts → createRAGCitations.d.ts} +0 -0
  116. /package/dist/src/svelte/{ai/createRAGDocuments.d.ts → createRAGDocuments.d.ts} +0 -0
  117. /package/dist/src/svelte/{ai/createRAGEvaluate.d.ts → createRAGEvaluate.d.ts} +0 -0
  118. /package/dist/src/svelte/{ai/createRAGGrounding.d.ts → createRAGGrounding.d.ts} +0 -0
  119. /package/dist/src/svelte/{ai/createRAGIndexAdmin.d.ts → createRAGIndexAdmin.d.ts} +0 -0
  120. /package/dist/src/svelte/{ai/createRAGIngest.d.ts → createRAGIngest.d.ts} +0 -0
  121. /package/dist/src/svelte/{ai/createRAGOps.d.ts → createRAGOps.d.ts} +0 -0
  122. /package/dist/src/svelte/{ai/createRAGSources.d.ts → createRAGSources.d.ts} +0 -0
  123. /package/dist/src/svelte/{ai/createRAGStatus.d.ts → createRAGStatus.d.ts} +0 -0
  124. /package/dist/src/svelte/{ai/index.d.ts → index.d.ts} +0 -0
  125. /package/dist/src/vue/{ai/index.d.ts → index.d.ts} +0 -0
  126. /package/dist/src/vue/{ai/useRAGChunkPreview.d.ts → useRAGChunkPreview.d.ts} +0 -0
  127. /package/dist/src/vue/{ai/useRAGCitations.d.ts → useRAGCitations.d.ts} +0 -0
  128. /package/dist/src/vue/{ai/useRAGDocuments.d.ts → useRAGDocuments.d.ts} +0 -0
  129. /package/dist/src/vue/{ai/useRAGEvaluate.d.ts → useRAGEvaluate.d.ts} +0 -0
  130. /package/dist/src/vue/{ai/useRAGGrounding.d.ts → useRAGGrounding.d.ts} +0 -0
  131. /package/dist/src/vue/{ai/useRAGIndexAdmin.d.ts → useRAGIndexAdmin.d.ts} +0 -0
  132. /package/dist/src/vue/{ai/useRAGIngest.d.ts → useRAGIngest.d.ts} +0 -0
  133. /package/dist/src/vue/{ai/useRAGOps.d.ts → useRAGOps.d.ts} +0 -0
  134. /package/dist/src/vue/{ai/useRAGSources.d.ts → useRAGSources.d.ts} +0 -0
  135. /package/dist/src/vue/{ai/useRAGStatus.d.ts → useRAGStatus.d.ts} +0 -0
@@ -1,8 +1,8 @@
1
1
  // @bun
2
- // src/ai/rag/quality.ts
2
+ // src/rag/quality.ts
3
3
  import { mkdir, readFile } from "fs/promises";
4
4
 
5
- // src/ai/rag/atomicWrite.ts
5
+ // src/rag/atomicWrite.ts
6
6
  import { open, rename, unlink } from "fs/promises";
7
7
  import { dirname } from "path";
8
8
  var writeFileAtomic = async (path, data, encoding = "utf8") => {
@@ -37,11 +37,11 @@ var writeFileAtomic = async (path, data, encoding = "utf8") => {
37
37
  }
38
38
  };
39
39
 
40
- // src/ai/rag/quality.ts
40
+ // src/rag/quality.ts
41
41
  import { dirname as dirname2 } from "path";
42
42
  import { generateId } from "@absolutejs/ai";
43
43
 
44
- // src/ai/rag/grounding.ts
44
+ // src/rag/grounding.ts
45
45
  var getContextString = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
46
46
  var getContextNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
47
47
  var getAttachmentName = (source, title) => {
@@ -735,7 +735,7 @@ var buildRAGGroundingReferences = (sources) => {
735
735
  });
736
736
  };
737
737
 
738
- // src/ai/rag/presentation.ts
738
+ // src/rag/presentation.ts
739
739
  var buildSourceGroupKey = (source) => source.source ?? source.title ?? source.chunkId;
740
740
  var buildSourceLabel2 = (source) => source.source ?? source.title ?? source.chunkId;
741
741
  var getContextNumber2 = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
@@ -4538,7 +4538,7 @@ var buildRAGAnswerGroundingEntityQualityPresentation = (view, entityType) => {
4538
4538
  };
4539
4539
  };
4540
4540
 
4541
- // src/ai/rag/quality.ts
4541
+ // src/rag/quality.ts
4542
4542
  var DEFAULT_TOP_K = 6;
4543
4543
  var DEFAULT_HISTORY_LIMIT = 20;
4544
4544
  var DEFAULT_SEARCH_TRACE_TABLE_NAME = "rag_search_traces";
@@ -11221,10 +11221,10 @@ var summarizeRAGRetrievalComparison = (entries) => ({
11221
11221
  bestByLowestRuntimeCandidateBudgetExhaustedCases: selectComparisonEntryByLowestTraceMetric(entries, "retrievalId", "runtimeCandidateBudgetExhaustedCases"),
11222
11222
  bestByLowestRuntimeUnderfilledTopKCases: selectComparisonEntryByLowestTraceMetric(entries, "retrievalId", "runtimeUnderfilledTopKCases")
11223
11223
  });
11224
- // src/ai/rag/chat.ts
11224
+ // src/rag/chat.ts
11225
11225
  import { Elysia } from "elysia";
11226
11226
 
11227
- // src/ai/rag/constants.ts
11227
+ // src/rag/constants.ts
11228
11228
  var HTTP_STATUS_OK = 200;
11229
11229
  var HTTP_STATUS_BAD_REQUEST = 400;
11230
11230
  var HTTP_STATUS_NOT_FOUND = 404;
@@ -11235,14 +11235,14 @@ var RAG_DOCUMENT_SLUG_MAX_LENGTH = 48;
11235
11235
  var RAG_MIN_CHUNK_LENGTH_FLOOR = 120;
11236
11236
  var RAG_SEARCH_SCORE_DECIMAL_PLACES = 3;
11237
11237
 
11238
- // src/ai/rag/chat.ts
11238
+ // src/rag/chat.ts
11239
11239
  import { createMemoryStore } from "@absolutejs/ai";
11240
11240
  import { generateId as generateId2, parseAIMessage } from "@absolutejs/ai";
11241
11241
  import { streamAI } from "@absolutejs/ai";
11242
11242
  import { streamAIToSSE } from "@absolutejs/ai";
11243
11243
  import { resolveRenderers } from "@absolutejs/ai";
11244
11244
 
11245
- // src/ai/rag/lexical.ts
11245
+ // src/rag/lexical.ts
11246
11246
  var DEFAULT_FUSION_CONSTANT = 60;
11247
11247
  var STOP_WORDS = new Set([
11248
11248
  "a",
@@ -11703,7 +11703,7 @@ var resolveRAGHybridSearchOptions = (retrieval) => {
11703
11703
  };
11704
11704
  };
11705
11705
 
11706
- // src/ai/rag/queryTransforms.ts
11706
+ // src/rag/queryTransforms.ts
11707
11707
  var tokenize2 = (value) => value.toLowerCase().split(/[^a-z0-9]+/i).map((token) => token.trim()).filter((token) => !STOP_WORDS2.has(token)).map((token) => token.endsWith("ies") && token.length > 3 ? `${token.slice(0, -3)}y` : token.endsWith("ing") && token.length > 5 ? token.slice(0, -3) : token.endsWith("ed") && token.length > 4 ? token.slice(0, -2) : token.endsWith("es") && token.length > 4 ? token.slice(0, -2) : token.endsWith("s") && token.length > 3 ? token.slice(0, -1) : token).map((token) => token.endsWith("ck") && token.length > 4 ? token.slice(0, -1) : token).map((token) => token.endsWith("ay") && token.length > 4 ? `${token.slice(0, -2)}i` : token).filter((token) => token.length > 1);
11708
11708
  var STOP_WORDS2 = new Set([
11709
11709
  "a",
@@ -11939,7 +11939,7 @@ var applyRAGQueryTransform = async ({
11939
11939
  }));
11940
11940
  };
11941
11941
 
11942
- // src/ai/rag/reranking.ts
11942
+ // src/rag/reranking.ts
11943
11943
  var tokenize3 = (value) => value.toLowerCase().split(/[^a-z0-9]+/i).map((token) => token.trim()).filter((token) => !STOP_WORDS3.has(token)).map((token) => token.endsWith("ies") && token.length > 3 ? `${token.slice(0, -3)}y` : token.endsWith("ing") && token.length > 5 ? token.slice(0, -3) : token.endsWith("ed") && token.length > 4 ? token.slice(0, -2) : token.endsWith("es") && token.length > 4 ? token.slice(0, -2) : token.endsWith("s") && token.length > 3 ? token.slice(0, -1) : token).map((token) => token.endsWith("ck") && token.length > 4 ? token.slice(0, -1) : token).map((token) => token.endsWith("ay") && token.length > 4 ? `${token.slice(0, -2)}i` : token).filter((token) => token.length > 1);
11944
11944
  var STOP_WORDS3 = new Set([
11945
11945
  "a",
@@ -13234,7 +13234,7 @@ var resolveRAGReranker = (reranker) => {
13234
13234
  return reranker;
13235
13235
  };
13236
13236
 
13237
- // src/ai/rag/embedding.ts
13237
+ // src/rag/embedding.ts
13238
13238
  var isEmbeddingProvider = (value) => typeof value === "object" && value !== null && typeof value.embed === "function";
13239
13239
  var createRAGEmbeddingProvider = (options) => options;
13240
13240
  var resolveRAGEmbeddingProvider = (providerLike, fallbackEmbed, defaultModel) => {
@@ -13258,7 +13258,7 @@ var validateRAGEmbeddingDimensions = (vector, expectedDimensions, context) => {
13258
13258
  }
13259
13259
  };
13260
13260
 
13261
- // src/ai/rag/ingestion.ts
13261
+ // src/rag/ingestion.ts
13262
13262
  import { readdir, readFile as readFile2 } from "fs/promises";
13263
13263
  import { basename, extname, join, relative, resolve } from "path";
13264
13264
  import { gunzipSync, inflateRawSync } from "zlib";
@@ -19626,7 +19626,7 @@ var loadRAGDocumentsFromDirectory = async (input) => {
19626
19626
  };
19627
19627
  var prepareRAGDirectoryDocuments = async (input) => prepareRAGDocuments(await loadRAGDocumentsFromDirectory(input));
19628
19628
 
19629
- // src/ai/rag/collection.ts
19629
+ // src/rag/collection.ts
19630
19630
  var DEFAULT_TOP_K2 = 6;
19631
19631
  var AUTO_BALANCED_NATIVE_ROW_ESTIMATE = 5000;
19632
19632
  var AUTO_RECALL_NATIVE_ROW_ESTIMATE = 20000;
@@ -21130,7 +21130,7 @@ var ingestDocuments = async (collection, input) => collection.ingest(input);
21130
21130
  var ingestRAGDocuments = async (collection, input) => collection.ingest(buildRAGUpsertInputFromDocuments(input));
21131
21131
  var searchDocuments = async (collection, input) => collection.search(input);
21132
21132
 
21133
- // src/ai/rag/htmxWorkflowRenderers.ts
21133
+ // src/rag/htmxWorkflowRenderers.ts
21134
21134
  var escapeHtml = (text) => text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
21135
21135
  var renderLabelValueRows = (rows) => rows.length > 0 ? `<dl class="rag-status">${rows.map((row) => `<div><dt>${escapeHtml(row.label)}</dt><dd>${escapeHtml(row.value)}</dd></div>`).join("")}</dl>` : "";
21136
21136
  var renderBenchmarkRuntimePanel = (input) => {
@@ -21548,7 +21548,7 @@ var resolveRAGWorkflowRenderers = (custom) => ({
21548
21548
  status: custom?.status ?? defaultStatus
21549
21549
  });
21550
21550
 
21551
- // src/ai/rag/types.ts
21551
+ // src/rag/types.ts
21552
21552
  var getContextNumber3 = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
21553
21553
  var getContextString3 = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
21554
21554
  var formatMediaTimestamp3 = (value) => {
@@ -21704,7 +21704,7 @@ ${sourceLines.join(`
21704
21704
  ${buildRAGContextCitationGuidance(hits)}`;
21705
21705
  };
21706
21706
 
21707
- // src/ai/rag/chat.ts
21707
+ // src/rag/chat.ts
21708
21708
  var DEFAULT_PATH = "/rag";
21709
21709
  var DEFAULT_TOP_K3 = 6;
21710
21710
  var DEFAULT_PREFIX_LEN = 12;
@@ -21714,6 +21714,7 @@ var MAX_INGEST_JOBS = 20;
21714
21714
  var MAX_ADMIN_ACTIONS = 20;
21715
21715
  var MAX_ADMIN_JOBS = 20;
21716
21716
  var DEFAULT_STALE_AFTER_MS = 1000 * 60 * 60 * 24 * 7;
21717
+ var WEBSOCKET_OPEN = 1;
21717
21718
  var REQUEST_USER_SUB_HEADER = "x-absolutejs-user-sub";
21718
21719
  var HTML_HEADERS = { "Content-Type": "text/html; charset=utf-8" };
21719
21720
  var defaultParseProvider = (content) => {
@@ -22157,9 +22158,23 @@ var persistSearchTraceIfConfigured = async (input) => {
22157
22158
  await input.onPrune?.(input.retention);
22158
22159
  }
22159
22160
  };
22160
- var buildRAGContextFromQuery = async (config, topK, scoreThreshold, queryText, ragModel, embedding, embeddingModel) => {
22161
+ var sendWebSocketError = (ws, error, conversationId, messageId) => {
22162
+ if (typeof ws.readyState === "number" && ws.readyState !== WEBSOCKET_OPEN) {
22163
+ return;
22164
+ }
22165
+ try {
22166
+ ws.send(JSON.stringify({
22167
+ conversationId,
22168
+ message: error instanceof Error ? error.message : String(error),
22169
+ messageId,
22170
+ type: "error"
22171
+ }));
22172
+ } catch {}
22173
+ };
22174
+ var getProviderDefaultEmbeddingModel = (embedding) => embedding !== undefined && typeof embedding === "object" && typeof embedding.defaultModel === "string" ? embedding.defaultModel : undefined;
22175
+ var buildRAGContextFromQuery = async (config, topK, scoreThreshold, queryText, embedding, embeddingModel) => {
22161
22176
  const collection = config.collection ?? (config.ragStore ? createRAGCollection({
22162
- defaultModel: embeddingModel ?? ragModel,
22177
+ defaultModel: embeddingModel,
22163
22178
  defaultTopK: topK,
22164
22179
  embedding,
22165
22180
  rerank: config.rerank,
@@ -22172,7 +22187,7 @@ var buildRAGContextFromQuery = async (config, topK, scoreThreshold, queryText, r
22172
22187
  };
22173
22188
  }
22174
22189
  const queried = await collection.searchWithTrace({
22175
- model: embeddingModel ?? ragModel,
22190
+ model: embeddingModel,
22176
22191
  query: queryText,
22177
22192
  scoreThreshold,
22178
22193
  topK
@@ -22195,7 +22210,27 @@ var buildRAGContextFromQuery = async (config, topK, scoreThreshold, queryText, r
22195
22210
  trace: queried.trace
22196
22211
  };
22197
22212
  };
22213
+ var assertEmbeddingModelConfigured = (config) => {
22214
+ if (config.collection !== undefined) {
22215
+ return;
22216
+ }
22217
+ if (config.ragStore === undefined) {
22218
+ return;
22219
+ }
22220
+ if (config.embeddingModel !== undefined) {
22221
+ return;
22222
+ }
22223
+ const { embedding } = config;
22224
+ if (embedding === undefined || typeof embedding !== "object") {
22225
+ return;
22226
+ }
22227
+ if (getProviderDefaultEmbeddingModel(embedding) !== undefined) {
22228
+ return;
22229
+ }
22230
+ throw new Error("ragChat: an embedding provider is configured but no embedding model is set. " + "Pass `embeddingModel` to ragChat() or set `defaultModel` on the embedding provider. " + "The chat model cannot be used for embeddings.");
22231
+ };
22198
22232
  var ragChat = (config) => {
22233
+ assertEmbeddingModelConfigured(config);
22199
22234
  const path = config.path ?? DEFAULT_PATH;
22200
22235
  const authorizeRAGAction = config.authorizeRAGAction;
22201
22236
  const resolveRAGAccessScope = config.resolveRAGAccessScope;
@@ -22657,53 +22692,57 @@ var ragChat = (config) => {
22657
22692
  }));
22658
22693
  };
22659
22694
  const handleMessage = async (ws, rawContent, rawConversationId, rawAttachments) => {
22660
- const parsed = parseProvider(rawContent);
22661
- const { content, providerName } = parsed;
22662
- const userMessageId = generateId2();
22663
22695
  const assistantMessageId = generateId2();
22664
22696
  const conversationId = rawConversationId ?? generateId2();
22665
- const conversation = await store.getOrCreate(conversationId);
22666
- const history = buildHistory(conversation);
22667
- const model = resolveModel(config, parsed);
22668
- const ragModel = parsed.model ?? model;
22669
- appendMessage(conversation, {
22670
- attachments: rawAttachments,
22671
- content,
22672
- conversationId,
22673
- id: userMessageId,
22674
- role: "user",
22675
- timestamp: Date.now()
22676
- });
22677
- await store.set(conversationId, conversation);
22678
- const retrievalStartedAt = Date.now();
22679
- handleRAGRetrieving(ws, conversationId, assistantMessageId, retrievalStartedAt);
22680
- const provider = config.provider(providerName);
22681
- const rag = await buildRAGContextFromQuery(config, topK, scoreThreshold, content, ragModel, config.embedding, config.embeddingModel);
22682
- const controller = new AbortController;
22683
- abortControllers.set(conversationId, controller);
22684
- const { ragContext, sources, trace } = rag;
22685
- const retrievedAt = Date.now();
22686
- const retrievalDurationMs = retrievedAt - retrievalStartedAt;
22687
- handleRAGRetrieved(ws, conversationId, assistantMessageId, sources, retrievalStartedAt, retrievedAt, retrievalDurationMs, trace);
22688
- await streamAI(ws, conversationId, assistantMessageId, {
22689
- completeMeta: includeCompleteSources ? { sources } : undefined,
22690
- maxTurns: config.maxTurns,
22691
- messages: [
22692
- ...history,
22693
- buildUserMessage(content, rawAttachments, ragContext)
22694
- ],
22695
- model,
22696
- provider,
22697
- signal: controller.signal,
22698
- systemPrompt: config.systemPrompt,
22699
- thinking: resolveThinking(config, providerName, model),
22700
- tools: resolveTools(config, providerName, model),
22701
- onComplete: async (fullResponse, usage) => {
22702
- await appendAssistantMessage(conversationId, assistantMessageId, fullResponse, sources, usage, model, retrievalStartedAt, retrievedAt, retrievalDurationMs, trace);
22703
- abortControllers.delete(conversationId);
22704
- config.onComplete?.(conversationId, fullResponse, usage, sources);
22705
- }
22706
- });
22697
+ try {
22698
+ const parsed = parseProvider(rawContent);
22699
+ const { content, providerName } = parsed;
22700
+ const userMessageId = generateId2();
22701
+ const conversation = await store.getOrCreate(conversationId);
22702
+ const history = buildHistory(conversation);
22703
+ const model = resolveModel(config, parsed);
22704
+ appendMessage(conversation, {
22705
+ attachments: rawAttachments,
22706
+ content,
22707
+ conversationId,
22708
+ id: userMessageId,
22709
+ role: "user",
22710
+ timestamp: Date.now()
22711
+ });
22712
+ await store.set(conversationId, conversation);
22713
+ const retrievalStartedAt = Date.now();
22714
+ handleRAGRetrieving(ws, conversationId, assistantMessageId, retrievalStartedAt);
22715
+ const provider = config.provider(providerName);
22716
+ const rag = await buildRAGContextFromQuery(config, topK, scoreThreshold, content, config.embedding, config.embeddingModel);
22717
+ const controller = new AbortController;
22718
+ abortControllers.set(conversationId, controller);
22719
+ const { ragContext, sources, trace } = rag;
22720
+ const retrievedAt = Date.now();
22721
+ const retrievalDurationMs = retrievedAt - retrievalStartedAt;
22722
+ handleRAGRetrieved(ws, conversationId, assistantMessageId, sources, retrievalStartedAt, retrievedAt, retrievalDurationMs, trace);
22723
+ await streamAI(ws, conversationId, assistantMessageId, {
22724
+ completeMeta: includeCompleteSources ? { sources } : undefined,
22725
+ maxTurns: config.maxTurns,
22726
+ messages: [
22727
+ ...history,
22728
+ buildUserMessage(content, rawAttachments, ragContext)
22729
+ ],
22730
+ model,
22731
+ provider,
22732
+ signal: controller.signal,
22733
+ systemPrompt: config.systemPrompt,
22734
+ thinking: resolveThinking(config, providerName, model),
22735
+ tools: resolveTools(config, providerName, model),
22736
+ onComplete: async (fullResponse, usage) => {
22737
+ await appendAssistantMessage(conversationId, assistantMessageId, fullResponse, sources, usage, model, retrievalStartedAt, retrievedAt, retrievalDurationMs, trace);
22738
+ abortControllers.delete(conversationId);
22739
+ config.onComplete?.(conversationId, fullResponse, usage, sources);
22740
+ }
22741
+ });
22742
+ } catch (error) {
22743
+ abortControllers.delete(conversationId);
22744
+ sendWebSocketError(ws, error, conversationId, assistantMessageId);
22745
+ }
22707
22746
  };
22708
22747
  const resolveCollection = () => config.collection ?? (ragStore ? createRAGCollection({
22709
22748
  defaultModel: config.embeddingModel,
@@ -29422,7 +29461,6 @@ var ragChat = (config) => {
29422
29461
  const parsed = parseProvider(lastMessage.content);
29423
29462
  const { content, providerName } = parsed;
29424
29463
  const model = resolveModel(config, parsed);
29425
- const ragModel = parsed.model ?? model;
29426
29464
  const assistantMessageId = generateId2();
29427
29465
  const retrievalStartedAt = Date.now();
29428
29466
  yield {
@@ -29434,7 +29472,7 @@ var ragChat = (config) => {
29434
29472
  event: "retrieval"
29435
29473
  };
29436
29474
  const provider = config.provider(providerName);
29437
- const { ragContext, sources, trace } = await buildRAGContextFromQuery(config, topK, scoreThreshold, content, ragModel, config.embedding, config.embeddingModel);
29475
+ const { ragContext, sources, trace } = await buildRAGContextFromQuery(config, topK, scoreThreshold, content, config.embedding, config.embeddingModel);
29438
29476
  const retrievedAt = Date.now();
29439
29477
  const retrievalDurationMs = retrievedAt - retrievalStartedAt;
29440
29478
  yield {
@@ -29485,16 +29523,20 @@ var ragChat = (config) => {
29485
29523
  if (!message) {
29486
29524
  return;
29487
29525
  }
29488
- if (message.type === "cancel") {
29489
- handleCancel(message.conversationId);
29490
- return;
29491
- }
29492
- if (message.type === "branch") {
29493
- await handleBranch(ws, message.messageId, message.conversationId);
29494
- return;
29495
- }
29496
- if (message.type === "message") {
29497
- await handleMessage(ws, message.content, message.conversationId, message.attachments);
29526
+ try {
29527
+ if (message.type === "cancel") {
29528
+ handleCancel(message.conversationId);
29529
+ return;
29530
+ }
29531
+ if (message.type === "branch") {
29532
+ await handleBranch(ws, message.messageId, message.conversationId);
29533
+ return;
29534
+ }
29535
+ if (message.type === "message") {
29536
+ await handleMessage(ws, message.content, message.conversationId, message.attachments);
29537
+ }
29538
+ } catch (error) {
29539
+ sendWebSocketError(ws, error, "conversationId" in message ? message.conversationId : undefined);
29498
29540
  }
29499
29541
  }
29500
29542
  }).post(`${path}/search`, async ({ body, request, set }) => {
@@ -30863,10 +30905,10 @@ var ragChat = (config) => {
30863
30905
  return { ok: true };
30864
30906
  }).use(htmxRoutes());
30865
30907
  };
30866
- // src/ai/rag/htmxConfig.ts
30908
+ // src/rag/htmxConfig.ts
30867
30909
  var createRAGHTMXConfig = (config) => config;
30868
30910
  var createRAGHTMXWorkflowRenderConfig = (config) => config;
30869
- // src/ai/rag/rerankerProviders.ts
30911
+ // src/rag/rerankerProviders.ts
30870
30912
  var rowScore = (row) => row.relevance_score ?? row.relevanceScore ?? row.score ?? 0;
30871
30913
  var applyRanking = (candidates, rows, topK) => {
30872
30914
  const ranked = [];
@@ -30954,7 +30996,7 @@ var createJinaRAGReranker = (config) => createHttpCrossEncoderReranker({
30954
30996
  fallbackModel: "jina-reranker-v2-base-multilingual",
30955
30997
  providerName: "jina"
30956
30998
  });
30957
- // src/ai/rag/retrievalStrategies.ts
30999
+ // src/rag/retrievalStrategies.ts
30958
31000
  var tokenize4 = (value) => value.toLowerCase().split(/[^a-z0-9]+/i).map((token) => token.trim()).filter((token) => token.length > 0);
30959
31001
  var hasAnyToken2 = (tokens, values) => values.some((value) => tokens.includes(value));
30960
31002
  var buildSelectorMetadata = (selector, extra = {}) => ({
@@ -31040,7 +31082,7 @@ var createHeuristicRAGRetrievalStrategy = (options = {}) => ({
31040
31082
  return;
31041
31083
  }
31042
31084
  });
31043
- // src/ai/rag/accessControl.ts
31085
+ // src/rag/accessControl.ts
31044
31086
  var createRAGAccessControl = (options) => {
31045
31087
  const authorize = options.authorize;
31046
31088
  const contextCache = new WeakMap;
@@ -31065,7 +31107,7 @@ var createRAGAccessControl = (options) => {
31065
31107
  }) : undefined
31066
31108
  };
31067
31109
  };
31068
- // src/ai/rag/embeddingProviders.ts
31110
+ // src/rag/embeddingProviders.ts
31069
31111
  var DEFAULT_OPENAI_BASE_URL = "https://api.openai.com";
31070
31112
  var DEFAULT_GEMINI_BASE_URL = "https://generativelanguage.googleapis.com";
31071
31113
  var DEFAULT_OLLAMA_BASE_URL = "http://127.0.0.1:11434";
@@ -31234,7 +31276,7 @@ var xaiEmbeddings = (config) => openaiCompatibleEmbeddings({
31234
31276
  apiKey: config.apiKey,
31235
31277
  baseUrl: "https://api.x.ai"
31236
31278
  });
31237
- // src/ai/rag/extractorProviders.ts
31279
+ // src/rag/extractorProviders.ts
31238
31280
  var DEFAULT_OPENAI_BASE_URL2 = "https://api.openai.com";
31239
31281
  var DEFAULT_GEMINI_BASE_URL2 = "https://generativelanguage.googleapis.com";
31240
31282
  var DEFAULT_OLLAMA_BASE_URL2 = "http://127.0.0.1:11434";
@@ -31581,7 +31623,7 @@ var openaiTranscriber = (config) => {
31581
31623
  }
31582
31624
  });
31583
31625
  };
31584
- // src/ai/rag/emailProviders.ts
31626
+ // src/rag/emailProviders.ts
31585
31627
  import { connect as connectTls } from "tls";
31586
31628
  var defaultFetch = (...args) => fetch(...args);
31587
31629
  var stripHtml2 = (value) => value.replace(/<style[\s\S]*?<\/style>/gi, " ").replace(/<script[\s\S]*?<\/script>/gi, " ").replace(/<[^>]+>/g, " ").replace(/&nbsp;/gi, " ").replace(/&amp;/gi, "&").replace(/\s+/g, " ").trim();
@@ -31958,7 +32000,7 @@ ${tag} OK`) || chunk.startsWith(`${tag} OK`));
31958
32000
  return { messages };
31959
32001
  }
31960
32002
  });
31961
- // src/ai/rag/contactProviders.ts
32003
+ // src/rag/contactProviders.ts
31962
32004
  var defaultFetch2 = Object.assign((...args) => fetch(...args), { preconnect: fetch.preconnect });
31963
32005
  var GOOGLE_PEOPLE_BASE_URL = "https://people.googleapis.com/v1";
31964
32006
  var DEFAULT_GOOGLE_CONTACTS_PAGE_SIZE = 200;
@@ -31977,7 +32019,9 @@ var toErrorMessage3 = async (response, label) => {
31977
32019
  return new Error(`${label}: ${response.status} ${response.statusText}${detailMessage ? ` (${detailMessage})` : ""}`);
31978
32020
  };
31979
32021
  var normalizeString = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
31980
- var toUniqueStringArray = (values) => [...new Set(values.filter((value) => typeof value === "string" && value.length > 0))];
32022
+ var toUniqueStringArray = (values) => [
32023
+ ...new Set(values.filter((value) => typeof value === "string" && value.length > 0))
32024
+ ];
31981
32025
  var toContactTitle = (person, fallbackId) => {
31982
32026
  const primaryName = person.names?.find((name) => normalizeString(name.displayName) !== undefined);
31983
32027
  const displayName = normalizeString(primaryName?.displayName);
@@ -32091,7 +32135,7 @@ var createRAGGoogleContactsConnector = (input) => ({
32091
32135
  };
32092
32136
  }
32093
32137
  });
32094
- // src/ai/rag/socialProviders.ts
32138
+ // src/rag/socialProviders.ts
32095
32139
  var defaultFetch3 = Object.assign((...args) => fetch(...args), { preconnect: fetch.preconnect });
32096
32140
  var META_GRAPH_BASE_URL = "https://graph.facebook.com/v22.0";
32097
32141
  var DEFAULT_META_PAGE_SIZE = 25;
@@ -32260,7 +32304,7 @@ var createRAGInstagramBusinessConnector = (input) => ({
32260
32304
  };
32261
32305
  }
32262
32306
  });
32263
- // src/ai/rag/sync.ts
32307
+ // src/rag/sync.ts
32264
32308
  var {S3Client } = globalThis.Bun;
32265
32309
  import { createHash } from "crypto";
32266
32310
  import { mkdir as mkdir2, readFile as readFile3, readdir as readdir2 } from "fs/promises";
@@ -34810,7 +34854,7 @@ var createRAGSyncScheduler = (input) => {
34810
34854
  listSchedules: () => [...input.schedules]
34811
34855
  };
34812
34856
  };
34813
- // src/ai/rag/jobState.ts
34857
+ // src/rag/jobState.ts
34814
34858
  import { mkdir as mkdir3, readFile as readFile4 } from "fs/promises";
34815
34859
  import { dirname as dirname4, resolve as resolve3 } from "path";
34816
34860
  var parseJobState = (content) => {
@@ -34852,7 +34896,7 @@ var createRAGFileJobStateStore = (path) => {
34852
34896
  }
34853
34897
  };
34854
34898
  };
34855
- // src/ai/rag/adapters/utils.ts
34899
+ // src/rag/adapters/utils.ts
34856
34900
  var vectorDimensionDefault = 24;
34857
34901
  var createRAGVector = (text, dimensions = vectorDimensionDefault) => {
34858
34902
  const bucket = new Array(dimensions).fill(0);
@@ -34897,7 +34941,7 @@ var RAG_NATIVE_QUERY_CANDIDATE_LIMIT = 1000;
34897
34941
  var RAG_VECTOR_DIMENSIONS_DEFAULT = 24;
34898
34942
  var TWO_THIRDS = 2 / 3;
34899
34943
 
34900
- // src/ai/rag/adapters/filtering.ts
34944
+ // src/rag/adapters/filtering.ts
34901
34945
  var isObjectRecord4 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
34902
34946
  var valuesMatch = (expected, actual) => {
34903
34947
  if (actual === expected) {
@@ -34974,7 +35018,7 @@ var matchesMetadataFilterRecord = (record, filter) => {
34974
35018
  });
34975
35019
  };
34976
35020
 
34977
- // src/ai/rag/adapters/inMemory.ts
35021
+ // src/rag/adapters/inMemory.ts
34978
35022
  var createInMemoryStatus = (dimensions) => ({
34979
35023
  backend: "in_memory",
34980
35024
  dimensions,
@@ -35111,7 +35155,7 @@ var createInMemoryRAGStore = (options = {}) => {
35111
35155
  getStatus: () => createInMemoryStatus(dimensions)
35112
35156
  };
35113
35157
  };
35114
- // src/ai/rag/adapters/queryPlanning.ts
35158
+ // src/rag/adapters/queryPlanning.ts
35115
35159
  var planNativeCandidateSearchK = (input) => {
35116
35160
  const base = Math.min(Math.max(input.topK * input.queryMultiplier, input.topK), input.candidateLimit);
35117
35161
  if (input.filteredCandidateCount === undefined || !Number.isFinite(input.filteredCandidateCount)) {
@@ -35163,7 +35207,7 @@ var summarizeSQLiteCandidateCoverage = (input) => {
35163
35207
  return "target_sized";
35164
35208
  };
35165
35209
 
35166
- // src/ai/rag/adapters/postgres.ts
35210
+ // src/rag/adapters/postgres.ts
35167
35211
  var DEFAULT_DIMENSIONS = RAG_VECTOR_DIMENSIONS_DEFAULT;
35168
35212
  var DEFAULT_TABLE_NAME = "rag_chunks";
35169
35213
  var DEFAULT_SCHEMA_NAME = "public";
@@ -36073,11 +36117,11 @@ var createPostgresRAGStore = (options = {}) => {
36073
36117
  upsert
36074
36118
  };
36075
36119
  };
36076
- // src/ai/rag/adapters/sqlite.ts
36120
+ // src/rag/adapters/sqlite.ts
36077
36121
  import { Database } from "bun:sqlite";
36078
36122
  import { existsSync as existsSync2 } from "fs";
36079
36123
 
36080
- // src/ai/rag/resolveAbsoluteSQLiteVec.ts
36124
+ // src/rag/resolveAbsoluteSQLiteVec.ts
36081
36125
  import { existsSync, readFileSync } from "fs";
36082
36126
  import { arch, platform } from "os";
36083
36127
  import { dirname as dirname5, join as join3 } from "path";
@@ -36176,7 +36220,7 @@ var resolveAbsoluteSQLiteVecExtensionPath = () => {
36176
36220
  return resolution.status === "resolved" ? resolution.libraryPath ?? null : null;
36177
36221
  };
36178
36222
 
36179
- // src/ai/rag/adapters/sqlite.ts
36223
+ // src/rag/adapters/sqlite.ts
36180
36224
  var DEFAULT_DIMENSIONS2 = RAG_VECTOR_DIMENSIONS_DEFAULT;
36181
36225
  var DEFAULT_TABLE_NAME2 = "rag_chunks";
36182
36226
  var DEFAULT_NATIVE_TABLE_SUFFIX = "_vec0";
@@ -37605,5 +37649,5 @@ export {
37605
37649
  addRAGEvaluationSuiteCase
37606
37650
  };
37607
37651
 
37608
- //# debugId=20E465BEF0B96FD164756E2164756E21
37652
+ //# debugId=AFC9E59FEEA03C7364756E2164756E21
37609
37653
  //# sourceMappingURL=index.js.map