@xopcai/xopc 0.0.146 → 0.0.147

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 (376) hide show
  1. package/README.md +2 -2
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/demo-memory/src/index.js +6 -4
  4. package/dist/extensions/demo-memory/src/index.js.map +1 -1
  5. package/dist/extensions/telegram/xopc.extension.json +1 -1
  6. package/dist/gateway/static/root/assets/Combination-14nmIgxH.js +41 -0
  7. package/dist/gateway/static/root/assets/activity-store-DXeSSlw1.js +1 -0
  8. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-gBVDdd-Q.js → agent-avatar-dicebear-CFdJKSjY.js} +1 -1
  9. package/dist/gateway/static/root/assets/agents-DKjbRpbA.js +2 -0
  10. package/dist/gateway/static/root/assets/api-Bs69B5zA.js +1 -0
  11. package/dist/gateway/static/root/assets/{app-management-settings-panel-Dd5dmRWY.js → app-management-settings-panel-ag1ViXT_.js} +1 -1
  12. package/dist/gateway/static/root/assets/{appearance-settings-D89pY61C.js → appearance-settings-C6iMpwOM.js} +1 -1
  13. package/dist/gateway/static/root/assets/apps-page-CpX3lBFF.js +1 -0
  14. package/dist/gateway/static/root/assets/{archive-plugin-BZj1tk3p.js → archive-plugin-Dwi3mIBy.js} +1 -1
  15. package/dist/gateway/static/root/assets/{attachment-load-18eo6l3m.js → attachment-load-BaCDoq40.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automation-suggestion-card-F1g3MckR.js → automation-suggestion-card-CwqtFgnw.js} +1 -1
  17. package/dist/gateway/static/root/assets/automations-page-DlupOxFQ.js +6 -0
  18. package/dist/gateway/static/root/assets/{binary-plugins-jOYMquLP.js → binary-plugins-DoAYhsxa.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-CD77nXJU.js → block-editor-Bw72pO7S.js} +31 -31
  20. package/dist/gateway/static/root/assets/browser-settings-page-BwLoUBcZ.js +8 -0
  21. package/dist/gateway/static/root/assets/capability-presets-api-vdbAR65Q.js +1 -0
  22. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BAsKbJgm.js +2 -0
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-fTlTnWB4.js → channel-recipient-api-rTG26jpV.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-CxFWy0cE.js +1 -0
  25. package/dist/gateway/static/root/assets/channels-status-swr-OKlqTtKJ.js +1 -0
  26. package/dist/gateway/static/root/assets/{connector-logo-g9f07qO6.js → connector-logo-DIMP4NWY.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-BjQQwX62.js +2 -0
  28. package/dist/gateway/static/root/assets/{desktop-pet-DwPVWi3D.js → desktop-pet-kQq2e0BN.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-settings-Dm1N7RRX.js → desktop-pet-settings-B6vtozMY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{directory-picker-path-field-hZghTKie.js → directory-picker-path-field-Dn5-e3v4.js} +1 -1
  31. package/dist/gateway/static/root/assets/dist-C230izr8.js +1 -0
  32. package/dist/gateway/static/root/assets/dist-CxGUk8J-.js +1 -0
  33. package/dist/gateway/static/root/assets/dreaming-settings-BzwIujPG.js +3 -0
  34. package/dist/gateway/static/root/assets/extension-debug-page-D_e_hsEy.js +1 -0
  35. package/dist/gateway/static/root/assets/{extension-page-otKJCjKP.js → extension-page-D15CWHBd.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-ifHzMfT-.js → extension-settings-page-D4P0n1om.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-BQX5GGl2.js → gateway-config-api-B4qZctjG.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-BfXo0j0O.js → gateway-settings-BvndV7TP.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-DtoLihQE.js → gateway-startup-retry-BpgMunEb.js} +1 -1
  40. package/dist/gateway/static/root/assets/{goal-create-dialog-C_Qw_QgW.js → goal-create-dialog-DrVHKXHq.js} +1 -1
  41. package/dist/gateway/static/root/assets/goal-detail-page-PHlCwv68.js +4 -0
  42. package/dist/gateway/static/root/assets/{goals-config-api-DQJ5mBXB.js → goals-config-api-B6YJB_ct.js} +1 -1
  43. package/dist/gateway/static/root/assets/goals-page-Hg9uyO6e.js +2 -0
  44. package/dist/gateway/static/root/assets/{goals-settings-CQX8zWKe.js → goals-settings-BROWCIcL.js} +1 -1
  45. package/dist/gateway/static/root/assets/{heartbeat-settings-yy_Pt_24.js → heartbeat-settings-CoCwIOIg.js} +1 -1
  46. package/dist/gateway/static/root/assets/index-CxkNzw3e.js +259 -0
  47. package/dist/gateway/static/root/assets/index-DjCSOyaN.css +1 -0
  48. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Bm_AIYQ7.js +1 -0
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-BJWFcxwG.js +2 -0
  50. package/dist/gateway/static/root/assets/local-apps-page-BsiZMrEf.js +1 -0
  51. package/dist/gateway/static/root/assets/{locale-store-CiM-D9jA.js → locale-store-Bp8joZck.js} +1 -1
  52. package/dist/gateway/static/root/assets/logs-page-DOmK61ey.js +7 -0
  53. package/dist/gateway/static/root/assets/{markdown-split-BYasrWPk.js → markdown-split-Dy7QpaAz.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins--cJpmHc2.js → media-plugins-3Lxliy9D.js} +1 -1
  55. package/dist/gateway/static/root/assets/messages-CQGpD-dC.js +5 -0
  56. package/dist/gateway/static/root/assets/models-hub-panel-DGCZom4o.js +2 -0
  57. package/dist/gateway/static/root/assets/{notes-page-Digm3EgB.js → notes-page-BJtT4vSf.js} +1 -1
  58. package/dist/gateway/static/root/assets/notes-workbench-B_bN7cOR.js +4 -0
  59. package/dist/gateway/static/root/assets/{page-tabs-CGVMJEW0.js → page-tabs-DKB6RDre.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-BBAkU4xW.js → preview-open-alternatives-Br_YhYHp.js} +1 -1
  61. package/dist/gateway/static/root/assets/project-detail-page-Dq8JouJj.js +1 -0
  62. package/dist/gateway/static/root/assets/projects-page-DvfL7fSe.js +1 -0
  63. package/dist/gateway/static/root/assets/remote-access-hub-DqwMXSXP.js +1 -0
  64. package/dist/gateway/static/root/assets/{save-bar-controls-D4B469dh.js → save-bar-controls-BgIE9BBh.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schedule-field-Vy4OjH0i.js → schedule-field-BXDP-oMz.js} +1 -1
  66. package/dist/gateway/static/root/assets/{schema-form-CPYzgmby.js → schema-form-Dhv-SmjG.js} +1 -1
  67. package/dist/gateway/static/root/assets/sessions-page-B_mOZkQk.js +1 -0
  68. package/dist/gateway/static/root/assets/settings-advanced-gate-BHGmH6YS.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-collapsible-section-BB5y9vwh.js → settings-collapsible-section-CUTExnlK.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-form-section-BfzJkVHd.js → settings-form-section-CmnDhsf0.js} +1 -1
  71. package/dist/gateway/static/root/assets/{settings-loading-skeleton-DM8iH25s.js → settings-loading-skeleton-B79dq-XY.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-page-h5Alz_fA.js → settings-page-Db8uAv3X.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-page-layout-DjbdpK2j.js → settings-page-layout-DaFwstQw.js} +1 -1
  74. package/dist/gateway/static/root/assets/setup-status-panel-BUSEj0KK.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-DxozU_zz.js → share-preview-page-Bi00uXzV.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-DzsTYfuX.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-DSsdU081.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-DeB1tQZL.js +2 -0
  79. package/dist/gateway/static/root/assets/{system-settings-panel-DNi9Ofuj.js → system-settings-panel-Cxaph7hW.js} +1 -1
  80. package/dist/gateway/static/root/assets/{theme-store-C9Dxcppm.js → theme-store-eCTN1RpG.js} +1 -1
  81. package/dist/gateway/static/root/assets/{typed-models-lib-B6Nw3iFM.js → typed-models-lib-CcZ_tyFY.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-channel-catalog-DE9cpn4G.js → use-channel-catalog-C4PWbNoi.js} +1 -1
  83. package/dist/gateway/static/root/assets/user-context-page-QTVMx_hG.js +1 -0
  84. package/dist/gateway/static/root/assets/{user-profile-fields-editor-DVBShNYF.js → user-profile-fields-editor-CPOO9Jz5.js} +1 -1
  85. package/dist/gateway/static/root/assets/{user-profile-settings-panel-CC0sf3vS.js → user-profile-settings-panel-C8cgtSF7.js} +1 -1
  86. package/dist/gateway/static/root/assets/{utils-DnsuE4YP.js → utils-CiZK2KwH.js} +1 -1
  87. package/dist/gateway/static/root/assets/voice-api-key-field-b-YZtvUu.js +1 -0
  88. package/dist/gateway/static/root/assets/work-discovery-page-4zVDOl2G.js +1 -0
  89. package/dist/gateway/static/root/assets/work-item-detail-page-CHe2tfkc.js +1 -0
  90. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DXc_pbVG.js → workflow-run-setup-panel-8SLCYeXE.js} +2 -2
  91. package/dist/gateway/static/root/assets/workflows-page-DEOFqiWn.js +11 -0
  92. package/dist/gateway/static/root/index.html +10 -9
  93. package/dist/package.js +1 -1
  94. package/dist/src/activity/types.d.ts +1 -1
  95. package/dist/src/agent/agent-instance-gateway.d.ts +1 -1
  96. package/dist/src/agent/agent-manager.d.ts +1 -1
  97. package/dist/src/agent/agent-manager.js +5 -4
  98. package/dist/src/agent/agent-manager.js.map +1 -1
  99. package/dist/src/agent/background-review/coordinator.js +0 -1
  100. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  101. package/dist/src/agent/background-review/settings.d.ts +1 -1
  102. package/dist/src/agent/background-review/settings.js +10 -17
  103. package/dist/src/agent/background-review/settings.js.map +1 -1
  104. package/dist/src/agent/bootstrap/filter-bootstrap-files.d.ts +1 -1
  105. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  106. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  107. package/dist/src/agent/bootstrap/load-bootstrap-files.js +2 -3
  108. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  109. package/dist/src/agent/code-intelligence/binary.js +1 -1
  110. package/dist/src/agent/context/project-context.d.ts +14 -0
  111. package/dist/src/agent/context/project-context.js +23 -1
  112. package/dist/src/agent/context/project-context.js.map +1 -1
  113. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  114. package/dist/src/agent/context/workspace.d.ts +1 -2
  115. package/dist/src/agent/context/workspace.js +2 -4
  116. package/dist/src/agent/context/workspace.js.map +1 -1
  117. package/dist/src/agent/embedded/run-for-session.js +1 -2
  118. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  119. package/dist/src/agent/embedded/run-turn.js +6 -1
  120. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  121. package/dist/src/agent/embedded/types.d.ts +17 -0
  122. package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -2
  123. package/dist/src/agent/memory/builtin-memory-store.js +2 -2
  124. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  125. package/dist/src/agent/memory/builtin-provider.d.ts +1 -3
  126. package/dist/src/agent/memory/builtin-provider.js +21 -48
  127. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  128. package/dist/src/agent/memory/context/planner.js +48 -9
  129. package/dist/src/agent/memory/context/planner.js.map +1 -1
  130. package/dist/src/agent/memory/context/types.d.ts +7 -1
  131. package/dist/src/agent/memory/context-fence.js +1 -1
  132. package/dist/src/agent/memory/context-fence.js.map +1 -1
  133. package/dist/src/agent/memory/create-memory-manager.js +2 -9
  134. package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
  135. package/dist/src/agent/memory/dreaming/config.js +4 -9
  136. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  137. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +2 -2
  138. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js.map +1 -1
  139. package/dist/src/agent/memory/dreaming/scope.d.ts +2 -3
  140. package/dist/src/agent/memory/dreaming/scope.js +8 -8
  141. package/dist/src/agent/memory/dreaming/scope.js.map +1 -1
  142. package/dist/src/agent/memory/manager.d.ts +1 -5
  143. package/dist/src/agent/memory/manager.js +2 -23
  144. package/dist/src/agent/memory/manager.js.map +1 -1
  145. package/dist/src/agent/memory/memory-config.d.ts +3 -3
  146. package/dist/src/agent/memory/memory-config.js +9 -14
  147. package/dist/src/agent/memory/memory-config.js.map +1 -1
  148. package/dist/src/agent/memory/types.d.ts +9 -5
  149. package/dist/src/agent/memory/understanding/service.js +21 -8
  150. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  151. package/dist/src/agent/memory/understanding/types.d.ts +5 -0
  152. package/dist/src/agent/memory/user-context-coordinator.d.ts +1 -1
  153. package/dist/src/agent/memory/user-context-coordinator.js +6 -2
  154. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  155. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -2
  156. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  157. package/dist/src/agent/prompt/memory/index.d.ts +1 -2
  158. package/dist/src/agent/prompt/memory/index.js +6 -7
  159. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  160. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  161. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  162. package/dist/src/agent/service/direct-turn-helpers.js +13 -2
  163. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  164. package/dist/src/agent/tools/curated-memory-tool.js +4 -4
  165. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  166. package/dist/src/agent/tools/factory.d.ts +1 -1
  167. package/dist/src/agent/tools/factory.js +2 -2
  168. package/dist/src/agent/tools/factory.js.map +1 -1
  169. package/dist/src/agent/tools/memory-tool.js +1 -1
  170. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  171. package/dist/src/agent/workflow/workflow-child-tools.js +2 -3
  172. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
  173. package/dist/src/agent/workspace-runtime/registry.d.ts +5 -5
  174. package/dist/src/agent/workspace-runtime/registry.js +6 -11
  175. package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
  176. package/dist/src/agent-manifest/index.js +2 -2
  177. package/dist/src/agent-manifest/prompt.js +1 -7
  178. package/dist/src/agent-manifest/prompt.js.map +1 -1
  179. package/dist/src/agent-manifest/schema.d.ts +0 -598
  180. package/dist/src/agent-manifest/schema.js +2 -143
  181. package/dist/src/agent-manifest/schema.js.map +1 -1
  182. package/dist/src/agent-manifest/validator.js +0 -12
  183. package/dist/src/agent-manifest/validator.js.map +1 -1
  184. package/dist/src/agent-runtime/memory-runtime.d.ts +2 -2
  185. package/dist/src/agent-runtime/memory-runtime.js +8 -7
  186. package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
  187. package/dist/src/agent-runtime/runtime-profile.d.ts +2 -0
  188. package/dist/src/agent-runtime/runtime-profile.js +1 -1
  189. package/dist/src/agent-runtime/runtime-profile.js.map +1 -1
  190. package/dist/src/chat-commands/agent-edit.js +1 -2
  191. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  192. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  193. package/dist/src/cli/commands/init.js +0 -22
  194. package/dist/src/cli/commands/init.js.map +1 -1
  195. package/dist/src/cli/templates.d.ts +1 -1
  196. package/dist/src/cli/templates.js +1 -16
  197. package/dist/src/cli/templates.js.map +1 -1
  198. package/dist/src/commands/agents.config.js +0 -10
  199. package/dist/src/commands/agents.config.js.map +1 -1
  200. package/dist/src/config/index.js +2 -2
  201. package/dist/src/config/paths.d.ts +0 -1
  202. package/dist/src/config/paths.js +1 -2
  203. package/dist/src/config/paths.js.map +1 -1
  204. package/dist/src/config/schema.d.ts +118 -532
  205. package/dist/src/config/schema.js +32 -26
  206. package/dist/src/config/schema.js.map +1 -1
  207. package/dist/src/extensions/loader.js +2 -1
  208. package/dist/src/extensions/loader.js.map +1 -1
  209. package/dist/src/gateway/agents-admin.d.ts +0 -2
  210. package/dist/src/gateway/agents-admin.js +0 -6
  211. package/dist/src/gateway/agents-admin.js.map +1 -1
  212. package/dist/src/gateway/capability-presets-admin.d.ts +0 -2
  213. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  214. package/dist/src/gateway/chat-stream/mapper.js +26 -0
  215. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  216. package/dist/src/gateway/chat-stream/protocol.d.ts +16 -1
  217. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -1
  218. package/dist/src/gateway/dreaming-automation-reconciler.js +41 -63
  219. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  220. package/dist/src/gateway/hono/app.js +3 -1
  221. package/dist/src/gateway/hono/app.js.map +1 -1
  222. package/dist/src/gateway/hono/lib/config-payload.d.ts +0 -130
  223. package/dist/src/gateway/hono/lib/config-payload.js +0 -1
  224. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  225. package/dist/src/gateway/hono/routes/agents.js +6 -12
  226. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  227. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +6 -0
  228. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  229. package/dist/src/gateway/hono/routes/capability-presets.js +2 -2
  230. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  231. package/dist/src/gateway/hono/routes/dreaming.js +9 -20
  232. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  233. package/dist/src/gateway/hono/routes/index.js +4 -0
  234. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  235. package/dist/src/gateway/hono/routes/local-apps.d.ts +5 -0
  236. package/dist/src/gateway/hono/routes/local-apps.js +99 -0
  237. package/dist/src/gateway/hono/routes/local-apps.js.map +1 -0
  238. package/dist/src/gateway/hono/routes/memory.js +48 -65
  239. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  240. package/dist/src/gateway/hono/routes/projects.js +2 -2
  241. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  242. package/dist/src/gateway/hono/routes/work-discovery.d.ts +3 -0
  243. package/dist/src/gateway/hono/routes/work-discovery.js +150 -0
  244. package/dist/src/gateway/hono/routes/work-discovery.js.map +1 -0
  245. package/dist/src/gateway/hono/routes/you.d.ts +3 -0
  246. package/dist/src/gateway/hono/routes/you.js +358 -91
  247. package/dist/src/gateway/hono/routes/you.js.map +1 -1
  248. package/dist/src/gateway/service.d.ts +3 -0
  249. package/dist/src/gateway/service.js +12 -0
  250. package/dist/src/gateway/service.js.map +1 -1
  251. package/dist/src/knowledge/connected-knowledge-pipeline.js +9 -5
  252. package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -1
  253. package/dist/src/local-apps/acceptance.d.ts +30 -0
  254. package/dist/src/local-apps/acceptance.js +93 -0
  255. package/dist/src/local-apps/acceptance.js.map +1 -0
  256. package/dist/src/local-apps/index.d.ts +5 -0
  257. package/dist/src/local-apps/index.js +4 -0
  258. package/dist/src/local-apps/preview-runtime-bridge.d.ts +4 -0
  259. package/dist/src/local-apps/preview-runtime-bridge.js +171 -0
  260. package/dist/src/local-apps/preview-runtime-bridge.js.map +1 -0
  261. package/dist/src/local-apps/runtime-entry.d.ts +8 -0
  262. package/dist/src/local-apps/runtime-entry.js +25 -0
  263. package/dist/src/local-apps/runtime-entry.js.map +1 -0
  264. package/dist/src/local-apps/scaffold.d.ts +8 -0
  265. package/dist/src/local-apps/scaffold.js +122 -0
  266. package/dist/src/local-apps/scaffold.js.map +1 -0
  267. package/dist/src/local-apps/service.d.ts +37 -0
  268. package/dist/src/local-apps/service.js +553 -0
  269. package/dist/src/local-apps/service.js.map +1 -0
  270. package/dist/src/local-apps/store.d.ts +44 -0
  271. package/dist/src/local-apps/store.js +195 -0
  272. package/dist/src/local-apps/store.js.map +1 -0
  273. package/dist/src/local-apps/types.d.ts +105 -0
  274. package/dist/src/local-apps/types.js +1 -0
  275. package/dist/src/storage/sqlite/index.d.ts +3 -2
  276. package/dist/src/storage/sqlite/index.js +4 -3
  277. package/dist/src/storage/sqlite/memory-index-repository.d.ts +2 -3
  278. package/dist/src/storage/sqlite/memory-index-repository.js +16 -20
  279. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
  280. package/dist/src/storage/sqlite/memory-records-repository.d.ts +18 -10
  281. package/dist/src/storage/sqlite/memory-records-repository.js +79 -34
  282. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  283. package/dist/src/storage/sqlite/memory-reference-consent-repository.d.ts +27 -0
  284. package/dist/src/storage/sqlite/memory-reference-consent-repository.js +109 -0
  285. package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +1 -0
  286. package/dist/src/storage/sqlite/migrations/038_user_owned_memory.sql +68 -0
  287. package/dist/src/storage/sqlite/migrations/039_memory_reference_consents.sql +19 -0
  288. package/dist/src/storage/sqlite/migrations/040_local_apps.sql +32 -0
  289. package/dist/src/storage/sqlite/migrations/041_local_app_release_lifecycle.sql +17 -0
  290. package/dist/src/storage/sqlite/migrations/042_work_discovery.sql +41 -0
  291. package/dist/src/storage/sqlite/migrations/043_local_app_acceptance_runs.sql +16 -0
  292. package/dist/src/storage/sqlite/migrations/044_repair_work_discovery_foreign_keys.sql +75 -0
  293. package/dist/src/storage/sqlite/migrations/045_extension_ui_grants.sql +13 -0
  294. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  295. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  296. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  297. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  298. package/dist/src/storage/sqlite/schema.js +1 -1
  299. package/dist/src/storage/sqlite/schema.sql +20 -0
  300. package/dist/src/user-context/config.d.ts +227 -0
  301. package/dist/src/user-context/config.js +158 -0
  302. package/dist/src/user-context/config.js.map +1 -0
  303. package/dist/src/user-context/import.d.ts +1 -1
  304. package/dist/src/user-context/import.js +6 -1
  305. package/dist/src/user-context/import.js.map +1 -1
  306. package/dist/src/user-context/owner.d.ts +5 -0
  307. package/dist/src/user-context/owner.js +9 -0
  308. package/dist/src/user-context/owner.js.map +1 -0
  309. package/dist/src/user-context/projection.d.ts +11 -9
  310. package/dist/src/user-context/projection.js +74 -47
  311. package/dist/src/user-context/projection.js.map +1 -1
  312. package/dist/src/user-context/runtime.d.ts +13 -0
  313. package/dist/src/user-context/runtime.js +36 -0
  314. package/dist/src/user-context/runtime.js.map +1 -0
  315. package/dist/src/work-discovery/analyzer.d.ts +11 -0
  316. package/dist/src/work-discovery/analyzer.js +171 -0
  317. package/dist/src/work-discovery/analyzer.js.map +1 -0
  318. package/dist/src/work-discovery/index.d.ts +5 -0
  319. package/dist/src/work-discovery/index.js +5 -0
  320. package/dist/src/work-discovery/probe.d.ts +12 -0
  321. package/dist/src/work-discovery/probe.js +335 -0
  322. package/dist/src/work-discovery/probe.js.map +1 -0
  323. package/dist/src/work-discovery/repository.d.ts +11 -0
  324. package/dist/src/work-discovery/repository.js +100 -0
  325. package/dist/src/work-discovery/repository.js.map +1 -0
  326. package/dist/src/work-discovery/service.d.ts +30 -0
  327. package/dist/src/work-discovery/service.js +387 -0
  328. package/dist/src/work-discovery/service.js.map +1 -0
  329. package/dist/src/work-discovery/types.d.ts +114 -0
  330. package/dist/src/work-discovery/types.js +1 -0
  331. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  332. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  333. package/package.json +4 -3
  334. package/skills/engineering/build-xopc-local-app/SKILL.md +45 -0
  335. package/skills/engineering/build-xopc-local-app/references/app-contract.md +33 -0
  336. package/skills/engineering/build-xopc-local-app/scripts/validate-local-app.mjs +72 -0
  337. package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +0 -41
  338. package/dist/gateway/static/root/assets/activity-center-store-3l9ahUqb.js +0 -1
  339. package/dist/gateway/static/root/assets/agents-BLp5ItD3.js +0 -2
  340. package/dist/gateway/static/root/assets/apps-page-CgOy905b.js +0 -1
  341. package/dist/gateway/static/root/assets/automations-page-Bdj0A_IC.js +0 -6
  342. package/dist/gateway/static/root/assets/browser-settings-page-D73ClpC2.js +0 -8
  343. package/dist/gateway/static/root/assets/capability-presets-api-DZwIrY_P.js +0 -1
  344. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Dw2uinRX.js +0 -2
  345. package/dist/gateway/static/root/assets/channels-settings-g9TZdnQh.js +0 -1
  346. package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +0 -1
  347. package/dist/gateway/static/root/assets/connectors-page-CJLsXBB0.js +0 -2
  348. package/dist/gateway/static/root/assets/dist-C99RGfAH.js +0 -1
  349. package/dist/gateway/static/root/assets/dreaming-settings-B_LcHWcv.js +0 -3
  350. package/dist/gateway/static/root/assets/extension-debug-page-BqguEetG.js +0 -1
  351. package/dist/gateway/static/root/assets/goal-detail-page-BnUrr9_O.js +0 -4
  352. package/dist/gateway/static/root/assets/goals-page-BgDCoiG0.js +0 -2
  353. package/dist/gateway/static/root/assets/index-BJGusbyV.js +0 -259
  354. package/dist/gateway/static/root/assets/index-CSLF84-Q.css +0 -1
  355. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-D1rVyDdf.js +0 -1
  356. package/dist/gateway/static/root/assets/logs-page-C35Xa_mx.js +0 -7
  357. package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +0 -5
  358. package/dist/gateway/static/root/assets/models-hub-panel-CqehWxbT.js +0 -2
  359. package/dist/gateway/static/root/assets/notes-workbench-CCuL7qlg.js +0 -4
  360. package/dist/gateway/static/root/assets/project-detail-page-DTWPEtSE.js +0 -1
  361. package/dist/gateway/static/root/assets/projects-page-NnJpsIAD.js +0 -1
  362. package/dist/gateway/static/root/assets/remote-access-hub-wbk1GCvg.js +0 -1
  363. package/dist/gateway/static/root/assets/sessions-page-Do0ZNuqM.js +0 -1
  364. package/dist/gateway/static/root/assets/settings-advanced-gate-HeYP_JCr.js +0 -1
  365. package/dist/gateway/static/root/assets/setup-status-panel-bjbH7U6x.js +0 -1
  366. package/dist/gateway/static/root/assets/shares-settings-Cl_bE9gQ.js +0 -1
  367. package/dist/gateway/static/root/assets/skill-reload-api-DcqbKYgB.js +0 -1
  368. package/dist/gateway/static/root/assets/skills-page-D_Xkjxtr.js +0 -2
  369. package/dist/gateway/static/root/assets/user-context-page-BtU2sQoK.js +0 -1
  370. package/dist/gateway/static/root/assets/voice-api-key-field-BIcSMf0O.js +0 -1
  371. package/dist/gateway/static/root/assets/work-item-detail-page-ChCKymS7.js +0 -1
  372. package/dist/gateway/static/root/assets/workflows-page-CheHRVox.js +0 -11
  373. package/dist/src/agent/context/workspace-templates/MEMORY.md +0 -33
  374. package/dist/src/agent/memory/access-policy.d.ts +0 -12
  375. package/dist/src/agent/memory/access-policy.js +0 -44
  376. package/dist/src/agent/memory/access-policy.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ import type { WorkContextSnapshot, WorkContextSnapshotSummary } from './types.js';
2
+ export declare const WORK_DISCOVERY_SCAN_POLICY_VERSION = 1;
3
+ export declare function canonicalWorkDiscoveryRoot(input: string): Promise<string>;
4
+ export declare function previewWorkDiscoveryRoot(rootPath: string): Promise<{
5
+ canonicalRootPath: string;
6
+ displayName: string;
7
+ projectKind: import("../projects/project-kind.js").ProjectKind;
8
+ projectKindConfidence: number;
9
+ markerReasons: string[];
10
+ }>;
11
+ export declare function probeWorkDiscoveryRoot(rootPath: string, signal?: AbortSignal): Promise<WorkContextSnapshot>;
12
+ export declare function summarizeWorkContextSnapshot(snapshot: WorkContextSnapshot): WorkContextSnapshotSummary;
@@ -0,0 +1,335 @@
1
+ import { inferProjectKind } from "../projects/project-kind.js";
2
+ import "../projects/index.js";
3
+ import { basename, extname, isAbsolute, relative, resolve, sep } from "node:path";
4
+ import { constants } from "node:fs";
5
+ import { execFile } from "node:child_process";
6
+ import { access, lstat, readFile, readdir, realpath, stat } from "node:fs/promises";
7
+ import { promisify } from "node:util";
8
+ //#region src/work-discovery/probe.ts
9
+ const execFileAsync = promisify(execFile);
10
+ const WORK_DISCOVERY_SCAN_POLICY_VERSION = 1;
11
+ const MAX_DEPTH = 4;
12
+ const MAX_CANDIDATE_FILES = 2e3;
13
+ const MAX_CONTENT_FILES = 30;
14
+ const MAX_FILE_BYTES = 64 * 1024;
15
+ const MAX_TOTAL_BYTES = 512 * 1024;
16
+ const EXCLUDED_DIRECTORY_NAMES = new Set([
17
+ ".git",
18
+ ".hg",
19
+ ".svn",
20
+ "node_modules",
21
+ "vendor",
22
+ "dist",
23
+ "build",
24
+ "coverage",
25
+ ".coverage",
26
+ ".cache",
27
+ ".next",
28
+ ".nuxt",
29
+ ".turbo",
30
+ ".vite",
31
+ ".pnpm-store",
32
+ "__pycache__",
33
+ ".venv",
34
+ "venv",
35
+ "target",
36
+ "out",
37
+ "Pods",
38
+ "DerivedData"
39
+ ]);
40
+ const BINARY_EXTENSIONS = new Set([
41
+ ".7z",
42
+ ".a",
43
+ ".avi",
44
+ ".bin",
45
+ ".class",
46
+ ".db",
47
+ ".dmg",
48
+ ".dll",
49
+ ".eot",
50
+ ".exe",
51
+ ".gz",
52
+ ".jar",
53
+ ".lockb",
54
+ ".mov",
55
+ ".mp3",
56
+ ".mp4",
57
+ ".o",
58
+ ".otf",
59
+ ".pyc",
60
+ ".rar",
61
+ ".so",
62
+ ".sqlite",
63
+ ".sqlite3",
64
+ ".tar",
65
+ ".ttf",
66
+ ".wav",
67
+ ".webm",
68
+ ".woff",
69
+ ".woff2",
70
+ ".zip"
71
+ ]);
72
+ const METADATA_ONLY_EXTENSIONS = new Map([
73
+ [".doc", "document"],
74
+ [".docx", "document"],
75
+ [".ppt", "document"],
76
+ [".pptx", "document"],
77
+ [".xls", "document"],
78
+ [".xlsx", "document"],
79
+ [".pdf", "pdf"],
80
+ [".bmp", "image"],
81
+ [".gif", "image"],
82
+ [".ico", "image"],
83
+ [".jpeg", "image"],
84
+ [".jpg", "image"],
85
+ [".png", "image"],
86
+ [".webp", "image"]
87
+ ]);
88
+ const SECRET_FILE_PATTERNS = [
89
+ /^\.env(?:\.|$)/i,
90
+ /(?:^|[-_.])(credentials?|secrets?|tokens?|api[-_]?keys?|auth)(?:[-_.]|$)/i,
91
+ /\.(?:pem|key|p12|pfx|crt|cer)$/i,
92
+ /^(?:id_rsa|id_ed25519)(?:\.pub)?$/i
93
+ ];
94
+ const HIGH_VALUE_NAMES = [
95
+ /^AGENTS\.md$/i,
96
+ /^CONTEXT\.md$/i,
97
+ /^README(?:\..+)?$/i,
98
+ /^TODO(?:\..+)?$/i,
99
+ /^ROADMAP(?:\..+)?$/i,
100
+ /^CHANGELOG(?:\..+)?$/i,
101
+ /^package\.json$/i,
102
+ /^pyproject\.toml$/i,
103
+ /^Cargo\.toml$/i,
104
+ /^go\.mod$/i
105
+ ];
106
+ function abortIfNeeded(signal) {
107
+ if (signal?.aborted) throw new DOMException("Work discovery canceled", "AbortError");
108
+ }
109
+ function isSecretFile(name) {
110
+ return SECRET_FILE_PATTERNS.some((pattern) => pattern.test(name));
111
+ }
112
+ function isExcludedDirectory(name) {
113
+ return EXCLUDED_DIRECTORY_NAMES.has(name) || name.startsWith(".");
114
+ }
115
+ function isLikelyBinary(path) {
116
+ return BINARY_EXTENSIONS.has(extname(path).toLowerCase());
117
+ }
118
+ function isInsideRoot(root, candidate) {
119
+ return candidate === root || candidate.startsWith(`${root}${sep}`);
120
+ }
121
+ function selectionPriority(path, modifiedAt) {
122
+ const name = basename(path);
123
+ const highValueIndex = HIGH_VALUE_NAMES.findIndex((pattern) => pattern.test(name));
124
+ if (highValueIndex >= 0) return 1e4 - highValueIndex * 100;
125
+ return Math.floor(modifiedAt / 1e6);
126
+ }
127
+ async function gitInfo(root, signal) {
128
+ abortIfNeeded(signal);
129
+ try {
130
+ const [{ stdout: statusOutput }, { stdout: logOutput }] = await Promise.all([execFileAsync("git", [
131
+ "-C",
132
+ root,
133
+ "status",
134
+ "--short",
135
+ "--branch",
136
+ "--untracked-files=no"
137
+ ], {
138
+ timeout: 4e3,
139
+ maxBuffer: 256 * 1024,
140
+ signal
141
+ }), execFileAsync("git", [
142
+ "-C",
143
+ root,
144
+ "log",
145
+ "-10",
146
+ "--format=%ct%x09%s"
147
+ ], {
148
+ timeout: 4e3,
149
+ maxBuffer: 256 * 1024,
150
+ signal
151
+ })]);
152
+ const statusLines = statusOutput.split("\n").filter(Boolean);
153
+ const branch = statusLines[0]?.startsWith("## ") ? statusLines[0].slice(3).split("...")[0]?.trim() : void 0;
154
+ const changedPaths = statusLines.slice(1, 101).map((line) => line.slice(3).trim()).filter(Boolean);
155
+ const recentCommits = logOutput.split("\n").filter(Boolean).slice(0, 10).map((line) => {
156
+ const [timestamp, ...subjectParts] = line.split(" ");
157
+ const committedAt = Number(timestamp) * 1e3;
158
+ return {
159
+ subject: subjectParts.join(" ").slice(0, 240),
160
+ ...Number.isFinite(committedAt) ? { committedAt } : {}
161
+ };
162
+ });
163
+ return {
164
+ ...branch ? { branch } : {},
165
+ changedPaths,
166
+ recentCommits
167
+ };
168
+ } catch {
169
+ return;
170
+ }
171
+ }
172
+ async function canonicalWorkDiscoveryRoot(input) {
173
+ const trimmed = input.trim();
174
+ if (!trimmed || !isAbsolute(trimmed)) throw new Error("An absolute folder path is required");
175
+ const canonical = await realpath(trimmed);
176
+ if (!(await stat(canonical)).isDirectory()) throw new Error("Selected path is not a directory");
177
+ await access(canonical, constants.R_OK);
178
+ return canonical;
179
+ }
180
+ async function previewWorkDiscoveryRoot(rootPath) {
181
+ const canonicalRootPath = await canonicalWorkDiscoveryRoot(rootPath);
182
+ const inference = inferProjectKind({ workspaceRoot: canonicalRootPath });
183
+ return {
184
+ canonicalRootPath,
185
+ displayName: basename(canonicalRootPath),
186
+ projectKind: inference.kind,
187
+ projectKindConfidence: inference.confidence,
188
+ markerReasons: inference.reasons
189
+ };
190
+ }
191
+ async function probeWorkDiscoveryRoot(rootPath, signal) {
192
+ const root = await canonicalWorkDiscoveryRoot(rootPath);
193
+ const inference = inferProjectKind({ workspaceRoot: root });
194
+ const candidates = [];
195
+ const metadataOnlyFiles = [];
196
+ let omittedPathCount = 0;
197
+ let traversalTruncated = false;
198
+ const walk = async (directory, depth) => {
199
+ abortIfNeeded(signal);
200
+ if (candidates.length >= MAX_CANDIDATE_FILES) {
201
+ traversalTruncated = true;
202
+ return;
203
+ }
204
+ let entries;
205
+ try {
206
+ entries = await readdir(directory, { withFileTypes: true });
207
+ } catch {
208
+ return;
209
+ }
210
+ entries.sort((a, b) => a.name.localeCompare(b.name));
211
+ for (const entry of entries) {
212
+ abortIfNeeded(signal);
213
+ if (candidates.length >= MAX_CANDIDATE_FILES) {
214
+ traversalTruncated = true;
215
+ omittedPathCount += 1;
216
+ continue;
217
+ }
218
+ if (entry.isDirectory()) {
219
+ if (depth >= MAX_DEPTH || isExcludedDirectory(entry.name)) {
220
+ omittedPathCount += 1;
221
+ continue;
222
+ }
223
+ await walk(resolve(directory, entry.name), depth + 1);
224
+ continue;
225
+ }
226
+ if (!entry.isFile() || isSecretFile(entry.name)) {
227
+ omittedPathCount += 1;
228
+ continue;
229
+ }
230
+ const absolutePath = resolve(directory, entry.name);
231
+ try {
232
+ const resolvedPath = await realpath(absolutePath);
233
+ if (!isInsideRoot(root, resolvedPath)) {
234
+ omittedPathCount += 1;
235
+ continue;
236
+ }
237
+ const info = await lstat(resolvedPath);
238
+ if (!info.isFile()) {
239
+ omittedPathCount += 1;
240
+ continue;
241
+ }
242
+ const relativePath = relative(root, resolvedPath);
243
+ const metadataKind = METADATA_ONLY_EXTENSIONS.get(extname(entry.name).toLowerCase());
244
+ if (metadataKind) {
245
+ if (metadataOnlyFiles.length < 200) metadataOnlyFiles.push({
246
+ relativePath,
247
+ modifiedAt: info.mtimeMs,
248
+ size: info.size,
249
+ kind: metadataKind
250
+ });
251
+ else omittedPathCount += 1;
252
+ continue;
253
+ }
254
+ if (isLikelyBinary(entry.name) || info.size > MAX_FILE_BYTES * 4) {
255
+ omittedPathCount += 1;
256
+ continue;
257
+ }
258
+ candidates.push({
259
+ absolutePath: resolvedPath,
260
+ relativePath,
261
+ modifiedAt: info.mtimeMs,
262
+ size: info.size
263
+ });
264
+ } catch {
265
+ omittedPathCount += 1;
266
+ }
267
+ }
268
+ };
269
+ await walk(root, 0);
270
+ const git = await gitInfo(root, signal);
271
+ const changed = new Set(git?.changedPaths ?? []);
272
+ candidates.sort((a, b) => {
273
+ const aScore = selectionPriority(a.relativePath, a.modifiedAt) + (changed.has(a.relativePath) ? 2e4 : 0);
274
+ return selectionPriority(b.relativePath, b.modifiedAt) + (changed.has(b.relativePath) ? 2e4 : 0) - aScore || a.relativePath.localeCompare(b.relativePath);
275
+ });
276
+ const documents = [];
277
+ let contentBytes = 0;
278
+ for (const candidate of candidates) {
279
+ abortIfNeeded(signal);
280
+ if (documents.length >= MAX_CONTENT_FILES || contentBytes >= MAX_TOTAL_BYTES) break;
281
+ const remaining = MAX_TOTAL_BYTES - contentBytes;
282
+ const limit = Math.min(MAX_FILE_BYTES, remaining);
283
+ try {
284
+ const buffer = await readFile(candidate.absolutePath);
285
+ const slice = buffer.subarray(0, limit);
286
+ if (slice.includes(0)) continue;
287
+ const excerpt = slice.toString("utf8").trim();
288
+ if (!excerpt) continue;
289
+ const highValue = HIGH_VALUE_NAMES.some((pattern) => pattern.test(basename(candidate.relativePath)));
290
+ documents.push({
291
+ relativePath: candidate.relativePath,
292
+ modifiedAt: candidate.modifiedAt,
293
+ excerpt,
294
+ truncated: buffer.length > slice.length,
295
+ selectionReason: changed.has(candidate.relativePath) ? "git_change" : highValue ? "project_context" : "recently_modified"
296
+ });
297
+ contentBytes += slice.length;
298
+ } catch {}
299
+ }
300
+ return {
301
+ root: {
302
+ displayName: basename(root),
303
+ projectKind: inference.kind,
304
+ markerReasons: inference.reasons
305
+ },
306
+ structure: {
307
+ sampledPaths: [...candidates.map((candidate) => candidate.relativePath), ...metadataOnlyFiles.map((file) => file.relativePath)].slice(0, 200),
308
+ metadataOnlyFiles,
309
+ omittedPathCount
310
+ },
311
+ ...git ? { git } : {},
312
+ documents,
313
+ limits: {
314
+ policyVersion: 1,
315
+ fileCount: candidates.length,
316
+ contentBytes,
317
+ truncated: traversalTruncated || candidates.length > 200 || documents.some((document) => document.truncated)
318
+ }
319
+ };
320
+ }
321
+ function summarizeWorkContextSnapshot(snapshot) {
322
+ return {
323
+ projectKind: snapshot.root.projectKind,
324
+ sampledPathCount: snapshot.structure.sampledPaths.length,
325
+ omittedPathCount: snapshot.structure.omittedPathCount,
326
+ documentCount: snapshot.documents.length,
327
+ contentBytes: snapshot.limits.contentBytes,
328
+ changedPathCount: snapshot.git?.changedPaths.length ?? 0,
329
+ truncated: snapshot.limits.truncated
330
+ };
331
+ }
332
+ //#endregion
333
+ export { WORK_DISCOVERY_SCAN_POLICY_VERSION, canonicalWorkDiscoveryRoot, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, summarizeWorkContextSnapshot };
334
+
335
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","names":["fsConstants"],"sources":["../../../src/work-discovery/probe.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { constants as fsConstants } from 'node:fs';\nimport { access, lstat, readFile, readdir, realpath, stat } from 'node:fs/promises';\nimport { basename, extname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { inferProjectKind } from '../projects/index.js';\n\nimport type { WorkContextSnapshot, WorkContextSnapshotSummary } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const WORK_DISCOVERY_SCAN_POLICY_VERSION = 1;\n\nconst MAX_DEPTH = 4;\nconst MAX_CANDIDATE_FILES = 2_000;\nconst MAX_CONTENT_FILES = 30;\nconst MAX_FILE_BYTES = 64 * 1024;\nconst MAX_TOTAL_BYTES = 512 * 1024;\n\nconst EXCLUDED_DIRECTORY_NAMES = new Set([\n '.git', '.hg', '.svn', 'node_modules', 'vendor', 'dist', 'build', 'coverage', '.coverage',\n '.cache', '.next', '.nuxt', '.turbo', '.vite', '.pnpm-store', '__pycache__', '.venv', 'venv',\n 'target', 'out', 'Pods', 'DerivedData',\n]);\n\nconst BINARY_EXTENSIONS = new Set([\n '.7z', '.a', '.avi', '.bin', '.class', '.db', '.dmg', '.dll', '.eot', '.exe', '.gz', '.jar',\n '.lockb', '.mov', '.mp3', '.mp4', '.o', '.otf', '.pyc', '.rar', '.so', '.sqlite', '.sqlite3',\n '.tar', '.ttf', '.wav', '.webm', '.woff', '.woff2', '.zip',\n]);\n\nconst METADATA_ONLY_EXTENSIONS = new Map<string, 'document' | 'pdf' | 'image'>([\n ['.doc', 'document'], ['.docx', 'document'], ['.ppt', 'document'], ['.pptx', 'document'],\n ['.xls', 'document'], ['.xlsx', 'document'], ['.pdf', 'pdf'],\n ['.bmp', 'image'], ['.gif', 'image'], ['.ico', 'image'], ['.jpeg', 'image'], ['.jpg', 'image'],\n ['.png', 'image'], ['.webp', 'image'],\n]);\n\nconst SECRET_FILE_PATTERNS = [\n /^\\.env(?:\\.|$)/i,\n /(?:^|[-_.])(credentials?|secrets?|tokens?|api[-_]?keys?|auth)(?:[-_.]|$)/i,\n /\\.(?:pem|key|p12|pfx|crt|cer)$/i,\n /^(?:id_rsa|id_ed25519)(?:\\.pub)?$/i,\n];\n\nconst HIGH_VALUE_NAMES = [\n /^AGENTS\\.md$/i,\n /^CONTEXT\\.md$/i,\n /^README(?:\\..+)?$/i,\n /^TODO(?:\\..+)?$/i,\n /^ROADMAP(?:\\..+)?$/i,\n /^CHANGELOG(?:\\..+)?$/i,\n /^package\\.json$/i,\n /^pyproject\\.toml$/i,\n /^Cargo\\.toml$/i,\n /^go\\.mod$/i,\n];\n\nfunction abortIfNeeded(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException('Work discovery canceled', 'AbortError');\n}\n\nfunction isSecretFile(name: string): boolean {\n return SECRET_FILE_PATTERNS.some((pattern) => pattern.test(name));\n}\n\nfunction isExcludedDirectory(name: string): boolean {\n return EXCLUDED_DIRECTORY_NAMES.has(name) || name.startsWith('.');\n}\n\nfunction isLikelyBinary(path: string): boolean {\n return BINARY_EXTENSIONS.has(extname(path).toLowerCase());\n}\n\nfunction isInsideRoot(root: string, candidate: string): boolean {\n return candidate === root || candidate.startsWith(`${root}${sep}`);\n}\n\nfunction selectionPriority(path: string, modifiedAt: number): number {\n const name = basename(path);\n const highValueIndex = HIGH_VALUE_NAMES.findIndex((pattern) => pattern.test(name));\n if (highValueIndex >= 0) return 10_000 - highValueIndex * 100;\n return Math.floor(modifiedAt / 1_000_000);\n}\n\nasync function gitInfo(root: string, signal?: AbortSignal): Promise<WorkContextSnapshot['git'] | undefined> {\n abortIfNeeded(signal);\n try {\n const [{ stdout: statusOutput }, { stdout: logOutput }] = await Promise.all([\n execFileAsync('git', ['-C', root, 'status', '--short', '--branch', '--untracked-files=no'], {\n timeout: 4_000,\n maxBuffer: 256 * 1024,\n signal,\n }),\n execFileAsync('git', ['-C', root, 'log', '-10', '--format=%ct%x09%s'], {\n timeout: 4_000,\n maxBuffer: 256 * 1024,\n signal,\n }),\n ]);\n const statusLines = statusOutput.split('\\n').filter(Boolean);\n const branch = statusLines[0]?.startsWith('## ')\n ? statusLines[0].slice(3).split('...')[0]?.trim()\n : undefined;\n const changedPaths = statusLines.slice(1, 101).map((line) => line.slice(3).trim()).filter(Boolean);\n const recentCommits = logOutput.split('\\n').filter(Boolean).slice(0, 10).map((line) => {\n const [timestamp, ...subjectParts] = line.split('\\t');\n const committedAt = Number(timestamp) * 1000;\n return {\n subject: subjectParts.join('\\t').slice(0, 240),\n ...(Number.isFinite(committedAt) ? { committedAt } : {}),\n };\n });\n return { ...(branch ? { branch } : {}), changedPaths, recentCommits };\n } catch {\n return undefined;\n }\n}\n\nexport async function canonicalWorkDiscoveryRoot(input: string): Promise<string> {\n const trimmed = input.trim();\n if (!trimmed || !isAbsolute(trimmed)) throw new Error('An absolute folder path is required');\n const canonical = await realpath(trimmed);\n const info = await stat(canonical);\n if (!info.isDirectory()) throw new Error('Selected path is not a directory');\n await access(canonical, fsConstants.R_OK);\n return canonical;\n}\n\nexport async function previewWorkDiscoveryRoot(rootPath: string) {\n const canonicalRootPath = await canonicalWorkDiscoveryRoot(rootPath);\n const inference = inferProjectKind({ workspaceRoot: canonicalRootPath });\n return {\n canonicalRootPath,\n displayName: basename(canonicalRootPath),\n projectKind: inference.kind,\n projectKindConfidence: inference.confidence,\n markerReasons: inference.reasons,\n };\n}\n\nexport async function probeWorkDiscoveryRoot(\n rootPath: string,\n signal?: AbortSignal,\n): Promise<WorkContextSnapshot> {\n const root = await canonicalWorkDiscoveryRoot(rootPath);\n const inference = inferProjectKind({ workspaceRoot: root });\n const candidates: Array<{ absolutePath: string; relativePath: string; modifiedAt: number; size: number }> = [];\n const metadataOnlyFiles: WorkContextSnapshot['structure']['metadataOnlyFiles'] = [];\n let omittedPathCount = 0;\n let traversalTruncated = false;\n\n const walk = async (directory: string, depth: number): Promise<void> => {\n abortIfNeeded(signal);\n if (candidates.length >= MAX_CANDIDATE_FILES) {\n traversalTruncated = true;\n return;\n }\n let entries;\n try {\n entries = await readdir(directory, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n abortIfNeeded(signal);\n if (candidates.length >= MAX_CANDIDATE_FILES) {\n traversalTruncated = true;\n omittedPathCount += 1;\n continue;\n }\n if (entry.isDirectory()) {\n if (depth >= MAX_DEPTH || isExcludedDirectory(entry.name)) {\n omittedPathCount += 1;\n continue;\n }\n await walk(resolve(directory, entry.name), depth + 1);\n continue;\n }\n if (!entry.isFile() || isSecretFile(entry.name)) {\n omittedPathCount += 1;\n continue;\n }\n const absolutePath = resolve(directory, entry.name);\n try {\n const resolvedPath = await realpath(absolutePath);\n if (!isInsideRoot(root, resolvedPath)) {\n omittedPathCount += 1;\n continue;\n }\n const info = await lstat(resolvedPath);\n if (!info.isFile()) {\n omittedPathCount += 1;\n continue;\n }\n const relativePath = relative(root, resolvedPath);\n const metadataKind = METADATA_ONLY_EXTENSIONS.get(extname(entry.name).toLowerCase());\n if (metadataKind) {\n if (metadataOnlyFiles.length < 200) {\n metadataOnlyFiles.push({ relativePath, modifiedAt: info.mtimeMs, size: info.size, kind: metadataKind });\n } else {\n omittedPathCount += 1;\n }\n continue;\n }\n if (isLikelyBinary(entry.name) || info.size > MAX_FILE_BYTES * 4) {\n omittedPathCount += 1;\n continue;\n }\n candidates.push({\n absolutePath: resolvedPath,\n relativePath,\n modifiedAt: info.mtimeMs,\n size: info.size,\n });\n } catch {\n omittedPathCount += 1;\n }\n }\n };\n\n await walk(root, 0);\n const git = await gitInfo(root, signal);\n const changed = new Set(git?.changedPaths ?? []);\n candidates.sort((a, b) => {\n const aScore = selectionPriority(a.relativePath, a.modifiedAt) + (changed.has(a.relativePath) ? 20_000 : 0);\n const bScore = selectionPriority(b.relativePath, b.modifiedAt) + (changed.has(b.relativePath) ? 20_000 : 0);\n return bScore - aScore || a.relativePath.localeCompare(b.relativePath);\n });\n\n const documents: WorkContextSnapshot['documents'] = [];\n let contentBytes = 0;\n for (const candidate of candidates) {\n abortIfNeeded(signal);\n if (documents.length >= MAX_CONTENT_FILES || contentBytes >= MAX_TOTAL_BYTES) break;\n const remaining = MAX_TOTAL_BYTES - contentBytes;\n const limit = Math.min(MAX_FILE_BYTES, remaining);\n try {\n const buffer = await readFile(candidate.absolutePath);\n const slice = buffer.subarray(0, limit);\n if (slice.includes(0)) continue;\n const excerpt = slice.toString('utf8').trim();\n if (!excerpt) continue;\n const highValue = HIGH_VALUE_NAMES.some((pattern) => pattern.test(basename(candidate.relativePath)));\n documents.push({\n relativePath: candidate.relativePath,\n modifiedAt: candidate.modifiedAt,\n excerpt,\n truncated: buffer.length > slice.length,\n selectionReason: changed.has(candidate.relativePath)\n ? 'git_change'\n : highValue\n ? 'project_context'\n : 'recently_modified',\n });\n contentBytes += slice.length;\n } catch {\n // Continue with the remaining readable files.\n }\n }\n\n return {\n root: {\n displayName: basename(root),\n projectKind: inference.kind,\n markerReasons: inference.reasons,\n },\n structure: {\n sampledPaths: [\n ...candidates.map((candidate) => candidate.relativePath),\n ...metadataOnlyFiles.map((file) => file.relativePath),\n ].slice(0, 200),\n metadataOnlyFiles,\n omittedPathCount,\n },\n ...(git ? { git } : {}),\n documents,\n limits: {\n policyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION,\n fileCount: candidates.length,\n contentBytes,\n truncated: traversalTruncated || candidates.length > 200 || documents.some((document) => document.truncated),\n },\n };\n}\n\nexport function summarizeWorkContextSnapshot(snapshot: WorkContextSnapshot): WorkContextSnapshotSummary {\n return {\n projectKind: snapshot.root.projectKind,\n sampledPathCount: snapshot.structure.sampledPaths.length,\n omittedPathCount: snapshot.structure.omittedPathCount,\n documentCount: snapshot.documents.length,\n contentBytes: snapshot.limits.contentBytes,\n changedPathCount: snapshot.git?.changedPaths.length ?? 0,\n truncated: snapshot.limits.truncated,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { WorkDiscoveryOnboardingState, WorkDiscoveryOnboardingStatus, WorkDiscoveryRun } from './types.js';
2
+ export declare function getWorkDiscoveryOnboardingState(): WorkDiscoveryOnboardingState;
3
+ export declare function setWorkDiscoveryOnboardingState(input: {
4
+ status: WorkDiscoveryOnboardingStatus;
5
+ activeRunId?: string | null;
6
+ nowMs?: number;
7
+ }): WorkDiscoveryOnboardingState;
8
+ export declare function createWorkDiscoveryRun(run: WorkDiscoveryRun): WorkDiscoveryRun;
9
+ export declare function getWorkDiscoveryRun(id: string): WorkDiscoveryRun | null;
10
+ export declare function getWorkDiscoveryRunByIdempotencyKey(key: string): WorkDiscoveryRun | null;
11
+ export declare function updateWorkDiscoveryRun(id: string, patch: Partial<Pick<WorkDiscoveryRun, 'status' | 'stage' | 'snapshot' | 'result' | 'errorCode' | 'errorMessage' | 'startedAt' | 'completedAt' | 'canceledAt'>>): WorkDiscoveryRun | null;
@@ -0,0 +1,100 @@
1
+ import { requireXopcDatabase } from "../storage/sqlite/connection.js";
2
+ import { runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
3
+ //#region src/work-discovery/repository.ts
4
+ function parseJson(value) {
5
+ if (!value) return void 0;
6
+ try {
7
+ return JSON.parse(value);
8
+ } catch {
9
+ return;
10
+ }
11
+ }
12
+ function onboardingFromRow(row) {
13
+ return {
14
+ status: row.status,
15
+ ...row.active_run_id ? { activeRunId: row.active_run_id } : {},
16
+ ...row.completed_at != null ? { completedAt: row.completed_at } : {},
17
+ ...row.dismissed_at != null ? { dismissedAt: row.dismissed_at } : {},
18
+ updatedAt: row.updated_at
19
+ };
20
+ }
21
+ function runFromRow(row) {
22
+ return {
23
+ id: row.id,
24
+ idempotencyKey: row.idempotency_key,
25
+ source: row.source,
26
+ status: row.status,
27
+ ...row.stage ? { stage: row.stage } : {},
28
+ rootPath: row.root_path,
29
+ projectId: row.project_id,
30
+ sessionKey: row.session_key,
31
+ agentId: row.agent_id,
32
+ modelRef: row.model_ref,
33
+ scanPolicyVersion: row.scan_policy_version,
34
+ ...parseJson(row.snapshot_summary_json) ? { snapshot: parseJson(row.snapshot_summary_json) } : {},
35
+ ...parseJson(row.result_json) ? { result: parseJson(row.result_json) } : {},
36
+ ...row.error_code ? { errorCode: row.error_code } : {},
37
+ ...row.error_message ? { errorMessage: row.error_message } : {},
38
+ createdAt: row.created_at,
39
+ ...row.started_at != null ? { startedAt: row.started_at } : {},
40
+ ...row.completed_at != null ? { completedAt: row.completed_at } : {},
41
+ ...row.canceled_at != null ? { canceledAt: row.canceled_at } : {}
42
+ };
43
+ }
44
+ function readRun(db, clause, value) {
45
+ const row = db.prepare(`SELECT * FROM work_discovery_runs WHERE ${clause} = ?`).get(value);
46
+ return row ? runFromRow(row) : null;
47
+ }
48
+ function getWorkDiscoveryOnboardingState() {
49
+ const { db } = requireXopcDatabase();
50
+ return onboardingFromRow(db.prepare("SELECT * FROM work_discovery_onboarding WHERE singleton_id = 1").get());
51
+ }
52
+ function setWorkDiscoveryOnboardingState(input) {
53
+ const now = input.nowMs ?? Date.now();
54
+ runSqliteWriteTransaction((db) => {
55
+ db.prepare(`UPDATE work_discovery_onboarding
56
+ SET status = ?, active_run_id = ?,
57
+ completed_at = CASE WHEN ? = 'completed' THEN ? ELSE completed_at END,
58
+ dismissed_at = CASE WHEN ? = 'dismissed' THEN ? ELSE dismissed_at END,
59
+ updated_at = ?
60
+ WHERE singleton_id = 1`).run(input.status, input.activeRunId ?? null, input.status, now, input.status, now, now);
61
+ });
62
+ return getWorkDiscoveryOnboardingState();
63
+ }
64
+ function createWorkDiscoveryRun(run) {
65
+ runSqliteWriteTransaction((db) => {
66
+ db.prepare(`INSERT INTO work_discovery_runs (
67
+ id, idempotency_key, source, status, stage, root_path, project_id, session_key,
68
+ agent_id, model_ref, scan_policy_version, snapshot_summary_json, result_json,
69
+ error_code, error_message, created_at, started_at, completed_at, canceled_at
70
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(run.id, run.idempotencyKey, run.source, run.status, run.stage ?? null, run.rootPath, run.projectId, run.sessionKey, run.agentId, run.modelRef, run.scanPolicyVersion, run.snapshot ? JSON.stringify(run.snapshot) : null, run.result ? JSON.stringify(run.result) : null, run.errorCode ?? null, run.errorMessage ?? null, run.createdAt, run.startedAt ?? null, run.completedAt ?? null, run.canceledAt ?? null);
71
+ });
72
+ return getWorkDiscoveryRun(run.id);
73
+ }
74
+ function getWorkDiscoveryRun(id) {
75
+ const { db } = requireXopcDatabase();
76
+ return readRun(db, "id", id);
77
+ }
78
+ function getWorkDiscoveryRunByIdempotencyKey(key) {
79
+ const { db } = requireXopcDatabase();
80
+ return readRun(db, "idempotency_key", key);
81
+ }
82
+ function updateWorkDiscoveryRun(id, patch) {
83
+ const existing = getWorkDiscoveryRun(id);
84
+ if (!existing) return null;
85
+ const next = {
86
+ ...existing,
87
+ ...patch
88
+ };
89
+ runSqliteWriteTransaction((db) => {
90
+ db.prepare(`UPDATE work_discovery_runs SET
91
+ status = ?, stage = ?, snapshot_summary_json = ?, result_json = ?,
92
+ error_code = ?, error_message = ?, started_at = ?, completed_at = ?, canceled_at = ?
93
+ WHERE id = ?`).run(next.status, next.stage ?? null, next.snapshot ? JSON.stringify(next.snapshot) : null, next.result ? JSON.stringify(next.result) : null, next.errorCode ?? null, next.errorMessage ?? null, next.startedAt ?? null, next.completedAt ?? null, next.canceledAt ?? null, id);
94
+ });
95
+ return getWorkDiscoveryRun(id);
96
+ }
97
+ //#endregion
98
+ export { createWorkDiscoveryRun, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, setWorkDiscoveryOnboardingState, updateWorkDiscoveryRun };
99
+
100
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","names":[],"sources":["../../../src/work-discovery/repository.ts"],"sourcesContent":["import type { DatabaseSync } from 'node:sqlite';\n\nimport { requireXopcDatabase } from '../storage/sqlite/connection.js';\nimport { runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\n\nimport type {\n WorkDiscoveryOnboardingState,\n WorkDiscoveryOnboardingStatus,\n WorkDiscoveryRun,\n} from './types.js';\n\ntype OnboardingRow = {\n status: string;\n active_run_id: string | null;\n completed_at: number | null;\n dismissed_at: number | null;\n updated_at: number;\n};\n\ntype RunRow = {\n id: string;\n idempotency_key: string;\n source: string;\n status: string;\n stage: string | null;\n root_path: string;\n project_id: string;\n session_key: string;\n agent_id: string;\n model_ref: string;\n scan_policy_version: number;\n snapshot_summary_json: string | null;\n result_json: string | null;\n error_code: string | null;\n error_message: string | null;\n created_at: number;\n started_at: number | null;\n completed_at: number | null;\n canceled_at: number | null;\n};\n\nfunction parseJson<T>(value: string | null): T | undefined {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction onboardingFromRow(row: OnboardingRow): WorkDiscoveryOnboardingState {\n return {\n status: row.status as WorkDiscoveryOnboardingStatus,\n ...(row.active_run_id ? { activeRunId: row.active_run_id } : {}),\n ...(row.completed_at != null ? { completedAt: row.completed_at } : {}),\n ...(row.dismissed_at != null ? { dismissedAt: row.dismissed_at } : {}),\n updatedAt: row.updated_at,\n };\n}\n\nfunction runFromRow(row: RunRow): WorkDiscoveryRun {\n return {\n id: row.id,\n idempotencyKey: row.idempotency_key,\n source: row.source as WorkDiscoveryRun['source'],\n status: row.status as WorkDiscoveryRun['status'],\n ...(row.stage ? { stage: row.stage as WorkDiscoveryRun['stage'] } : {}),\n rootPath: row.root_path,\n projectId: row.project_id,\n sessionKey: row.session_key,\n agentId: row.agent_id,\n modelRef: row.model_ref,\n scanPolicyVersion: row.scan_policy_version,\n ...(parseJson<WorkDiscoveryRun['snapshot']>(row.snapshot_summary_json)\n ? { snapshot: parseJson<WorkDiscoveryRun['snapshot']>(row.snapshot_summary_json) }\n : {}),\n ...(parseJson<WorkDiscoveryRun['result']>(row.result_json)\n ? { result: parseJson<WorkDiscoveryRun['result']>(row.result_json) }\n : {}),\n ...(row.error_code ? { errorCode: row.error_code as WorkDiscoveryRun['errorCode'] } : {}),\n ...(row.error_message ? { errorMessage: row.error_message } : {}),\n createdAt: row.created_at,\n ...(row.started_at != null ? { startedAt: row.started_at } : {}),\n ...(row.completed_at != null ? { completedAt: row.completed_at } : {}),\n ...(row.canceled_at != null ? { canceledAt: row.canceled_at } : {}),\n };\n}\n\nfunction readRun(db: DatabaseSync, clause: string, value: string): WorkDiscoveryRun | null {\n const row = db.prepare(`SELECT * FROM work_discovery_runs WHERE ${clause} = ?`).get(value) as RunRow | undefined;\n return row ? runFromRow(row) : null;\n}\n\nexport function getWorkDiscoveryOnboardingState(): WorkDiscoveryOnboardingState {\n const { db } = requireXopcDatabase();\n const row = db.prepare('SELECT * FROM work_discovery_onboarding WHERE singleton_id = 1').get() as OnboardingRow;\n return onboardingFromRow(row);\n}\n\nexport function setWorkDiscoveryOnboardingState(input: {\n status: WorkDiscoveryOnboardingStatus;\n activeRunId?: string | null;\n nowMs?: number;\n}): WorkDiscoveryOnboardingState {\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE work_discovery_onboarding\n SET status = ?, active_run_id = ?,\n completed_at = CASE WHEN ? = 'completed' THEN ? ELSE completed_at END,\n dismissed_at = CASE WHEN ? = 'dismissed' THEN ? ELSE dismissed_at END,\n updated_at = ?\n WHERE singleton_id = 1`,\n ).run(input.status, input.activeRunId ?? null, input.status, now, input.status, now, now);\n });\n return getWorkDiscoveryOnboardingState();\n}\n\nexport function createWorkDiscoveryRun(run: WorkDiscoveryRun): WorkDiscoveryRun {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO work_discovery_runs (\n id, idempotency_key, source, status, stage, root_path, project_id, session_key,\n agent_id, model_ref, scan_policy_version, snapshot_summary_json, result_json,\n error_code, error_message, created_at, started_at, completed_at, canceled_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n run.id,\n run.idempotencyKey,\n run.source,\n run.status,\n run.stage ?? null,\n run.rootPath,\n run.projectId,\n run.sessionKey,\n run.agentId,\n run.modelRef,\n run.scanPolicyVersion,\n run.snapshot ? JSON.stringify(run.snapshot) : null,\n run.result ? JSON.stringify(run.result) : null,\n run.errorCode ?? null,\n run.errorMessage ?? null,\n run.createdAt,\n run.startedAt ?? null,\n run.completedAt ?? null,\n run.canceledAt ?? null,\n );\n });\n return getWorkDiscoveryRun(run.id)!;\n}\n\nexport function getWorkDiscoveryRun(id: string): WorkDiscoveryRun | null {\n const { db } = requireXopcDatabase();\n return readRun(db, 'id', id);\n}\n\nexport function getWorkDiscoveryRunByIdempotencyKey(key: string): WorkDiscoveryRun | null {\n const { db } = requireXopcDatabase();\n return readRun(db, 'idempotency_key', key);\n}\n\nexport function updateWorkDiscoveryRun(\n id: string,\n patch: Partial<Pick<\n WorkDiscoveryRun,\n | 'status'\n | 'stage'\n | 'snapshot'\n | 'result'\n | 'errorCode'\n | 'errorMessage'\n | 'startedAt'\n | 'completedAt'\n | 'canceledAt'\n >>,\n): WorkDiscoveryRun | null {\n const existing = getWorkDiscoveryRun(id);\n if (!existing) return null;\n const next = { ...existing, ...patch };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE work_discovery_runs SET\n status = ?, stage = ?, snapshot_summary_json = ?, result_json = ?,\n error_code = ?, error_message = ?, started_at = ?, completed_at = ?, canceled_at = ?\n WHERE id = ?`,\n ).run(\n next.status,\n next.stage ?? null,\n next.snapshot ? JSON.stringify(next.snapshot) : null,\n next.result ? JSON.stringify(next.result) : null,\n next.errorCode ?? null,\n next.errorMessage ?? null,\n next.startedAt ?? null,\n next.completedAt ?? null,\n next.canceledAt ?? null,\n id,\n );\n });\n return getWorkDiscoveryRun(id);\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Config } from '../config/schema.js';
2
+ import type { ProjectService } from '../projects/project-service.js';
3
+ import type { SessionIndex } from '../session/manager.js';
4
+ import type { WorkDiscoveryOnboardingState, WorkDiscoveryRun, WorkDiscoverySource } from './types.js';
5
+ export interface WorkDiscoveryServiceOptions {
6
+ projects: ProjectService;
7
+ sessions: SessionIndex;
8
+ getConfig: () => Config;
9
+ emit: (type: string, payload: unknown) => void;
10
+ }
11
+ export declare class WorkDiscoveryService {
12
+ private readonly options;
13
+ private readonly abortControllers;
14
+ private readonly activity;
15
+ constructor(options: WorkDiscoveryServiceOptions);
16
+ isEnabled(): boolean;
17
+ getOnboardingState(): WorkDiscoveryOnboardingState;
18
+ dismissOnboarding(): WorkDiscoveryOnboardingState;
19
+ getRun(id: string): WorkDiscoveryRun | null;
20
+ startRun(input: {
21
+ rootPath: string;
22
+ source: WorkDiscoverySource;
23
+ idempotencyKey: string;
24
+ }): Promise<WorkDiscoveryRun>;
25
+ private publish;
26
+ private execute;
27
+ cancelRun(id: string): WorkDiscoveryRun | null;
28
+ retryRun(id: string): WorkDiscoveryRun | null;
29
+ selectSuggestion(runId: string, suggestionId: string): WorkDiscoveryRun | null;
30
+ }