@xopcai/xopc 0.0.145 → 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 (380) 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-BEUxdhZx.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-CRHSZJWi.js → app-management-settings-panel-ag1ViXT_.js} +1 -1
  12. package/dist/gateway/static/root/assets/{appearance-settings-BunADYJb.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-B6vTkH2A.js → archive-plugin-Dwi3mIBy.js} +1 -1
  15. package/dist/gateway/static/root/assets/{attachment-load-BjZXzaNv.js → attachment-load-BaCDoq40.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automation-suggestion-card-ZDA-Stg1.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-DYZfLvPz.js → binary-plugins-DoAYhsxa.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-C3MUlYC9.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-BVFNT2zW.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-_jUmoXd3.js → desktop-pet-kQq2e0BN.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-settings-DwGOy4AQ.js → desktop-pet-settings-B6vtozMY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{directory-picker-path-field-akvF0F-u.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-CwWktRNz.js → extension-page-D15CWHBd.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-CuggWOIl.js → extension-settings-page-D4P0n1om.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-B7sxIbza.js → gateway-config-api-B4qZctjG.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-DIv0eKMf.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-C4Kw0mfS.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-B0jm5JaA.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-N5_iL7es.js → goals-settings-BROWCIcL.js} +1 -1
  45. package/dist/gateway/static/root/assets/{heartbeat-settings-XzH3lbRR.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-5rJx5flj.js → markdown-split-Dy7QpaAz.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-DYXccwAd.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-BgLyndCO.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-6Al9_sGz.js → page-tabs-DKB6RDre.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-Cm3G72Hv.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-BYtfzu_F.js → save-bar-controls-BgIE9BBh.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schedule-field-CvIRc6yK.js → schedule-field-BXDP-oMz.js} +1 -1
  66. package/dist/gateway/static/root/assets/{schema-form-CQuKx0n7.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-CF3HHM-t.js → settings-collapsible-section-CUTExnlK.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-form-section-CwWjoRN6.js → settings-form-section-CmnDhsf0.js} +1 -1
  71. package/dist/gateway/static/root/assets/{settings-loading-skeleton-aUFmJa13.js → settings-loading-skeleton-B79dq-XY.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-page-B2UUU9TF.js → settings-page-Db8uAv3X.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-page-layout-DqpbTWqI.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-BOhlPsS1.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-CWxSvuwD.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-qROAvqTw.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-CWxc0ghP.js → user-profile-fields-editor-CPOO9Jz5.js} +1 -1
  85. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DW-Up6vt.js → user-profile-settings-panel-C8cgtSF7.js} +1 -1
  86. package/dist/gateway/static/root/assets/{utils-D53uRXVr.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-D_x9ELJp.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 +5 -10
  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/index.js +1 -1
  185. package/dist/src/agent-runtime/memory-runtime.d.ts +2 -2
  186. package/dist/src/agent-runtime/memory-runtime.js +8 -7
  187. package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
  188. package/dist/src/agent-runtime/runtime-profile.d.ts +2 -0
  189. package/dist/src/agent-runtime/runtime-profile.js +2 -2
  190. package/dist/src/agent-runtime/runtime-profile.js.map +1 -1
  191. package/dist/src/chat-commands/agent-edit.js +1 -2
  192. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  193. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  194. package/dist/src/cli/commands/init.js +0 -22
  195. package/dist/src/cli/commands/init.js.map +1 -1
  196. package/dist/src/cli/templates.d.ts +1 -1
  197. package/dist/src/cli/templates.js +1 -16
  198. package/dist/src/cli/templates.js.map +1 -1
  199. package/dist/src/commands/agents.config.js +0 -10
  200. package/dist/src/commands/agents.config.js.map +1 -1
  201. package/dist/src/config/agent-profile.js +1 -1
  202. package/dist/src/config/index.js +2 -2
  203. package/dist/src/config/paths.d.ts +0 -1
  204. package/dist/src/config/paths.js +1 -2
  205. package/dist/src/config/paths.js.map +1 -1
  206. package/dist/src/config/schema.d.ts +118 -532
  207. package/dist/src/config/schema.js +32 -26
  208. package/dist/src/config/schema.js.map +1 -1
  209. package/dist/src/extensions/loader.js +2 -1
  210. package/dist/src/extensions/loader.js.map +1 -1
  211. package/dist/src/gateway/agents-admin.d.ts +0 -2
  212. package/dist/src/gateway/agents-admin.js +1 -7
  213. package/dist/src/gateway/agents-admin.js.map +1 -1
  214. package/dist/src/gateway/capability-presets-admin.d.ts +0 -2
  215. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  216. package/dist/src/gateway/chat-stream/mapper.js +26 -0
  217. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  218. package/dist/src/gateway/chat-stream/protocol.d.ts +16 -1
  219. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -1
  220. package/dist/src/gateway/dreaming-automation-reconciler.js +41 -63
  221. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  222. package/dist/src/gateway/heartbeat/service.js +1 -1
  223. package/dist/src/gateway/hono/app.js +3 -1
  224. package/dist/src/gateway/hono/app.js.map +1 -1
  225. package/dist/src/gateway/hono/lib/config-payload.d.ts +0 -130
  226. package/dist/src/gateway/hono/lib/config-payload.js +0 -1
  227. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  228. package/dist/src/gateway/hono/routes/agents.js +6 -12
  229. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  230. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +6 -0
  231. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  232. package/dist/src/gateway/hono/routes/capability-presets.js +2 -2
  233. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  234. package/dist/src/gateway/hono/routes/dreaming.js +9 -20
  235. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  236. package/dist/src/gateway/hono/routes/index.js +4 -0
  237. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/local-apps.d.ts +5 -0
  239. package/dist/src/gateway/hono/routes/local-apps.js +99 -0
  240. package/dist/src/gateway/hono/routes/local-apps.js.map +1 -0
  241. package/dist/src/gateway/hono/routes/memory.js +48 -65
  242. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  243. package/dist/src/gateway/hono/routes/projects.js +2 -2
  244. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  245. package/dist/src/gateway/hono/routes/work-discovery.d.ts +3 -0
  246. package/dist/src/gateway/hono/routes/work-discovery.js +150 -0
  247. package/dist/src/gateway/hono/routes/work-discovery.js.map +1 -0
  248. package/dist/src/gateway/hono/routes/you.d.ts +3 -0
  249. package/dist/src/gateway/hono/routes/you.js +358 -91
  250. package/dist/src/gateway/hono/routes/you.js.map +1 -1
  251. package/dist/src/gateway/service.d.ts +3 -0
  252. package/dist/src/gateway/service.js +12 -0
  253. package/dist/src/gateway/service.js.map +1 -1
  254. package/dist/src/heartbeat/index.js +1 -1
  255. package/dist/src/knowledge/connected-knowledge-pipeline.js +9 -5
  256. package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -1
  257. package/dist/src/local-apps/acceptance.d.ts +30 -0
  258. package/dist/src/local-apps/acceptance.js +93 -0
  259. package/dist/src/local-apps/acceptance.js.map +1 -0
  260. package/dist/src/local-apps/index.d.ts +5 -0
  261. package/dist/src/local-apps/index.js +4 -0
  262. package/dist/src/local-apps/preview-runtime-bridge.d.ts +4 -0
  263. package/dist/src/local-apps/preview-runtime-bridge.js +171 -0
  264. package/dist/src/local-apps/preview-runtime-bridge.js.map +1 -0
  265. package/dist/src/local-apps/runtime-entry.d.ts +8 -0
  266. package/dist/src/local-apps/runtime-entry.js +25 -0
  267. package/dist/src/local-apps/runtime-entry.js.map +1 -0
  268. package/dist/src/local-apps/scaffold.d.ts +8 -0
  269. package/dist/src/local-apps/scaffold.js +122 -0
  270. package/dist/src/local-apps/scaffold.js.map +1 -0
  271. package/dist/src/local-apps/service.d.ts +37 -0
  272. package/dist/src/local-apps/service.js +553 -0
  273. package/dist/src/local-apps/service.js.map +1 -0
  274. package/dist/src/local-apps/store.d.ts +44 -0
  275. package/dist/src/local-apps/store.js +195 -0
  276. package/dist/src/local-apps/store.js.map +1 -0
  277. package/dist/src/local-apps/types.d.ts +105 -0
  278. package/dist/src/local-apps/types.js +1 -0
  279. package/dist/src/storage/sqlite/index.d.ts +3 -2
  280. package/dist/src/storage/sqlite/index.js +4 -3
  281. package/dist/src/storage/sqlite/memory-index-repository.d.ts +2 -3
  282. package/dist/src/storage/sqlite/memory-index-repository.js +16 -20
  283. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
  284. package/dist/src/storage/sqlite/memory-records-repository.d.ts +18 -10
  285. package/dist/src/storage/sqlite/memory-records-repository.js +79 -34
  286. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  287. package/dist/src/storage/sqlite/memory-reference-consent-repository.d.ts +27 -0
  288. package/dist/src/storage/sqlite/memory-reference-consent-repository.js +109 -0
  289. package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +1 -0
  290. package/dist/src/storage/sqlite/migrations/038_user_owned_memory.sql +68 -0
  291. package/dist/src/storage/sqlite/migrations/039_memory_reference_consents.sql +19 -0
  292. package/dist/src/storage/sqlite/migrations/040_local_apps.sql +32 -0
  293. package/dist/src/storage/sqlite/migrations/041_local_app_release_lifecycle.sql +17 -0
  294. package/dist/src/storage/sqlite/migrations/042_work_discovery.sql +41 -0
  295. package/dist/src/storage/sqlite/migrations/043_local_app_acceptance_runs.sql +16 -0
  296. package/dist/src/storage/sqlite/migrations/044_repair_work_discovery_foreign_keys.sql +75 -0
  297. package/dist/src/storage/sqlite/migrations/045_extension_ui_grants.sql +13 -0
  298. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  299. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  300. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  301. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  302. package/dist/src/storage/sqlite/schema.js +1 -1
  303. package/dist/src/storage/sqlite/schema.sql +20 -0
  304. package/dist/src/user-context/config.d.ts +227 -0
  305. package/dist/src/user-context/config.js +158 -0
  306. package/dist/src/user-context/config.js.map +1 -0
  307. package/dist/src/user-context/import.d.ts +1 -1
  308. package/dist/src/user-context/import.js +6 -1
  309. package/dist/src/user-context/import.js.map +1 -1
  310. package/dist/src/user-context/owner.d.ts +5 -0
  311. package/dist/src/user-context/owner.js +9 -0
  312. package/dist/src/user-context/owner.js.map +1 -0
  313. package/dist/src/user-context/projection.d.ts +11 -9
  314. package/dist/src/user-context/projection.js +74 -47
  315. package/dist/src/user-context/projection.js.map +1 -1
  316. package/dist/src/user-context/runtime.d.ts +13 -0
  317. package/dist/src/user-context/runtime.js +36 -0
  318. package/dist/src/user-context/runtime.js.map +1 -0
  319. package/dist/src/work-discovery/analyzer.d.ts +11 -0
  320. package/dist/src/work-discovery/analyzer.js +171 -0
  321. package/dist/src/work-discovery/analyzer.js.map +1 -0
  322. package/dist/src/work-discovery/index.d.ts +5 -0
  323. package/dist/src/work-discovery/index.js +5 -0
  324. package/dist/src/work-discovery/probe.d.ts +12 -0
  325. package/dist/src/work-discovery/probe.js +335 -0
  326. package/dist/src/work-discovery/probe.js.map +1 -0
  327. package/dist/src/work-discovery/repository.d.ts +11 -0
  328. package/dist/src/work-discovery/repository.js +100 -0
  329. package/dist/src/work-discovery/repository.js.map +1 -0
  330. package/dist/src/work-discovery/service.d.ts +30 -0
  331. package/dist/src/work-discovery/service.js +387 -0
  332. package/dist/src/work-discovery/service.js.map +1 -0
  333. package/dist/src/work-discovery/types.d.ts +114 -0
  334. package/dist/src/work-discovery/types.js +1 -0
  335. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  336. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  337. package/package.json +5 -3
  338. package/skills/engineering/build-xopc-local-app/SKILL.md +45 -0
  339. package/skills/engineering/build-xopc-local-app/references/app-contract.md +33 -0
  340. package/skills/engineering/build-xopc-local-app/scripts/validate-local-app.mjs +72 -0
  341. package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +0 -41
  342. package/dist/gateway/static/root/assets/activity-center-store-3l9ahUqb.js +0 -1
  343. package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +0 -2
  344. package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +0 -1
  345. package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +0 -6
  346. package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +0 -8
  347. package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +0 -1
  348. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +0 -2
  349. package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +0 -1
  350. package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +0 -1
  351. package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +0 -2
  352. package/dist/gateway/static/root/assets/dist-C99RGfAH.js +0 -1
  353. package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +0 -3
  354. package/dist/gateway/static/root/assets/extension-debug-page-Cof2ncxE.js +0 -1
  355. package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +0 -4
  356. package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +0 -2
  357. package/dist/gateway/static/root/assets/index-CSLF84-Q.css +0 -1
  358. package/dist/gateway/static/root/assets/index-I-ZCenVw.js +0 -259
  359. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +0 -1
  360. package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +0 -7
  361. package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +0 -5
  362. package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +0 -2
  363. package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +0 -4
  364. package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +0 -1
  365. package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +0 -1
  366. package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +0 -1
  367. package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +0 -1
  368. package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +0 -1
  369. package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +0 -1
  370. package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +0 -1
  371. package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +0 -1
  372. package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +0 -2
  373. package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +0 -1
  374. package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +0 -1
  375. package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +0 -1
  376. package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +0 -11
  377. package/dist/src/agent/context/workspace-templates/MEMORY.md +0 -33
  378. package/dist/src/agent/memory/access-policy.d.ts +0 -12
  379. package/dist/src/agent/memory/access-policy.js +0 -44
  380. 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":";;;AAyCA,SAAS,UAAa,OAAqC;AACzD,KAAI,CAAC,MAAO,QAAO,KAAA;AACnB,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;;AAIJ,SAAS,kBAAkB,KAAkD;AAC3E,QAAO;EACL,QAAQ,IAAI;EACZ,GAAI,IAAI,gBAAgB,EAAE,aAAa,IAAI,eAAe,GAAG,EAAE;EAC/D,GAAI,IAAI,gBAAgB,OAAO,EAAE,aAAa,IAAI,cAAc,GAAG,EAAE;EACrE,GAAI,IAAI,gBAAgB,OAAO,EAAE,aAAa,IAAI,cAAc,GAAG,EAAE;EACrE,WAAW,IAAI;EAChB;;AAGH,SAAS,WAAW,KAA+B;AACjD,QAAO;EACL,IAAI,IAAI;EACR,gBAAgB,IAAI;EACpB,QAAQ,IAAI;EACZ,QAAQ,IAAI;EACZ,GAAI,IAAI,QAAQ,EAAE,OAAO,IAAI,OAAoC,GAAG,EAAE;EACtE,UAAU,IAAI;EACd,WAAW,IAAI;EACf,YAAY,IAAI;EAChB,SAAS,IAAI;EACb,UAAU,IAAI;EACd,mBAAmB,IAAI;EACvB,GAAI,UAAwC,IAAI,sBAAsB,GAClE,EAAE,UAAU,UAAwC,IAAI,sBAAsB,EAAE,GAChF,EAAE;EACN,GAAI,UAAsC,IAAI,YAAY,GACtD,EAAE,QAAQ,UAAsC,IAAI,YAAY,EAAE,GAClE,EAAE;EACN,GAAI,IAAI,aAAa,EAAE,WAAW,IAAI,YAA6C,GAAG,EAAE;EACxF,GAAI,IAAI,gBAAgB,EAAE,cAAc,IAAI,eAAe,GAAG,EAAE;EAChE,WAAW,IAAI;EACf,GAAI,IAAI,cAAc,OAAO,EAAE,WAAW,IAAI,YAAY,GAAG,EAAE;EAC/D,GAAI,IAAI,gBAAgB,OAAO,EAAE,aAAa,IAAI,cAAc,GAAG,EAAE;EACrE,GAAI,IAAI,eAAe,OAAO,EAAE,YAAY,IAAI,aAAa,GAAG,EAAE;EACnE;;AAGH,SAAS,QAAQ,IAAkB,QAAgB,OAAwC;CACzF,MAAM,MAAM,GAAG,QAAQ,2CAA2C,OAAO,MAAM,CAAC,IAAI,MAAM;AAC1F,QAAO,MAAM,WAAW,IAAI,GAAG;;AAGjC,SAAgB,kCAAgE;CAC9E,MAAM,EAAE,OAAO,qBAAqB;AAEpC,QAAO,kBADK,GAAG,QAAQ,iEAAiE,CAAC,KAC7D,CAAC;;AAG/B,SAAgB,gCAAgC,OAIf;CAC/B,MAAM,MAAM,MAAM,SAAS,KAAK,KAAK;AACrC,4BAA2B,OAAO;AAChC,KAAG,QACD;;;;;+BAMD,CAAC,IAAI,MAAM,QAAQ,MAAM,eAAe,MAAM,MAAM,QAAQ,KAAK,MAAM,QAAQ,KAAK,IAAI;GACzF;AACF,QAAO,iCAAiC;;AAG1C,SAAgB,uBAAuB,KAAyC;AAC9E,4BAA2B,OAAO;AAChC,KAAG,QACD;;;;0EAKD,CAAC,IACA,IAAI,IACJ,IAAI,gBACJ,IAAI,QACJ,IAAI,QACJ,IAAI,SAAS,MACb,IAAI,UACJ,IAAI,WACJ,IAAI,YACJ,IAAI,SACJ,IAAI,UACJ,IAAI,mBACJ,IAAI,WAAW,KAAK,UAAU,IAAI,SAAS,GAAG,MAC9C,IAAI,SAAS,KAAK,UAAU,IAAI,OAAO,GAAG,MAC1C,IAAI,aAAa,MACjB,IAAI,gBAAgB,MACpB,IAAI,WACJ,IAAI,aAAa,MACjB,IAAI,eAAe,MACnB,IAAI,cAAc,KACnB;GACD;AACF,QAAO,oBAAoB,IAAI,GAAG;;AAGpC,SAAgB,oBAAoB,IAAqC;CACvE,MAAM,EAAE,OAAO,qBAAqB;AACpC,QAAO,QAAQ,IAAI,MAAM,GAAG;;AAG9B,SAAgB,oCAAoC,KAAsC;CACxF,MAAM,EAAE,OAAO,qBAAqB;AACpC,QAAO,QAAQ,IAAI,mBAAmB,IAAI;;AAG5C,SAAgB,uBACd,IACA,OAYyB;CACzB,MAAM,WAAW,oBAAoB,GAAG;AACxC,KAAI,CAAC,SAAU,QAAO;CACtB,MAAM,OAAO;EAAE,GAAG;EAAU,GAAG;EAAO;AACtC,4BAA2B,OAAO;AAChC,KAAG,QACD;;;qBAID,CAAC,IACA,KAAK,QACL,KAAK,SAAS,MACd,KAAK,WAAW,KAAK,UAAU,KAAK,SAAS,GAAG,MAChD,KAAK,SAAS,KAAK,UAAU,KAAK,OAAO,GAAG,MAC5C,KAAK,aAAa,MAClB,KAAK,gBAAgB,MACrB,KAAK,aAAa,MAClB,KAAK,eAAe,MACpB,KAAK,cAAc,MACnB,GACD;GACD;AACF,QAAO,oBAAoB,GAAG"}
@@ -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
+ }