weave-typescript 0.27.0 → 0.29.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.
@@ -0,0 +1,880 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listApprovedReconcilePoolByOrganizationQuery = exports.deleteSessionRetrievalContextQuery = exports.listSessionRetrievalContextQuery = exports.insertSessionRetrievalContextQuery = exports.searchConceptClusterThreadsBySimilarityAndUserPermissionsQuery = exports.searchConceptClusterThreadsBySimilarityQuery = exports.searchLeafConceptClustersBySimilarityQuery = exports.searchApprovedThreadsByEntitiesAndUserPermissionsQuery = exports.searchApprovedThreadsByEntitiesQuery = exports.searchApprovedThreadsSemanticByKnowledgeTypesAndUserPermissionsQuery = exports.searchApprovedThreadsSemanticByKnowledgeTypesQuery = exports.searchAccessibleDocumentsSemanticQuery = exports.searchApprovedThreadsSemanticByUserPermissionsQuery = exports.searchApprovedThreadsSemanticQuery = exports.refreshThreadReinforcementScoresQuery = void 0;
4
+ exports.refreshThreadReinforcementScores = refreshThreadReinforcementScores;
5
+ exports.searchApprovedThreadsSemantic = searchApprovedThreadsSemantic;
6
+ exports.searchApprovedThreadsSemanticByUserPermissions = searchApprovedThreadsSemanticByUserPermissions;
7
+ exports.searchAccessibleDocumentsSemantic = searchAccessibleDocumentsSemantic;
8
+ exports.searchApprovedThreadsSemanticByKnowledgeTypes = searchApprovedThreadsSemanticByKnowledgeTypes;
9
+ exports.searchApprovedThreadsSemanticByKnowledgeTypesAndUserPermissions = searchApprovedThreadsSemanticByKnowledgeTypesAndUserPermissions;
10
+ exports.searchApprovedThreadsByEntities = searchApprovedThreadsByEntities;
11
+ exports.searchApprovedThreadsByEntitiesAndUserPermissions = searchApprovedThreadsByEntitiesAndUserPermissions;
12
+ exports.searchLeafConceptClustersBySimilarity = searchLeafConceptClustersBySimilarity;
13
+ exports.searchConceptClusterThreadsBySimilarity = searchConceptClusterThreadsBySimilarity;
14
+ exports.searchConceptClusterThreadsBySimilarityAndUserPermissions = searchConceptClusterThreadsBySimilarityAndUserPermissions;
15
+ exports.insertSessionRetrievalContext = insertSessionRetrievalContext;
16
+ exports.listSessionRetrievalContext = listSessionRetrievalContext;
17
+ exports.deleteSessionRetrievalContext = deleteSessionRetrievalContext;
18
+ exports.listApprovedReconcilePoolByOrganization = listApprovedReconcilePoolByOrganization;
19
+ exports.refreshThreadReinforcementScoresQuery = `-- name: RefreshThreadReinforcementScores :exec
20
+ REFRESH MATERIALIZED VIEW CONCURRENTLY weave.thread_reinforcement_scores`;
21
+ async function refreshThreadReinforcementScores(client) {
22
+ await client.query({
23
+ text: exports.refreshThreadReinforcementScoresQuery,
24
+ values: [],
25
+ rowMode: "array"
26
+ });
27
+ }
28
+ exports.searchApprovedThreadsSemanticQuery = `-- name: SearchApprovedThreadsSemantic :many
29
+ SELECT
30
+ t.id AS thread_id,
31
+ t.text,
32
+ t.knowledge_type,
33
+ t.facet_fields,
34
+ similarity.score,
35
+ t.classification,
36
+ t.document_id,
37
+ d.filename AS document_name,
38
+ t.source_location,
39
+ t.approved_at,
40
+ t.temporal_validity,
41
+ COALESCE(entity_data.entities, '{}'::text[]) AS entities,
42
+ COALESCE(rs.reinforcement_count, 0) AS reinforcement_count,
43
+ COALESCE(cc.name, '') AS concept_cluster
44
+ FROM weave.threads t
45
+ JOIN weave.documents d ON d.id = t.document_id
46
+ CROSS JOIN LATERAL (
47
+ SELECT CAST(
48
+ 1.0::double precision
49
+ - (t.embedding <=> $1::vector)::double precision
50
+ AS double precision
51
+ ) AS score
52
+ ) similarity
53
+ LEFT JOIN weave.thread_reinforcement_scores rs ON rs.thread_id = t.id
54
+ LEFT JOIN weave.concept_clusters cc ON cc.id = t.cluster_id
55
+ LEFT JOIN LATERAL (
56
+ SELECT array_agg(DISTINCT e.canonical ORDER BY e.canonical) AS entities
57
+ FROM weave.thread_entities te
58
+ JOIN weave.entities e ON e.id = te.entity_id
59
+ WHERE te.thread_id = t.id
60
+ ) entity_data ON TRUE
61
+ WHERE t.organization_id = $2
62
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
63
+ AND t.embedding IS NOT NULL
64
+ AND similarity.score >= $3::double precision
65
+ ORDER BY score DESC, t.approved_at DESC
66
+ LIMIT $4`;
67
+ async function searchApprovedThreadsSemantic(client, args) {
68
+ const result = await client.query({
69
+ text: exports.searchApprovedThreadsSemanticQuery,
70
+ values: [args.queryEmbedding, args.organizationId, args.minSimilarity, args.resultLimit],
71
+ rowMode: "array"
72
+ });
73
+ return result.rows.map(row => {
74
+ return {
75
+ threadId: row[0],
76
+ text: row[1],
77
+ knowledgeType: row[2],
78
+ facetFields: row[3],
79
+ score: row[4],
80
+ classification: row[5],
81
+ documentId: row[6],
82
+ documentName: row[7],
83
+ sourceLocation: row[8],
84
+ approvedAt: row[9],
85
+ temporalValidity: row[10],
86
+ entities: row[11],
87
+ reinforcementCount: row[12],
88
+ conceptCluster: row[13]
89
+ };
90
+ });
91
+ }
92
+ exports.searchApprovedThreadsSemanticByUserPermissionsQuery = `-- name: SearchApprovedThreadsSemanticByUserPermissions :many
93
+ SELECT
94
+ t.id AS thread_id,
95
+ t.text,
96
+ t.knowledge_type,
97
+ t.facet_fields,
98
+ similarity.score,
99
+ t.classification,
100
+ t.document_id,
101
+ d.filename AS document_name,
102
+ t.source_location,
103
+ t.approved_at,
104
+ t.temporal_validity,
105
+ COALESCE(entity_data.entities, '{}'::text[]) AS entities,
106
+ COALESCE(rs.reinforcement_count, 0) AS reinforcement_count,
107
+ COALESCE(cc.name, '') AS concept_cluster
108
+ FROM weave.threads t
109
+ JOIN weave.documents d ON d.id = t.document_id
110
+ CROSS JOIN LATERAL (
111
+ SELECT CAST(
112
+ 1.0::double precision
113
+ - (t.embedding <=> $1::vector)::double precision
114
+ AS double precision
115
+ ) AS score
116
+ ) similarity
117
+ LEFT JOIN weave.thread_reinforcement_scores rs ON rs.thread_id = t.id
118
+ LEFT JOIN weave.concept_clusters cc ON cc.id = t.cluster_id
119
+ LEFT JOIN LATERAL (
120
+ SELECT array_agg(DISTINCT e.canonical ORDER BY e.canonical) AS entities
121
+ FROM weave.thread_entities te
122
+ JOIN weave.entities e ON e.id = te.entity_id
123
+ WHERE te.thread_id = t.id
124
+ ) entity_data ON TRUE
125
+ WHERE t.organization_id = $2
126
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
127
+ AND t.embedding IS NOT NULL
128
+ AND similarity.score >= $3::double precision
129
+ AND (
130
+ d.scope = 'DOCUMENT_SCOPE_ORG'
131
+ OR (d.scope = 'DOCUMENT_SCOPE_PRIVATE'
132
+ AND d.uploaded_by_user_id = $4)
133
+ OR (d.scope = 'DOCUMENT_SCOPE_RESTRICTED'
134
+ AND EXISTS (
135
+ SELECT 1
136
+ FROM weave.user_sensitivity_clearances c
137
+ WHERE c.organization_id = $2
138
+ AND c.user_id = $4
139
+ AND cardinality(d.sensitivity_tags) = 1
140
+ AND c.sensitivity_tag_slug = d.sensitivity_tags[1]
141
+ ))
142
+ )
143
+ ORDER BY score DESC, t.approved_at DESC
144
+ LIMIT $5`;
145
+ async function searchApprovedThreadsSemanticByUserPermissions(client, args) {
146
+ const result = await client.query({
147
+ text: exports.searchApprovedThreadsSemanticByUserPermissionsQuery,
148
+ values: [args.queryEmbedding, args.organizationId, args.minSimilarity, args.actingUserId, args.resultLimit],
149
+ rowMode: "array"
150
+ });
151
+ return result.rows.map(row => {
152
+ return {
153
+ threadId: row[0],
154
+ text: row[1],
155
+ knowledgeType: row[2],
156
+ facetFields: row[3],
157
+ score: row[4],
158
+ classification: row[5],
159
+ documentId: row[6],
160
+ documentName: row[7],
161
+ sourceLocation: row[8],
162
+ approvedAt: row[9],
163
+ temporalValidity: row[10],
164
+ entities: row[11],
165
+ reinforcementCount: row[12],
166
+ conceptCluster: row[13]
167
+ };
168
+ });
169
+ }
170
+ exports.searchAccessibleDocumentsSemanticQuery = `-- name: SearchAccessibleDocumentsSemantic :many
171
+ WITH tag_data AS (
172
+ SELECT
173
+ dt.document_id,
174
+ array_agg(dt.tag ORDER BY dt.tag ASC) AS tags,
175
+ array_agg(dt.confidence ORDER BY dt.tag ASC) AS tag_confidences
176
+ FROM weave.document_tags dt
177
+ JOIN weave.documents d ON d.id = dt.document_id
178
+ WHERE d.organization_id = $4
179
+ GROUP BY dt.document_id
180
+ ),
181
+ matches AS (
182
+ SELECT
183
+ t.id AS thread_id,
184
+ t.text,
185
+ t.classification,
186
+ t.document_id,
187
+ d.filename AS document_name,
188
+ d.mime_type,
189
+ d.scope,
190
+ d.sensitivity_tags,
191
+ d.uploaded_at,
192
+ COALESCE(tag_data.tags, '{}'::text[]) AS tags,
193
+ COALESCE(tag_data.tag_confidences, '{}'::real[]) AS tag_confidences,
194
+ t.source_location,
195
+ t.approved_at,
196
+ CAST(
197
+ 1.0::double precision
198
+ - (t.embedding <=> $5::vector)::double precision
199
+ AS double precision
200
+ ) AS score
201
+ FROM weave.threads t
202
+ JOIN weave.documents d ON d.id = t.document_id
203
+ LEFT JOIN tag_data ON tag_data.document_id = d.id
204
+ WHERE t.organization_id = $4
205
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
206
+ AND t.embedding IS NOT NULL
207
+ AND (
208
+ d.scope = 'DOCUMENT_SCOPE_ORG'
209
+ OR (d.scope = 'DOCUMENT_SCOPE_PRIVATE'
210
+ AND d.uploaded_by_user_id = $6)
211
+ OR (d.scope = 'DOCUMENT_SCOPE_RESTRICTED'
212
+ AND EXISTS (
213
+ SELECT 1
214
+ FROM weave.user_sensitivity_clearances c
215
+ WHERE c.organization_id = $4
216
+ AND c.user_id = $6
217
+ AND cardinality(d.sensitivity_tags) = 1
218
+ AND c.sensitivity_tag_slug = d.sensitivity_tags[1]
219
+ ))
220
+ )
221
+ AND (cardinality($7::text[]) = 0 OR tag_data.tags && $7::text[] OR d.sensitivity_tags && $7::text[])
222
+ AND (cardinality($8::text[]) = 0 OR d.sensitivity_tags && $8::text[])
223
+ AND (cardinality($9::text[]) = 0 OR d.scope = ANY($9::text[]))
224
+ AND ($10::timestamptz IS NULL OR d.uploaded_at >= $10::timestamptz)
225
+ AND ($11::timestamptz IS NULL OR d.uploaded_at <= $11::timestamptz)
226
+ )
227
+ SELECT
228
+ document_id,
229
+ document_name,
230
+ mime_type,
231
+ scope,
232
+ sensitivity_tags,
233
+ tags,
234
+ tag_confidences,
235
+ uploaded_at,
236
+ MAX(score)::double precision AS score,
237
+ COUNT(*)::int AS matched_thread_count,
238
+ (array_agg(thread_id ORDER BY score DESC, approved_at DESC))[1] AS best_thread_id,
239
+ (array_agg(text ORDER BY score DESC, approved_at DESC))[1] AS best_text,
240
+ (array_agg(classification ORDER BY score DESC, approved_at DESC))[1] AS best_classification,
241
+ (array_agg(source_location ORDER BY score DESC, approved_at DESC))[1] AS best_source_location
242
+ FROM matches
243
+ WHERE score >= $1::double precision
244
+ GROUP BY
245
+ document_id,
246
+ document_name,
247
+ mime_type,
248
+ scope,
249
+ sensitivity_tags,
250
+ tags,
251
+ tag_confidences,
252
+ uploaded_at
253
+ ORDER BY score DESC, uploaded_at DESC
254
+ LIMIT $3 OFFSET $2`;
255
+ async function searchAccessibleDocumentsSemantic(client, args) {
256
+ const result = await client.query({
257
+ text: exports.searchAccessibleDocumentsSemanticQuery,
258
+ values: [args.minSimilarity, args.pageOffset, args.resultLimit, args.organizationId, args.queryEmbedding, args.actingUserId, args.tags, args.restrictedTags, args.scopes, args.uploadedAfter, args.uploadedBefore],
259
+ rowMode: "array"
260
+ });
261
+ return result.rows.map(row => {
262
+ return {
263
+ documentId: row[0],
264
+ documentName: row[1],
265
+ mimeType: row[2],
266
+ scope: row[3],
267
+ sensitivityTags: row[4],
268
+ tags: row[5],
269
+ tagConfidences: row[6],
270
+ uploadedAt: row[7],
271
+ score: row[8],
272
+ matchedThreadCount: row[9],
273
+ bestThreadId: row[10],
274
+ bestText: row[11],
275
+ bestClassification: row[12],
276
+ bestSourceLocation: row[13]
277
+ };
278
+ });
279
+ }
280
+ exports.searchApprovedThreadsSemanticByKnowledgeTypesQuery = `-- name: SearchApprovedThreadsSemanticByKnowledgeTypes :many
281
+ SELECT
282
+ t.id AS thread_id,
283
+ t.text,
284
+ t.knowledge_type,
285
+ t.facet_fields,
286
+ similarity.score,
287
+ t.classification,
288
+ t.document_id,
289
+ d.filename AS document_name,
290
+ t.source_location,
291
+ t.approved_at,
292
+ t.temporal_validity,
293
+ COALESCE(entity_data.entities, '{}'::text[]) AS entities,
294
+ COALESCE(rs.reinforcement_count, 0) AS reinforcement_count,
295
+ COALESCE(cc.name, '') AS concept_cluster
296
+ FROM weave.threads t
297
+ JOIN weave.documents d ON d.id = t.document_id
298
+ CROSS JOIN LATERAL (
299
+ SELECT CAST(
300
+ 1.0::double precision
301
+ - (t.embedding <=> $1::vector)::double precision
302
+ AS double precision
303
+ ) AS score
304
+ ) similarity
305
+ LEFT JOIN weave.thread_reinforcement_scores rs ON rs.thread_id = t.id
306
+ LEFT JOIN weave.concept_clusters cc ON cc.id = t.cluster_id
307
+ LEFT JOIN LATERAL (
308
+ SELECT array_agg(DISTINCT e.canonical ORDER BY e.canonical) AS entities
309
+ FROM weave.thread_entities te
310
+ JOIN weave.entities e ON e.id = te.entity_id
311
+ WHERE te.thread_id = t.id
312
+ ) entity_data ON TRUE
313
+ WHERE t.organization_id = $2
314
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
315
+ AND t.embedding IS NOT NULL
316
+ AND t.knowledge_type = ANY($3::text[])
317
+ AND similarity.score >= $4::double precision
318
+ ORDER BY score DESC, t.approved_at DESC
319
+ LIMIT $5`;
320
+ async function searchApprovedThreadsSemanticByKnowledgeTypes(client, args) {
321
+ const result = await client.query({
322
+ text: exports.searchApprovedThreadsSemanticByKnowledgeTypesQuery,
323
+ values: [args.queryEmbedding, args.organizationId, args.knowledgeTypes, args.minSimilarity, args.resultLimit],
324
+ rowMode: "array"
325
+ });
326
+ return result.rows.map(row => {
327
+ return {
328
+ threadId: row[0],
329
+ text: row[1],
330
+ knowledgeType: row[2],
331
+ facetFields: row[3],
332
+ score: row[4],
333
+ classification: row[5],
334
+ documentId: row[6],
335
+ documentName: row[7],
336
+ sourceLocation: row[8],
337
+ approvedAt: row[9],
338
+ temporalValidity: row[10],
339
+ entities: row[11],
340
+ reinforcementCount: row[12],
341
+ conceptCluster: row[13]
342
+ };
343
+ });
344
+ }
345
+ exports.searchApprovedThreadsSemanticByKnowledgeTypesAndUserPermissionsQuery = `-- name: SearchApprovedThreadsSemanticByKnowledgeTypesAndUserPermissions :many
346
+ SELECT
347
+ t.id AS thread_id,
348
+ t.text,
349
+ t.knowledge_type,
350
+ t.facet_fields,
351
+ similarity.score,
352
+ t.classification,
353
+ t.document_id,
354
+ d.filename AS document_name,
355
+ t.source_location,
356
+ t.approved_at,
357
+ t.temporal_validity,
358
+ COALESCE(entity_data.entities, '{}'::text[]) AS entities,
359
+ COALESCE(rs.reinforcement_count, 0) AS reinforcement_count,
360
+ COALESCE(cc.name, '') AS concept_cluster
361
+ FROM weave.threads t
362
+ JOIN weave.documents d ON d.id = t.document_id
363
+ CROSS JOIN LATERAL (
364
+ SELECT CAST(
365
+ 1.0::double precision
366
+ - (t.embedding <=> $1::vector)::double precision
367
+ AS double precision
368
+ ) AS score
369
+ ) similarity
370
+ LEFT JOIN weave.thread_reinforcement_scores rs ON rs.thread_id = t.id
371
+ LEFT JOIN weave.concept_clusters cc ON cc.id = t.cluster_id
372
+ LEFT JOIN LATERAL (
373
+ SELECT array_agg(DISTINCT e.canonical ORDER BY e.canonical) AS entities
374
+ FROM weave.thread_entities te
375
+ JOIN weave.entities e ON e.id = te.entity_id
376
+ WHERE te.thread_id = t.id
377
+ ) entity_data ON TRUE
378
+ WHERE t.organization_id = $2
379
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
380
+ AND t.embedding IS NOT NULL
381
+ AND t.knowledge_type = ANY($3::text[])
382
+ AND similarity.score >= $4::double precision
383
+ AND (
384
+ d.scope = 'DOCUMENT_SCOPE_ORG'
385
+ OR (d.scope = 'DOCUMENT_SCOPE_PRIVATE'
386
+ AND d.uploaded_by_user_id = $5)
387
+ OR (d.scope = 'DOCUMENT_SCOPE_RESTRICTED'
388
+ AND EXISTS (
389
+ SELECT 1
390
+ FROM weave.user_sensitivity_clearances c
391
+ WHERE c.organization_id = $2
392
+ AND c.user_id = $5
393
+ AND cardinality(d.sensitivity_tags) = 1
394
+ AND c.sensitivity_tag_slug = d.sensitivity_tags[1]
395
+ ))
396
+ )
397
+ ORDER BY score DESC, t.approved_at DESC
398
+ LIMIT $6`;
399
+ async function searchApprovedThreadsSemanticByKnowledgeTypesAndUserPermissions(client, args) {
400
+ const result = await client.query({
401
+ text: exports.searchApprovedThreadsSemanticByKnowledgeTypesAndUserPermissionsQuery,
402
+ values: [args.queryEmbedding, args.organizationId, args.knowledgeTypes, args.minSimilarity, args.actingUserId, args.resultLimit],
403
+ rowMode: "array"
404
+ });
405
+ return result.rows.map(row => {
406
+ return {
407
+ threadId: row[0],
408
+ text: row[1],
409
+ knowledgeType: row[2],
410
+ facetFields: row[3],
411
+ score: row[4],
412
+ classification: row[5],
413
+ documentId: row[6],
414
+ documentName: row[7],
415
+ sourceLocation: row[8],
416
+ approvedAt: row[9],
417
+ temporalValidity: row[10],
418
+ entities: row[11],
419
+ reinforcementCount: row[12],
420
+ conceptCluster: row[13]
421
+ };
422
+ });
423
+ }
424
+ exports.searchApprovedThreadsByEntitiesQuery = `-- name: SearchApprovedThreadsByEntities :many
425
+ SELECT DISTINCT
426
+ t.id AS thread_id,
427
+ t.text,
428
+ t.knowledge_type,
429
+ t.facet_fields,
430
+ te.confidence::double precision AS score,
431
+ t.classification,
432
+ t.document_id,
433
+ d.filename AS document_name,
434
+ t.source_location,
435
+ t.approved_at,
436
+ t.temporal_validity,
437
+ COALESCE(entity_data.entities, '{}'::text[]) AS entities,
438
+ COALESCE(rs.reinforcement_count, 0) AS reinforcement_count,
439
+ COALESCE(cc.name, '') AS concept_cluster
440
+ FROM weave.threads t
441
+ JOIN weave.documents d ON d.id = t.document_id
442
+ JOIN weave.thread_entities te ON te.thread_id = t.id
443
+ JOIN weave.entities e ON e.id = te.entity_id
444
+ LEFT JOIN weave.thread_reinforcement_scores rs ON rs.thread_id = t.id
445
+ LEFT JOIN weave.concept_clusters cc ON cc.id = t.cluster_id
446
+ LEFT JOIN LATERAL (
447
+ SELECT array_agg(DISTINCT e2.canonical ORDER BY e2.canonical) AS entities
448
+ FROM weave.thread_entities te2
449
+ JOIN weave.entities e2 ON e2.id = te2.entity_id
450
+ WHERE te2.thread_id = t.id
451
+ ) entity_data ON TRUE
452
+ WHERE t.organization_id = $1
453
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
454
+ AND e.canonical = ANY($2::text[])
455
+ ORDER BY score DESC, t.approved_at DESC
456
+ LIMIT $3`;
457
+ async function searchApprovedThreadsByEntities(client, args) {
458
+ const result = await client.query({
459
+ text: exports.searchApprovedThreadsByEntitiesQuery,
460
+ values: [args.organizationId, args.entityCanonicals, args.resultLimit],
461
+ rowMode: "array"
462
+ });
463
+ return result.rows.map(row => {
464
+ return {
465
+ threadId: row[0],
466
+ text: row[1],
467
+ knowledgeType: row[2],
468
+ facetFields: row[3],
469
+ score: row[4],
470
+ classification: row[5],
471
+ documentId: row[6],
472
+ documentName: row[7],
473
+ sourceLocation: row[8],
474
+ approvedAt: row[9],
475
+ temporalValidity: row[10],
476
+ entities: row[11],
477
+ reinforcementCount: row[12],
478
+ conceptCluster: row[13]
479
+ };
480
+ });
481
+ }
482
+ exports.searchApprovedThreadsByEntitiesAndUserPermissionsQuery = `-- name: SearchApprovedThreadsByEntitiesAndUserPermissions :many
483
+ SELECT DISTINCT
484
+ t.id AS thread_id,
485
+ t.text,
486
+ t.knowledge_type,
487
+ t.facet_fields,
488
+ te.confidence::double precision AS score,
489
+ t.classification,
490
+ t.document_id,
491
+ d.filename AS document_name,
492
+ t.source_location,
493
+ t.approved_at,
494
+ t.temporal_validity,
495
+ COALESCE(entity_data.entities, '{}'::text[]) AS entities,
496
+ COALESCE(rs.reinforcement_count, 0) AS reinforcement_count,
497
+ COALESCE(cc.name, '') AS concept_cluster
498
+ FROM weave.threads t
499
+ JOIN weave.documents d ON d.id = t.document_id
500
+ JOIN weave.thread_entities te ON te.thread_id = t.id
501
+ JOIN weave.entities e ON e.id = te.entity_id
502
+ LEFT JOIN weave.thread_reinforcement_scores rs ON rs.thread_id = t.id
503
+ LEFT JOIN weave.concept_clusters cc ON cc.id = t.cluster_id
504
+ LEFT JOIN LATERAL (
505
+ SELECT array_agg(DISTINCT e2.canonical ORDER BY e2.canonical) AS entities
506
+ FROM weave.thread_entities te2
507
+ JOIN weave.entities e2 ON e2.id = te2.entity_id
508
+ WHERE te2.thread_id = t.id
509
+ ) entity_data ON TRUE
510
+ WHERE t.organization_id = $1
511
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
512
+ AND e.canonical = ANY($2::text[])
513
+ AND (
514
+ d.scope = 'DOCUMENT_SCOPE_ORG'
515
+ OR (d.scope = 'DOCUMENT_SCOPE_PRIVATE'
516
+ AND d.uploaded_by_user_id = $3)
517
+ OR (d.scope = 'DOCUMENT_SCOPE_RESTRICTED'
518
+ AND EXISTS (
519
+ SELECT 1
520
+ FROM weave.user_sensitivity_clearances c
521
+ WHERE c.organization_id = $1
522
+ AND c.user_id = $3
523
+ AND cardinality(d.sensitivity_tags) = 1
524
+ AND c.sensitivity_tag_slug = d.sensitivity_tags[1]
525
+ ))
526
+ )
527
+ ORDER BY score DESC, t.approved_at DESC
528
+ LIMIT $4`;
529
+ async function searchApprovedThreadsByEntitiesAndUserPermissions(client, args) {
530
+ const result = await client.query({
531
+ text: exports.searchApprovedThreadsByEntitiesAndUserPermissionsQuery,
532
+ values: [args.organizationId, args.entityCanonicals, args.actingUserId, args.resultLimit],
533
+ rowMode: "array"
534
+ });
535
+ return result.rows.map(row => {
536
+ return {
537
+ threadId: row[0],
538
+ text: row[1],
539
+ knowledgeType: row[2],
540
+ facetFields: row[3],
541
+ score: row[4],
542
+ classification: row[5],
543
+ documentId: row[6],
544
+ documentName: row[7],
545
+ sourceLocation: row[8],
546
+ approvedAt: row[9],
547
+ temporalValidity: row[10],
548
+ entities: row[11],
549
+ reinforcementCount: row[12],
550
+ conceptCluster: row[13]
551
+ };
552
+ });
553
+ }
554
+ exports.searchLeafConceptClustersBySimilarityQuery = `-- name: SearchLeafConceptClustersBySimilarity :many
555
+ SELECT
556
+ cc.id,
557
+ cc.organization_id,
558
+ cc.realm_kind,
559
+ cc.realm_key,
560
+ cc.name,
561
+ cc.description,
562
+ cc.knowledge_type,
563
+ cc.level,
564
+ cc.parent_id,
565
+ cc.thread_count,
566
+ cc.consolidation_run_id,
567
+ cc.created_at,
568
+ cc.updated_at,
569
+ similarity.score
570
+ FROM weave.concept_clusters cc
571
+ CROSS JOIN LATERAL (
572
+ SELECT CAST(
573
+ 1.0::double precision
574
+ - (cc.embedding <=> $1::vector)::double precision
575
+ AS double precision
576
+ ) AS score
577
+ ) similarity
578
+ WHERE cc.organization_id = $2
579
+ AND cc.realm_kind = $3
580
+ AND cc.realm_key = $4
581
+ AND cc.level = 0
582
+ AND cc.embedding IS NOT NULL
583
+ AND similarity.score >= $5::double precision
584
+ ORDER BY score DESC, cc.updated_at DESC
585
+ LIMIT $6`;
586
+ async function searchLeafConceptClustersBySimilarity(client, args) {
587
+ const result = await client.query({
588
+ text: exports.searchLeafConceptClustersBySimilarityQuery,
589
+ values: [args.queryEmbedding, args.organizationId, args.realmKind, args.realmKey, args.minSimilarity, args.resultLimit],
590
+ rowMode: "array"
591
+ });
592
+ return result.rows.map(row => {
593
+ return {
594
+ id: row[0],
595
+ organizationId: row[1],
596
+ realmKind: row[2],
597
+ realmKey: row[3],
598
+ name: row[4],
599
+ description: row[5],
600
+ knowledgeType: row[6],
601
+ level: row[7],
602
+ parentId: row[8],
603
+ threadCount: row[9],
604
+ consolidationRunId: row[10],
605
+ createdAt: row[11],
606
+ updatedAt: row[12],
607
+ score: row[13]
608
+ };
609
+ });
610
+ }
611
+ exports.searchConceptClusterThreadsBySimilarityQuery = `-- name: SearchConceptClusterThreadsBySimilarity :many
612
+ SELECT
613
+ t.id AS thread_id,
614
+ t.text,
615
+ t.knowledge_type,
616
+ t.facet_fields,
617
+ similarity.score,
618
+ t.classification,
619
+ t.document_id,
620
+ d.filename AS document_name,
621
+ t.source_location,
622
+ t.approved_at,
623
+ t.temporal_validity,
624
+ COALESCE(entity_data.entities, '{}'::text[]) AS entities,
625
+ COALESCE(rs.reinforcement_count, 0) AS reinforcement_count,
626
+ cc.name AS concept_cluster
627
+ FROM weave.concept_clusters cc
628
+ CROSS JOIN LATERAL (
629
+ SELECT CAST(
630
+ 1.0::double precision
631
+ - (cc.embedding <=> $1::vector)::double precision
632
+ AS double precision
633
+ ) AS score
634
+ ) similarity
635
+ JOIN weave.threads t ON t.cluster_id = cc.id
636
+ JOIN weave.documents d ON d.id = t.document_id
637
+ LEFT JOIN weave.thread_reinforcement_scores rs ON rs.thread_id = t.id
638
+ LEFT JOIN LATERAL (
639
+ SELECT array_agg(DISTINCT e.canonical ORDER BY e.canonical) AS entities
640
+ FROM weave.thread_entities te
641
+ JOIN weave.entities e ON e.id = te.entity_id
642
+ WHERE te.thread_id = t.id
643
+ ) entity_data ON TRUE
644
+ WHERE cc.organization_id = $2
645
+ AND cc.realm_kind = $3
646
+ AND cc.realm_key = $4
647
+ AND cc.level = 0
648
+ AND cc.embedding IS NOT NULL
649
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
650
+ AND similarity.score >= $5::double precision
651
+ ORDER BY score DESC, t.approved_at DESC
652
+ LIMIT $6`;
653
+ async function searchConceptClusterThreadsBySimilarity(client, args) {
654
+ const result = await client.query({
655
+ text: exports.searchConceptClusterThreadsBySimilarityQuery,
656
+ values: [args.queryEmbedding, args.organizationId, args.realmKind, args.realmKey, args.minSimilarity, args.resultLimit],
657
+ rowMode: "array"
658
+ });
659
+ return result.rows.map(row => {
660
+ return {
661
+ threadId: row[0],
662
+ text: row[1],
663
+ knowledgeType: row[2],
664
+ facetFields: row[3],
665
+ score: row[4],
666
+ classification: row[5],
667
+ documentId: row[6],
668
+ documentName: row[7],
669
+ sourceLocation: row[8],
670
+ approvedAt: row[9],
671
+ temporalValidity: row[10],
672
+ entities: row[11],
673
+ reinforcementCount: row[12],
674
+ conceptCluster: row[13]
675
+ };
676
+ });
677
+ }
678
+ exports.searchConceptClusterThreadsBySimilarityAndUserPermissionsQuery = `-- name: SearchConceptClusterThreadsBySimilarityAndUserPermissions :many
679
+ SELECT
680
+ t.id AS thread_id,
681
+ t.text,
682
+ t.knowledge_type,
683
+ t.facet_fields,
684
+ similarity.score,
685
+ t.classification,
686
+ t.document_id,
687
+ d.filename AS document_name,
688
+ t.source_location,
689
+ t.approved_at,
690
+ t.temporal_validity,
691
+ COALESCE(entity_data.entities, '{}'::text[]) AS entities,
692
+ COALESCE(rs.reinforcement_count, 0) AS reinforcement_count,
693
+ cc.name AS concept_cluster
694
+ FROM weave.concept_clusters cc
695
+ CROSS JOIN LATERAL (
696
+ SELECT CAST(
697
+ 1.0::double precision
698
+ - (cc.embedding <=> $1::vector)::double precision
699
+ AS double precision
700
+ ) AS score
701
+ ) similarity
702
+ JOIN weave.threads t ON t.cluster_id = cc.id
703
+ JOIN weave.documents d ON d.id = t.document_id
704
+ LEFT JOIN weave.thread_reinforcement_scores rs ON rs.thread_id = t.id
705
+ LEFT JOIN LATERAL (
706
+ SELECT array_agg(DISTINCT e.canonical ORDER BY e.canonical) AS entities
707
+ FROM weave.thread_entities te
708
+ JOIN weave.entities e ON e.id = te.entity_id
709
+ WHERE te.thread_id = t.id
710
+ ) entity_data ON TRUE
711
+ WHERE cc.organization_id = $2
712
+ AND cc.realm_kind = $3
713
+ AND cc.realm_key = $4
714
+ AND cc.level = 0
715
+ AND cc.embedding IS NOT NULL
716
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
717
+ AND similarity.score >= $5::double precision
718
+ AND (
719
+ d.scope = 'DOCUMENT_SCOPE_ORG'
720
+ OR (d.scope = 'DOCUMENT_SCOPE_PRIVATE'
721
+ AND d.uploaded_by_user_id = $6)
722
+ OR (d.scope = 'DOCUMENT_SCOPE_RESTRICTED'
723
+ AND EXISTS (
724
+ SELECT 1
725
+ FROM weave.user_sensitivity_clearances c
726
+ WHERE c.organization_id = $2
727
+ AND c.user_id = $6
728
+ AND cardinality(d.sensitivity_tags) = 1
729
+ AND c.sensitivity_tag_slug = d.sensitivity_tags[1]
730
+ ))
731
+ )
732
+ ORDER BY score DESC, t.approved_at DESC
733
+ LIMIT $7`;
734
+ async function searchConceptClusterThreadsBySimilarityAndUserPermissions(client, args) {
735
+ const result = await client.query({
736
+ text: exports.searchConceptClusterThreadsBySimilarityAndUserPermissionsQuery,
737
+ values: [args.queryEmbedding, args.organizationId, args.realmKind, args.realmKey, args.minSimilarity, args.actingUserId, args.resultLimit],
738
+ rowMode: "array"
739
+ });
740
+ return result.rows.map(row => {
741
+ return {
742
+ threadId: row[0],
743
+ text: row[1],
744
+ knowledgeType: row[2],
745
+ facetFields: row[3],
746
+ score: row[4],
747
+ classification: row[5],
748
+ documentId: row[6],
749
+ documentName: row[7],
750
+ sourceLocation: row[8],
751
+ approvedAt: row[9],
752
+ temporalValidity: row[10],
753
+ entities: row[11],
754
+ reinforcementCount: row[12],
755
+ conceptCluster: row[13]
756
+ };
757
+ });
758
+ }
759
+ exports.insertSessionRetrievalContextQuery = `-- name: InsertSessionRetrievalContext :one
760
+ INSERT INTO weave.session_retrieval_context (
761
+ session_id,
762
+ turn_number,
763
+ thread_id,
764
+ relevance
765
+ ) SELECT
766
+ $1,
767
+ $2,
768
+ t.id,
769
+ $3
770
+ FROM weave.threads t
771
+ WHERE t.organization_id = $4
772
+ AND t.id = $5
773
+ RETURNING
774
+ session_id,
775
+ turn_number,
776
+ thread_id,
777
+ relevance,
778
+ retrieved_at`;
779
+ async function insertSessionRetrievalContext(client, args) {
780
+ const result = await client.query({
781
+ text: exports.insertSessionRetrievalContextQuery,
782
+ values: [args.sessionId, args.turnNumber, args.relevance, args.organizationId, args.threadId],
783
+ rowMode: "array"
784
+ });
785
+ if (result.rows.length !== 1) {
786
+ return null;
787
+ }
788
+ const row = result.rows[0];
789
+ return {
790
+ sessionId: row[0],
791
+ turnNumber: row[1],
792
+ threadId: row[2],
793
+ relevance: row[3],
794
+ retrievedAt: row[4]
795
+ };
796
+ }
797
+ exports.listSessionRetrievalContextQuery = `-- name: ListSessionRetrievalContext :many
798
+ SELECT
799
+ session_id,
800
+ turn_number,
801
+ thread_id,
802
+ relevance,
803
+ retrieved_at
804
+ FROM weave.session_retrieval_context
805
+ WHERE session_id = $1
806
+ AND thread_id IN (
807
+ SELECT id
808
+ FROM weave.threads
809
+ WHERE organization_id = $2
810
+ )
811
+ ORDER BY turn_number DESC, relevance DESC, retrieved_at DESC
812
+ LIMIT $3`;
813
+ async function listSessionRetrievalContext(client, args) {
814
+ const result = await client.query({
815
+ text: exports.listSessionRetrievalContextQuery,
816
+ values: [args.sessionId, args.organizationId, args.resultLimit],
817
+ rowMode: "array"
818
+ });
819
+ return result.rows.map(row => {
820
+ return {
821
+ sessionId: row[0],
822
+ turnNumber: row[1],
823
+ threadId: row[2],
824
+ relevance: row[3],
825
+ retrievedAt: row[4]
826
+ };
827
+ });
828
+ }
829
+ exports.deleteSessionRetrievalContextQuery = `-- name: DeleteSessionRetrievalContext :exec
830
+ DELETE FROM weave.session_retrieval_context
831
+ WHERE session_id = $1
832
+ AND thread_id IN (
833
+ SELECT id
834
+ FROM weave.threads
835
+ WHERE organization_id = $2
836
+ )`;
837
+ async function deleteSessionRetrievalContext(client, args) {
838
+ await client.query({
839
+ text: exports.deleteSessionRetrievalContextQuery,
840
+ values: [args.sessionId, args.organizationId],
841
+ rowMode: "array"
842
+ });
843
+ }
844
+ exports.listApprovedReconcilePoolByOrganizationQuery = `-- name: ListApprovedReconcilePoolByOrganization :many
845
+ SELECT
846
+ t.id AS thread_id,
847
+ t.text,
848
+ t.knowledge_type,
849
+ t.embedding::text AS embedding_text,
850
+ COALESCE(entity_data.entities, '{}'::text[]) AS entity_canonicals,
851
+ t.approved_at
852
+ FROM weave.threads t
853
+ LEFT JOIN LATERAL (
854
+ SELECT array_agg(DISTINCT e.canonical ORDER BY e.canonical) AS entities
855
+ FROM weave.thread_entities te
856
+ JOIN weave.entities e ON e.id = te.entity_id
857
+ WHERE te.thread_id = t.id
858
+ ) entity_data ON TRUE
859
+ WHERE t.organization_id = $1
860
+ AND t.retrieval_status = 'THREAD_RETRIEVAL_STATUS_APPROVED'
861
+ AND t.embedding IS NOT NULL
862
+ ORDER BY t.approved_at DESC, t.id ASC
863
+ LIMIT $3 OFFSET $2`;
864
+ async function listApprovedReconcilePoolByOrganization(client, args) {
865
+ const result = await client.query({
866
+ text: exports.listApprovedReconcilePoolByOrganizationQuery,
867
+ values: [args.organizationId, args.pageOffset, args.pageSize],
868
+ rowMode: "array"
869
+ });
870
+ return result.rows.map(row => {
871
+ return {
872
+ threadId: row[0],
873
+ text: row[1],
874
+ knowledgeType: row[2],
875
+ embeddingText: row[3],
876
+ entityCanonicals: row[4],
877
+ approvedAt: row[5]
878
+ };
879
+ });
880
+ }