@xopcai/xopc 0.0.223 → 0.0.225

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 (197) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/demo-memory/src/index.js +10 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{activity-store--GBciH10.js → activity-store-CtTYnku4.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-C93T3FLD.js → agent-avatar-dicebear-dizuqu_4.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DeEEFZJ4.js +68 -0
  7. package/dist/gateway/static/root/assets/{api-HoIz_ija.js → api-CLRMz2BT.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-Bhl8Xluk.js → app-management-settings-panel-Cnk-DtQh.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-CywEN-kG.js → appearance-settings-wP0rogVI.js} +1 -1
  10. package/dist/gateway/static/root/assets/{apps-page-BZY09nuJ.js → apps-page-Db5YNHVM.js} +1 -1
  11. package/dist/gateway/static/root/assets/{archive-plugin-CteCVsBP.js → archive-plugin-Cpzsm-DM.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-CbNE_EPd.js → attachment-load-Bd2OOoEK.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-Bcqk6tOx.js → automations-page-DNqhguyk.js} +1 -1
  14. package/dist/gateway/static/root/assets/automations-workspace-CNT05YTb.js +6 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-M_i3WS5M.js → binary-plugins-Dcma5HdI.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-eg9LEH2o.js → block-editor-D-B8ThwK.js} +3 -3
  17. package/dist/gateway/static/root/assets/{browser-settings-page-kKwbvzjj.js → browser-settings-page-UbDj3LIq.js} +3 -3
  18. package/dist/gateway/static/root/assets/{browser-workflow-inputs-1UZ0vnIy.js → browser-workflow-inputs-BAPZIXrs.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-workflows-page-D8ATQqZ5.js → browser-workflows-page-DHtaSKEh.js} +1 -1
  20. package/dist/gateway/static/root/assets/capabilities-settings-panel-CiO152QS.js +7 -0
  21. package/dist/gateway/static/root/assets/{capability-presets-api-yNqTIuyd.js → capability-presets-api-zsZQ7im3.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-CgdRkwnk.js → capability-presets-settings-panel-Bc_hRwfL.js} +2 -2
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-krezGsKc.js → channel-recipient-api-Cp8iaaXp.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-CFW7zBoT.js +1 -0
  25. package/dist/gateway/static/root/assets/channels-status-swr-5rNVq7iI.js +1 -0
  26. package/dist/gateway/static/root/assets/{chat-terminal-dock-DQ5bB4Su.js → chat-terminal-dock-Dr6Rq2ln.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-DLBr5nre.js +2 -0
  28. package/dist/gateway/static/root/assets/{cron-expression-CEwPkdhh.js → cron-expression-BiXrpzmo.js} +1 -1
  29. package/dist/gateway/static/root/assets/{date-picker-DDAxTir8.js → date-picker-BPuRtwKt.js} +1 -1
  30. package/dist/gateway/static/root/assets/{dependency-picker-CYVoSZwI.js → dependency-picker-BNC_W7wI.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-CrNKfW_c.js → desktop-pet-DzOpt5nI.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-settings-C06PaB46.js → desktop-pet-settings-BW0brCvH.js} +1 -1
  33. package/dist/gateway/static/root/assets/{directory-picker-path-field--D7laeLF.js → directory-picker-path-field-Baml0uTS.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-debug-page-Dn4Px9KQ.js → extension-debug-page-CBXyKmfS.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-page-DzLf3fMQ.js → extension-page-BBhcr_SZ.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-DIchwtvB.js → extension-settings-page-4rwWpN9_.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-SmTGLhqK.js → gateway-config-api-Dg-BlBe4.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-config-swr-yUxMMVjK.js → gateway-config-swr-Du0MvK9s.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-settings-yCDkOYzA.js → gateway-settings-BOuYZOYe.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-startup-retry-9mrsL84j.js → gateway-startup-retry-JbjcHCaN.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-settings-CquIULHX.js → heartbeat-settings-Dq4YAlSx.js} +1 -1
  42. package/dist/gateway/static/root/assets/home-page-BIXkO0Ck.js +1 -0
  43. package/dist/gateway/static/root/assets/{image-generation-api-CgFAGDi8.js → image-generation-api-G2tfPvKP.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-Csccu8sa.js +74 -0
  45. package/dist/gateway/static/root/assets/index-D3_xSYKd.css +2 -0
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DI2To7yl.js → keyboard-shortcuts-settings-L1Vtxgp9.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-app-workbench-page-D-eacBcO.js +2 -0
  48. package/dist/gateway/static/root/assets/{local-apps-page-CSEJsQ1F.js → local-apps-page--thlkBLS.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-CPylQjH9.js → locale-store-DqJz-cOR.js} +1 -1
  50. package/dist/gateway/static/root/assets/logs-page-BRCglHvd.js +2 -0
  51. package/dist/gateway/static/root/assets/{management-settings-CgyaIyuk.js → management-settings-p55fR4XO.js} +1 -1
  52. package/dist/gateway/static/root/assets/{markdown-split-paG9qap9.js → markdown-split-DwMcRlBR.js} +1 -1
  53. package/dist/gateway/static/root/assets/{markdown-view-CUsob4Pz.js → markdown-view-CTB9u15e.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-0Q-c_QIy.js → media-plugins-O6H3GZn7.js} +1 -1
  55. package/dist/gateway/static/root/assets/{messages-B82nsi9k.js → messages-CeydamsI.js} +3 -3
  56. package/dist/gateway/static/root/assets/{notes-api-CfKZYrBC.js → notes-api-CrjQbmk1.js} +1 -1
  57. package/dist/gateway/static/root/assets/{notes-page-Bvb-ycX_.js → notes-page-miO9ig9C.js} +1 -1
  58. package/dist/gateway/static/root/assets/notes-workbench-_13lmvmF.js +4 -0
  59. package/dist/gateway/static/root/assets/{product-open-page-DrvBwAns.js → product-open-page-BOu07nXf.js} +1 -1
  60. package/dist/gateway/static/root/assets/project-detail-page-BStRkOQr.js +1 -0
  61. package/dist/gateway/static/root/assets/projects-page-CY03RxVr.js +1 -0
  62. package/dist/gateway/static/root/assets/{registry-api-B_5D8epF.js → registry-api-Bf_HDLUJ.js} +1 -1
  63. package/dist/gateway/static/root/assets/remote-access-hub-B19llkld.js +1 -0
  64. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DKjdN4Lr.js → runtime-tools-settings-panel-DthuRqUH.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schema-form-DskqaNqC.js → schema-form-8W8PhXxa.js} +1 -1
  66. package/dist/gateway/static/root/assets/sessions-page-BDA2qbTd.js +1 -0
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-BONIDX4v.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-CZlMvHA9.js → settings-form-section-CrsKGYiG.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-DS6lcAg9.js → settings-loading-skeleton-WJtI0AAq.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-oE5J9tsV.js → settings-page-PCjwRF47.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-C7oFCIqD.js → setup-status-panel-D65CwlNC.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-CPFAj8NE.js → share-preview-page-BGtvLLeZ.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-CdzVKrBl.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-CsRWid5h.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-Bh4gFi8e.js → skills-page-C_npyryI.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-BQaUWP9z.js → skills-page.utils-C46Sd78k.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-COAZoh_O.js → system-settings-panel-DomTLwki.js} +1 -1
  78. package/dist/gateway/static/root/assets/task-detail-page-B6YFX7kK.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-BN-32Fz5.js → theme-store-Ce7wq__X.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-autosave-BAkToU15.js → use-autosave-Do9mCRcY.js} +1 -1
  81. package/dist/gateway/static/root/assets/{user-context-page-Br5wgARM.js → user-context-page-CiCQA40E.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-CC4z9-ux.js → voice-api-key-field-Bc5p-0tX.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-overlay-dLVUYSSE.js → work-discovery-overlay-BieqsmT1.js} +1 -1
  84. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BYU5-0KF.js → workflow-run-setup-panel-DVj8iYvm.js} +2 -2
  85. package/dist/gateway/static/root/assets/workflows-page-AG04TTuH.js +5 -0
  86. package/dist/gateway/static/root/index.html +11 -11
  87. package/dist/package.js +1 -1
  88. package/dist/src/agent/embedded/run-turn.js +2 -0
  89. package/dist/src/agent/mcp/bundle-mcp-config.d.ts +9 -1
  90. package/dist/src/agent/mcp/bundle-mcp-config.js +11 -15
  91. package/dist/src/agent/mcp/embedded-mcp.d.ts +1 -1
  92. package/dist/src/agent/mcp/index.d.ts +1 -0
  93. package/dist/src/agent/mcp/index.js +7 -1
  94. package/dist/src/agent/mcp/mcp-http.d.ts +4 -0
  95. package/dist/src/agent/mcp/mcp-http.js +25 -1
  96. package/dist/src/agent/mcp/mcp-transport-config.d.ts +4 -0
  97. package/dist/src/agent/mcp/mcp-transport-config.js +1 -0
  98. package/dist/src/agent/mcp/mcp-transport.d.ts +7 -1
  99. package/dist/src/agent/mcp/mcp-transport.js +38 -11
  100. package/dist/src/agent/mcp/oauth/index.d.ts +6 -0
  101. package/dist/src/agent/mcp/oauth/index.js +6 -0
  102. package/dist/src/agent/mcp/oauth/mcp-oauth-errors.d.ts +5 -0
  103. package/dist/src/agent/mcp/oauth/mcp-oauth-errors.js +14 -0
  104. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.d.ts +25 -0
  105. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +219 -0
  106. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.d.ts +33 -0
  107. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +103 -0
  108. package/dist/src/agent/mcp/oauth/mcp-oauth-session.d.ts +29 -0
  109. package/dist/src/agent/mcp/oauth/mcp-oauth-session.js +169 -0
  110. package/dist/src/agent/mcp/oauth/mcp-oauth-store.d.ts +9 -0
  111. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +79 -0
  112. package/dist/src/agent/mcp/oauth/mcp-oauth-types.d.ts +22 -0
  113. package/dist/src/agent/mcp/oauth/mcp-oauth-types.js +1 -0
  114. package/dist/src/agent/memory/builtin-provider.js +23 -4
  115. package/dist/src/agent/memory/compaction-promotion.d.ts +18 -0
  116. package/dist/src/agent/memory/compaction-promotion.js +211 -0
  117. package/dist/src/agent/memory/context/types.d.ts +5 -0
  118. package/dist/src/agent/memory/manager.d.ts +3 -0
  119. package/dist/src/agent/memory/manager.js +12 -2
  120. package/dist/src/agent/memory/trusted-recall.d.ts +7 -0
  121. package/dist/src/agent/memory/trusted-recall.js +53 -0
  122. package/dist/src/agent/memory/turn-provenance.d.ts +14 -0
  123. package/dist/src/agent/memory/turn-provenance.js +60 -0
  124. package/dist/src/agent/memory/types.d.ts +18 -3
  125. package/dist/src/agent/memory/user-context-coordinator.js +57 -6
  126. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -0
  127. package/dist/src/agent/tools/memory-tool.js +5 -1
  128. package/dist/src/capabilities/store-connector.js +99 -10
  129. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  130. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  131. package/dist/src/config/config-mutation.d.ts +14 -0
  132. package/dist/src/config/config-mutation.js +33 -0
  133. package/dist/src/config/index.js +3 -3
  134. package/dist/src/config/paths.d.ts +2 -0
  135. package/dist/src/config/paths.js +5 -1
  136. package/dist/src/config/schema.d.ts +17 -0
  137. package/dist/src/config/schema.js +26 -2
  138. package/dist/src/connectors/auth-provider-registry.d.ts +1 -1
  139. package/dist/src/connectors/auth-provider-registry.js +23 -2
  140. package/dist/src/connectors/install.js +3 -3
  141. package/dist/src/connectors/instances.d.ts +2 -1
  142. package/dist/src/connectors/instances.js +15 -5
  143. package/dist/src/connectors/materialize.d.ts +1 -0
  144. package/dist/src/connectors/materialize.js +9 -1
  145. package/dist/src/connectors/runtime-adapter-registry.js +1 -0
  146. package/dist/src/connectors/types.d.ts +4 -1
  147. package/dist/src/extensions/connector-dependencies.d.ts +10 -0
  148. package/dist/src/extensions/connector-dependencies.js +65 -0
  149. package/dist/src/extensions/install.js +27 -0
  150. package/dist/src/extensions/normalize-manifest.js +1 -0
  151. package/dist/src/extensions/types/manifest.d.ts +2 -0
  152. package/dist/src/gateway/heartbeat/service.js +1 -1
  153. package/dist/src/gateway/hono/routes/capabilities.js +8 -8
  154. package/dist/src/gateway/hono/routes/connectors.js +87 -55
  155. package/dist/src/gateway/hono/routes/mcp.js +77 -5
  156. package/dist/src/gateway/hono/routes/voice.js +1 -1
  157. package/dist/src/gateway/run-loop.js +3 -0
  158. package/dist/src/gateway/server.d.ts +3 -0
  159. package/dist/src/gateway/server.js +30 -5
  160. package/dist/src/heartbeat/index.js +1 -1
  161. package/dist/src/infra/update-restart.js +1 -1
  162. package/dist/src/knowledge/connected-knowledge-pipeline.js +26 -4
  163. package/dist/src/session/store.js +27 -0
  164. package/dist/src/storage/sqlite/memory-records-repository.d.ts +9 -1
  165. package/dist/src/storage/sqlite/memory-records-repository.js +40 -6
  166. package/dist/src/storage/sqlite/migrations/134_memory_provenance.sql +18 -0
  167. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  168. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  169. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  170. package/dist/src/storage/sqlite/schema.js +1 -1
  171. package/dist/src/user-context/planner.js +8 -3
  172. package/dist/src/voice/stt/transcribe-core.js +17 -1
  173. package/dist/src/voice/stt/types.d.ts +1 -1
  174. package/package.json +3 -3
  175. package/dist/gateway/static/root/assets/agents-Ba4XF0Im.js +0 -68
  176. package/dist/gateway/static/root/assets/automations-workspace-DtI6vsMf.js +0 -6
  177. package/dist/gateway/static/root/assets/capabilities-settings-panel-CZRcis8B.js +0 -7
  178. package/dist/gateway/static/root/assets/channels-settings-DETCY0Ku.js +0 -1
  179. package/dist/gateway/static/root/assets/channels-status-swr-DMxB7slL.js +0 -1
  180. package/dist/gateway/static/root/assets/connectors-page-D9D92u28.js +0 -2
  181. package/dist/gateway/static/root/assets/home-page-COSGBh4c.js +0 -1
  182. package/dist/gateway/static/root/assets/index-5XkDWH_Q.css +0 -2
  183. package/dist/gateway/static/root/assets/index-wnDPGRTi.js +0 -74
  184. package/dist/gateway/static/root/assets/local-app-workbench-page-CAF5SZXv.js +0 -2
  185. package/dist/gateway/static/root/assets/logs-page-D1KFPHL1.js +0 -2
  186. package/dist/gateway/static/root/assets/notes-workbench-DelxGBof.js +0 -4
  187. package/dist/gateway/static/root/assets/project-detail-page-C2EnYXEQ.js +0 -1
  188. package/dist/gateway/static/root/assets/projects-page-BiMPU6Oa.js +0 -1
  189. package/dist/gateway/static/root/assets/remote-access-hub-CpbNivVs.js +0 -1
  190. package/dist/gateway/static/root/assets/sessions-page-BxKtzsKI.js +0 -1
  191. package/dist/gateway/static/root/assets/settings-advanced-gate-BfBKMMUx.js +0 -1
  192. package/dist/gateway/static/root/assets/shares-settings-B46DWZK4.js +0 -1
  193. package/dist/gateway/static/root/assets/skill-reload-api-CyKolUZ-.js +0 -1
  194. package/dist/gateway/static/root/assets/task-detail-page-CXkhprf-.js +0 -1
  195. package/dist/gateway/static/root/assets/workflows-page-CJ24a1HM.js +0 -5
  196. package/dist/src/extensions/bundle-mcp.d.ts +0 -18
  197. package/dist/src/extensions/bundle-mcp.js +0 -69
@@ -86,7 +86,16 @@ function rowToRecord(row, evidence = []) {
86
86
  ...row.session_key ? { sessionKey: row.session_key } : {},
87
87
  ...row.project_id ? { projectId: row.project_id } : {}
88
88
  },
89
- provenance: { sourceAgentId: row.source_agent_id },
89
+ provenance: {
90
+ sourceAgentId: row.source_agent_id,
91
+ originClass: row.origin_class,
92
+ sessionKind: row.session_kind,
93
+ observedAt: new Date(row.observed_at).toISOString(),
94
+ ...row.source_session_id ? { sourceSessionId: row.source_session_id } : {},
95
+ ...row.source_turn_id ? { sourceTurnId: row.source_turn_id } : {},
96
+ ...row.supersedes_key ? { supersedesKey: row.supersedes_key } : {},
97
+ derivedFromRecalledContext: row.derived_from_recalled_context === 1
98
+ },
90
99
  content: row.content,
91
100
  source: parseSource(row.source_json),
92
101
  ...row.confidence != null ? { confidence: row.confidence } : {},
@@ -131,6 +140,9 @@ function upsertMemoryRecord(input) {
131
140
  const validTo = parseOptionalTimestamp(input.validTo);
132
141
  const reviewAfter = parseOptionalTimestamp(input.reviewAfter);
133
142
  const expiresAt = parseOptionalTimestamp(input.expiresAt);
143
+ const observedAt = parseOptionalTimestamp(input.observedAt) ?? now;
144
+ const originClass = input.originClass ?? "untrusted";
145
+ const sessionKind = input.sessionKind ?? "unknown";
134
146
  const source = {
135
147
  ...input.source ?? {},
136
148
  provider: input.source?.provider ?? input.providerId
@@ -141,8 +153,10 @@ function upsertMemoryRecord(input) {
141
153
  content, source_json, confidence, tags_json, status, sensitivity,
142
154
  canonical_key, explicitness, durability, importance,
143
155
  disclosure_policy, valid_from, valid_to, review_after, expires_at,
144
- supersedes_record_id, conflict_group_id, created_at, updated_at
145
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
156
+ supersedes_record_id, conflict_group_id,
157
+ origin_class, session_kind, observed_at, source_session_id, source_turn_id,
158
+ supersedes_key, derived_from_recalled_context, created_at, updated_at
159
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
146
160
  ON CONFLICT(record_id) DO UPDATE SET
147
161
  provider_id = excluded.provider_id,
148
162
  kind = excluded.kind,
@@ -168,7 +182,14 @@ function upsertMemoryRecord(input) {
168
182
  expires_at = excluded.expires_at,
169
183
  supersedes_record_id = excluded.supersedes_record_id,
170
184
  conflict_group_id = excluded.conflict_group_id,
171
- updated_at = excluded.updated_at`).run(id, input.providerId, input.kind, input.userId ?? "local-owner", input.sourceAgentId, input.workspaceId ?? null, input.sessionKey ?? null, input.projectId ?? null, input.content, JSON.stringify(source), input.confidence ?? null, JSON.stringify(input.tags ?? []), status, sensitivity, input.canonicalKey ?? null, explicitness, durability, importance, disclosurePolicy, validFrom, validTo, reviewAfter, expiresAt, input.supersedesRecordId ?? null, input.conflictGroupId ?? null, now, now);
185
+ origin_class = excluded.origin_class,
186
+ session_kind = excluded.session_kind,
187
+ observed_at = excluded.observed_at,
188
+ source_session_id = excluded.source_session_id,
189
+ source_turn_id = excluded.source_turn_id,
190
+ supersedes_key = excluded.supersedes_key,
191
+ derived_from_recalled_context = excluded.derived_from_recalled_context,
192
+ updated_at = excluded.updated_at`).run(id, input.providerId, input.kind, input.userId ?? "local-owner", input.sourceAgentId, input.workspaceId ?? null, input.sessionKey ?? null, input.projectId ?? null, input.content, JSON.stringify(source), input.confidence ?? null, JSON.stringify(input.tags ?? []), status, sensitivity, input.canonicalKey ?? null, explicitness, durability, importance, disclosurePolicy, validFrom, validTo, reviewAfter, expiresAt, input.supersedesRecordId ?? null, input.conflictGroupId ?? null, originClass, sessionKind, observedAt, input.sourceSessionId ?? null, input.sourceTurnId ?? null, input.supersedesKey ?? null, input.derivedFromRecalledContext ? 1 : 0, now, now);
172
193
  upsertMemoryRecordFts(db, {
173
194
  ...input,
174
195
  id
@@ -204,7 +225,16 @@ function upsertMemoryRecord(input) {
204
225
  ...input.sessionKey ? { sessionKey: input.sessionKey } : {},
205
226
  ...input.projectId ? { projectId: input.projectId } : {}
206
227
  },
207
- provenance: { sourceAgentId: input.sourceAgentId },
228
+ provenance: {
229
+ sourceAgentId: input.sourceAgentId,
230
+ originClass,
231
+ sessionKind,
232
+ observedAt: new Date(observedAt).toISOString(),
233
+ ...input.sourceSessionId ? { sourceSessionId: input.sourceSessionId } : {},
234
+ ...input.sourceTurnId ? { sourceTurnId: input.sourceTurnId } : {},
235
+ ...input.supersedesKey ? { supersedesKey: input.supersedesKey } : {},
236
+ derivedFromRecalledContext: input.derivedFromRecalledContext ?? false
237
+ },
208
238
  content: input.content,
209
239
  source,
210
240
  ...input.confidence != null ? { confidence: input.confidence } : {},
@@ -339,6 +369,10 @@ function searchMemoryRecords(options) {
339
369
  filters.push(`f.kind IN (${options.kinds.map(() => "?").join(", ")})`);
340
370
  params.push(...options.kinds);
341
371
  }
372
+ if (options.trustedOnly) {
373
+ filters.push(`r.origin_class IN ('owner', 'agent')`);
374
+ filters.push("r.derived_from_recalled_context = 0");
375
+ }
342
376
  const statuses = options.statuses && options.statuses.length > 0 ? options.statuses : ["active"];
343
377
  filters.push(`r.status IN (${statuses.map(() => "?").join(", ")})`);
344
378
  params.push(...statuses);
@@ -366,7 +400,7 @@ function searchMemoryRecords(options) {
366
400
  visibleToWorkspaceId: options.visibleToWorkspaceId,
367
401
  unscopedWorkspaceOnly: options.unscopedWorkspaceOnly,
368
402
  limit: 500
369
- }).filter((record) => statuses.includes(record.status ?? "active") && (!options.kinds?.length || options.kinds.includes(record.kind)));
403
+ }).filter((record) => statuses.includes(record.status ?? "active") && (!options.kinds?.length || options.kinds.includes(record.kind))).filter((record) => !options.trustedOnly || (record.provenance.originClass === "owner" || record.provenance.originClass === "agent") && !record.provenance.derivedFromRecalledContext);
370
404
  const candidateById = new Map(candidateRecords.map((record) => [record.id, record]));
371
405
  const missingRows = rows.filter((row) => !candidateById.has(row.record_id));
372
406
  const missingEvidence = listMemoryEvidenceForRecords(missingRows.map((row) => row.record_id));
@@ -0,0 +1,18 @@
1
+ ALTER TABLE memory_records ADD COLUMN origin_class TEXT NOT NULL DEFAULT 'untrusted'
2
+ CHECK (origin_class IN ('owner', 'agent', 'untrusted', 'system'));
3
+ ALTER TABLE memory_records ADD COLUMN session_kind TEXT NOT NULL DEFAULT 'unknown'
4
+ CHECK (session_kind IN ('interactive', 'group', 'automation', 'workflow', 'subagent', 'background', 'unknown'));
5
+ ALTER TABLE memory_records ADD COLUMN observed_at INTEGER NOT NULL DEFAULT 0;
6
+ ALTER TABLE memory_records ADD COLUMN source_session_id TEXT;
7
+ ALTER TABLE memory_records ADD COLUMN source_turn_id TEXT;
8
+ ALTER TABLE memory_records ADD COLUMN supersedes_key TEXT;
9
+ ALTER TABLE memory_records ADD COLUMN derived_from_recalled_context INTEGER NOT NULL DEFAULT 0
10
+ CHECK (derived_from_recalled_context IN (0, 1));
11
+
12
+ UPDATE memory_records
13
+ SET observed_at = CASE WHEN observed_at = 0 THEN created_at ELSE observed_at END;
14
+
15
+ CREATE INDEX idx_memory_records_trusted_scope_updated
16
+ ON memory_records(origin_class, derived_from_recalled_context, status, workspace_id, updated_at DESC);
17
+ CREATE INDEX idx_memory_records_source_turn
18
+ ON memory_records(source_session_id, source_turn_id);
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
3
3
  /** Baseline schema version applied from schema.sql on first open. */
4
4
  export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 133;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 134;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -12,7 +12,7 @@ const log = createLogger("Sqlite:Migrations");
12
12
  /** Baseline schema version applied from schema.sql on first open. */
13
13
  const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
14
14
  /** Latest schema version this release supports (increment when adding migrations). */
15
- const XOPC_DB_SCHEMA_VERSION = 133;
15
+ const XOPC_DB_SCHEMA_VERSION = 134;
16
16
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
17
17
  function backupBeforeTaskCutover(db, databasePath) {
18
18
  db.exec("PRAGMA wal_checkpoint(FULL)");
@@ -57,7 +57,7 @@ function applySingleMigration(db, migration) {
57
57
  * Each step runs in its own transaction and updates schema_meta on success.
58
58
  */
59
59
  function applyPendingMigrations(db, options = {}) {
60
- const targetVersion = options.targetVersion ?? 133;
60
+ const targetVersion = options.targetVersion ?? 134;
61
61
  let currentVersion = readSchemaVersion(db);
62
62
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
63
63
  if (currentVersion >= targetVersion) return currentVersion;
@@ -94,7 +94,7 @@ function applyPendingMigrations(db, options = {}) {
94
94
  }
95
95
  /** Inspect schema version without mutating the database. */
96
96
  function inspectSchemaMigrationStatus(db, options = {}) {
97
- const appVersion = options.targetVersion ?? 133;
97
+ const appVersion = options.targetVersion ?? 134;
98
98
  const dbVersion = readSchemaVersion(db);
99
99
  if (dbVersion > appVersion) return {
100
100
  dbVersion,
@@ -19,7 +19,7 @@ const log = createLogger('Sqlite:Migrations');
19
19
  export const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
20
20
 
21
21
  /** Latest schema version this release supports (increment when adding migrations). */
22
- export const XOPC_DB_SCHEMA_VERSION = 133;
22
+ export const XOPC_DB_SCHEMA_VERSION = 134;
23
23
 
24
24
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
25
 
@@ -32,7 +32,7 @@ function ensureXopcDatabaseSchema(db, options = {}) {
32
32
  currentVersion = 11;
33
33
  }
34
34
  applyPendingMigrations(db, {
35
- targetVersion: 133,
35
+ targetVersion: 134,
36
36
  databasePath: options.databasePath
37
37
  });
38
38
  }
@@ -160,6 +160,8 @@ var UserContextPlanner = class {
160
160
  rejected: [],
161
161
  consentRequests: [],
162
162
  estimatedTokens: 0,
163
+ contextChars: 0,
164
+ contextItemCount: 0,
163
165
  allocation: params.allocation
164
166
  };
165
167
  const started = Date.now();
@@ -174,7 +176,8 @@ var UserContextPlanner = class {
174
176
  const queryProfile = buildRetrievalQueryProfile(query, scopeInput);
175
177
  const selfReview = queryProfile.selfReview;
176
178
  const maxResults = requestedMaxResults ?? (selfReview ? SELF_REVIEW_MAX_RESULTS : DEFAULT_MAX_RESULTS);
177
- const maxChars = requestedMaxChars ?? (selfReview ? SELF_REVIEW_MAX_CONTEXT_CHARS : DEFAULT_MAX_CONTEXT_CHARS);
179
+ const budgetChars = requestedMaxChars ?? (selfReview ? SELF_REVIEW_MAX_CONTEXT_CHARS : DEFAULT_MAX_CONTEXT_CHARS);
180
+ const maxChars = Math.max(0, budgetChars - 2);
178
181
  const projects = new ProjectStore();
179
182
  const excluded = new Set(params.excludedRecordIds ?? []);
180
183
  const rejected = [];
@@ -464,7 +467,7 @@ var UserContextPlanner = class {
464
467
  turnId: params.turnId,
465
468
  sessionKey: params.sessionKey,
466
469
  query,
467
- budget: maxChars,
470
+ budget: budgetChars,
468
471
  durationMs: Date.now() - started,
469
472
  items: traceItems
470
473
  });
@@ -474,7 +477,9 @@ var UserContextPlanner = class {
474
477
  items,
475
478
  rejected,
476
479
  consentRequests,
477
- estimatedTokens: Math.ceil(block.length / 4),
480
+ estimatedTokens: Math.ceil((block.length + (block ? 2 : 0)) / 4),
481
+ contextChars: block.length + (block ? 2 : 0),
482
+ contextItemCount: traceItems.filter((item) => item.decision === "selected").length,
478
483
  allocation: params.allocation
479
484
  };
480
485
  }
@@ -10,6 +10,7 @@ function classifyFailureReason(reason) {
10
10
  const lower = reason.toLowerCase();
11
11
  if (lower.includes("not configured") || lower.includes("api key") || lower.includes("missing")) return "not_configured";
12
12
  if (lower.includes("timeout") || lower.includes("timed out") || lower.includes("aborted")) return "timeout";
13
+ if (lower.includes("empty transcription") || lower.includes("no speech") || lower.includes("no voice detected")) return "no_speech";
13
14
  if (lower.includes("unsupported") || lower.includes("format") || lower.includes("audio decoder")) return "unsupported_format";
14
15
  return "provider_error";
15
16
  }
@@ -51,7 +52,23 @@ async function transcribe(audioBuffer, config, options) {
51
52
  const attachmentDecision = result.decision.attachments[0];
52
53
  const attempts = (attachmentDecision?.attempts ?? []).map(toAttempt);
53
54
  const attemptedProviders = attempts.map((a) => a.provider);
55
+ const primaryProvider = providersWithLanguage[0].id;
54
56
  if (!attachmentDecision?.chosen) {
57
+ const noSpeechAttempt = attempts.findLast((attempt) => attempt.reasonCode === "no_speech");
58
+ if (noSpeechAttempt) {
59
+ log.debug({
60
+ attempts,
61
+ attemptedProviders
62
+ }, "STT completed without recognized speech");
63
+ const fallbackFrom = noSpeechAttempt.provider !== primaryProvider ? primaryProvider : void 0;
64
+ return {
65
+ text: "",
66
+ provider: noSpeechAttempt.provider,
67
+ attempts,
68
+ ...fallbackFrom ? { fallbackFrom } : {},
69
+ attemptedProviders
70
+ };
71
+ }
55
72
  log.error({
56
73
  attempts,
57
74
  attemptedProviders
@@ -62,7 +79,6 @@ async function transcribe(audioBuffer, config, options) {
62
79
  const chosen = attachmentDecision.chosen;
63
80
  const output = result.outputs[0];
64
81
  if (!output) throw new Error("STT runner returned chosen attempt but no output text");
65
- const primaryProvider = providersWithLanguage[0].id;
66
82
  const fallbackFrom = chosen.provider && chosen.provider !== primaryProvider ? primaryProvider : void 0;
67
83
  return {
68
84
  text: output.text,
@@ -47,7 +47,7 @@ export interface STTConfig {
47
47
  timeoutMs?: number;
48
48
  }
49
49
  export type STTProviderAttemptTask = 'success' | 'skipped' | 'failed';
50
- export type STTProviderFailureReason = 'success' | 'not_configured' | 'timeout' | 'provider_error' | 'unsupported_format' | 'unknown';
50
+ export type STTProviderFailureReason = 'success' | 'not_configured' | 'timeout' | 'no_speech' | 'provider_error' | 'unsupported_format' | 'unknown';
51
51
  export interface STTProviderAttempt {
52
52
  provider: string;
53
53
  task: STTProviderAttemptTask;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.223",
3
+ "version": "0.0.225",
4
4
  "description": "Local-first personal AI assistant with reviewable user understanding, durable tasks, workflows, automations, and local or cloud models.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -159,8 +159,8 @@
159
159
  "vue": "^3.5.35",
160
160
  "@xopcai/endpoint-tools-protocol": "0.0.0",
161
161
  "@xopcai/gateway-contract": "0.0.0",
162
- "@xopcai/realtime-client": "0.0.0",
163
- "@xopcai/realtime-protocol": "0.0.0"
162
+ "@xopcai/realtime-protocol": "0.0.0",
163
+ "@xopcai/realtime-client": "0.0.0"
164
164
  },
165
165
  "scripts": {
166
166
  "assets:brand": "node scripts/generate-brand-assets.mjs",