@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.
Files changed (37) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +50 -50
  3. package/dist/chain-cursor-stores.js +6 -6
  4. package/dist/chat-memory.js +209 -209
  5. package/dist/db.js +955 -955
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +3 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/telemetry.d.ts +56 -0
  11. package/dist/telemetry.d.ts.map +1 -1
  12. package/dist/telemetry.js +96 -6
  13. package/dist/telemetry.js.map +1 -1
  14. package/dist-ui/assets/{3d-force-graph-Bl6v-uII.js → 3d-force-graph-C9KowW4u.js} +1 -1
  15. package/dist-ui/assets/{AgentHub-D2vaQxlw.js → AgentHub-BVrcom9_.js} +1 -1
  16. package/dist-ui/assets/{AgentProfilePage-BgSTdsjD.js → AgentProfilePage-C9XaTt7j.js} +1 -1
  17. package/dist-ui/assets/{ApproveWalletsModal-D0Ub_eiD.js → ApproveWalletsModal-BdR2mshx.js} +3 -3
  18. package/dist-ui/assets/{ConvictionDetailView-CieVypna.js → ConvictionDetailView-cao48GL1.js} +1 -1
  19. package/dist-ui/assets/{Network-DKw_XEGi.js → Network-B3jCYzr5.js} +1 -1
  20. package/dist-ui/assets/{OnChainProvenanceCard-Dn_IEP7Q.js → OnChainProvenanceCard-DboMX4Aq.js} +1 -1
  21. package/dist-ui/assets/{Operations-BO2C3UWB.js → Operations-Dg1gfLXv.js} +1 -1
  22. package/dist-ui/assets/{PublishingConviction-xKRNHbzk.js → PublishingConviction-Byp6t69e.js} +1 -1
  23. package/dist-ui/assets/{Settings-DC_d9STV.js → Settings-CxI0SKeV.js} +1 -1
  24. package/dist-ui/assets/{ccip-zWfeQL8Q.js → ccip-wJ3OMRuz.js} +1 -1
  25. package/dist-ui/assets/{index-CwRQnNYh.js → index-5DS6xjw0.js} +3 -3
  26. package/dist-ui/assets/index-DOjsv0r7.css +1 -0
  27. package/dist-ui/assets/index-KoAnx9JE.js +1661 -0
  28. package/dist-ui/assets/{jsonld-B67IUHNU-C3ydusi_.js → jsonld-32FQRO67-CDirPi8u.js} +2 -2
  29. package/dist-ui/assets/{jsonld-G-CM-8JR.js → jsonld-CwHW9UDN.js} +1 -1
  30. package/dist-ui/assets/{renderer-3d-OSESAPET-ConXqyK6.js → renderer-3d-2EVDZII7-BNXV6iSu.js} +2 -2
  31. package/dist-ui/assets/{shikiHighlighter-C6lRYd1O.js → shikiHighlighter-C-LWPPSu.js} +1 -1
  32. package/dist-ui/index.html +14 -14
  33. package/package.json +4 -3
  34. package/dist-ui/assets/index-DEtfq9qv.css +0 -1
  35. package/dist-ui/assets/index-hrI-Ir4l.js +0 -1661
  36. /package/dist-ui/assets/{ntriples-SF2LFNMC-DH7OofPp.js → ntriples-ZWBY2WET-DH7OofPp.js} +0 -0
  37. /package/dist-ui/assets/{turtle-BXN4L2BY-BzTu0283.js → turtle-JJPK7LJ5-BzTu0283.js} +0 -0
@@ -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,