@origintrail-official/dkg-node-ui 10.0.11 → 10.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.
- package/LICENSE +201 -201
- package/README.md +50 -50
- package/dist/chain-cursor-stores.js +6 -6
- package/dist/chat-memory.js +209 -209
- package/dist/db.js +955 -955
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/telemetry.d.ts +56 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +96 -6
- package/dist/telemetry.js.map +1 -1
- package/dist-ui/assets/{3d-force-graph-Bl6v-uII.js → 3d-force-graph-C9KowW4u.js} +1 -1
- package/dist-ui/assets/{AgentHub-D2vaQxlw.js → AgentHub-BVrcom9_.js} +1 -1
- package/dist-ui/assets/{AgentProfilePage-BgSTdsjD.js → AgentProfilePage-C9XaTt7j.js} +1 -1
- package/dist-ui/assets/{ApproveWalletsModal-D0Ub_eiD.js → ApproveWalletsModal-BdR2mshx.js} +3 -3
- package/dist-ui/assets/{ConvictionDetailView-CieVypna.js → ConvictionDetailView-cao48GL1.js} +1 -1
- package/dist-ui/assets/{Network-DKw_XEGi.js → Network-B3jCYzr5.js} +1 -1
- package/dist-ui/assets/{OnChainProvenanceCard-Dn_IEP7Q.js → OnChainProvenanceCard-DboMX4Aq.js} +1 -1
- package/dist-ui/assets/{Operations-BO2C3UWB.js → Operations-Dg1gfLXv.js} +1 -1
- package/dist-ui/assets/{PublishingConviction-xKRNHbzk.js → PublishingConviction-Byp6t69e.js} +1 -1
- package/dist-ui/assets/{Settings-DC_d9STV.js → Settings-CxI0SKeV.js} +1 -1
- package/dist-ui/assets/{ccip-zWfeQL8Q.js → ccip-wJ3OMRuz.js} +1 -1
- package/dist-ui/assets/{index-CwRQnNYh.js → index-5DS6xjw0.js} +3 -3
- package/dist-ui/assets/index-DOjsv0r7.css +1 -0
- package/dist-ui/assets/index-KoAnx9JE.js +1661 -0
- package/dist-ui/assets/{jsonld-B67IUHNU-C3ydusi_.js → jsonld-32FQRO67-CDirPi8u.js} +2 -2
- package/dist-ui/assets/{jsonld-G-CM-8JR.js → jsonld-CwHW9UDN.js} +1 -1
- package/dist-ui/assets/{renderer-3d-OSESAPET-ConXqyK6.js → renderer-3d-2EVDZII7-BNXV6iSu.js} +2 -2
- package/dist-ui/assets/{shikiHighlighter-C6lRYd1O.js → shikiHighlighter-C-LWPPSu.js} +1 -1
- package/dist-ui/index.html +14 -14
- package/package.json +4 -3
- package/dist-ui/assets/index-DEtfq9qv.css +0 -1
- package/dist-ui/assets/index-hrI-Ir4l.js +0 -1661
- /package/dist-ui/assets/{ntriples-SF2LFNMC-DH7OofPp.js → ntriples-ZWBY2WET-DH7OofPp.js} +0 -0
- /package/dist-ui/assets/{turtle-BXN4L2BY-BzTu0283.js → turtle-JJPK7LJ5-BzTu0283.js} +0 -0
package/dist/chat-memory.js
CHANGED
|
@@ -183,102 +183,102 @@ function buildSessionRootPattern(sessionUri) {
|
|
|
183
183
|
const clauses = [
|
|
184
184
|
`{ <${sessionUri}> ?sessionP ?sessionO . BIND(<${sessionUri}> AS ?s) }`,
|
|
185
185
|
`{ ?s <${SCHEMA}isPartOf> <${sessionUri}> }`,
|
|
186
|
-
`{
|
|
187
|
-
?msg <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
188
|
-
?msg <${DKG_ONT}usedTool> ?s .
|
|
186
|
+
`{
|
|
187
|
+
?msg <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
188
|
+
?msg <${DKG_ONT}usedTool> ?s .
|
|
189
189
|
}`,
|
|
190
|
-
`{
|
|
191
|
-
?msg <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
192
|
-
?s <${DKG_ONT}mentionedIn> ?msg .
|
|
190
|
+
`{
|
|
191
|
+
?msg <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
192
|
+
?s <${DKG_ONT}mentionedIn> ?msg .
|
|
193
193
|
}`,
|
|
194
194
|
`{ ?s <${DKG_ONT}extractedFrom> <${sessionUri}> }`,
|
|
195
195
|
];
|
|
196
|
-
return `{
|
|
197
|
-
${clauses.join('\n UNION ')}
|
|
196
|
+
return `{
|
|
197
|
+
${clauses.join('\n UNION ')}
|
|
198
198
|
}`;
|
|
199
199
|
}
|
|
200
|
-
const MENTION_EXTRACTION_PROMPT = `Extract named entities mentioned in the following text. Output ONLY a JSON array of objects with "name" and "type" fields.
|
|
201
|
-
|
|
202
|
-
Rules:
|
|
203
|
-
- "name" is the canonical label (proper casing, e.g. "Porsche", "Bitcoin", "Berlin")
|
|
204
|
-
- "type" is one of: Person, Organization, Place, Product, Event, Technology, Concept
|
|
205
|
-
- Only extract concrete, specific entities — skip vague words like "car", "company", "city"
|
|
206
|
-
- If no entities found, output: []
|
|
207
|
-
- Do NOT wrap in markdown code fences
|
|
208
|
-
|
|
209
|
-
Example output:
|
|
210
|
-
[{"name":"Porsche","type":"Organization"},{"name":"Berlin","type":"Place"}]
|
|
211
|
-
|
|
200
|
+
const MENTION_EXTRACTION_PROMPT = `Extract named entities mentioned in the following text. Output ONLY a JSON array of objects with "name" and "type" fields.
|
|
201
|
+
|
|
202
|
+
Rules:
|
|
203
|
+
- "name" is the canonical label (proper casing, e.g. "Porsche", "Bitcoin", "Berlin")
|
|
204
|
+
- "type" is one of: Person, Organization, Place, Product, Event, Technology, Concept
|
|
205
|
+
- Only extract concrete, specific entities — skip vague words like "car", "company", "city"
|
|
206
|
+
- If no entities found, output: []
|
|
207
|
+
- Do NOT wrap in markdown code fences
|
|
208
|
+
|
|
209
|
+
Example output:
|
|
210
|
+
[{"name":"Porsche","type":"Organization"},{"name":"Berlin","type":"Place"}]
|
|
211
|
+
|
|
212
212
|
Text:`;
|
|
213
|
-
const KG_EXTRACTION_PROMPT = `Extract structured knowledge from the following conversation exchange. Output ONLY valid N-Triples (one per line, no blank lines). Use URIs for subjects/predicates and proper RDF syntax.
|
|
214
|
-
|
|
215
|
-
Rules:
|
|
216
|
-
- Subject URIs: use urn:dkg:entity:{slug} where slug is a lowercase-kebab-case identifier for the entity
|
|
217
|
-
- Use schema.org predicates where possible (e.g. <http://schema.org/name>, <http://schema.org/description>, <http://schema.org/knows>, <http://schema.org/about>)
|
|
218
|
-
- Use <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> for types
|
|
219
|
-
- String literals use "value" syntax; typed literals use "value"^^<datatype>
|
|
220
|
-
- Each triple must end with " ."
|
|
221
|
-
- Only extract factual, meaningful entities and relationships — skip conversational filler
|
|
222
|
-
- If no meaningful knowledge can be extracted, output exactly: NONE
|
|
223
|
-
|
|
224
|
-
Example output:
|
|
225
|
-
<urn:dkg:entity:alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .
|
|
226
|
-
<urn:dkg:entity:alice> <http://schema.org/name> "Alice Johnson" .
|
|
227
|
-
<urn:dkg:entity:alice> <http://schema.org/worksFor> <urn:dkg:entity:acme-corp> .
|
|
228
|
-
|
|
213
|
+
const KG_EXTRACTION_PROMPT = `Extract structured knowledge from the following conversation exchange. Output ONLY valid N-Triples (one per line, no blank lines). Use URIs for subjects/predicates and proper RDF syntax.
|
|
214
|
+
|
|
215
|
+
Rules:
|
|
216
|
+
- Subject URIs: use urn:dkg:entity:{slug} where slug is a lowercase-kebab-case identifier for the entity
|
|
217
|
+
- Use schema.org predicates where possible (e.g. <http://schema.org/name>, <http://schema.org/description>, <http://schema.org/knows>, <http://schema.org/about>)
|
|
218
|
+
- Use <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> for types
|
|
219
|
+
- String literals use "value" syntax; typed literals use "value"^^<datatype>
|
|
220
|
+
- Each triple must end with " ."
|
|
221
|
+
- Only extract factual, meaningful entities and relationships — skip conversational filler
|
|
222
|
+
- If no meaningful knowledge can be extracted, output exactly: NONE
|
|
223
|
+
|
|
224
|
+
Example output:
|
|
225
|
+
<urn:dkg:entity:alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .
|
|
226
|
+
<urn:dkg:entity:alice> <http://schema.org/name> "Alice Johnson" .
|
|
227
|
+
<urn:dkg:entity:alice> <http://schema.org/worksFor> <urn:dkg:entity:acme-corp> .
|
|
228
|
+
|
|
229
229
|
Conversation:`;
|
|
230
|
-
const MEMORY_PARSE_PROMPT = `Parse the following exported AI memories into individual structured items. Each memory is a discrete fact, preference, or piece of context the user previously shared with an AI assistant.
|
|
231
|
-
|
|
232
|
-
Output ONLY a valid JSON array. Each item should have:
|
|
233
|
-
- "text": the memory content as a clear sentence
|
|
234
|
-
- "category": one of "preference", "fact", "context", "instruction", "relationship"
|
|
235
|
-
|
|
236
|
-
Rules:
|
|
237
|
-
- Split compound memories into separate items when they contain distinct facts
|
|
238
|
-
- Normalize formatting: remove bullet markers, numbering, markdown artifacts
|
|
239
|
-
- Preserve the original meaning faithfully
|
|
240
|
-
- Skip metadata lines like "Here are your memories:" or "Last updated:"
|
|
241
|
-
- If no valid memories can be extracted, output: []
|
|
242
|
-
- Do NOT wrap in markdown code fences
|
|
243
|
-
|
|
244
|
-
Example input:
|
|
245
|
-
"- Prefers dark mode in all apps
|
|
246
|
-
- Works at Acme Corp as a senior engineer
|
|
247
|
-
- Has a dog named Max"
|
|
248
|
-
|
|
249
|
-
Example output:
|
|
250
|
-
[{"text":"Prefers dark mode in all apps","category":"preference"},{"text":"Works at Acme Corp as a senior engineer","category":"fact"},{"text":"Has a dog named Max","category":"fact"}]
|
|
251
|
-
|
|
230
|
+
const MEMORY_PARSE_PROMPT = `Parse the following exported AI memories into individual structured items. Each memory is a discrete fact, preference, or piece of context the user previously shared with an AI assistant.
|
|
231
|
+
|
|
232
|
+
Output ONLY a valid JSON array. Each item should have:
|
|
233
|
+
- "text": the memory content as a clear sentence
|
|
234
|
+
- "category": one of "preference", "fact", "context", "instruction", "relationship"
|
|
235
|
+
|
|
236
|
+
Rules:
|
|
237
|
+
- Split compound memories into separate items when they contain distinct facts
|
|
238
|
+
- Normalize formatting: remove bullet markers, numbering, markdown artifacts
|
|
239
|
+
- Preserve the original meaning faithfully
|
|
240
|
+
- Skip metadata lines like "Here are your memories:" or "Last updated:"
|
|
241
|
+
- If no valid memories can be extracted, output: []
|
|
242
|
+
- Do NOT wrap in markdown code fences
|
|
243
|
+
|
|
244
|
+
Example input:
|
|
245
|
+
"- Prefers dark mode in all apps
|
|
246
|
+
- Works at Acme Corp as a senior engineer
|
|
247
|
+
- Has a dog named Max"
|
|
248
|
+
|
|
249
|
+
Example output:
|
|
250
|
+
[{"text":"Prefers dark mode in all apps","category":"preference"},{"text":"Works at Acme Corp as a senior engineer","category":"fact"},{"text":"Has a dog named Max","category":"fact"}]
|
|
251
|
+
|
|
252
252
|
Memories to parse:`;
|
|
253
|
-
const MEMORY_KG_PROMPT = `Extract structured knowledge from the following personal memory items. These are facts/preferences a user previously stored with an AI assistant. Output ONLY valid N-Triples (one per line).
|
|
254
|
-
|
|
255
|
-
Rules:
|
|
256
|
-
- Subject URIs: use urn:dkg:entity:{slug} where slug is a lowercase-kebab-case identifier
|
|
257
|
-
- Use schema.org predicates where possible (e.g. <http://schema.org/name>, <http://schema.org/description>, <http://schema.org/knows>)
|
|
258
|
-
- Use <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> for types
|
|
259
|
-
- String literals use "value" syntax
|
|
260
|
-
- Each triple must end with " ."
|
|
261
|
-
- Focus on extracting entities (people, organizations, tools, places) and their relationships
|
|
262
|
-
- If no meaningful knowledge can be extracted, output exactly: NONE
|
|
263
|
-
|
|
253
|
+
const MEMORY_KG_PROMPT = `Extract structured knowledge from the following personal memory items. These are facts/preferences a user previously stored with an AI assistant. Output ONLY valid N-Triples (one per line).
|
|
254
|
+
|
|
255
|
+
Rules:
|
|
256
|
+
- Subject URIs: use urn:dkg:entity:{slug} where slug is a lowercase-kebab-case identifier
|
|
257
|
+
- Use schema.org predicates where possible (e.g. <http://schema.org/name>, <http://schema.org/description>, <http://schema.org/knows>)
|
|
258
|
+
- Use <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> for types
|
|
259
|
+
- String literals use "value" syntax
|
|
260
|
+
- Each triple must end with " ."
|
|
261
|
+
- Focus on extracting entities (people, organizations, tools, places) and their relationships
|
|
262
|
+
- If no meaningful knowledge can be extracted, output exactly: NONE
|
|
263
|
+
|
|
264
264
|
Memory items:`;
|
|
265
|
-
const SEMANTIC_RECALL_SYSTEM = `You are a SPARQL query generator. Output ONLY a valid SPARQL SELECT query.
|
|
266
|
-
|
|
267
|
-
IMPORTANT: Always use full URI syntax with angle brackets — NEVER use prefix shortcuts.
|
|
268
|
-
|
|
269
|
-
Available patterns:
|
|
270
|
-
- Sessions: ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Conversation>
|
|
271
|
-
- Messages: ?m <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Message>
|
|
272
|
-
- ?m <http://schema.org/text> ?text
|
|
273
|
-
- ?m <http://schema.org/author> <urn:dkg:chat:actor:user> or <urn:dkg:chat:actor:agent>
|
|
274
|
-
- ?m <http://schema.org/isPartOf> ?session
|
|
275
|
-
- ?m <http://schema.org/dateCreated> ?ts
|
|
276
|
-
- Entities: ?e <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type . FILTER(STRSTARTS(STR(?e), "urn:dkg:entity:"))
|
|
277
|
-
- ?e <http://schema.org/name> ?name
|
|
278
|
-
- ?e <http://schema.org/worksFor> ?org
|
|
279
|
-
- Memory links: ?m <http://dkg.io/ontology/contains> ?entity
|
|
280
|
-
- Entity mentions: ?entity <http://dkg.io/ontology/mentionedIn> ?message
|
|
281
|
-
|
|
265
|
+
const SEMANTIC_RECALL_SYSTEM = `You are a SPARQL query generator. Output ONLY a valid SPARQL SELECT query.
|
|
266
|
+
|
|
267
|
+
IMPORTANT: Always use full URI syntax with angle brackets — NEVER use prefix shortcuts.
|
|
268
|
+
|
|
269
|
+
Available patterns:
|
|
270
|
+
- Sessions: ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Conversation>
|
|
271
|
+
- Messages: ?m <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Message>
|
|
272
|
+
- ?m <http://schema.org/text> ?text
|
|
273
|
+
- ?m <http://schema.org/author> <urn:dkg:chat:actor:user> or <urn:dkg:chat:actor:agent>
|
|
274
|
+
- ?m <http://schema.org/isPartOf> ?session
|
|
275
|
+
- ?m <http://schema.org/dateCreated> ?ts
|
|
276
|
+
- Entities: ?e <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type . FILTER(STRSTARTS(STR(?e), "urn:dkg:entity:"))
|
|
277
|
+
- ?e <http://schema.org/name> ?name
|
|
278
|
+
- ?e <http://schema.org/worksFor> ?org
|
|
279
|
+
- Memory links: ?m <http://dkg.io/ontology/contains> ?entity
|
|
280
|
+
- Entity mentions: ?entity <http://dkg.io/ontology/mentionedIn> ?message
|
|
281
|
+
|
|
282
282
|
Always include LIMIT (default 50). Use FILTER with regex or CONTAINS for text search.`;
|
|
283
283
|
export class ChatMemoryManager {
|
|
284
284
|
tools;
|
|
@@ -431,10 +431,10 @@ export class ChatMemoryManager {
|
|
|
431
431
|
if (!trimmedTurnId)
|
|
432
432
|
return false;
|
|
433
433
|
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
434
|
-
const result = await this.tools.query(`SELECT ?turn WHERE {
|
|
435
|
-
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
436
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
437
|
-
?turn <${DKG_ONT}turnId> ${JSON.stringify(trimmedTurnId)} .
|
|
434
|
+
const result = await this.tools.query(`SELECT ?turn WHERE {
|
|
435
|
+
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
436
|
+
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
437
|
+
?turn <${DKG_ONT}turnId> ${JSON.stringify(trimmedTurnId)} .
|
|
438
438
|
} LIMIT 1`, this.wmReadOpts());
|
|
439
439
|
return (result.bindings ?? []).length > 0;
|
|
440
440
|
}
|
|
@@ -444,16 +444,16 @@ export class ChatMemoryManager {
|
|
|
444
444
|
if (!trimmedTurnId)
|
|
445
445
|
return null;
|
|
446
446
|
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
447
|
-
const result = await this.tools.query(`SELECT ?persistenceState ?transitionState WHERE {
|
|
448
|
-
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
449
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
450
|
-
?turn <${DKG_ONT}turnId> ${JSON.stringify(trimmedTurnId)} .
|
|
451
|
-
OPTIONAL { ?turn <${DKG_ONT}persistenceState> ?persistenceState }
|
|
452
|
-
OPTIONAL {
|
|
453
|
-
?transition <${RDF_TYPE}> <${CHAT_TURN_PERSISTENCE_TRANSITION_TYPE}> .
|
|
454
|
-
?transition <${CHAT_TURN_PERSISTENCE_TRANSITION_PREDICATE}> ?turn .
|
|
455
|
-
?transition <${DKG_ONT}persistenceState> ?transitionState .
|
|
456
|
-
}
|
|
447
|
+
const result = await this.tools.query(`SELECT ?persistenceState ?transitionState WHERE {
|
|
448
|
+
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
449
|
+
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
450
|
+
?turn <${DKG_ONT}turnId> ${JSON.stringify(trimmedTurnId)} .
|
|
451
|
+
OPTIONAL { ?turn <${DKG_ONT}persistenceState> ?persistenceState }
|
|
452
|
+
OPTIONAL {
|
|
453
|
+
?transition <${RDF_TYPE}> <${CHAT_TURN_PERSISTENCE_TRANSITION_TYPE}> .
|
|
454
|
+
?transition <${CHAT_TURN_PERSISTENCE_TRANSITION_PREDICATE}> ?turn .
|
|
455
|
+
?transition <${DKG_ONT}persistenceState> ?transitionState .
|
|
456
|
+
}
|
|
457
457
|
}`, this.wmReadOpts());
|
|
458
458
|
const states = (result.bindings ?? [])
|
|
459
459
|
.flatMap((binding) => [
|
|
@@ -668,12 +668,12 @@ export class ChatMemoryManager {
|
|
|
668
668
|
base.sessionCount = sumBindingValues(sessions.bindings, 'c');
|
|
669
669
|
const msgs = await this.tools.query(`SELECT (COUNT(*) AS ?c) WHERE { ?s <${RDF_TYPE}> <${SCHEMA}Message> }`, this.wmReadOpts());
|
|
670
670
|
base.messageCount = sumBindingValues(msgs.bindings, 'c');
|
|
671
|
-
const chatRelatedTriples = await this.tools.query(`SELECT (COUNT(*) AS ?c) WHERE {
|
|
672
|
-
{ ?s <${RDF_TYPE}> <${SCHEMA}Message> . ?s ?p ?o }
|
|
673
|
-
UNION
|
|
674
|
-
{ ?s <${RDF_TYPE}> <${SCHEMA}Conversation> . ?s ?p ?o }
|
|
675
|
-
UNION
|
|
676
|
-
{ ?s <${RDF_TYPE}> <${DKG_ONT}ToolInvocation> . ?s ?p ?o }
|
|
671
|
+
const chatRelatedTriples = await this.tools.query(`SELECT (COUNT(*) AS ?c) WHERE {
|
|
672
|
+
{ ?s <${RDF_TYPE}> <${SCHEMA}Message> . ?s ?p ?o }
|
|
673
|
+
UNION
|
|
674
|
+
{ ?s <${RDF_TYPE}> <${SCHEMA}Conversation> . ?s ?p ?o }
|
|
675
|
+
UNION
|
|
676
|
+
{ ?s <${RDF_TYPE}> <${DKG_ONT}ToolInvocation> . ?s ?p ?o }
|
|
677
677
|
}`, this.wmReadOpts());
|
|
678
678
|
const chatTripleCount = sumBindingValues(chatRelatedTriples.bindings, 'c');
|
|
679
679
|
const entities = await this.tools.query(`SELECT (COUNT(DISTINCT ?e) AS ?c) WHERE { ?e <${RDF_TYPE}> ?t . FILTER(STRSTARTS(STR(?e), "urn:dkg:entity:")) }`, this.wmReadOpts());
|
|
@@ -686,10 +686,10 @@ export class ChatMemoryManager {
|
|
|
686
686
|
async getEntities(limit = 50) {
|
|
687
687
|
await this.ensureInitialized();
|
|
688
688
|
try {
|
|
689
|
-
const result = await this.tools.query(`SELECT DISTINCT ?e ?type ?label WHERE {
|
|
690
|
-
?e <${RDF_TYPE}> ?type .
|
|
691
|
-
OPTIONAL { ?e <${SCHEMA}name> ?label }
|
|
692
|
-
FILTER(STRSTARTS(STR(?e), "urn:dkg:entity:"))
|
|
689
|
+
const result = await this.tools.query(`SELECT DISTINCT ?e ?type ?label WHERE {
|
|
690
|
+
?e <${RDF_TYPE}> ?type .
|
|
691
|
+
OPTIONAL { ?e <${SCHEMA}name> ?label }
|
|
692
|
+
FILTER(STRSTARTS(STR(?e), "urn:dkg:entity:"))
|
|
693
693
|
} LIMIT ${limit}`, this.wmReadOpts());
|
|
694
694
|
const entities = [];
|
|
695
695
|
for (const b of result.bindings ?? []) {
|
|
@@ -722,35 +722,35 @@ export class ChatMemoryManager {
|
|
|
722
722
|
: 500;
|
|
723
723
|
const order = opts.order === 'desc' ? 'DESC' : 'ASC';
|
|
724
724
|
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
725
|
-
const msgsResult = await this.tools.query(`SELECT ?m ?author ?text ?ts ?turnId ?persistenceState ?transitionState ?attachmentRefs ?failureReason ?transitionFailureReason ?transitionAssistantReply ?transitionAttachmentRefs ?transitionToolCalls WHERE {
|
|
726
|
-
{
|
|
727
|
-
SELECT ?m ?ts WHERE {
|
|
728
|
-
?m <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
729
|
-
?m <${SCHEMA}dateCreated> ?ts
|
|
730
|
-
} ORDER BY ${order}(?ts) LIMIT ${limit}
|
|
731
|
-
}
|
|
732
|
-
?m <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
733
|
-
?m <${SCHEMA}author> ?author .
|
|
734
|
-
?m <${SCHEMA}text> ?text .
|
|
735
|
-
?m <${SCHEMA}dateCreated> ?ts
|
|
736
|
-
OPTIONAL { ?m <${DKG_ONT}turnId> ?turnId }
|
|
737
|
-
OPTIONAL { ?m <${CHAT_ATTACHMENT_REFS_PREDICATE}> ?attachmentRefs }
|
|
738
|
-
OPTIONAL {
|
|
739
|
-
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
740
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
741
|
-
?turn <${DKG_ONT}turnId> ?turnId .
|
|
742
|
-
OPTIONAL { ?turn <${DKG_ONT}persistenceState> ?persistenceState }
|
|
743
|
-
OPTIONAL { ?turn <${DKG_ONT}failureReason> ?failureReason }
|
|
744
|
-
OPTIONAL {
|
|
745
|
-
?transition <${RDF_TYPE}> <${CHAT_TURN_PERSISTENCE_TRANSITION_TYPE}> .
|
|
746
|
-
?transition <${CHAT_TURN_PERSISTENCE_TRANSITION_PREDICATE}> ?turn .
|
|
747
|
-
?transition <${DKG_ONT}persistenceState> ?transitionState .
|
|
748
|
-
OPTIONAL { ?transition <${DKG_ONT}failureReason> ?transitionFailureReason }
|
|
749
|
-
OPTIONAL { ?transition <${DKG_ONT}assistantReply> ?transitionAssistantReply }
|
|
750
|
-
OPTIONAL { ?transition <${CHAT_ATTACHMENT_REFS_PREDICATE}> ?transitionAttachmentRefs }
|
|
751
|
-
OPTIONAL { ?transition <${DKG_ONT}toolCalls> ?transitionToolCalls }
|
|
752
|
-
}
|
|
753
|
-
}
|
|
725
|
+
const msgsResult = await this.tools.query(`SELECT ?m ?author ?text ?ts ?turnId ?persistenceState ?transitionState ?attachmentRefs ?failureReason ?transitionFailureReason ?transitionAssistantReply ?transitionAttachmentRefs ?transitionToolCalls WHERE {
|
|
726
|
+
{
|
|
727
|
+
SELECT ?m ?ts WHERE {
|
|
728
|
+
?m <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
729
|
+
?m <${SCHEMA}dateCreated> ?ts
|
|
730
|
+
} ORDER BY ${order}(?ts) LIMIT ${limit}
|
|
731
|
+
}
|
|
732
|
+
?m <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
733
|
+
?m <${SCHEMA}author> ?author .
|
|
734
|
+
?m <${SCHEMA}text> ?text .
|
|
735
|
+
?m <${SCHEMA}dateCreated> ?ts
|
|
736
|
+
OPTIONAL { ?m <${DKG_ONT}turnId> ?turnId }
|
|
737
|
+
OPTIONAL { ?m <${CHAT_ATTACHMENT_REFS_PREDICATE}> ?attachmentRefs }
|
|
738
|
+
OPTIONAL {
|
|
739
|
+
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
740
|
+
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
741
|
+
?turn <${DKG_ONT}turnId> ?turnId .
|
|
742
|
+
OPTIONAL { ?turn <${DKG_ONT}persistenceState> ?persistenceState }
|
|
743
|
+
OPTIONAL { ?turn <${DKG_ONT}failureReason> ?failureReason }
|
|
744
|
+
OPTIONAL {
|
|
745
|
+
?transition <${RDF_TYPE}> <${CHAT_TURN_PERSISTENCE_TRANSITION_TYPE}> .
|
|
746
|
+
?transition <${CHAT_TURN_PERSISTENCE_TRANSITION_PREDICATE}> ?turn .
|
|
747
|
+
?transition <${DKG_ONT}persistenceState> ?transitionState .
|
|
748
|
+
OPTIONAL { ?transition <${DKG_ONT}failureReason> ?transitionFailureReason }
|
|
749
|
+
OPTIONAL { ?transition <${DKG_ONT}assistantReply> ?transitionAssistantReply }
|
|
750
|
+
OPTIONAL { ?transition <${CHAT_ATTACHMENT_REFS_PREDICATE}> ?transitionAttachmentRefs }
|
|
751
|
+
OPTIONAL { ?transition <${DKG_ONT}toolCalls> ?transitionToolCalls }
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
754
|
} ORDER BY ${order}(?ts)`, this.wmReadOpts());
|
|
755
755
|
const bindings = msgsResult.bindings ?? [];
|
|
756
756
|
if (bindings.length === 0)
|
|
@@ -812,10 +812,10 @@ export class ChatMemoryManager {
|
|
|
812
812
|
await this.ensureInitialized();
|
|
813
813
|
try {
|
|
814
814
|
const expandedLimit = Math.max(limit, Math.min(limit * 4, 400));
|
|
815
|
-
const sessionsResult = await this.tools.query(`SELECT ?s ?sid (MAX(?mts) AS ?latest) WHERE {
|
|
816
|
-
?s <${RDF_TYPE}> <${SCHEMA}Conversation> .
|
|
817
|
-
?s <${DKG_ONT}sessionId> ?sid .
|
|
818
|
-
OPTIONAL { ?m <${SCHEMA}isPartOf> ?s . ?m <${SCHEMA}dateCreated> ?mts }
|
|
815
|
+
const sessionsResult = await this.tools.query(`SELECT ?s ?sid (MAX(?mts) AS ?latest) WHERE {
|
|
816
|
+
?s <${RDF_TYPE}> <${SCHEMA}Conversation> .
|
|
817
|
+
?s <${DKG_ONT}sessionId> ?sid .
|
|
818
|
+
OPTIONAL { ?m <${SCHEMA}isPartOf> ?s . ?m <${SCHEMA}dateCreated> ?mts }
|
|
819
819
|
} GROUP BY ?s ?sid ORDER BY DESC(?latest) LIMIT ${expandedLimit}`, this.wmReadOpts());
|
|
820
820
|
const sessionBindings = sessionsResult.bindings ?? [];
|
|
821
821
|
if (sessionBindings.length === 0)
|
|
@@ -842,12 +842,12 @@ export class ChatMemoryManager {
|
|
|
842
842
|
const values = sessionEntries
|
|
843
843
|
.map((entry) => `<${entry.sessionUri}>`)
|
|
844
844
|
.join(' ');
|
|
845
|
-
const allMsgs = await this.tools.query(`SELECT ?session ?author ?text ?ts WHERE {
|
|
846
|
-
VALUES ?session { ${values} }
|
|
847
|
-
?m <${SCHEMA}isPartOf> ?session .
|
|
848
|
-
?m <${SCHEMA}author> ?author .
|
|
849
|
-
?m <${SCHEMA}text> ?text .
|
|
850
|
-
?m <${SCHEMA}dateCreated> ?ts
|
|
845
|
+
const allMsgs = await this.tools.query(`SELECT ?session ?author ?text ?ts WHERE {
|
|
846
|
+
VALUES ?session { ${values} }
|
|
847
|
+
?m <${SCHEMA}isPartOf> ?session .
|
|
848
|
+
?m <${SCHEMA}author> ?author .
|
|
849
|
+
?m <${SCHEMA}text> ?text .
|
|
850
|
+
?m <${SCHEMA}dateCreated> ?ts
|
|
851
851
|
} ORDER BY ?session ?ts`, this.wmReadOpts());
|
|
852
852
|
const bySession = new Map();
|
|
853
853
|
for (const row of allMsgs.bindings ?? []) {
|
|
@@ -878,9 +878,9 @@ export class ChatMemoryManager {
|
|
|
878
878
|
await this.ensureInitialized();
|
|
879
879
|
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
880
880
|
const baseTurnId = opts?.baseTurnId?.trim() || null;
|
|
881
|
-
const countResult = await this.tools.query(`SELECT (COUNT(*) AS ?c) WHERE {
|
|
882
|
-
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
883
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
881
|
+
const countResult = await this.tools.query(`SELECT (COUNT(*) AS ?c) WHERE {
|
|
882
|
+
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
883
|
+
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
884
884
|
}`, this.wmReadOpts());
|
|
885
885
|
const turnCount = sumBindingValues(countResult.bindings, 'c');
|
|
886
886
|
if (turnCount === 0) {
|
|
@@ -901,20 +901,20 @@ export class ChatMemoryManager {
|
|
|
901
901
|
};
|
|
902
902
|
}
|
|
903
903
|
const turnUri = `${CHAT_NS}turn:${turnId}`;
|
|
904
|
-
const currentTurnResult = await this.tools.query(`SELECT ?tid ?ts WHERE {
|
|
905
|
-
<${turnUri}> <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
906
|
-
<${turnUri}> <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
907
|
-
<${turnUri}> <${DKG_ONT}turnId> ?tid .
|
|
908
|
-
OPTIONAL { <${turnUri}> <${SCHEMA}dateCreated> ?ts }
|
|
904
|
+
const currentTurnResult = await this.tools.query(`SELECT ?tid ?ts WHERE {
|
|
905
|
+
<${turnUri}> <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
906
|
+
<${turnUri}> <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
907
|
+
<${turnUri}> <${DKG_ONT}turnId> ?tid .
|
|
908
|
+
OPTIONAL { <${turnUri}> <${SCHEMA}dateCreated> ?ts }
|
|
909
909
|
} LIMIT 1`, this.wmReadOpts());
|
|
910
910
|
const currentTurn = (currentTurnResult.bindings ?? [])[0];
|
|
911
911
|
const currentTurnId = stripRdfLiteral(currentTurn?.tid ?? '').trim();
|
|
912
912
|
const currentTurnTs = stripRdfLiteral(currentTurn?.ts ?? '').trim();
|
|
913
|
-
const latestTurnResult = await this.tools.query(`SELECT ?latestTurnId ?latestTs WHERE {
|
|
914
|
-
?latestTurn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
915
|
-
?latestTurn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
916
|
-
?latestTurn <${DKG_ONT}turnId> ?latestTurnId .
|
|
917
|
-
OPTIONAL { ?latestTurn <${SCHEMA}dateCreated> ?latestTs }
|
|
913
|
+
const latestTurnResult = await this.tools.query(`SELECT ?latestTurnId ?latestTs WHERE {
|
|
914
|
+
?latestTurn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
915
|
+
?latestTurn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
916
|
+
?latestTurn <${DKG_ONT}turnId> ?latestTurnId .
|
|
917
|
+
OPTIONAL { ?latestTurn <${SCHEMA}dateCreated> ?latestTs }
|
|
918
918
|
} ORDER BY DESC(?latestTs) DESC(?latestTurnId) LIMIT 1`, this.wmReadOpts());
|
|
919
919
|
const latestTurnId = stripRdfLiteral((latestTurnResult.bindings ?? [])[0]?.latestTurnId ?? '').trim() || null;
|
|
920
920
|
if (!currentTurnId || currentTurnId !== turnId) {
|
|
@@ -939,34 +939,34 @@ export class ChatMemoryManager {
|
|
|
939
939
|
? `"${currentTurnTs}"^^<${XSD_DATETIME}>`
|
|
940
940
|
: null;
|
|
941
941
|
const previousTurnQuery = currentTsLiteral
|
|
942
|
-
? `SELECT ?previousTurnId WHERE {
|
|
943
|
-
?previousTurn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
944
|
-
?previousTurn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
945
|
-
?previousTurn <${DKG_ONT}turnId> ?previousTurnId .
|
|
946
|
-
?previousTurn <${SCHEMA}dateCreated> ?previousTs .
|
|
947
|
-
FILTER(
|
|
948
|
-
?previousTs < ${currentTsLiteral}
|
|
949
|
-
|| (?previousTs = ${currentTsLiteral} && ?previousTurnId < ${currentTurnIdLiteral})
|
|
950
|
-
)
|
|
942
|
+
? `SELECT ?previousTurnId WHERE {
|
|
943
|
+
?previousTurn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
944
|
+
?previousTurn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
945
|
+
?previousTurn <${DKG_ONT}turnId> ?previousTurnId .
|
|
946
|
+
?previousTurn <${SCHEMA}dateCreated> ?previousTs .
|
|
947
|
+
FILTER(
|
|
948
|
+
?previousTs < ${currentTsLiteral}
|
|
949
|
+
|| (?previousTs = ${currentTsLiteral} && ?previousTurnId < ${currentTurnIdLiteral})
|
|
950
|
+
)
|
|
951
951
|
} ORDER BY DESC(?previousTs) DESC(?previousTurnId) LIMIT 1`
|
|
952
|
-
: `SELECT ?previousTurnId WHERE {
|
|
953
|
-
?previousTurn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
954
|
-
?previousTurn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
955
|
-
?previousTurn <${DKG_ONT}turnId> ?previousTurnId .
|
|
956
|
-
FILTER(?previousTurnId < ${currentTurnIdLiteral})
|
|
952
|
+
: `SELECT ?previousTurnId WHERE {
|
|
953
|
+
?previousTurn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
954
|
+
?previousTurn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
955
|
+
?previousTurn <${DKG_ONT}turnId> ?previousTurnId .
|
|
956
|
+
FILTER(?previousTurnId < ${currentTurnIdLiteral})
|
|
957
957
|
} ORDER BY DESC(?previousTurnId) LIMIT 1`;
|
|
958
958
|
const previousTurnResult = await this.tools.query(previousTurnQuery, this.wmReadOpts());
|
|
959
959
|
const previousTurnId = stripRdfLiteral((previousTurnResult.bindings ?? [])[0]?.previousTurnId ?? '').trim() || null;
|
|
960
960
|
const turnIndexResult = currentTsLiteral
|
|
961
|
-
? await this.tools.query(`SELECT (COUNT(*) AS ?c) WHERE {
|
|
962
|
-
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
963
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
964
|
-
?turn <${DKG_ONT}turnId> ?tid .
|
|
965
|
-
?turn <${SCHEMA}dateCreated> ?ts .
|
|
966
|
-
FILTER(
|
|
967
|
-
?ts < ${currentTsLiteral}
|
|
968
|
-
|| (?ts = ${currentTsLiteral} && ?tid <= ${currentTurnIdLiteral})
|
|
969
|
-
)
|
|
961
|
+
? await this.tools.query(`SELECT (COUNT(*) AS ?c) WHERE {
|
|
962
|
+
?turn <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
963
|
+
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
964
|
+
?turn <${DKG_ONT}turnId> ?tid .
|
|
965
|
+
?turn <${SCHEMA}dateCreated> ?ts .
|
|
966
|
+
FILTER(
|
|
967
|
+
?ts < ${currentTsLiteral}
|
|
968
|
+
|| (?ts = ${currentTsLiteral} && ?tid <= ${currentTurnIdLiteral})
|
|
969
|
+
)
|
|
970
970
|
}`, this.wmReadOpts())
|
|
971
971
|
: { bindings: [{ c: String(previousTurnId ? 2 : 1) }] };
|
|
972
972
|
const turnIndex = Math.max(0, sumBindingValues(turnIndexResult.bindings, 'c'));
|
|
@@ -1005,10 +1005,10 @@ export class ChatMemoryManager {
|
|
|
1005
1005
|
triples: [],
|
|
1006
1006
|
};
|
|
1007
1007
|
}
|
|
1008
|
-
const turnMessagesResult = await this.tools.query(`SELECT ?user ?assistant WHERE {
|
|
1009
|
-
<${turnUri}> <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
1010
|
-
<${turnUri}> <${DKG_ONT}hasUserMessage> ?user .
|
|
1011
|
-
<${turnUri}> <${DKG_ONT}hasAssistantMessage> ?assistant .
|
|
1008
|
+
const turnMessagesResult = await this.tools.query(`SELECT ?user ?assistant WHERE {
|
|
1009
|
+
<${turnUri}> <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
1010
|
+
<${turnUri}> <${DKG_ONT}hasUserMessage> ?user .
|
|
1011
|
+
<${turnUri}> <${DKG_ONT}hasAssistantMessage> ?assistant .
|
|
1012
1012
|
} LIMIT 1`, this.wmReadOpts());
|
|
1013
1013
|
const turnMessages = (turnMessagesResult.bindings ?? [])[0];
|
|
1014
1014
|
const userMsgUri = String(turnMessages?.user ?? '').replace(/[<>]/g, '');
|
|
@@ -1030,18 +1030,18 @@ export class ChatMemoryManager {
|
|
|
1030
1030
|
triples: [],
|
|
1031
1031
|
};
|
|
1032
1032
|
}
|
|
1033
|
-
const relatedSubjectsResult = await this.tools.query(`SELECT DISTINCT ?s WHERE {
|
|
1034
|
-
VALUES ?msg { <${userMsgUri}> <${assistantMsgUri}> }
|
|
1035
|
-
{ BIND(<${sessionUri}> AS ?s) }
|
|
1036
|
-
UNION { BIND(<${turnUri}> AS ?s) }
|
|
1037
|
-
UNION { BIND(?msg AS ?s) }
|
|
1038
|
-
UNION { <${assistantMsgUri}> <${DKG_ONT}usedTool> ?s }
|
|
1039
|
-
UNION { ?s <${DKG_ONT}mentionedIn> ?msg }
|
|
1040
|
-
UNION {
|
|
1041
|
-
?entity <${DKG_ONT}mentionedIn> ?msg .
|
|
1042
|
-
?s <${DKG_ONT}contains> ?entity .
|
|
1043
|
-
?s <${DKG_ONT}extractedFrom> <${sessionUri}> .
|
|
1044
|
-
}
|
|
1033
|
+
const relatedSubjectsResult = await this.tools.query(`SELECT DISTINCT ?s WHERE {
|
|
1034
|
+
VALUES ?msg { <${userMsgUri}> <${assistantMsgUri}> }
|
|
1035
|
+
{ BIND(<${sessionUri}> AS ?s) }
|
|
1036
|
+
UNION { BIND(<${turnUri}> AS ?s) }
|
|
1037
|
+
UNION { BIND(?msg AS ?s) }
|
|
1038
|
+
UNION { <${assistantMsgUri}> <${DKG_ONT}usedTool> ?s }
|
|
1039
|
+
UNION { ?s <${DKG_ONT}mentionedIn> ?msg }
|
|
1040
|
+
UNION {
|
|
1041
|
+
?entity <${DKG_ONT}mentionedIn> ?msg .
|
|
1042
|
+
?s <${DKG_ONT}contains> ?entity .
|
|
1043
|
+
?s <${DKG_ONT}extractedFrom> <${sessionUri}> .
|
|
1044
|
+
}
|
|
1045
1045
|
} LIMIT 5000`, this.wmReadOpts());
|
|
1046
1046
|
const subjectSet = new Set([sessionUri, turnUri, userMsgUri, assistantMsgUri]);
|
|
1047
1047
|
for (const b of relatedSubjectsResult.bindings ?? []) {
|
|
@@ -1053,9 +1053,9 @@ export class ChatMemoryManager {
|
|
|
1053
1053
|
const values = [...subjectSet]
|
|
1054
1054
|
.map((iri) => `<${iri}>`)
|
|
1055
1055
|
.join(' ');
|
|
1056
|
-
const deltaResult = await this.tools.query(`CONSTRUCT { ?s ?p ?o } WHERE {
|
|
1057
|
-
VALUES ?s { ${values} }
|
|
1058
|
-
?s ?p ?o .
|
|
1056
|
+
const deltaResult = await this.tools.query(`CONSTRUCT { ?s ?p ?o } WHERE {
|
|
1057
|
+
VALUES ?s { ${values} }
|
|
1058
|
+
?s ?p ?o .
|
|
1059
1059
|
}`, this.wmReadOpts());
|
|
1060
1060
|
const quads = Array.isArray(deltaResult?.quads) ? deltaResult.quads : [];
|
|
1061
1061
|
const triples = quads.map((q) => ({
|
|
@@ -1089,11 +1089,11 @@ export class ChatMemoryManager {
|
|
|
1089
1089
|
await this.ensureInitialized();
|
|
1090
1090
|
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
1091
1091
|
const rootPattern = buildSessionRootPattern(sessionUri);
|
|
1092
|
-
const countQuery = `SELECT (COUNT(*) AS ?c) WHERE {
|
|
1093
|
-
{
|
|
1094
|
-
SELECT DISTINCT ?s WHERE ${rootPattern} LIMIT 5000
|
|
1095
|
-
}
|
|
1096
|
-
?s ?p ?o
|
|
1092
|
+
const countQuery = `SELECT (COUNT(*) AS ?c) WHERE {
|
|
1093
|
+
{
|
|
1094
|
+
SELECT DISTINCT ?s WHERE ${rootPattern} LIMIT 5000
|
|
1095
|
+
}
|
|
1096
|
+
?s ?p ?o
|
|
1097
1097
|
}`;
|
|
1098
1098
|
const swmCountResult = await this.tools.query(countQuery, {
|
|
1099
1099
|
contextGraphId: this.agentContextGraph,
|