@xopcai/xopc 0.0.315 → 0.0.317

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 (160) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BbFOF2SH.js → agent-avatar-dicebear-BmmO4j0u.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-D9T-QGmd.js → agent-defaults-settings-panel-2NGwyCKB.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agents-Ds5sQcPd.js → agents-Cb4lfXqA.js} +1 -1
  6. package/dist/gateway/static/root/assets/{api-BzloAiIG.js → api-Fu9gSeAI.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-BpUHskXq.js → app-management-settings-panel-BhIQOlam.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-CQd5Vo6f.js → appearance-settings-DwW3wrBX.js} +1 -1
  9. package/dist/gateway/static/root/assets/{apps-page-B7VIsfye.js → apps-page-ByLoHKiD.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-BM4O6WfL.js → archive-plugin-DzQeKhMy.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-Cdn9MYmI.js → attachment-load-CNWbDfHi.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-page-DnRx-Ra4.js → automations-page-CZcaFAco.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-workspace-CGTrgDlW.js +7 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-dkhUf4bm.js → binary-plugins-D5-gEs50.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-BTzqEuAy.js → block-editor-DngH5soo.js} +5 -5
  16. package/dist/gateway/static/root/assets/{browser-automation-inputs-Bowij-nJ.js → browser-automation-inputs-DeGdfGUg.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-automations-page-CQ7SYTQj.js → browser-automations-page-D_vsV9Og.js} +1 -1
  18. package/dist/gateway/static/root/assets/browser-settings-page-DCpyjtI7.js +3 -0
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-C3clEWb3.js +8 -0
  20. package/dist/gateway/static/root/assets/channels-settings-Dibm8FJG.js +1 -0
  21. package/dist/gateway/static/root/assets/{chat-terminal-dock-DzgFHd6l.js → chat-terminal-dock-DyoR9vy9.js} +1 -1
  22. package/dist/gateway/static/root/assets/{computer-settings-page-380_vIqO.js → computer-settings-page-Dp1d7MGE.js} +1 -1
  23. package/dist/gateway/static/root/assets/{connector-service-page-DILFakXb.js → connector-service-page--SapHT59.js} +1 -1
  24. package/dist/gateway/static/root/assets/connectors-page-CV2K0GsR.js +2 -0
  25. package/dist/gateway/static/root/assets/{date-picker-CRVun-T5.js → date-picker-BpJiursq.js} +1 -1
  26. package/dist/gateway/static/root/assets/{dependency-picker-BoWqt5yU.js → dependency-picker-BKLcvu4-.js} +1 -1
  27. package/dist/gateway/static/root/assets/{desktop-pet-DPlkBjft.js → desktop-pet-DNBeDygk.js} +1 -1
  28. package/dist/gateway/static/root/assets/{desktop-pet-settings-D7FgfX_K.js → desktop-pet-settings-C1wzPZky.js} +1 -1
  29. package/dist/gateway/static/root/assets/device-pairing-wizard-tCgXlVNO.js +1 -0
  30. package/dist/gateway/static/root/assets/{extension-debug-page-CT_QkSN_.js → extension-debug-page-BoG796xN.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-page-BF1NdcKP.js → extension-page-DatEJD_W.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-settings-page-CKQVZ3Xc.js → extension-settings-page-cs0pcgqa.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-config-swr-BPsZPoAT.js → gateway-config-swr-CYa7aVok.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-settings-3bIy7XMr.js → gateway-settings-DSxwMkLj.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-startup-retry-cG6EqUJw.js → gateway-startup-retry-FZix2Im1.js} +1 -1
  36. package/dist/gateway/static/root/assets/home-page-3cToq8Ic.js +1 -0
  37. package/dist/gateway/static/root/assets/{image-generation-api-DI_QutIx.js → image-generation-api-IDhumota.js} +1 -1
  38. package/dist/gateway/static/root/assets/{imports-page-BUG6G72F.js → imports-page-BZ-0tsFU.js} +1 -1
  39. package/dist/gateway/static/root/assets/index-Ca4fdHsK.css +1 -0
  40. package/dist/gateway/static/root/assets/index-DqxyVarz.js +89 -0
  41. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-qnG-4FJs.js → keyboard-shortcuts-settings-CyXLl8PE.js} +1 -1
  42. package/dist/gateway/static/root/assets/{local-app-workbench-page-B3iJWhjN.js → local-app-workbench-page-ZjNFRbSU.js} +2 -2
  43. package/dist/gateway/static/root/assets/{local-apps-page-BpEGeURS.js → local-apps-page-BmcNQOEx.js} +1 -1
  44. package/dist/gateway/static/root/assets/{locale-store-BlgpZORR.js → locale-store-BrnrrtSS.js} +1 -1
  45. package/dist/gateway/static/root/assets/{logs-page-0QPGj-5c.js → logs-page-DoaBVsR2.js} +2 -2
  46. package/dist/gateway/static/root/assets/{management-settings-Sl0wwidS.js → management-settings-BkCC5j8K.js} +1 -1
  47. package/dist/gateway/static/root/assets/{markdown-view-BzjjpL2H.js → markdown-view-DUfjxG4s.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-Bzkdhotn.js → media-plugins-DFNzifXX.js} +1 -1
  49. package/dist/gateway/static/root/assets/messages-BoEi2k2p.js +3 -0
  50. package/dist/gateway/static/root/assets/note-detail-panel-CLxgY3Xq.js +5 -0
  51. package/dist/gateway/static/root/assets/notes-page-CgQEb3ks.js +8 -0
  52. package/dist/gateway/static/root/assets/{page-context-capture-button-CFt4hXQ6.js → page-context-capture-button-Beu5hjB5.js} +1 -1
  53. package/dist/gateway/static/root/assets/{page-tabs-Dz_x22MQ.js → page-tabs-DWppfGs6.js} +1 -1
  54. package/dist/gateway/static/root/assets/{preview-open-alternatives-C1mkgFAl.js → preview-open-alternatives-CjBsxcGv.js} +1 -1
  55. package/dist/gateway/static/root/assets/{product-open-page-DHZgzSDV.js → product-open-page-BYoaBpad.js} +1 -1
  56. package/dist/gateway/static/root/assets/project-detail-page-BtiNnPuJ.js +1 -0
  57. package/dist/gateway/static/root/assets/{projects-page-CEr8DX9I.js → projects-page-_Qc8812P.js} +1 -1
  58. package/dist/gateway/static/root/assets/{registry-api-DMW2apOO.js → registry-api-DgKqRZl1.js} +1 -1
  59. package/dist/gateway/static/root/assets/{remote-access-hub-Db-B-Mf3.js → remote-access-hub-CpI6OjSj.js} +1 -1
  60. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DEJi0BLL.js → runtime-tools-settings-panel-Dykdq60b.js} +1 -1
  61. package/dist/gateway/static/root/assets/scenes-page-hP1OhIG6.js +2 -0
  62. package/dist/gateway/static/root/assets/{schema-form-RVltVpuG.js → schema-form-BPeMGXnp.js} +1 -1
  63. package/dist/gateway/static/root/assets/sessions-page-Dmncs4GP.js +1 -0
  64. package/dist/gateway/static/root/assets/settings-advanced-gate-CV2LhIvd.js +1 -0
  65. package/dist/gateway/static/root/assets/{settings-form-section-BkBO7woF.js → settings-form-section-OfLwze5k.js} +1 -1
  66. package/dist/gateway/static/root/assets/{settings-page-zl0XY203.js → settings-page-D-koQ_0e.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-page-layout-lLvHc-zF.js → settings-page-layout-r1Q31sB_.js} +1 -1
  68. package/dist/gateway/static/root/assets/{setup-status-panel-Difrpr4T.js → setup-status-panel-MiIbmzZu.js} +1 -1
  69. package/dist/gateway/static/root/assets/{share-preview-page-NC4Gj867.js → share-preview-page-BkSzw3wN.js} +1 -1
  70. package/dist/gateway/static/root/assets/{shares-settings-DPLvEcB-.js → shares-settings-BT9NIsiS.js} +1 -1
  71. package/dist/gateway/static/root/assets/skill-reload-api-BgxB-kmG.js +1 -0
  72. package/dist/gateway/static/root/assets/{skills-page-CzekvBNQ.js → skills-page-CfL2BT9s.js} +1 -1
  73. package/dist/gateway/static/root/assets/{skills-page.utils-BLeiN245.js → skills-page.utils-BKdQtHAI.js} +1 -1
  74. package/dist/gateway/static/root/assets/{system-settings-panel-Bp75s9nl.js → system-settings-panel-Del-7fwn.js} +1 -1
  75. package/dist/gateway/static/root/assets/task-detail-page-q8NLbitF.js +1 -0
  76. package/dist/gateway/static/root/assets/{tunnel-api-BDiaC6an.js → tunnel-api-DK9ICDPw.js} +1 -1
  77. package/dist/gateway/static/root/assets/{use-autosave-C_ntK_Zu.js → use-autosave-BLZSp59v.js} +1 -1
  78. package/dist/gateway/static/root/assets/user-model-page-DPfaWuJs.js +2 -0
  79. package/dist/gateway/static/root/assets/{voice-api-key-field-D4cfuMp1.js → voice-api-key-field-Lzm2ik7J.js} +1 -1
  80. package/dist/gateway/static/root/assets/{voice-config-api-Cjvd6maH.js → voice-config-api-F6NsgxNd.js} +1 -1
  81. package/dist/gateway/static/root/assets/work-discovery-overlay-CkC8ANVw.js +1 -0
  82. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-C80nrmKi.js → workflow-run-setup-panel-DoevvbCd.js} +2 -2
  83. package/dist/gateway/static/root/assets/workflows-page-CZxaaUK8.js +6 -0
  84. package/dist/gateway/static/root/index.html +8 -8
  85. package/dist/package.js +1 -1
  86. package/dist/src/agent/agent-manager.js +14 -13
  87. package/dist/src/agent/embedded/run-turn.js +28 -15
  88. package/dist/src/agent/embedded/system-prompt-override.js +14 -3
  89. package/dist/src/agent/embedded/xopc-stream-bridge.js +13 -2
  90. package/dist/src/agent/memory/context-budget.js +1 -1
  91. package/dist/src/agent/orchestration/agent-turn-policy.d.ts +2 -2
  92. package/dist/src/agent/prompt/agent-system-prompt.d.ts +3 -0
  93. package/dist/src/agent/prompt/agent-system-prompt.js +16 -0
  94. package/dist/src/agent/tools/knowledge-memory-tool.js +1 -0
  95. package/dist/src/agent-config/schema.d.ts +8 -8
  96. package/dist/src/ai-assist/text-assist.js +2 -1
  97. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  98. package/dist/src/config/schema.d.ts +5 -5
  99. package/dist/src/connectors/connected-source-ingestion.d.ts +1 -0
  100. package/dist/src/connectors/connected-source-ingestion.js +1 -0
  101. package/dist/src/connectors/connected-source-understanding.d.ts +1 -0
  102. package/dist/src/connectors/connected-source-understanding.js +91 -31
  103. package/dist/src/connectors/content-enrichment.d.ts +1 -0
  104. package/dist/src/connectors/content-enrichment.js +3 -1
  105. package/dist/src/connectors/learning-coordinator.js +24 -24
  106. package/dist/src/gateway/chat-stream/mapper.js +9 -4
  107. package/dist/src/gateway/chat-stream/protocol.d.ts +2 -1
  108. package/dist/src/gateway/hono/lib/config-payload.d.ts +2 -2
  109. package/dist/src/gateway/hono/routes/user-model-refresh.js +2 -2
  110. package/dist/src/gateway/hono/routes/voice.js +1 -1
  111. package/dist/src/gateway/service.js +6 -6
  112. package/dist/src/knowledge/ingestion-service.d.ts +5 -2
  113. package/dist/src/knowledge/ingestion-service.js +24 -15
  114. package/dist/src/knowledge-memory/domain.d.ts +1 -1
  115. package/dist/src/platform/client.d.ts +1 -1
  116. package/dist/src/platform/contracts.d.ts +1 -1
  117. package/dist/src/providers/extension-stream-bridge.js +6 -4
  118. package/dist/src/providers/model-call.js +3 -3
  119. package/dist/src/providers/presentation.js +4 -3
  120. package/dist/src/storage/sqlite/context-extraction-repository.d.ts +1 -2
  121. package/dist/src/storage/sqlite/context-extraction-repository.js +1 -9
  122. package/dist/src/storage/sqlite/index.d.ts +1 -2
  123. package/dist/src/storage/sqlite/index.js +2 -3
  124. package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
  125. package/dist/src/storage/sqlite/knowledge-repository.js +3 -0
  126. package/dist/src/storage/sqlite/migrations/200_connected_work_threads.sql +92 -0
  127. package/dist/src/storage/sqlite/migrations/201_connector_extraction_audit.sql +127 -0
  128. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  129. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  130. package/dist/src/storage/sqlite/schema.js +1 -1
  131. package/dist/src/storage/sqlite/schema.sql +1 -1
  132. package/dist/src/user-context/domain.d.ts +0 -13
  133. package/dist/src/user-context/sources/index.js +2 -2
  134. package/dist/src/user-context/sources/repository.d.ts +10 -0
  135. package/dist/src/user-context/sources/repository.js +19 -4
  136. package/dist/src/user-context/sources/types.d.ts +1 -0
  137. package/package.json +8 -8
  138. package/dist/gateway/static/root/assets/automations-workspace-B5s10G5F.js +0 -7
  139. package/dist/gateway/static/root/assets/browser-settings-page-vqLoPOOg.js +0 -3
  140. package/dist/gateway/static/root/assets/capabilities-settings-panel-DI68WGYd.js +0 -8
  141. package/dist/gateway/static/root/assets/channels-settings-Cimssy-S.js +0 -1
  142. package/dist/gateway/static/root/assets/connectors-page-COmFp9HC.js +0 -2
  143. package/dist/gateway/static/root/assets/device-pairing-wizard-BP6yxut8.js +0 -1
  144. package/dist/gateway/static/root/assets/home-page-DFNDLFgv.js +0 -1
  145. package/dist/gateway/static/root/assets/index-BCi8nfxs.js +0 -89
  146. package/dist/gateway/static/root/assets/index-DWgd1VK2.css +0 -1
  147. package/dist/gateway/static/root/assets/messages-2GhUD7SC.js +0 -3
  148. package/dist/gateway/static/root/assets/note-detail-panel-BXtD71j1.js +0 -5
  149. package/dist/gateway/static/root/assets/notes-page-DNY4vW-u.js +0 -8
  150. package/dist/gateway/static/root/assets/project-detail-page-D3NhZ7ZZ.js +0 -1
  151. package/dist/gateway/static/root/assets/scenes-page-BUUX-PnI.js +0 -2
  152. package/dist/gateway/static/root/assets/sessions-page-Rm4H2okS.js +0 -1
  153. package/dist/gateway/static/root/assets/settings-advanced-gate-VxPItcOG.js +0 -1
  154. package/dist/gateway/static/root/assets/skill-reload-api-CKdLCf_-.js +0 -1
  155. package/dist/gateway/static/root/assets/task-detail-page-Bh8H4FYR.js +0 -1
  156. package/dist/gateway/static/root/assets/user-model-page-C7gFCGAV.js +0 -2
  157. package/dist/gateway/static/root/assets/work-discovery-overlay-Ce6ToB0O.js +0 -1
  158. package/dist/gateway/static/root/assets/workflows-page-CVQjo3RI.js +0 -6
  159. package/dist/src/storage/sqlite/context-relation-repository.d.ts +0 -50
  160. package/dist/src/storage/sqlite/context-relation-repository.js +0 -98
@@ -15,7 +15,7 @@ import "../knowledge/index.js";
15
15
  import { ingestComposioConnectedSource } from "./connected-source-ingestion.js";
16
16
  import { deriveConnectedSourceUnderstanding } from "./connected-source-understanding.js";
17
17
  import { listConnectedContentCandidates, readConnectedContent } from "./content-enrichment.js";
18
- import { createUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceGrants, listUnderstandingSourceRuns, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
18
+ import { getConnectorUnderstandingSourceRun, getOrCreateConnectorUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceGrants, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
19
19
  //#region src/connectors/learning-coordinator.ts
20
20
  init_logger();
21
21
  const log = createLogger("ConnectorLearning");
@@ -35,29 +35,26 @@ function connectorSourceCategory(toolkit) {
35
35
  function ensureUnderstandingSourceRun(job, toolkit, displayName) {
36
36
  const existing = listUnderstandingSourceGrants({ includeRevoked: true }).find((grant) => grant.sourceKey === `connector-account:${job.accountId}`);
37
37
  if (existing?.status === "revoked") throw new Error("Source authorization was revoked.");
38
- const grant = existing ?? upsertUnderstandingSourceGrant({
39
- sourceKey: `connector-account:${job.accountId}`,
40
- adapterId: `connector:${job.connectorId}`,
41
- category: connectorSourceCategory(toolkit),
42
- platform: "all",
43
- displayName,
44
- accessMode: "continuous",
45
- retentionPolicy: "bounded_raw",
46
- processingPolicy: "remote_allowed",
47
- config: {
48
- connectorId: job.connectorId,
49
- accountId: job.accountId,
50
- readOnly: true
51
- }
52
- });
53
- return listUnderstandingSourceRuns(grant.id, 100).find((run) => run.metadata.connectorLearningJobId === job.id) ?? createUnderstandingSourceRun({
54
- grantId: grant.id,
38
+ return getOrCreateConnectorUnderstandingSourceRun({
39
+ grantId: (existing ?? upsertUnderstandingSourceGrant({
40
+ sourceKey: `connector-account:${job.accountId}`,
41
+ adapterId: `connector:${job.connectorId}`,
42
+ category: connectorSourceCategory(toolkit),
43
+ platform: "all",
44
+ displayName,
45
+ accessMode: "continuous",
46
+ retentionPolicy: "bounded_raw",
47
+ processingPolicy: "remote_allowed",
48
+ config: {
49
+ connectorId: job.connectorId,
50
+ accountId: job.accountId,
51
+ readOnly: true
52
+ }
53
+ })).id,
54
+ connectorLearningJobId: job.id,
55
55
  kind: job.mode,
56
56
  status: "queued",
57
- metadata: {
58
- connectorLearningJobId: job.id,
59
- connectorId: job.connectorId
60
- }
57
+ metadata: { connectorId: job.connectorId }
61
58
  });
62
59
  }
63
60
  function learningEnabled(config) {
@@ -177,6 +174,7 @@ function startConnectorLearningCoordinator(options) {
177
174
  }
178
175
  let itemsSeen = 0;
179
176
  let itemsIndexed = 0;
177
+ const changedSourceItemIds = /* @__PURE__ */ new Set();
180
178
  for (const stream of plan.streams) {
181
179
  const synced = await ingestComposioConnectedSource({
182
180
  config: options.getConfig(),
@@ -191,6 +189,7 @@ function startConnectorLearningCoordinator(options) {
191
189
  });
192
190
  itemsSeen += synced.itemsSeen;
193
191
  itemsIndexed += synced.itemsIndexed;
192
+ for (const sourceItemId of synced.sourceItemIds) changedSourceItemIds.add(sourceItemId);
194
193
  }
195
194
  const enrichmentErrors = [];
196
195
  if (plan.toolkit === "googledrive") {
@@ -206,6 +205,7 @@ function startConnectorLearningCoordinator(options) {
206
205
  });
207
206
  enrichmentErrors.push(...enriched.failed.map((failure) => failure.error));
208
207
  itemsIndexed += enriched.completed;
208
+ for (const sourceItemId of enriched.sourceItemIds) changedSourceItemIds.add(sourceItemId);
209
209
  }
210
210
  }
211
211
  if (listConnectorLearningJobs({
@@ -229,6 +229,7 @@ function startConnectorLearningCoordinator(options) {
229
229
  config: options.getConfig(),
230
230
  agentId: job.agentId,
231
231
  sourceInstanceId: job.sourceInstanceId,
232
+ sourceItemIds: [...changedSourceItemIds],
232
233
  sourceRunId: sourceRun.id,
233
234
  processingPolicy: getUnderstandingSourceGrant(sourceRun.grantId)?.processingPolicy ?? "local_only",
234
235
  assertAuthorized: () => {
@@ -324,8 +325,7 @@ function startConnectorLearningCoordinator(options) {
324
325
  }));
325
326
  const definition = getConnectorDefinition(job.connectorId);
326
327
  if (definition?.runtime.type === "composio" && definition.runtime.role === "toolkit") {
327
- const grant = listUnderstandingSourceGrants({ includeRevoked: true }).find((item) => item.sourceKey === `connector-account:${job.accountId}`);
328
- const sourceRun = grant && listUnderstandingSourceRuns(grant.id, 100).find((item) => item.metadata.connectorLearningJobId === job.id);
328
+ const sourceRun = listUnderstandingSourceGrants({ includeRevoked: true }).find((item) => item.sourceKey === `connector-account:${job.accountId}`) && getConnectorUnderstandingSourceRun(job.id);
329
329
  if (sourceRun) updateUnderstandingSourceRun(sourceRun.id, {
330
330
  status: "failed",
331
331
  errorMessage: learningFailureCode(err),
@@ -168,7 +168,8 @@ var ChatStreamMapper = class {
168
168
  if (delta?.type === "text_delta" && typeof delta.delta === "string" && delta.delta) {
169
169
  events.push(this.make("assistant_delta", {
170
170
  messageId,
171
- delta: delta.delta
171
+ delta: delta.delta,
172
+ offset: this.currentAssistantText.length
172
173
  }));
173
174
  this.currentAssistantText += delta.delta;
174
175
  }
@@ -182,7 +183,8 @@ var ChatStreamMapper = class {
182
183
  if (suffix) {
183
184
  events.push(this.make("assistant_delta", {
184
185
  messageId,
185
- delta: suffix
186
+ delta: suffix,
187
+ offset: this.currentAssistantText.length
186
188
  }));
187
189
  this.currentAssistantText = text || `${this.currentAssistantText}${suffix}`;
188
190
  }
@@ -204,10 +206,12 @@ var ChatStreamMapper = class {
204
206
  const text = extractTextFromMessage(message);
205
207
  const suffix = appendSuffix(this.currentAssistantText, text);
206
208
  if (!suffix) return [];
209
+ const offset = this.currentAssistantText.length;
207
210
  this.currentAssistantText = text || `${this.currentAssistantText}${suffix}`;
208
211
  return [this.make("assistant_delta", {
209
212
  messageId,
210
- delta: suffix
213
+ delta: suffix,
214
+ offset
211
215
  })];
212
216
  }
213
217
  mapMessageEnd(raw) {
@@ -227,7 +231,8 @@ var ChatStreamMapper = class {
227
231
  const suffix = appendSuffix(this.currentAssistantText, text);
228
232
  if (suffix) events.push(this.make("assistant_delta", {
229
233
  messageId,
230
- delta: suffix
234
+ delta: suffix,
235
+ offset: this.currentAssistantText.length
231
236
  }));
232
237
  this.currentAssistantText = text || this.currentAssistantText;
233
238
  events.push(this.make("thinking_end", { messageId }));
@@ -44,7 +44,8 @@ export type AssistantMessageStartEvent = ChatStreamEnvelope<'assistant_message_s
44
44
  }>;
45
45
  export type AssistantDeltaEvent = ChatStreamEnvelope<'assistant_delta', {
46
46
  messageId: string;
47
- delta: string;
47
+ delta: string; /** UTF-16 offset before this delta. */
48
+ offset?: number;
48
49
  }>;
49
50
  export type ThinkingDeltaEvent = ChatStreamEnvelope<'thinking_delta', {
50
51
  messageId: string;
@@ -28,7 +28,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
28
28
  primary: string;
29
29
  fallbacks: string[];
30
30
  };
31
- intents?: Partial<Record<"review" | "coding" | "understanding" | "fast" | "reasoning" | "vision", {
31
+ intents?: Partial<Record<"review" | "coding" | "fast" | "reasoning" | "vision" | "understanding", {
32
32
  primary: string;
33
33
  fallbacks: string[];
34
34
  }>>;
@@ -72,7 +72,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
72
72
  primary: string;
73
73
  fallbacks: string[];
74
74
  };
75
- intents: Partial<Record<"review" | "coding" | "understanding" | "fast" | "reasoning" | "vision", {
75
+ intents: Partial<Record<"review" | "coding" | "fast" | "reasoning" | "vision" | "understanding", {
76
76
  primary: string;
77
77
  fallbacks: string[];
78
78
  }>>;
@@ -2,7 +2,7 @@ import { listConnectorLearningJobs } from "../../../storage/sqlite/connector-lea
2
2
  import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
3
3
  import "../../../storage/sqlite/index.js";
4
4
  import { getWorkDiscoveryRun } from "../../../work-discovery/repository.js";
5
- import { listUnderstandingSourceRuns } from "../../../user-context/sources/repository.js";
5
+ import { getConnectorUnderstandingSourceRun } from "../../../user-context/sources/repository.js";
6
6
  import { isLocalUnderstandingSourceId } from "../../../user-context/sources/local-source-contract.js";
7
7
  import { normalizeUnderstandingSourceItems } from "../../../work-discovery/service.js";
8
8
  import { UnderstandingRefreshService } from "../../../user-context/sources/refresh-service.js";
@@ -63,7 +63,7 @@ function createUnderstandingRefreshService(deps) {
63
63
  phase: "completed",
64
64
  error: "Connector update is no longer available."
65
65
  };
66
- const sourceRun = listUnderstandingSourceRuns(run.grantId, 100).find((item) => item.id !== run.id && item.metadata.connectorLearningJobId === job.id);
66
+ const sourceRun = getConnectorUnderstandingSourceRun(job.id);
67
67
  if (job.status === "completed") return {
68
68
  status: sourceRun?.status === "partial" ? "partial" : "completed",
69
69
  phase: "completed",
@@ -21,8 +21,8 @@ import { VoiceSessionCreationError, resolveStreamingStt, resolveStreamingTts } f
21
21
  import { getGatewayPrincipal } from "../../security/gateway-principal.js";
22
22
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
23
23
  import { selectPlatformVoice, voiceSettingsCatalog } from "../../../voice/platform-settings.js";
24
- import { listTtsProvidersForApi } from "../../../voice/tts/list-providers.js";
25
24
  import { listLocalVoiceModelStatuses, removeLocalVoiceModel, startLocalVoiceModelInstall } from "../../../voice/local/model-manager.js";
25
+ import { listTtsProvidersForApi } from "../../../voice/tts/list-providers.js";
26
26
  import { z } from "zod";
27
27
  //#region src/gateway/hono/routes/voice.ts
28
28
  init_voice();
@@ -66,18 +66,18 @@ import { registerClarificationChannelRuntime } from "./clarify-runtime.js";
66
66
  import { ChannelManager } from "../channels/manager.js";
67
67
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
68
68
  import "../config/index.js";
69
- import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
70
- import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
71
- import "../knowledge/index.js";
72
- import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
73
- import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
74
- import { startConnectorSupervisor } from "../connectors/supervisor.js";
75
69
  import { DiscussionService } from "../discussions/service.js";
76
70
  import { DiscussionOrganizer } from "../discussions/organizer.js";
77
71
  import { DiscussionLiveWorker } from "../discussions/live-worker.js";
78
72
  import { DiscussionOrganizerWorker } from "../discussions/organizer-worker.js";
79
73
  import { DiscussionSealer } from "../discussions/sealer.js";
80
74
  import "../discussions/index.js";
75
+ import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
76
+ import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
77
+ import "../knowledge/index.js";
78
+ import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
79
+ import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
80
+ import { startConnectorSupervisor } from "../connectors/supervisor.js";
81
81
  import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
82
82
  import "../endpoint-tools/index.js";
83
83
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
@@ -1,4 +1,7 @@
1
1
  import type { KnowledgeSourceAdapter, KnowledgeSourceItemInput, KnowledgeSyncRun } from './types.js';
2
+ export type KnowledgeIngestionResult = KnowledgeSyncRun & {
3
+ changedItemIds: string[];
4
+ };
2
5
  export interface KnowledgeSourceStateStore {
3
6
  getCursor(instanceId: string, collectionScope: string): string | undefined;
4
7
  setCursor(instanceId: string, collectionScope: string, cursor: string | undefined): void;
@@ -17,12 +20,12 @@ export declare class KnowledgeIngestionService {
17
20
  items: KnowledgeSourceItemInput[];
18
21
  cursorAfter?: string;
19
22
  warnings?: string[];
20
- }): KnowledgeSyncRun;
23
+ }): KnowledgeIngestionResult;
21
24
  sync(params: {
22
25
  adapterKind: string;
23
26
  instanceId: string;
24
27
  collectionScope: string;
25
28
  windowStart?: string;
26
29
  signal?: AbortSignal;
27
- }): Promise<KnowledgeSyncRun>;
30
+ }): Promise<KnowledgeIngestionResult>;
28
31
  }
@@ -64,15 +64,18 @@ var KnowledgeIngestionService = class {
64
64
  try {
65
65
  const stored = upsertKnowledgeSourceItems(params.items);
66
66
  this.state.setCursor(params.instanceId, params.collectionScope, params.cursorAfter);
67
- return finishKnowledgeSyncRun({
68
- runId: run.id,
69
- status: params.warnings?.length ? "partial" : "succeeded",
70
- cursorAfter: params.cursorAfter,
71
- itemsSeen: params.items.length,
72
- itemsCreated: stored.created,
73
- itemsUpdated: stored.updated,
74
- warnings: params.warnings
75
- });
67
+ return {
68
+ ...finishKnowledgeSyncRun({
69
+ runId: run.id,
70
+ status: params.warnings?.length ? "partial" : "succeeded",
71
+ cursorAfter: params.cursorAfter,
72
+ itemsSeen: params.items.length,
73
+ itemsCreated: stored.created,
74
+ itemsUpdated: stored.updated,
75
+ warnings: params.warnings
76
+ }),
77
+ changedItemIds: stored.changedItemIds
78
+ };
76
79
  } catch (err) {
77
80
  const errorMessage = err instanceof Error ? err.message : String(err);
78
81
  finishKnowledgeSyncRun({
@@ -139,7 +142,10 @@ var KnowledgeIngestionService = class {
139
142
  itemsUpdated: stored.updated,
140
143
  itemsDeleted: tombstones.length
141
144
  }, "Knowledge source sync completed");
142
- return completed;
145
+ return {
146
+ ...completed,
147
+ changedItemIds: stored.changedItemIds
148
+ };
143
149
  } catch (err) {
144
150
  const errorMessage = err instanceof Error ? err.message : String(err);
145
151
  const status = signal.aborted ? "cancelled" : "failed";
@@ -148,11 +154,14 @@ var KnowledgeIngestionService = class {
148
154
  runId: run.id,
149
155
  sourceInstanceId: params.instanceId
150
156
  }, `Knowledge source sync ${status}: ${errorMessage}`);
151
- return finishKnowledgeSyncRun({
152
- runId: run.id,
153
- status,
154
- error: errorMessage
155
- });
157
+ return {
158
+ ...finishKnowledgeSyncRun({
159
+ runId: run.id,
160
+ status,
161
+ error: errorMessage
162
+ }),
163
+ changedItemIds: []
164
+ };
156
165
  }
157
166
  }
158
167
  };
@@ -1,5 +1,5 @@
1
1
  import type { UserModelScope } from '../user-model/domain.js';
2
- export type KnowledgeKind = 'project_fact' | 'workspace_fact' | 'decision' | 'task_lesson' | 'commitment' | 'open_question' | 'episode' | 'note';
2
+ export type KnowledgeKind = 'work_thread' | 'project_fact' | 'workspace_fact' | 'decision' | 'task_lesson' | 'commitment' | 'open_question' | 'episode' | 'note';
3
3
  export type KnowledgeStatus = 'candidate' | 'active' | 'needs_review' | 'stale' | 'archived' | 'rejected';
4
4
  export type KnowledgeReviewAction = 'approve' | 'edit_and_approve' | 'reject' | 'archive';
5
5
  export type KnowledgeStatusActor = 'user' | 'agent' | 'runtime' | 'maintenance' | 'migration';
@@ -33,10 +33,10 @@ export declare const RuntimeCommandSchema: z.ZodObject<{
33
33
  intents: z.ZodArray<z.ZodEnum<{
34
34
  review: "review";
35
35
  coding: "coding";
36
- understanding: "understanding";
37
36
  fast: "fast";
38
37
  reasoning: "reasoning";
39
38
  vision: "vision";
39
+ understanding: "understanding";
40
40
  }>>;
41
41
  allow: z.ZodArray<z.ZodString>;
42
42
  }, z.core.$strict>;
@@ -119,10 +119,10 @@ export declare const AgentManifestSchema: z.ZodObject<{
119
119
  intents: z.ZodArray<z.ZodEnum<{
120
120
  review: "review";
121
121
  coding: "coding";
122
- understanding: "understanding";
123
122
  fast: "fast";
124
123
  reasoning: "reasoning";
125
124
  vision: "vision";
125
+ understanding: "understanding";
126
126
  }>>;
127
127
  allow: z.ZodArray<z.ZodString>;
128
128
  }, z.core.$strict>;
@@ -4,7 +4,7 @@ import "./constants.js";
4
4
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
5
5
  import { init_providers } from "./index.js";
6
6
  import { stripPromptCacheBoundary } from "../agent/prompt/cache-boundary.js";
7
- import { createAssistantMessageEventStream, streamSimple } from "@earendil-works/pi-ai/compat";
7
+ import { createAssistantMessageEventStream, getCurrentSystemPrompt, getCurrentTools, streamSimple } from "@earendil-works/pi-ai/compat";
8
8
  //#region src/providers/extension-stream-bridge.ts
9
9
  init_plugin_registry();
10
10
  init_providers();
@@ -78,11 +78,13 @@ function createExtensionAwareStreamFn() {
78
78
  modelId: model.id
79
79
  }, "Streaming via extension provider");
80
80
  const stream = createAssistantMessageEventStream();
81
+ const systemPrompt = getCurrentSystemPrompt(context.messages);
82
+ const tools = getCurrentTools(context.messages);
81
83
  const params = {
82
84
  model: model.id,
83
- systemPrompt: context.systemPrompt ? stripPromptCacheBoundary(context.systemPrompt) : void 0,
84
- messages: context.messages,
85
- tools: context.tools,
85
+ systemPrompt: systemPrompt ? stripPromptCacheBoundary(systemPrompt) : void 0,
86
+ messages: context.messages.filter((message) => message.role !== "system"),
87
+ tools,
86
88
  temperature: options?.temperature,
87
89
  maxTokens: options?.maxTokens,
88
90
  apiKey: options?.apiKey,
@@ -1,7 +1,7 @@
1
1
  import { init_constants } from "./constants.js";
2
2
  import { getApiKey, init_providers } from "./index.js";
3
3
  import { createExtensionAwareStreamFn } from "./extension-stream-bridge.js";
4
- import { completeSimple } from "@earendil-works/pi-ai/compat";
4
+ import { completeSimple, normalizeContext } from "@earendil-works/pi-ai/compat";
5
5
  //#region src/providers/model-call.ts
6
6
  init_constants();
7
7
  init_providers();
@@ -42,7 +42,7 @@ async function resolveModelCallOptions(model, options = {}, credentialOptions) {
42
42
  */
43
43
  async function completeWithResolvedCredentials(model, context, options = {}, credentialOptions) {
44
44
  const resolvedOptions = await resolveModelCallOptions(model, options, credentialOptions);
45
- if (model.baseUrl === "extension://provider-plugin") return await (await createExtensionAwareStreamFn()(model, context, resolvedOptions)).result();
45
+ if (model.baseUrl === "extension://provider-plugin") return await (await createExtensionAwareStreamFn()(model, normalizeContext(context), resolvedOptions)).result();
46
46
  return await completeSimple(model, context, resolvedOptions);
47
47
  }
48
48
  /**
@@ -52,7 +52,7 @@ async function completeWithResolvedCredentials(model, context, options = {}, cre
52
52
  */
53
53
  async function createResolvedModelStream(model, context, options = {}, credentialOptions) {
54
54
  const resolvedOptions = await resolveModelCallOptions(model, options, credentialOptions);
55
- return await createExtensionAwareStreamFn()(model, context, resolvedOptions);
55
+ return await createExtensionAwareStreamFn()(model, normalizeContext(context), resolvedOptions);
56
56
  }
57
57
  //#endregion
58
58
  export { completeWithResolvedCredentials, createResolvedModelStream, isLocalModelBaseUrl, resolveModelCallApiKey, resolveModelCallOptions, supportsModelTemperature };
@@ -207,9 +207,10 @@ const RECOMMENDED_MODEL_PATTERNS = {
207
207
  "zhipu-cn": [/^glm-5\.2$/i],
208
208
  zai: [/^glm-5\.2$/i],
209
209
  "zai-coding-cn": [
210
- /^glm-5\.2$/i,
211
- /^glm-5\.1$/i,
212
- /^glm-5-turbo$/i
210
+ /^glm-5\.3$/i,
211
+ /^glm-5\.3-highspeed$/i,
212
+ /^glm-5\.3-flash$/i,
213
+ /^glm-4\.6v$/i
213
214
  ],
214
215
  "zai-coding-global": [/^glm-5\.2$/i],
215
216
  "zhipu-coding-cn": [/^glm-5\.2$/i],
@@ -1,5 +1,5 @@
1
1
  export type ContextExtractionStatus = 'running' | 'completed' | 'skipped' | 'failed';
2
- export type ContextObjectType = 'profile' | 'rule' | 'focus' | 'understanding';
2
+ export type ContextObjectType = 'assertion' | 'rule' | 'goal' | 'knowledge';
3
3
  export type ContextExtractionRun = {
4
4
  id: string;
5
5
  principalId: string;
@@ -54,4 +54,3 @@ export declare function listContextExtractionRuns(filter?: {
54
54
  }): ContextExtractionRun[];
55
55
  export declare function getContextExtractionRun(id: string): ContextExtractionRun | null;
56
56
  export declare function listContextExtractionOutputs(runId: string): ContextExtractionOutput[];
57
- export declare function hasIndependentExtractionOutput(runIds: string[], objectType: ContextObjectType, objectId: string): boolean;
@@ -108,13 +108,5 @@ function listContextExtractionOutputs(runId) {
108
108
  return getSqliteDatabase().prepare(`SELECT * FROM context_extraction_outputs
109
109
  WHERE extraction_run_id = ? ORDER BY ordinal`).all(runId).map(outputFromRow);
110
110
  }
111
- function hasIndependentExtractionOutput(runIds, objectType, objectId) {
112
- if (!runIds.length) return false;
113
- const placeholders = runIds.map(() => "?").join(", ");
114
- return Boolean(getSqliteDatabase().prepare(`SELECT 1 FROM context_extraction_outputs o
115
- JOIN context_extraction_runs r ON r.extraction_run_id = o.extraction_run_id
116
- WHERE o.extraction_run_id NOT IN (${placeholders}) AND o.object_type = ? AND o.object_id = ?
117
- AND r.status = 'completed' LIMIT 1`).get(...runIds, objectType, objectId));
118
- }
119
111
  //#endregion
120
- export { claimContextExtractionRun, finishContextExtractionRun, getContextExtractionRun, hasIndependentExtractionOutput, listContextExtractionOutputs, listContextExtractionRuns };
112
+ export { claimContextExtractionRun, finishContextExtractionRun, getContextExtractionRun, listContextExtractionOutputs, listContextExtractionRuns };
@@ -10,8 +10,7 @@ export { deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrow
10
10
  export { authenticateDeviceAccessToken, buildRefreshProofMessage, createDevice, getDevice, issueDeviceTokenPair, listDevices, revokeDevice, rotateDeviceRefreshToken, type DeviceAccessIdentity, type DevicePlatform, type DevicePublicKeyJwk, type DeviceRecord, type DeviceTokenPair, } from './device-access-repository.js';
11
11
  export { clearGatewayIdentityForTest, getOrCreateGatewayIdentity, signGatewayPayload, type GatewayIdentity, } from './gateway-identity-repository.js';
12
12
  export { createDevicePairingSetup, isDevicePairingSetupActive, type DevicePairingSetup, type DeviceRoute, } from './device-pairing-repository.js';
13
- export { claimContextExtractionRun, finishContextExtractionRun, getContextExtractionRun, hasIndependentExtractionOutput, listContextExtractionOutputs, listContextExtractionRuns, type ContextExtractionOutput, type ContextExtractionRun, type ContextExtractionStatus, type ContextObjectType, } from './context-extraction-repository.js';
14
- export { closeTemporalAssertions, createTemporalAssertion, linkContextObjects, listContextObjectRelations, listTemporalAssertions, type ContextObjectRelation, type ContextTemporalAssertion, } from './context-relation-repository.js';
13
+ export { claimContextExtractionRun, finishContextExtractionRun, getContextExtractionRun, listContextExtractionOutputs, listContextExtractionRuns, type ContextExtractionOutput, type ContextExtractionRun, type ContextExtractionStatus, type ContextObjectType, } from './context-extraction-repository.js';
15
14
  export { createCollaborationRule, getCollaborationRule, listCollaborationRules, setCollaborationRuleStatus, type CollaborationRule, } from './collaboration-rule-repository.js';
16
15
  export { createContextEvidence, type ContextEvidence } from './context-evidence-repository.js';
17
16
  export { getUserPerson, getUserPeopleIndexState, listUserPeople, mergeUserPeople, replaceUserPeopleIndex, summarizeUserPeople, updateUserPerson, } from './user-people-repository.js';
@@ -12,8 +12,7 @@ import { deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrow
12
12
  import { authenticateDeviceAccessToken, buildRefreshProofMessage, createDevice, getDevice, issueDeviceTokenPair, listDevices, revokeDevice, rotateDeviceRefreshToken } from "./device-access-repository.js";
13
13
  import { clearGatewayIdentityForTest, getOrCreateGatewayIdentity, signGatewayPayload } from "./gateway-identity-repository.js";
14
14
  import { createDevicePairingSetup, isDevicePairingSetupActive } from "./device-pairing-repository.js";
15
- import { claimContextExtractionRun, finishContextExtractionRun, getContextExtractionRun, hasIndependentExtractionOutput, listContextExtractionOutputs, listContextExtractionRuns } from "./context-extraction-repository.js";
16
- import { closeTemporalAssertions, createTemporalAssertion, linkContextObjects, listContextObjectRelations, listTemporalAssertions } from "./context-relation-repository.js";
15
+ import { claimContextExtractionRun, finishContextExtractionRun, getContextExtractionRun, listContextExtractionOutputs, listContextExtractionRuns } from "./context-extraction-repository.js";
17
16
  import { createCollaborationRule, getCollaborationRule, listCollaborationRules, setCollaborationRuleStatus } from "./collaboration-rule-repository.js";
18
17
  import { createContextEvidence } from "./context-evidence-repository.js";
19
18
  import { getUserPeopleIndexState, getUserPerson, listUserPeople, mergeUserPeople, replaceUserPeopleIndex, summarizeUserPeople, updateUserPerson } from "./user-people-repository.js";
@@ -58,4 +57,4 @@ init_session_repository();
58
57
  init_connector_repository();
59
58
  init_connector_account_repository();
60
59
  //#endregion
61
- export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, SidebarLayoutConflictError, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, buildRelationshipPrompt, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeTemporalAssertions, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, createTemporalAssertion, decideConnectorApproval, deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrowserTabBindingsByPrincipal, deleteConnectorConnection, deleteConnectorInstallation, deleteEndpointSessionBinding, deleteEndpointSessionBindingsByPrincipal, deleteKnowledgeSourceItems, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findConversationIdByTranscriptId, findLatestAssistantTranscriptEntryId, findSessionInput, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActiveClarification, getActivityEventRecord, getBrowserTabBinding, getBrowserTabBindingById, getCachedConnectorCatalogEntry, getClarification, getClarificationResumeInput, getClarificationSnapshot, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextExtractionRun, getCurrentTranscriptId, getDevice, getEndpointPrincipal, getEndpointSessionBinding, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getNoteAgentContextRecord, getNoteRecord, getOrCreateGatewayIdentity, getRelationshipSettings, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionPersistedLevels, getSessionTaskPlan, getSidebarLayout, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasIndependentExtractionOutput, hasSessionConfig, incrementSessionStatsOnAppend, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isXopcDatabaseOpen, issueDeviceTokenPair, linkContextObjects, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listContextObjectRelations, listDevices, listEndpointPrincipals, listEndpointToolInvocationAuditPage, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTemporalAssertions, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceSidebarLayout, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, sortBySidebarLayout, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
60
+ export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, SidebarLayoutConflictError, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, buildRelationshipPrompt, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, decideConnectorApproval, deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrowserTabBindingsByPrincipal, deleteConnectorConnection, deleteConnectorInstallation, deleteEndpointSessionBinding, deleteEndpointSessionBindingsByPrincipal, deleteKnowledgeSourceItems, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findConversationIdByTranscriptId, findLatestAssistantTranscriptEntryId, findSessionInput, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActiveClarification, getActivityEventRecord, getBrowserTabBinding, getBrowserTabBindingById, getCachedConnectorCatalogEntry, getClarification, getClarificationResumeInput, getClarificationSnapshot, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextExtractionRun, getCurrentTranscriptId, getDevice, getEndpointPrincipal, getEndpointSessionBinding, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getNoteAgentContextRecord, getNoteRecord, getOrCreateGatewayIdentity, getRelationshipSettings, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionPersistedLevels, getSessionTaskPlan, getSidebarLayout, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isXopcDatabaseOpen, issueDeviceTokenPair, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listDevices, listEndpointPrincipals, listEndpointToolInvocationAuditPage, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceSidebarLayout, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, sortBySidebarLayout, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
@@ -25,6 +25,7 @@ export declare function getKnowledgeSourceCursor(sourceInstanceId: string, colle
25
25
  export declare function setKnowledgeSourceCursor(sourceInstanceId: string, collectionScope: string, cursor: string | undefined): void;
26
26
  export declare function upsertKnowledgeSourceItems(inputs: KnowledgeSourceItemInput[], nowMs?: number): {
27
27
  items: KnowledgeSourceItem[];
28
+ changedItemIds: string[];
28
29
  created: number;
29
30
  updated: number;
30
31
  unchanged: number;
@@ -144,6 +144,7 @@ function setKnowledgeSourceCursor(sourceInstanceId, collectionScope, cursor) {
144
144
  function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
145
145
  return runSqliteWriteTransaction((db) => {
146
146
  const items = [];
147
+ const changedItemIds = [];
147
148
  let created = 0;
148
149
  let updated = 0;
149
150
  let unchanged = 0;
@@ -184,6 +185,7 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
184
185
  updated_at = excluded.updated_at`).run(id, input.sourceInstanceId, input.collectionScope, input.externalId, input.itemType, input.authorRole ?? null, parseTimestamp(input.occurredAt), parseTimestamp(input.sourceUpdatedAt), input.contentHash, input.normalizedText ?? null, input.payloadRef ?? null, JSON.stringify(input.metadata ?? {}), input.sensitivity ?? "normal", input.retentionClass ?? "bounded", input.synthesisPipeline ?? "user_understanding", input.synthesisStatus ?? "pending", parseTimestamp(input.deletedAt), existing?.created_at ?? nowMs, nowMs);
185
186
  const row = db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(id);
186
187
  items.push(sourceItemFromRow(row));
188
+ changedItemIds.push(id);
187
189
  const changeKind = input.deletedAt ? "deleted" : existing ? "modified" : "added";
188
190
  db.prepare(`INSERT INTO knowledge_source_changes (
189
191
  change_id, source_instance_id, source_item_id, change_kind,
@@ -194,6 +196,7 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
194
196
  }
195
197
  return {
196
198
  items,
199
+ changedItemIds,
197
200
  created,
198
201
  updated,
199
202
  unchanged
@@ -0,0 +1,92 @@
1
+ ALTER TABLE knowledge_item_status_events RENAME TO knowledge_item_status_events_v199;
2
+ ALTER TABLE knowledge_items RENAME TO knowledge_items_v199;
3
+
4
+ CREATE TABLE knowledge_items (
5
+ knowledge_id TEXT PRIMARY KEY,
6
+ principal_id TEXT NOT NULL,
7
+ kind TEXT NOT NULL CHECK(kind IN (
8
+ 'work_thread', 'project_fact', 'workspace_fact', 'decision', 'task_lesson',
9
+ 'commitment', 'open_question', 'episode', 'note'
10
+ )),
11
+ scope_type TEXT NOT NULL CHECK(scope_type IN ('global', 'agent', 'workspace', 'project', 'session')),
12
+ scope_id TEXT,
13
+ content TEXT NOT NULL,
14
+ canonical_key TEXT NOT NULL,
15
+ status TEXT NOT NULL CHECK(status IN ('candidate', 'active', 'needs_review', 'stale', 'archived', 'rejected')),
16
+ confidence REAL NOT NULL CHECK(confidence >= 0 AND confidence <= 1),
17
+ importance REAL NOT NULL CHECK(importance >= 0 AND importance <= 1),
18
+ valid_from INTEGER,
19
+ valid_to INTEGER,
20
+ expires_at INTEGER,
21
+ review_at INTEGER,
22
+ origin_class TEXT NOT NULL CHECK(origin_class IN ('owner', 'agent', 'system', 'untrusted')),
23
+ source_agent_id TEXT,
24
+ source_conversation_id TEXT,
25
+ source_turn_id TEXT,
26
+ derived_from_recalled_context INTEGER NOT NULL DEFAULT 0 CHECK(derived_from_recalled_context IN (0, 1)),
27
+ source_json TEXT NOT NULL DEFAULT '{}' CHECK(json_valid(source_json)),
28
+ created_at INTEGER NOT NULL,
29
+ updated_at INTEGER NOT NULL,
30
+ record_class TEXT NOT NULL DEFAULT 'memory' CHECK(record_class IN ('memory', 'source_index')),
31
+ CHECK(valid_to IS NULL OR valid_from IS NULL OR valid_to >= valid_from)
32
+ );
33
+
34
+ INSERT INTO knowledge_items (
35
+ knowledge_id, principal_id, kind, scope_type, scope_id, content, canonical_key,
36
+ status, confidence, importance, valid_from, valid_to, expires_at, review_at,
37
+ origin_class, source_agent_id, source_conversation_id, source_turn_id,
38
+ derived_from_recalled_context, source_json, created_at, updated_at, record_class
39
+ )
40
+ SELECT
41
+ knowledge_id,
42
+ principal_id,
43
+ CASE
44
+ WHEN record_class = 'memory' AND canonical_key LIKE 'connected-thread:%'
45
+ THEN 'work_thread'
46
+ ELSE kind
47
+ END,
48
+ CASE
49
+ WHEN record_class = 'memory' AND canonical_key LIKE 'connected-thread:%'
50
+ THEN 'global'
51
+ ELSE scope_type
52
+ END,
53
+ CASE
54
+ WHEN record_class = 'memory' AND canonical_key LIKE 'connected-thread:%'
55
+ THEN NULL
56
+ ELSE scope_id
57
+ END,
58
+ content, canonical_key, status, confidence, importance, valid_from, valid_to,
59
+ expires_at, review_at, origin_class, source_agent_id, source_conversation_id,
60
+ source_turn_id, derived_from_recalled_context, source_json, created_at, updated_at,
61
+ record_class
62
+ FROM knowledge_items_v199;
63
+
64
+ CREATE TABLE knowledge_item_status_events (
65
+ event_id TEXT PRIMARY KEY,
66
+ knowledge_id TEXT NOT NULL REFERENCES knowledge_items(knowledge_id) ON DELETE CASCADE,
67
+ from_status TEXT,
68
+ to_status TEXT NOT NULL,
69
+ actor_type TEXT NOT NULL CHECK(actor_type IN ('user', 'agent', 'runtime', 'maintenance', 'migration')),
70
+ reason TEXT NOT NULL,
71
+ created_at INTEGER NOT NULL
72
+ );
73
+
74
+ INSERT INTO knowledge_item_status_events
75
+ SELECT * FROM knowledge_item_status_events_v199;
76
+
77
+ DROP TABLE knowledge_item_status_events_v199;
78
+ DROP TABLE knowledge_items_v199;
79
+
80
+ CREATE INDEX idx_knowledge_items_status
81
+ ON knowledge_items(principal_id, status, updated_at DESC);
82
+ CREATE INDEX idx_knowledge_items_scope
83
+ ON knowledge_items(principal_id, scope_type, scope_id, status);
84
+ CREATE INDEX idx_knowledge_items_lifecycle
85
+ ON knowledge_items(status, expires_at, review_at);
86
+ CREATE INDEX idx_knowledge_items_class_status
87
+ ON knowledge_items(principal_id, record_class, status, updated_at DESC);
88
+ CREATE UNIQUE INDEX idx_knowledge_items_canonical
89
+ ON knowledge_items(principal_id, canonical_key, scope_type, COALESCE(scope_id, ''))
90
+ WHERE status IN ('candidate', 'active', 'needs_review', 'stale');
91
+ CREATE INDEX idx_knowledge_item_status_events_item
92
+ ON knowledge_item_status_events(knowledge_id, created_at DESC);