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