@xopcai/xopc 0.0.413 → 0.0.415

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 (323) 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-BT6oqCMD.js → agent-avatar-dicebear-CJFwitU2.js} +1 -1
  4. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DclyJr1N.js +1 -0
  5. package/dist/gateway/static/root/assets/{agents-admin-api-CeBkHnl8.js → agents-admin-api-B1p-ghg9.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-jhErNtzi.js +77 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-BdCgtTfT.js → app-management-settings-panel-DgwqNi5i.js} +1 -1
  8. package/dist/gateway/static/root/assets/app-window-DXFNqt_0.js +1 -0
  9. package/dist/gateway/static/root/assets/{appearance-settings-C3-hCFlF.js → appearance-settings-C0wJfFyz.js} +1 -1
  10. package/dist/gateway/static/root/assets/apps-page-C0LcnI4h.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-BviFGCy4.js → archive-plugin-Ch7wolHE.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-page-CfzazXE5.js → automations-page-DK7AU79v.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-workspace-CBxiV34x.js +8 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-Dp-gtJEk.js → binary-plugins-B4HcHYsC.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-D-DEPdpi.js → block-editor-BQAWEZF-.js} +4 -4
  16. package/dist/gateway/static/root/assets/{browser-automation-inputs-D1pDgMJu.js → browser-automation-inputs-D6AccXaA.js} +1 -1
  17. package/dist/gateway/static/root/assets/browser-automations-page-vJIrTxdi.js +3 -0
  18. package/dist/gateway/static/root/assets/browser-settings-page-in5Roh_E.js +3 -0
  19. package/dist/gateway/static/root/assets/{capabilities-Bpeh6E22.js → capabilities-BlxF36t-.js} +1 -1
  20. package/dist/gateway/static/root/assets/capabilities-page-CiGx8wpQ.js +2 -0
  21. package/dist/gateway/static/root/assets/capabilities-settings-panel-a8kqjzQu.js +8 -0
  22. package/dist/gateway/static/root/assets/{capability-header-actions-CP2fI9Fe.js → capability-header-actions-D4Yq35fD.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-C_CxcjKT.js +1 -0
  24. package/dist/gateway/static/root/assets/{chat-terminal-dock-BL3tFntQ.js → chat-terminal-dock-zdMySdMm.js} +2 -2
  25. package/dist/gateway/static/root/assets/chevron-down-ccbiQQz_.js +1 -0
  26. package/dist/gateway/static/root/assets/{computer-settings-page-DEQ5GYfC.js → computer-settings-page-C5Z6Jr0p.js} +1 -1
  27. package/dist/gateway/static/root/assets/{connector-service-page-CecwMnC5.js → connector-service-page-Cxus0qrZ.js} +1 -1
  28. package/dist/gateway/static/root/assets/connectors-page-DCBO2CxK.js +1 -0
  29. package/dist/gateway/static/root/assets/{date-picker-N5jnlvPs.js → date-picker-DuyyD6jz.js} +1 -1
  30. package/dist/gateway/static/root/assets/dependency-picker-BZN72rrk.js +1 -0
  31. package/dist/gateway/static/root/assets/desktop-pet-BtvTIDCi.js +1 -0
  32. package/dist/gateway/static/root/assets/desktop-pet-settings-BcyP7Z6v.js +1 -0
  33. package/dist/gateway/static/root/assets/device-pairing-wizard-Ctbgr50F.js +1 -0
  34. package/dist/gateway/static/root/assets/{directory-picker-path-field-CbMbPimD.js → directory-picker-path-field-DOusKz-O.js} +1 -1
  35. package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +1 -0
  36. package/dist/gateway/static/root/assets/{extension-debug-page-OE1nJMQ8.js → extension-debug-page-Bt4FwsFu.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-BEomiKhy.js → extension-page-0vsxX3FB.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-settings-page-BFOjQeSX.js → extension-settings-page-5Pt5_ELc.js} +1 -1
  39. package/dist/gateway/static/root/assets/eye-CABVeTq0.js +1 -0
  40. package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +1 -0
  41. package/dist/gateway/static/root/assets/{gateway-config-swr-DF_HV6NP.js → gateway-config-swr-fQKBHBi1.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-realtime-DMAzNlm-.js → gateway-realtime-DkWCHVzI.js} +1 -1
  43. package/dist/gateway/static/root/assets/gateway-realtime-store-Bx9KCID-.js +1 -0
  44. package/dist/gateway/static/root/assets/gateway-settings-BsVOcmV5.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-B91CBTzO.js → gateway-startup-retry-Cfwxof4k.js} +1 -1
  46. package/dist/gateway/static/root/assets/{highlight-code-6ONPRH5r.js → highlight-code-C8eS9949.js} +1 -1
  47. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-EJ9Kg4iQ.js → highlighted-body-KQOG7T2V-Cbk7eMlg.js} +1 -1
  48. package/dist/gateway/static/root/assets/home-page-BZDZnmyc.js +2 -0
  49. package/dist/gateway/static/root/assets/{image-generation-api-D0HNic89.js → image-generation-api-CAS8QVla.js} +1 -1
  50. package/dist/gateway/static/root/assets/imports-page-BCLBYzV1.js +1 -0
  51. package/dist/gateway/static/root/assets/index-Bys6njTY.js +710 -0
  52. package/dist/gateway/static/root/assets/index-Vsf0bj5e.css +1 -0
  53. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Cmi-2SIh.js → keyboard-shortcuts-settings-CM_kt5XN.js} +1 -1
  54. package/dist/gateway/static/root/assets/local-app-workbench-page-Dk87jtcc.js +1 -0
  55. package/dist/gateway/static/root/assets/{local-apps-page-jgaogH9Z.js → local-apps-page-BTSOChhk.js} +1 -1
  56. package/dist/gateway/static/root/assets/{local-session-drafts-DvmwiLUx.js → local-session-drafts-iGX_6O0O.js} +1 -1
  57. package/dist/gateway/static/root/assets/{locale-store-JogcXC4J.js → locale-store-B7s2Hb35.js} +1 -1
  58. package/dist/gateway/static/root/assets/logs-page-D3gVdm8S.js +2 -0
  59. package/dist/gateway/static/root/assets/management-settings-BQNYFE4J.js +1 -0
  60. package/dist/gateway/static/root/assets/{media-plugins-BRS9puQV.js → media-plugins-DYQDjCVQ.js} +1 -1
  61. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-ChweJKTv.js +1 -0
  62. package/dist/gateway/static/root/assets/{messages-RzwPiQNL.js → messages-BYq0cPbn.js} +2 -2
  63. package/dist/gateway/static/root/assets/note-detail-panel-CYKwUCte.js +5 -0
  64. package/dist/gateway/static/root/assets/note-image-lightbox-BTSZb9ZT.js +1 -0
  65. package/dist/gateway/static/root/assets/notes-page-CJ5nhWfL.js +8 -0
  66. package/dist/gateway/static/root/assets/{page-context-capture-button-D_VOB2_C.js → page-context-capture-button-DVn_dU83.js} +1 -1
  67. package/dist/gateway/static/root/assets/personal-page-DcW14lqn.js +1 -0
  68. package/dist/gateway/static/root/assets/personal-settings-panel-C16Iqe7X.js +1 -0
  69. package/dist/gateway/static/root/assets/phone-dependencies-card-D3l9uPFM.js +1 -0
  70. package/dist/gateway/static/root/assets/phone-model-picker-DOv38vBn.js +1 -0
  71. package/dist/gateway/static/root/assets/phone-settings-page-DUHp1q_9.js +1 -0
  72. package/dist/gateway/static/root/assets/plugin-details-dialog-BpfgDlVa.js +1 -0
  73. package/dist/gateway/static/root/assets/{preview-open-alternatives-DaTaSKox.js → preview-open-alternatives-RlHk76TI.js} +1 -1
  74. package/dist/gateway/static/root/assets/{product-open-page-wYlC0IVZ.js → product-open-page-Dh-HqLrE.js} +1 -1
  75. package/dist/gateway/static/root/assets/{product-preview-content-Bxur-p6S.js → product-preview-content-c3K-4DWc.js} +1 -1
  76. package/dist/gateway/static/root/assets/project-detail-page-GD8TxKad.js +7 -0
  77. package/dist/gateway/static/root/assets/projects-page-B8HAt9sD.js +1 -0
  78. package/dist/gateway/static/root/assets/{registry-api-BGqSwITi.js → registry-api-BcfoLEna.js} +1 -1
  79. package/dist/gateway/static/root/assets/remote-access-hub-D3el7lHK.js +1 -0
  80. package/dist/gateway/static/root/assets/{runtime-tools-api-CSm5SpnR.js → runtime-tools-api-DesqGCnE.js} +1 -1
  81. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DXNidliV.js → runtime-tools-settings-panel-Dbskk6RG.js} +1 -1
  82. package/dist/gateway/static/root/assets/{schema-form-DeSZ7SiO.js → schema-form-CXO1B1k4.js} +1 -1
  83. package/dist/gateway/static/root/assets/{session-api-DTxZyMta.js → session-api-DdQnMwkl.js} +1 -1
  84. package/dist/gateway/static/root/assets/{session-manager-B2HDomj4.js → session-manager-CA1NkTR_.js} +1 -1
  85. package/dist/gateway/static/root/assets/sessions-page-07liaSHH.js +1 -0
  86. package/dist/gateway/static/root/assets/settings-advanced-gate-BGjU8rfN.js +1 -0
  87. package/dist/gateway/static/root/assets/{settings-form-section-BNYQjZU4.js → settings-form-section-BQxKmbbJ.js} +1 -1
  88. package/dist/gateway/static/root/assets/{settings-page-29Ix0jSQ.js → settings-page-DvVMpKiA.js} +1 -1
  89. package/dist/gateway/static/root/assets/{setup-status-panel-COQZgKX9.js → setup-status-panel-DKo_VTx-.js} +1 -1
  90. package/dist/gateway/static/root/assets/{share-preview-page-CwMRULXc.js → share-preview-page-XgZk8Oa1.js} +1 -1
  91. package/dist/gateway/static/root/assets/shares-settings-BODFqK8k.js +1 -0
  92. package/dist/gateway/static/root/assets/{skill-api-xfB5fUAh.js → skill-api-CV-WT2hj.js} +1 -1
  93. package/dist/gateway/static/root/assets/skill-reload-api-Ce6OUk2C.js +1 -0
  94. package/dist/gateway/static/root/assets/skills-page-B7ehOIML.js +2 -0
  95. package/dist/gateway/static/root/assets/{system-settings-panel-DRJu1ehM.js → system-settings-panel-CxJkZRT4.js} +1 -1
  96. package/dist/gateway/static/root/assets/task-detail-page-CxRR0QuW.js +2 -0
  97. package/dist/gateway/static/root/assets/{task-result-evidence-C4o_Yue_.js → task-result-evidence-D-gGKNX9.js} +1 -1
  98. package/dist/gateway/static/root/assets/{tracing-settings-page-CYslh-Pu.js → tracing-settings-page-CQw3G-FB.js} +1 -1
  99. package/dist/gateway/static/root/assets/{tunnel-api-Bi_kw6bv.js → tunnel-api-B2HnCi0U.js} +1 -1
  100. package/dist/gateway/static/root/assets/usage-page-uUEkO38r.js +1 -0
  101. package/dist/gateway/static/root/assets/{use-autosave-BkB9uD93.js → use-autosave-Dc0nwUpX.js} +1 -1
  102. package/dist/gateway/static/root/assets/user-model-page-ICUutbKL.js +2 -0
  103. package/dist/gateway/static/root/assets/{voice-api-key-field-bt8_Agih.js → voice-api-key-field-BSWXZkGa.js} +1 -1
  104. package/dist/gateway/static/root/assets/{voice-config-api-D7xsWrdh.js → voice-config-api-BkUlN7GH.js} +1 -1
  105. package/dist/gateway/static/root/assets/{work-discovery-overlay-D3NG14dX.js → work-discovery-overlay-H3cdwq3l.js} +1 -1
  106. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-B2OUKOQi.js → xopc-cloud-account-card-CvT_W6YS.js} +1 -1
  107. package/dist/gateway/static/root/index.html +19 -14
  108. package/dist/package.js +1 -1
  109. package/dist/src/agent/agent-manager.js +1 -1
  110. package/dist/src/agent/background-review/run-background-review.js +1 -1
  111. package/dist/src/agent/coding/workspace-revision.js +1 -1
  112. package/dist/src/agent/commands/command-registry.js +1 -1
  113. package/dist/src/agent/external-tools/cliProvider.js +2 -2
  114. package/dist/src/agent/external-tools/composio-provider.js +2 -2
  115. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  116. package/dist/src/agent/memory/context-recovery.d.ts +1 -1
  117. package/dist/src/agent/service.js +1 -1
  118. package/dist/src/agent/skills/index.js +1 -1
  119. package/dist/src/agent/skills/installer.js +3 -3
  120. package/dist/src/agent/skills/managed-store.js +1 -1
  121. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  122. package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
  123. package/dist/src/agent/tool-manuals/phone.js +5 -3
  124. package/dist/src/agent/tools/personal-read-tool.js +1 -1
  125. package/dist/src/agent/tools/personal-task-tool.d.ts +1 -1
  126. package/dist/src/agent/tools/personal-task-tool.js +23 -21
  127. package/dist/src/agent/tools/phone-use-tool.js +22 -2
  128. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  129. package/dist/src/agent-catalog/capabilities.js +2 -2
  130. package/dist/src/agent-catalog/repository.js +1 -1
  131. package/dist/src/automations/capabilities/drafts.js +1 -1
  132. package/dist/src/backup/archive.js +2 -1
  133. package/dist/src/browser/providers/browser-ext-install.js +2 -2
  134. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  135. package/dist/src/capabilities/runtime/product.js +1 -1
  136. package/dist/src/cli/commands/agents.js +1 -1
  137. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  138. package/dist/src/cli/commands/extension-pack.js +1 -1
  139. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  140. package/dist/src/cli/commands/models.js +1 -1
  141. package/dist/src/cli/commands/onboard/model.js +1 -1
  142. package/dist/src/cli/commands/onboard.js +1 -1
  143. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  144. package/dist/src/config/agent-profile.js +1 -1
  145. package/dist/src/connectors/connected-source-understanding.js +1 -1
  146. package/dist/src/connectors/learning-coordinator.js +1 -1
  147. package/dist/src/execution-environments/local-worktree-manager.js +1 -1
  148. package/dist/src/extensions/agent-plugins/skill-catalog.js +1 -1
  149. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  150. package/dist/src/extensions/install.js +1 -1
  151. package/dist/src/gateway/agents-admin.js +2 -2
  152. package/dist/src/gateway/global-defaults-admin.js +1 -1
  153. package/dist/src/gateway/hono/routes/agents.js +1 -1
  154. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  155. package/dist/src/gateway/hono/routes/connectors.js +7 -7
  156. package/dist/src/gateway/hono/routes/home.js +1 -1
  157. package/dist/src/gateway/hono/routes/notes.js +2 -2
  158. package/dist/src/gateway/hono/routes/phone.js +33 -4
  159. package/dist/src/gateway/hono/routes/projects.js +2 -2
  160. package/dist/src/gateway/hono/routes/public-gateway.js +1 -1
  161. package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
  162. package/dist/src/gateway/hono/routes/tasks.js +1 -1
  163. package/dist/src/gateway/image-generation-setup.js +1 -1
  164. package/dist/src/gateway/service/session-input-coordinator.js +1 -1
  165. package/dist/src/gateway/service.js +7 -7
  166. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  167. package/dist/src/imports/importService.js +1 -1
  168. package/dist/src/infra/unhandled-rejections.js +2 -2
  169. package/dist/src/infra/update-restart.js +1 -1
  170. package/dist/src/local-apps/service.js +1 -1
  171. package/dist/src/personal-agent/prompts.js +1 -1
  172. package/dist/src/personal-agent/service.js +1 -1
  173. package/dist/src/phone/adb-driver.d.ts +9 -2
  174. package/dist/src/phone/adb-driver.js +113 -37
  175. package/dist/src/phone/app-access.d.ts +10 -0
  176. package/dist/src/phone/app-access.js +21 -0
  177. package/dist/src/phone/applications.d.ts +4 -0
  178. package/dist/src/phone/applications.js +49 -0
  179. package/dist/src/phone/cloud-adb.d.ts +1 -0
  180. package/dist/src/phone/cloud-adb.js +60 -2
  181. package/dist/src/phone/cloud-phones.js +2 -1
  182. package/dist/src/phone/cloud-scrcpy.d.ts +3 -1
  183. package/dist/src/phone/cloud-scrcpy.js +19 -4
  184. package/dist/src/phone/contracts.d.ts +54 -1
  185. package/dist/src/phone/contracts.js +18 -4
  186. package/dist/src/phone/model-adapter.d.ts +90 -2
  187. package/dist/src/phone/model-adapter.js +87 -19
  188. package/dist/src/phone/reliability.d.ts +7 -0
  189. package/dist/src/phone/reliability.js +66 -0
  190. package/dist/src/phone/repository.js +4 -3
  191. package/dist/src/phone/runtime.d.ts +14 -1
  192. package/dist/src/phone/runtime.js +215 -19
  193. package/dist/src/phone/scrcpy-assets.d.ts +4 -0
  194. package/dist/src/phone/scrcpy-assets.js +16 -0
  195. package/dist/src/phone/scrcpy-text.d.ts +11 -0
  196. package/dist/src/phone/scrcpy-text.js +72 -0
  197. package/dist/src/phone/scrcpy.d.ts +6 -5
  198. package/dist/src/phone/scrcpy.js +51 -14
  199. package/dist/src/runtime-tools/archive.js +1 -1
  200. package/dist/src/storage/sqlite/connection.js +2 -2
  201. package/dist/src/storage/sqlite/offline-access.js +13 -7
  202. package/dist/src/storage/sqlite/schema-errors.d.ts +12 -0
  203. package/dist/src/storage/sqlite/schema-errors.js +21 -3
  204. package/dist/src/storage/sqlite/schema-upgrade.d.ts +4 -0
  205. package/dist/src/storage/sqlite/schema-upgrade.js +78 -0
  206. package/dist/src/storage/sqlite/schema.d.ts +2 -1
  207. package/dist/src/storage/sqlite/schema.js +9 -3
  208. package/dist/src/storage/sqlite/upgrades/203_remove_retired_proactive_contracts.sql +70 -0
  209. package/dist/src/storage/sqlite/upgrades/204_home_intelligence.sql +78 -0
  210. package/dist/src/storage/sqlite/upgrades/205_agent_catalog.sql +66 -0
  211. package/dist/src/storage/sqlite/upgrades/206_home_advice_strategy_version.sql +2 -0
  212. package/dist/src/storage/sqlite/upgrades/207_user_model_policy_contract.sql +121 -0
  213. package/dist/src/storage/sqlite/upgrades/208_automation_management.sql +2 -0
  214. package/dist/src/storage/sqlite/upgrades/209_automation_event_hub.sql +48 -0
  215. package/dist/src/storage/sqlite/upgrades/210_remove_legacy_automation_timeout.sql +14 -0
  216. package/dist/src/storage/sqlite/upgrades/211_automation_result_deliveries.sql +16 -0
  217. package/dist/src/storage/sqlite/upgrades/212_automation_delivery_policy.sql +30 -0
  218. package/dist/src/storage/sqlite/upgrades/213_automation_reliability_contract.sql +188 -0
  219. package/dist/src/storage/sqlite/upgrades/214_ai_usage_ledger.sql +41 -0
  220. package/dist/src/storage/sqlite/upgrades/215_scene_execution_adapters.sql +6 -0
  221. package/dist/src/storage/sqlite/upgrades/216_remove_scene_model_usage.sql +1 -0
  222. package/dist/src/storage/sqlite/upgrades/217_remove_legacy_memory_tables.sql +4 -0
  223. package/dist/src/storage/sqlite/upgrades/218_core_relation_indexes.sql +26 -0
  224. package/dist/src/storage/sqlite/upgrades/219_json_contracts.sql +123 -0
  225. package/dist/src/storage/sqlite/upgrades/220_normalize_timestamps.sql +339 -0
  226. package/dist/src/storage/sqlite/upgrades/221_ai_usage_retention_index.sql +2 -0
  227. package/dist/src/storage/sqlite/upgrades/222_session_config_authority.sql +13 -0
  228. package/dist/src/storage/sqlite/upgrades/223_session_creation_receipts.sql +59 -0
  229. package/dist/src/storage/sqlite/upgrades/224_task_origin_links.sql +8 -0
  230. package/dist/src/storage/sqlite/upgrades/225_task_collaboration.sql +32 -0
  231. package/dist/src/storage/sqlite/upgrades/226_task_main_updates.sql +9 -0
  232. package/dist/src/storage/sqlite/upgrades/227_task_main_update_decisions.sql +8 -0
  233. package/dist/src/storage/sqlite/upgrades/228_task_main_agent_links.sql +14 -0
  234. package/dist/src/storage/sqlite/upgrades/229_task_criterion_reviews.sql +12 -0
  235. package/dist/src/storage/sqlite/upgrades/230_personal_agent_onboarding.sql +8 -0
  236. package/dist/src/storage/sqlite/upgrades/231_task_result_deliveries.sql +32 -0
  237. package/dist/src/storage/sqlite/upgrades/232_personal_requests.sql +28 -0
  238. package/dist/src/storage/sqlite/upgrades/233_observability_usage_links.sql +3 -0
  239. package/dist/src/storage/sqlite/upgrades/234_task_result_reply.sql +14 -0
  240. package/dist/src/storage/sqlite/upgrades/235_personal_conversation_priority.sql +3 -0
  241. package/dist/src/storage/sqlite/upgrades/236_personal_proactivity.sql +53 -0
  242. package/dist/src/storage/sqlite/upgrades/237_personal_strategy_versions.sql +18 -0
  243. package/dist/src/storage/sqlite/upgrades/238_browser_record_replay.sql +45 -0
  244. package/dist/src/storage/sqlite/upgrades/239_clarification_notifications.sql +26 -0
  245. package/dist/src/storage/sqlite/upgrades/240_device_settings.sql +5 -0
  246. package/dist/src/storage/sqlite/upgrades/241_device_grant_audit.sql +13 -0
  247. package/dist/src/storage/sqlite/upgrades/242_cloud_usage_receipts.sql +5 -0
  248. package/dist/src/storage/sqlite/upgrades/243_voice_opening_greetings.sql +12 -0
  249. package/dist/src/storage/sqlite/upgrades/244_device_request_proofs.sql +8 -0
  250. package/dist/src/storage/sqlite/upgrades/245_memory_learning.sql +125 -0
  251. package/dist/src/storage/sqlite/upgrades/246_personal_session_thinking.sql +22 -0
  252. package/dist/src/storage/sqlite/upgrades/247_agent_selection_records.sql +32 -0
  253. package/dist/src/storage/sqlite/upgrades/248_next_turn_suggestions.sql +20 -0
  254. package/dist/src/storage/sqlite/upgrades/249_task_allocations.sql +17 -0
  255. package/dist/src/storage/sqlite/upgrades/250_research_checkpoints.sql +15 -0
  256. package/dist/src/storage/sqlite/upgrades/251_personal_result_reads.sql +40 -0
  257. package/dist/src/storage/sqlite/upgrades/252_task_work_revisions.sql +15 -0
  258. package/dist/src/storage/sqlite/upgrades/253_discussion_processing_recovery.sql +20 -0
  259. package/dist/src/storage/sqlite/upgrades/254_discussion_annotations.sql +17 -0
  260. package/dist/src/storage/sqlite/upgrades/255_discussion_chapter_progress.sql +10 -0
  261. package/dist/src/storage/sqlite/upgrades/256_task_main_update_retries.sql +21 -0
  262. package/dist/src/storage/sqlite/upgrades/257_session_composer_history.sql +11 -0
  263. package/dist/src/storage/sqlite/upgrades/258_task_phase_changes.sql +20 -0
  264. package/dist/src/storage/sqlite/upgrades/259_personal_default_style.sql +10 -0
  265. package/dist/src/storage/sqlite/windows-database-owners.js +33 -28
  266. package/dist/src/tasks/capabilities/read.js +2 -2
  267. package/dist/src/tasks/capabilities/relations.d.ts +2 -2
  268. package/dist/src/tasks/capabilities/write.js +1 -1
  269. package/dist/src/tui/backends/embedded-backend.js +1 -1
  270. package/dist/src/tui/clipboard-image.js +1 -1
  271. package/dist/src/tui/tui.js +1 -1
  272. package/dist/src/user-context/sources/index.js +1 -1
  273. package/dist/src/utils/index.js +1 -1
  274. package/dist/src/utils/logger/index.js +1 -1
  275. package/dist/src/utils/logger.js +1 -1
  276. package/dist/src/voice/realtime/persona-context.js +1 -1
  277. package/dist/src/work-discovery/probe.js +1 -1
  278. package/dist/src/work-discovery/service.js +2 -2
  279. package/package.json +6 -6
  280. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BFmRRD_4.js +0 -1
  281. package/dist/gateway/static/root/assets/agents-Clwskw2J.js +0 -77
  282. package/dist/gateway/static/root/assets/apps-page-DJbKg3va.js +0 -1
  283. package/dist/gateway/static/root/assets/automations-workspace-D_X0_1X3.js +0 -8
  284. package/dist/gateway/static/root/assets/browser-automations-page-BI-ep6uM.js +0 -3
  285. package/dist/gateway/static/root/assets/browser-settings-page-BTyQ4-vN.js +0 -3
  286. package/dist/gateway/static/root/assets/capabilities-page-GNS95mG9.js +0 -2
  287. package/dist/gateway/static/root/assets/capabilities-settings-panel-DBiv1HN-.js +0 -8
  288. package/dist/gateway/static/root/assets/channels-DWlrUKBr.js +0 -1
  289. package/dist/gateway/static/root/assets/connectors-page-BcpUvrtl.js +0 -1
  290. package/dist/gateway/static/root/assets/dependency-picker-C4jddxFl.js +0 -1
  291. package/dist/gateway/static/root/assets/desktop-pet-BCbiUNQG.js +0 -1
  292. package/dist/gateway/static/root/assets/desktop-pet-settings-CkKU0JMY.js +0 -1
  293. package/dist/gateway/static/root/assets/device-pairing-wizard--E2GQoY1.js +0 -1
  294. package/dist/gateway/static/root/assets/gateway-realtime-store-CoIgC1Al.js +0 -1
  295. package/dist/gateway/static/root/assets/gateway-settings-CR4CsfNN.js +0 -1
  296. package/dist/gateway/static/root/assets/home-page-B9w3a6r2.js +0 -2
  297. package/dist/gateway/static/root/assets/imports-page-bxTINe-2.js +0 -1
  298. package/dist/gateway/static/root/assets/index-D1oivYvN.js +0 -710
  299. package/dist/gateway/static/root/assets/index-D_7q1UkI.css +0 -1
  300. package/dist/gateway/static/root/assets/local-app-workbench-page-NGCmXpa_.js +0 -1
  301. package/dist/gateway/static/root/assets/logs-page-drrr-c2W.js +0 -2
  302. package/dist/gateway/static/root/assets/management-settings-Dc1opXVr.js +0 -1
  303. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-B--edI1I.js +0 -1
  304. package/dist/gateway/static/root/assets/note-detail-panel-C3s4-ytB.js +0 -5
  305. package/dist/gateway/static/root/assets/note-image-lightbox-D7q5-KuS.js +0 -1
  306. package/dist/gateway/static/root/assets/notes-page-qVxoErUS.js +0 -8
  307. package/dist/gateway/static/root/assets/personal-page-B-T8NzQo.js +0 -1
  308. package/dist/gateway/static/root/assets/personal-settings-panel-BKA4fbYH.js +0 -1
  309. package/dist/gateway/static/root/assets/phone-dependencies-card-DhEsfEUN.js +0 -1
  310. package/dist/gateway/static/root/assets/phone-model-picker-J4mFDk21.js +0 -1
  311. package/dist/gateway/static/root/assets/phone-settings-page-BLflz8CQ.js +0 -1
  312. package/dist/gateway/static/root/assets/plugin-details-dialog-1BwvmKZi.js +0 -1
  313. package/dist/gateway/static/root/assets/project-detail-page-DwowzxzD.js +0 -7
  314. package/dist/gateway/static/root/assets/projects-page-Bwvn4i_e.js +0 -1
  315. package/dist/gateway/static/root/assets/remote-access-hub-DrHisOUe.js +0 -1
  316. package/dist/gateway/static/root/assets/sessions-page-seP7t0kv.js +0 -1
  317. package/dist/gateway/static/root/assets/settings-advanced-gate-VqBu7gHu.js +0 -1
  318. package/dist/gateway/static/root/assets/shares-settings-BWaykw9E.js +0 -1
  319. package/dist/gateway/static/root/assets/skill-reload-api-Bq-3_MCt.js +0 -1
  320. package/dist/gateway/static/root/assets/skills-page-C3LfWsAZ.js +0 -2
  321. package/dist/gateway/static/root/assets/task-detail-page-XCJFP-Aa.js +0 -2
  322. package/dist/gateway/static/root/assets/usage-page-CTTmklCs.js +0 -1
  323. package/dist/gateway/static/root/assets/user-model-page-BDqguzRE.js +0 -2
@@ -1,7 +1,6 @@
1
- import { SCRCPY_SHA256, SCRCPY_VERSION } from '../runtime-tools/phone-dependency-catalog.js';
1
+ import { ScrcpyTextChannel } from './scrcpy-text.js';
2
2
  import type { PhoneInteractiveProvider, PhonePointer, PhoneVideoGeometry, PhoneVideoPacket } from './live-provider.js';
3
- export { SCRCPY_VERSION, SCRCPY_SHA256 };
4
- export declare const scrcpyServerPath: (stateDir?: string) => string;
3
+ export { readScrcpyServer, scrcpyServerPath, SCRCPY_VERSION, SCRCPY_SHA256 } from './scrcpy-assets.js';
5
4
  /** The pinned server sends codec metadata followed by bounded, length-prefixed packets. */
6
5
  export declare class ScrcpyVideoParser {
7
6
  private buffer;
@@ -9,7 +8,6 @@ export declare class ScrcpyVideoParser {
9
8
  push(chunk: Buffer, packet: (packet: PhoneVideoPacket) => void): void;
10
9
  }
11
10
  export declare function scrcpyTouch(phase: PhonePointer['phase'], x: number, y: number, width: number, height: number): Buffer;
12
- export declare function readScrcpyServer(): Promise<Buffer>;
13
11
  /** Local and cloud transports share geometry, gesture sequencing and revocation. */
14
12
  export declare abstract class ScrcpyProvider implements PhoneInteractiveProvider {
15
13
  private onFailure;
@@ -21,6 +19,7 @@ export declare abstract class ScrcpyProvider implements PhoneInteractiveProvider
21
19
  };
22
20
  geometry: PhoneVideoGeometry;
23
21
  protected closing: boolean;
22
+ protected textChannel: ScrcpyTextChannel;
24
23
  private touch?;
25
24
  private listeners;
26
25
  private config?;
@@ -32,6 +31,7 @@ export declare abstract class ScrcpyProvider implements PhoneInteractiveProvider
32
31
  protected abstract startTransport(): Promise<void>;
33
32
  protected abstract write(buffer: Buffer): Promise<void>;
34
33
  protected abstract cleanup(): Promise<void>;
34
+ pasteText(text: string, signal: AbortSignal): Promise<void>;
35
35
  start(): Promise<void>;
36
36
  protected packet(packet: PhoneVideoPacket): void;
37
37
  subscribe(listener: (packet: PhoneVideoPacket) => void): () => void;
@@ -45,6 +45,7 @@ export declare class LocalScrcpyProvider extends ScrcpyProvider {
45
45
  private adb;
46
46
  private serial;
47
47
  private tuning;
48
+ private textOnly;
48
49
  private process?;
49
50
  private video?;
50
51
  private control?;
@@ -54,7 +55,7 @@ export declare class LocalScrcpyProvider extends ScrcpyProvider {
54
55
  constructor(adb: string, serial: string, onFailure: () => void, tuning?: {
55
56
  maxSize: number;
56
57
  bitRate: number;
57
- });
58
+ }, textOnly?: boolean);
58
59
  foreground(signal: AbortSignal): Promise<string>;
59
60
  protected startTransport(): Promise<void>;
60
61
  protected write(buffer: Buffer): Promise<void>;
@@ -1,15 +1,15 @@
1
1
  import { PhoneError, init_contracts } from "./contracts.js";
2
2
  import { spawnPhoneCommand } from "../process/phone-process.js";
3
- import { SCRCPY_SHA256, SCRCPY_VERSION, managedScrcpyServerPath } from "../runtime-tools/phone-dependency-catalog.js";
3
+ import { SCRCPY_SHA256, SCRCPY_VERSION } from "../runtime-tools/phone-dependency-catalog.js";
4
+ import { readScrcpyServer, scrcpyServerPath } from "./scrcpy-assets.js";
5
+ import { ScrcpyTextChannel } from "./scrcpy-text.js";
4
6
  import { AdbPhoneDriver, runAdb } from "./adb-driver.js";
5
- import { createHash, randomBytes } from "node:crypto";
6
- import { readFile } from "node:fs/promises";
7
+ import { randomBytes } from "node:crypto";
7
8
  import { connect } from "node:net";
8
9
  import { setTimeout as setTimeout$1 } from "node:timers/promises";
9
10
  import { h264ParseConfiguration } from "@yume-chan/scrcpy";
10
11
  //#region src/phone/scrcpy.ts
11
12
  init_contracts();
12
- const scrcpyServerPath = managedScrcpyServerPath;
13
13
  /** The pinned server sends codec metadata followed by bounded, length-prefixed packets. */
14
14
  var ScrcpyVideoParser = class {
15
15
  buffer = Buffer.alloc(0);
@@ -55,13 +55,6 @@ function scrcpyTouch(phase, x, y, width, height) {
55
55
  buffer.writeUInt16BE(phase === "up" || phase === "cancel" ? 0 : 65535, 22);
56
56
  return buffer;
57
57
  }
58
- async function readScrcpyServer() {
59
- const binary = await readFile(scrcpyServerPath()).catch(() => {
60
- throw new PhoneError("PHONE_VIDEO_SETUP_REQUIRED", "Install scrcpy server in Settings → Phone Use → Dependencies");
61
- });
62
- if (createHash("sha256").update(binary).digest("hex") !== "7e70323ba7f259649dd4acce97ac4fefbae8102b2c6d91e2e7be613fd5354be0") throw new PhoneError("PHONE_VIDEO_HASH_MISMATCH", "Phone video server checksum mismatch");
63
- return binary;
64
- }
65
58
  /** Local and cloud transports share geometry, gesture sequencing and revocation. */
66
59
  var ScrcpyProvider = class {
67
60
  descriptor = {
@@ -77,6 +70,7 @@ var ScrcpyProvider = class {
77
70
  codec: ""
78
71
  };
79
72
  closing = false;
73
+ textChannel = new ScrcpyTextChannel((bytes) => this.write(bytes));
80
74
  touch;
81
75
  listeners = /* @__PURE__ */ new Set();
82
76
  config;
@@ -86,6 +80,25 @@ var ScrcpyProvider = class {
86
80
  constructor(onFailure) {
87
81
  this.onFailure = onFailure;
88
82
  }
83
+ async pasteText(text, signal) {
84
+ signal.throwIfAborted();
85
+ const deadline = AbortSignal.any([signal, AbortSignal.timeout(25e3)]);
86
+ const abort = () => {
87
+ this.close();
88
+ };
89
+ deadline.addEventListener("abort", abort, { once: true });
90
+ try {
91
+ try {
92
+ await this.start();
93
+ deadline.throwIfAborted();
94
+ } catch {
95
+ throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Automatic text input is unavailable. Check Phone settings or take over and type with the phone keyboard.", 409);
96
+ }
97
+ await this.textChannel.paste(text, deadline);
98
+ } finally {
99
+ deadline.removeEventListener("abort", abort);
100
+ }
101
+ }
89
102
  start() {
90
103
  if (this.closing) return Promise.reject(new PhoneError("PHONE_VIDEO_ENDED", "Phone video ended", 409));
91
104
  if (!this.startResult) {
@@ -152,6 +165,7 @@ var ScrcpyProvider = class {
152
165
  }
153
166
  close() {
154
167
  this.closing = true;
168
+ this.textChannel.close();
155
169
  return this.closeResult ??= (async () => {
156
170
  await this.opening?.catch(() => {});
157
171
  try {
@@ -173,11 +187,12 @@ var LocalScrcpyProvider = class extends ScrcpyProvider {
173
187
  constructor(adb, serial, onFailure, tuning = {
174
188
  maxSize: 960,
175
189
  bitRate: 2e6
176
- }) {
190
+ }, textOnly = false) {
177
191
  super(onFailure);
178
192
  this.adb = adb;
179
193
  this.serial = serial;
180
194
  this.tuning = tuning;
195
+ this.textOnly = textOnly;
181
196
  }
182
197
  foreground(signal) {
183
198
  return new AdbPhoneDriver(this.adb).foreground(this.serial, signal);
@@ -229,7 +244,8 @@ var LocalScrcpyProvider = class extends ScrcpyProvider {
229
244
  "send_device_meta=false",
230
245
  "send_codec_meta=true",
231
246
  "send_frame_meta=true",
232
- "clipboard_autosync=false"
247
+ "clipboard_autosync=false",
248
+ ...this.textOnly ? ["video=false", "power_on=false"] : []
233
249
  ]);
234
250
  this.process.once("error", () => this.fail());
235
251
  this.process.once("exit", () => this.fail());
@@ -267,6 +283,21 @@ var LocalScrcpyProvider = class extends ScrcpyProvider {
267
283
  await setTimeout$1(50);
268
284
  }
269
285
  if (!this.video) throw new Error("Scrcpy connection timed out");
286
+ if (this.textOnly) {
287
+ this.control = this.video;
288
+ this.video = void 0;
289
+ this.control.setNoDelay(true);
290
+ this.control.on("error", () => this.fail());
291
+ this.control.on("end", () => this.fail());
292
+ this.control.on("data", (data) => {
293
+ try {
294
+ this.textChannel.receive(Buffer.from(data));
295
+ } catch {
296
+ this.fail();
297
+ }
298
+ });
299
+ return;
300
+ }
270
301
  const parser = new ScrcpyVideoParser();
271
302
  this.video.on("data", (data) => {
272
303
  try {
@@ -284,7 +315,13 @@ var LocalScrcpyProvider = class extends ScrcpyProvider {
284
315
  this.control.setNoDelay(true);
285
316
  this.control.on("error", () => this.fail());
286
317
  this.control.on("end", () => this.fail());
287
- this.control.on("data", () => {});
318
+ this.control.on("data", (data) => {
319
+ try {
320
+ this.textChannel.receive(Buffer.from(data));
321
+ } catch {
322
+ this.fail();
323
+ }
324
+ });
288
325
  await new Promise((resolve, reject) => {
289
326
  this.control.once("connect", resolve);
290
327
  this.control.once("error", reject);
@@ -1,8 +1,8 @@
1
1
  import { RuntimeError } from "./errors.js";
2
2
  import { isAbsolute, join, posix, relative, resolve } from "node:path";
3
3
  import { spawn } from "node:child_process";
4
- import AdmZip from "adm-zip";
5
4
  import { lstat, mkdir, readdir, readlink, rename, rm, stat } from "node:fs/promises";
5
+ import AdmZip from "adm-zip";
6
6
  //#region src/runtime-tools/archive.ts
7
7
  const MAX_ARCHIVE_ENTRIES = 5e4;
8
8
  const MAX_TAR_OUTPUT_BYTES = 16 * 1024 * 1024;
@@ -1,10 +1,10 @@
1
1
  import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
2
  import { resolveXopcDatabasePath } from "../../config/paths-state.js";
3
3
  import { init_paths } from "./paths.js";
4
- import { ensureXopcDatabaseSchema, init_schema } from "./schema.js";
5
- import { init_node_sqlite, requireNodeSqlite } from "../../infra/node-sqlite.js";
6
4
  import { createLogger } from "../../utils/logger/index.js";
7
5
  import { init_logger } from "../../utils/logger.js";
6
+ import { ensureXopcDatabaseSchema, init_schema } from "./schema.js";
7
+ import { init_node_sqlite, requireNodeSqlite } from "../../infra/node-sqlite.js";
8
8
  import { init_unhandled_rejections, installSqliteTransientRejectionHandler } from "../../infra/unhandled-rejections.js";
9
9
  import path from "node:path";
10
10
  import fs from "node:fs";
@@ -1,13 +1,9 @@
1
- import { windowsDatabaseOwners } from "./windows-database-owners.js";
1
+ import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
+ import { init_windows_database_owners, windowsDatabaseOwners } from "./windows-database-owners.js";
2
3
  import { resolve } from "node:path";
3
4
  import { closeSync, fsyncSync, openSync, readdirSync, readlinkSync, statSync } from "node:fs";
4
5
  import { execFileSync } from "node:child_process";
5
6
  //#region src/storage/sqlite/offline-access.ts
6
- const backupFileSyncOperations = {
7
- open: openSync,
8
- fsync: fsyncSync,
9
- close: closeSync
10
- };
11
7
  /** Windows requires write access on a file handle before FlushFileBuffers/fsync. */
12
8
  function flushBackupFile(backupPath, operations = backupFileSyncOperations) {
13
9
  const fd = operations.open(backupPath, "r+");
@@ -73,5 +69,15 @@ function assertDatabaseOffline(databasePath) {
73
69
  const otherOwners = databaseOwners(databasePath);
74
70
  if (otherOwners.length) throw new Error(`Stop other xopc database processes before backing up: ${otherOwners.join(", ")}`);
75
71
  }
72
+ var backupFileSyncOperations;
73
+ var init_offline_access = __esmMin((() => {
74
+ init_windows_database_owners();
75
+ backupFileSyncOperations = {
76
+ open: openSync,
77
+ fsync: fsyncSync,
78
+ close: closeSync
79
+ };
80
+ }));
76
81
  //#endregion
77
- export { assertDatabaseOffline, flushBackupFile };
82
+ init_offline_access();
83
+ export { assertDatabaseOffline, flushBackupFile, init_offline_access };
@@ -8,3 +8,15 @@ export declare class DatabaseSchemaTooOldError extends Error {
8
8
  readonly minimumVersion: number;
9
9
  constructor(dbVersion: number, minimumVersion: number);
10
10
  }
11
+ export declare class DatabaseSchemaMigrationGapError extends Error {
12
+ readonly dbVersion: number;
13
+ readonly appVersion: number;
14
+ readonly missingVersion: number;
15
+ constructor(dbVersion: number, appVersion: number, missingVersion: number);
16
+ }
17
+ export declare class DatabaseSchemaMigrationFailedError extends Error {
18
+ readonly dbVersion: number;
19
+ readonly appVersion: number;
20
+ readonly backupPath: string | undefined;
21
+ constructor(dbVersion: number, appVersion: number, backupPath: string | undefined, cause: unknown);
22
+ }
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
2
  //#region src/storage/sqlite/schema-errors.ts
3
- var DatabaseSchemaTooNewError, DatabaseSchemaTooOldError;
3
+ var DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, DatabaseSchemaMigrationGapError, DatabaseSchemaMigrationFailedError;
4
4
  var init_schema_errors = __esmMin((() => {
5
5
  DatabaseSchemaTooNewError = class extends Error {
6
6
  dbVersion;
@@ -16,13 +16,31 @@ var init_schema_errors = __esmMin((() => {
16
16
  dbVersion;
17
17
  minimumVersion;
18
18
  constructor(dbVersion, minimumVersion) {
19
- super(`xopc database schema version ${dbVersion} is older than the minimum supported version (${minimumVersion}). Start with a new xopc.db.`);
19
+ super(`xopc database schema version ${dbVersion} is older than the minimum supported version (${minimumVersion}). Keep xopc.db and its WAL/SHM files; use a release with an upgrade path for this database or contact support.`);
20
20
  this.name = "DatabaseSchemaTooOldError";
21
21
  this.dbVersion = dbVersion;
22
22
  this.minimumVersion = minimumVersion;
23
23
  }
24
24
  };
25
+ DatabaseSchemaMigrationGapError = class extends Error {
26
+ constructor(dbVersion, appVersion, missingVersion) {
27
+ super(`xopc database schema version ${dbVersion} requires migration to v${missingVersion}, but that migration is not bundled.`);
28
+ this.dbVersion = dbVersion;
29
+ this.appVersion = appVersion;
30
+ this.missingVersion = missingVersion;
31
+ this.name = "DatabaseSchemaMigrationGapError";
32
+ }
33
+ };
34
+ DatabaseSchemaMigrationFailedError = class extends Error {
35
+ constructor(dbVersion, appVersion, backupPath, cause) {
36
+ super(`SQLite database upgrade from v${dbVersion} to v${appVersion} failed; the upgrade was rolled back. ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
37
+ this.dbVersion = dbVersion;
38
+ this.appVersion = appVersion;
39
+ this.backupPath = backupPath;
40
+ this.name = "DatabaseSchemaMigrationFailedError";
41
+ }
42
+ };
25
43
  }));
26
44
  //#endregion
27
45
  init_schema_errors();
28
- export { DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, init_schema_errors };
46
+ export { DatabaseSchemaMigrationFailedError, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, init_schema_errors };
@@ -0,0 +1,4 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ export declare const XOPC_DB_MINIMUM_SCHEMA_VERSION = 202;
3
+ /** Keep the complete historical schema and data; retired features are never reactivated. */
4
+ export declare function upgradeXopcDatabase(db: DatabaseSync, fromVersion: number, targetVersion: number): void;
@@ -0,0 +1,78 @@
1
+ import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
+ import { init_sql_assets, readSqliteAsset, resolveSqliteAssetPath } from "./sql-assets.js";
3
+ import { init_schema_version, readSchemaVersion, setSchemaVersion } from "./schema-version.js";
4
+ import { DatabaseSchemaMigrationFailedError, DatabaseSchemaMigrationGapError, init_schema_errors } from "./schema-errors.js";
5
+ import { createLogger } from "../../utils/logger/index.js";
6
+ import { init_logger } from "../../utils/logger.js";
7
+ import { assertDatabaseOffline, flushBackupFile, init_offline_access } from "./offline-access.js";
8
+ import { chmodSync, readdirSync } from "node:fs";
9
+ import { randomUUID } from "node:crypto";
10
+ //#region src/storage/sqlite/schema-upgrade.ts
11
+ /** Keep the complete historical schema and data; retired features are never reactivated. */
12
+ function upgradeXopcDatabase(db, fromVersion, targetVersion) {
13
+ let files;
14
+ try {
15
+ files = readdirSync(resolveSqliteAssetPath("upgrades"));
16
+ } catch (error) {
17
+ if (error.code !== "ENOENT") throw error;
18
+ throw new DatabaseSchemaMigrationGapError(fromVersion, targetVersion, fromVersion + 1);
19
+ }
20
+ const migrations = [];
21
+ for (let version = fromVersion + 1; version <= targetVersion; version++) {
22
+ const matches = files.filter((file) => file.startsWith(`${version}_`) && file.endsWith(".sql"));
23
+ if (matches.length !== 1) throw new DatabaseSchemaMigrationGapError(fromVersion, targetVersion, version);
24
+ migrations.push(readSqliteAsset(`upgrades/${matches[0]}`));
25
+ }
26
+ const databasePath = db.prepare("PRAGMA database_list").all().find((row) => row.name === "main")?.file;
27
+ let backupPath;
28
+ if (databasePath) {
29
+ assertDatabaseOffline(databasePath);
30
+ backupPath = `${databasePath}.pre-upgrade-v${fromVersion}-${randomUUID()}.bak`;
31
+ db.prepare("VACUUM main INTO ?").run(backupPath);
32
+ chmodSync(backupPath, 384);
33
+ flushBackupFile(backupPath);
34
+ log.info({
35
+ path: databasePath,
36
+ backupPath,
37
+ fromVersion,
38
+ targetVersion
39
+ }, "Created pre-upgrade SQLite backup");
40
+ }
41
+ const foreignKeysEnabled = Number(db.prepare("PRAGMA foreign_keys").get()?.foreign_keys) === 1;
42
+ db.exec("PRAGMA foreign_keys = OFF");
43
+ let transactionStarted = false;
44
+ try {
45
+ db.exec("BEGIN IMMEDIATE");
46
+ transactionStarted = true;
47
+ if (readSchemaVersion(db) !== fromVersion) throw new Error("Database version changed during upgrade; retry startup");
48
+ for (const sql of migrations) db.exec(sql);
49
+ if (db.prepare("PRAGMA foreign_key_check").all().length) throw new Error("Database upgrade would violate foreign key integrity");
50
+ if (db.prepare("PRAGMA integrity_check").get()?.integrity_check !== "ok") throw new Error("Database upgrade failed integrity validation");
51
+ setSchemaVersion(db, targetVersion);
52
+ db.exec("COMMIT");
53
+ transactionStarted = false;
54
+ log.info({
55
+ fromVersion,
56
+ targetVersion,
57
+ backupPath
58
+ }, "Upgraded xopc SQLite database");
59
+ } catch (error) {
60
+ if (transactionStarted) db.exec("ROLLBACK");
61
+ throw new DatabaseSchemaMigrationFailedError(fromVersion, targetVersion, backupPath, error);
62
+ } finally {
63
+ if (foreignKeysEnabled) db.exec("PRAGMA foreign_keys = ON");
64
+ }
65
+ }
66
+ var XOPC_DB_MINIMUM_SCHEMA_VERSION, log;
67
+ var init_schema_upgrade = __esmMin((() => {
68
+ init_logger();
69
+ init_offline_access();
70
+ init_schema_errors();
71
+ init_schema_version();
72
+ init_sql_assets();
73
+ XOPC_DB_MINIMUM_SCHEMA_VERSION = 202;
74
+ log = createLogger("Sqlite:Upgrade");
75
+ }));
76
+ //#endregion
77
+ init_schema_upgrade();
78
+ export { XOPC_DB_MINIMUM_SCHEMA_VERSION, init_schema_upgrade, upgradeXopcDatabase };
@@ -2,5 +2,6 @@ import type { DatabaseSync } from 'node:sqlite';
2
2
  export { SCHEMA_META_SCHEMA_VERSION_KEY, readSchemaVersionForTest, readSchemaVersion, setSchemaVersion, ensureSchemaMetaTable } from './schema-version.js';
3
3
  export declare const XOPC_DB_SCHEMA_VERSION = 259;
4
4
  export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 259;
5
- /** Open only the current schema; older databases are never upgraded or interpreted. */
5
+ export { XOPC_DB_MINIMUM_SCHEMA_VERSION } from './schema-upgrade.js';
6
+ /** Initialize fresh databases directly; upgrade supported installed databases transactionally. */
6
7
  export declare function ensureXopcDatabaseSchema(db: DatabaseSync): void;
@@ -4,8 +4,9 @@ import { currentOperationId, init_operation_context } from "../../infra/operatio
4
4
  import { init_sql_assets, readSqliteAsset } from "./sql-assets.js";
5
5
  import { SCHEMA_META_SCHEMA_VERSION_KEY, ensureSchemaMetaTable, init_schema_version, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion } from "./schema-version.js";
6
6
  import { DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, init_schema_errors } from "./schema-errors.js";
7
+ import { XOPC_DB_MINIMUM_SCHEMA_VERSION, init_schema_upgrade, upgradeXopcDatabase } from "./schema-upgrade.js";
7
8
  //#region src/storage/sqlite/schema.ts
8
- /** Open only the current schema; older databases are never upgraded or interpreted. */
9
+ /** Initialize fresh databases directly; upgrade supported installed databases transactionally. */
9
10
  function ensureXopcDatabaseSchema(db) {
10
11
  db.function("xopc_memory_search_text", { deterministic: true }, (value) => memorySearchText(String(value ?? "")));
11
12
  db.function("xopc_operation_id", () => currentOperationId() ?? null);
@@ -14,7 +15,11 @@ function ensureXopcDatabaseSchema(db) {
14
15
  if (!hasMetadata && tables.length) throw new Error("An unversioned database cannot be initialized");
15
16
  const version = hasMetadata ? readSchemaVersion(db) : 0;
16
17
  if (version > 259) throw new DatabaseSchemaTooNewError(version, 259);
17
- if (version > 0 && version < 259) throw new DatabaseSchemaTooOldError(version, 259);
18
+ if (version > 0 && version < 202) throw new DatabaseSchemaTooOldError(version, 202);
19
+ if (version >= 202 && version < 259) {
20
+ upgradeXopcDatabase(db, version, 259);
21
+ return;
22
+ }
18
23
  if (version === 259) return;
19
24
  if (db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name != 'schema_meta' AND name NOT LIKE 'sqlite_%' LIMIT 1").get()) throw new Error("An unversioned database cannot be initialized");
20
25
  db.exec("BEGIN IMMEDIATE");
@@ -34,9 +39,10 @@ var init_schema = __esmMin((() => {
34
39
  init_sql_assets();
35
40
  init_schema_version();
36
41
  init_schema_errors();
42
+ init_schema_upgrade();
37
43
  XOPC_DB_SCHEMA_VERSION = 259;
38
44
  XOPC_DB_BASELINE_SCHEMA_VERSION = 259;
39
45
  }));
40
46
  //#endregion
41
47
  init_schema();
42
- export { SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, ensureSchemaMetaTable, ensureXopcDatabaseSchema, init_schema, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion };
48
+ export { SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_MINIMUM_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, ensureSchemaMetaTable, ensureXopcDatabaseSchema, init_schema, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion };
@@ -0,0 +1,70 @@
1
+ DROP TABLE IF EXISTS relationship_settings;
2
+
3
+ CREATE TABLE context_snapshots_v203 (
4
+ snapshot_id TEXT PRIMARY KEY,
5
+ trace_id TEXT NOT NULL UNIQUE,
6
+ owner_kind TEXT NOT NULL CHECK (owner_kind IN ('task_run', 'task', 'session')),
7
+ owner_id TEXT NOT NULL,
8
+ conversation_id TEXT,
9
+ query TEXT NOT NULL,
10
+ selected_items_json TEXT NOT NULL DEFAULT '[]',
11
+ rejected_items_json TEXT NOT NULL DEFAULT '[]',
12
+ consent_requests_json TEXT NOT NULL DEFAULT '[]',
13
+ relationship_policy_json TEXT NOT NULL DEFAULT '{}',
14
+ estimated_tokens INTEGER NOT NULL DEFAULT 0,
15
+ allocation_json TEXT,
16
+ authorization_snapshot_json TEXT NOT NULL DEFAULT '{}',
17
+ content_hash TEXT,
18
+ created_at INTEGER NOT NULL,
19
+ FOREIGN KEY (conversation_id) REFERENCES sessions(conversation_id) ON DELETE SET NULL
20
+ );
21
+
22
+ INSERT INTO context_snapshots_v203
23
+ SELECT * FROM context_snapshots WHERE owner_kind <> 'proactive_run';
24
+
25
+ DROP TABLE context_snapshots;
26
+ ALTER TABLE context_snapshots_v203 RENAME TO context_snapshots;
27
+
28
+ CREATE INDEX idx_context_snapshots_owner
29
+ ON context_snapshots(owner_kind, owner_id, created_at DESC);
30
+ CREATE INDEX idx_context_snapshots_session
31
+ ON context_snapshots(conversation_id, created_at DESC);
32
+
33
+ CREATE TABLE collaboration_rules_v203 (
34
+ rule_id TEXT PRIMARY KEY,
35
+ principal_id TEXT NOT NULL,
36
+ category TEXT NOT NULL CHECK (category IN ('communication', 'execution', 'boundary', 'routine', 'initiative')),
37
+ status TEXT NOT NULL CHECK (status IN ('active', 'disabled', 'archived')),
38
+ priority INTEGER NOT NULL DEFAULT 100,
39
+ scope_type TEXT NOT NULL CHECK (scope_type IN ('global', 'workspace', 'project', 'session')),
40
+ scope_id TEXT,
41
+ conditions_json TEXT NOT NULL DEFAULT '{}',
42
+ current_revision_id TEXT NOT NULL REFERENCES collaboration_rule_revisions(revision_id)
43
+ DEFERRABLE INITIALLY DEFERRED,
44
+ created_at INTEGER NOT NULL,
45
+ updated_at INTEGER NOT NULL
46
+ );
47
+
48
+ INSERT INTO collaboration_rules_v203 (
49
+ rule_id, principal_id, category, status, priority, scope_type, scope_id,
50
+ conditions_json, current_revision_id, created_at, updated_at
51
+ )
52
+ SELECT
53
+ rule_id,
54
+ principal_id,
55
+ CASE category WHEN 'proactive' THEN 'initiative' ELSE category END,
56
+ status,
57
+ priority,
58
+ scope_type,
59
+ scope_id,
60
+ conditions_json,
61
+ current_revision_id,
62
+ created_at,
63
+ updated_at
64
+ FROM collaboration_rules;
65
+
66
+ DROP TABLE collaboration_rules;
67
+ ALTER TABLE collaboration_rules_v203 RENAME TO collaboration_rules;
68
+
69
+ CREATE INDEX idx_collaboration_rules_principal_status
70
+ ON collaboration_rules(principal_id, status, priority, updated_at DESC);
@@ -0,0 +1,78 @@
1
+ CREATE TABLE home_advice_generations (
2
+ generation_id TEXT PRIMARY KEY,
3
+ owner_id TEXT NOT NULL,
4
+ workspace_id TEXT NOT NULL,
5
+ idempotency_key TEXT NOT NULL,
6
+ status TEXT NOT NULL CHECK(status IN ('queued', 'running', 'succeeded', 'skipped', 'retry_wait', 'failed', 'cancelled')),
7
+ reasons_json TEXT NOT NULL DEFAULT '[]' CHECK(json_valid(reasons_json)),
8
+ requested_at INTEGER NOT NULL,
9
+ started_at INTEGER,
10
+ completed_at INTEGER,
11
+ retry_at INTEGER,
12
+ lease_owner TEXT,
13
+ lease_until INTEGER,
14
+ lease_epoch INTEGER NOT NULL DEFAULT 0,
15
+ attempt INTEGER NOT NULL DEFAULT 0,
16
+ dirty_after_start INTEGER NOT NULL DEFAULT 0 CHECK(dirty_after_start IN (0, 1)),
17
+ snapshot_hash TEXT,
18
+ evidence_ids_json TEXT NOT NULL DEFAULT '[]' CHECK(json_valid(evidence_ids_json)),
19
+ result_json TEXT CHECK(result_json IS NULL OR json_valid(result_json)),
20
+ model_ref TEXT,
21
+ input_tokens INTEGER,
22
+ output_tokens INTEGER,
23
+ estimated_cost_usd REAL,
24
+ outcome_reason TEXT,
25
+ error_code TEXT
26
+ );
27
+
28
+ CREATE UNIQUE INDEX idx_home_advice_generation_idempotency
29
+ ON home_advice_generations(owner_id, workspace_id, idempotency_key);
30
+ CREATE UNIQUE INDEX idx_home_advice_generation_active
31
+ ON home_advice_generations(owner_id, workspace_id)
32
+ WHERE status IN ('queued', 'running', 'retry_wait');
33
+ CREATE INDEX idx_home_advice_generation_claim
34
+ ON home_advice_generations(status, retry_at, requested_at);
35
+ CREATE INDEX idx_home_advice_generation_latest
36
+ ON home_advice_generations(owner_id, workspace_id, completed_at DESC);
37
+
38
+ CREATE TABLE home_opportunity_projections (
39
+ opportunity_id TEXT PRIMARY KEY,
40
+ generation_id TEXT NOT NULL REFERENCES home_advice_generations(generation_id) ON DELETE CASCADE,
41
+ owner_id TEXT NOT NULL,
42
+ workspace_id TEXT NOT NULL,
43
+ rank INTEGER NOT NULL CHECK(rank BETWEEN 0 AND 2),
44
+ kind TEXT NOT NULL CHECK(kind IN ('project_next_step', 'delivery_risk', 'meeting_prep', 'commitment_follow_up', 'automation_candidate')),
45
+ project_id TEXT,
46
+ dedupe_key TEXT NOT NULL,
47
+ content_json TEXT NOT NULL CHECK(json_valid(content_json)),
48
+ evidence_refs_json TEXT NOT NULL DEFAULT '[]' CHECK(json_valid(evidence_refs_json)),
49
+ snapshot_hash TEXT NOT NULL,
50
+ state TEXT NOT NULL CHECK(state IN ('active', 'snoozed', 'accepted', 'discussing', 'dismissed', 'expired', 'superseded')),
51
+ revision INTEGER NOT NULL DEFAULT 1 CHECK(revision > 0),
52
+ created_at INTEGER NOT NULL,
53
+ updated_at INTEGER NOT NULL,
54
+ expires_at INTEGER NOT NULL,
55
+ snoozed_until INTEGER,
56
+ resolution_kind TEXT CHECK(resolution_kind IS NULL OR resolution_kind IN ('session', 'task', 'scene')),
57
+ resolution_ref TEXT
58
+ );
59
+
60
+ CREATE UNIQUE INDEX idx_home_opportunity_active_dedupe
61
+ ON home_opportunity_projections(owner_id, workspace_id, dedupe_key)
62
+ WHERE state IN ('active', 'snoozed');
63
+ CREATE INDEX idx_home_opportunity_visible
64
+ ON home_opportunity_projections(owner_id, workspace_id, state, rank, expires_at);
65
+
66
+ CREATE TABLE home_opportunity_feedback (
67
+ feedback_id TEXT PRIMARY KEY,
68
+ opportunity_id TEXT NOT NULL REFERENCES home_opportunity_projections(opportunity_id) ON DELETE CASCADE,
69
+ idempotency_key TEXT NOT NULL UNIQUE,
70
+ kind TEXT NOT NULL CHECK(kind IN ('started', 'discussed', 'already_done', 'irrelevant', 'too_early', 'source_incorrect', 'less_like_this', 'snoozed')),
71
+ reason_code TEXT,
72
+ note TEXT,
73
+ scope_json TEXT NOT NULL DEFAULT '{}' CHECK(json_valid(scope_json)),
74
+ created_at INTEGER NOT NULL
75
+ );
76
+
77
+ CREATE INDEX idx_home_opportunity_feedback_item
78
+ ON home_opportunity_feedback(opportunity_id, created_at DESC);
@@ -0,0 +1,66 @@
1
+ CREATE TABLE agent_catalog_settings (
2
+ singleton_id INTEGER PRIMARY KEY CHECK(singleton_id = 1),
3
+ default_agent_id TEXT NOT NULL REFERENCES agents(id),
4
+ defaults_json TEXT NOT NULL CHECK(json_valid(defaults_json)),
5
+ revision INTEGER NOT NULL CHECK(revision > 0),
6
+ created_at INTEGER NOT NULL,
7
+ updated_at INTEGER NOT NULL
8
+ );
9
+
10
+ CREATE TABLE agents (
11
+ id TEXT PRIMARY KEY,
12
+ enabled INTEGER NOT NULL CHECK(enabled IN (0, 1)),
13
+ workspace_override TEXT,
14
+ profile_json TEXT CHECK(profile_json IS NULL OR json_valid(profile_json)),
15
+ overrides_json TEXT NOT NULL CHECK(json_valid(overrides_json)),
16
+ provisioning_state TEXT NOT NULL CHECK(provisioning_state IN ('pending', 'ready', 'error')),
17
+ provisioning_error TEXT,
18
+ revision INTEGER NOT NULL CHECK(revision > 0),
19
+ created_at INTEGER NOT NULL,
20
+ updated_at INTEGER NOT NULL,
21
+ deleted_at INTEGER
22
+ );
23
+
24
+ CREATE INDEX idx_agents_available ON agents(enabled, provisioning_state, deleted_at, id);
25
+
26
+ CREATE TABLE agent_bindings (
27
+ id TEXT PRIMARY KEY,
28
+ agent_id TEXT NOT NULL REFERENCES agents(id),
29
+ position INTEGER NOT NULL CHECK(position >= 0),
30
+ rule_json TEXT NOT NULL CHECK(json_valid(rule_json)),
31
+ revision INTEGER NOT NULL CHECK(revision > 0),
32
+ created_at INTEGER NOT NULL,
33
+ updated_at INTEGER NOT NULL,
34
+ UNIQUE(position)
35
+ );
36
+
37
+ CREATE INDEX idx_agent_bindings_agent ON agent_bindings(agent_id, position);
38
+
39
+ CREATE TABLE agent_surface_defaults (
40
+ surface TEXT PRIMARY KEY,
41
+ agent_id TEXT NOT NULL REFERENCES agents(id),
42
+ revision INTEGER NOT NULL CHECK(revision > 0),
43
+ updated_at INTEGER NOT NULL
44
+ );
45
+
46
+ CREATE TABLE agent_provisioning_jobs (
47
+ agent_id TEXT PRIMARY KEY REFERENCES agents(id) ON DELETE CASCADE,
48
+ operation TEXT NOT NULL CHECK(operation IN ('provision', 'purge')),
49
+ state TEXT NOT NULL CHECK(state IN ('pending', 'running', 'failed')),
50
+ attempts INTEGER NOT NULL DEFAULT 0 CHECK(attempts >= 0),
51
+ last_error TEXT,
52
+ created_at INTEGER NOT NULL,
53
+ updated_at INTEGER NOT NULL
54
+ );
55
+
56
+ CREATE TABLE application_migrations (
57
+ id TEXT PRIMARY KEY,
58
+ state TEXT NOT NULL,
59
+ source_digest TEXT,
60
+ source_backup_path TEXT,
61
+ database_backup_path TEXT,
62
+ error_json TEXT CHECK(error_json IS NULL OR json_valid(error_json)),
63
+ started_at INTEGER NOT NULL,
64
+ completed_at INTEGER,
65
+ updated_at INTEGER NOT NULL
66
+ );
@@ -0,0 +1,2 @@
1
+ ALTER TABLE home_advice_generations
2
+ ADD COLUMN strategy_version TEXT NOT NULL DEFAULT 'home-v1';