@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,387 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { ActivityService } from "../activity/service.js";
4
+ import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
5
+ import { buildSessionKey, init_session_key } from "../routing/session-key.js";
6
+ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
7
+ import { previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, summarizeWorkContextSnapshot } from "./probe.js";
8
+ import { analyzeWorkContext, workDiscoveryResultMarkdown } from "./analyzer.js";
9
+ import { createWorkDiscoveryRun, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, setWorkDiscoveryOnboardingState, updateWorkDiscoveryRun } from "./repository.js";
10
+ import { randomUUID } from "node:crypto";
11
+ //#region src/work-discovery/service.ts
12
+ init_schema();
13
+ init_session_key();
14
+ init_resolve_route();
15
+ init_logger();
16
+ const log = createLogger("WorkDiscovery");
17
+ function sessionMetadata(agentId, peerId) {
18
+ return {
19
+ sourceChannel: "webchat",
20
+ sourceChatId: [
21
+ "default",
22
+ "direct",
23
+ peerId
24
+ ].join(":"),
25
+ sessionType: "chat",
26
+ hiddenFromSessionList: true,
27
+ routing: {
28
+ agentId,
29
+ source: "webchat",
30
+ accountId: "default",
31
+ peerKind: "direct",
32
+ peerId
33
+ },
34
+ customData: {
35
+ workDiscovery: true,
36
+ genericNewChatShell: false
37
+ }
38
+ };
39
+ }
40
+ function errorCode(error) {
41
+ if (error instanceof DOMException && error.name === "AbortError") return "canceled";
42
+ const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
43
+ if (message.includes("api key") || message.includes("model") || message.includes("provider")) return "model_unavailable";
44
+ if (message.includes("directory") || message.includes("folder") || message.includes("enoent")) return "folder_unavailable";
45
+ if (message.includes("permission") || message.includes("eacces")) return "folder_not_readable";
46
+ if (message.includes("json") || message.includes("analysis result")) return "analysis_invalid";
47
+ if (message.includes("timeout")) return "analysis_timeout";
48
+ return "internal_error";
49
+ }
50
+ var WorkDiscoveryService = class {
51
+ abortControllers = /* @__PURE__ */ new Map();
52
+ activity = new ActivityService();
53
+ constructor(options) {
54
+ this.options = options;
55
+ }
56
+ isEnabled() {
57
+ return this.options.getConfig().experimental?.workDiscoveryOnboarding === true;
58
+ }
59
+ getOnboardingState() {
60
+ return getWorkDiscoveryOnboardingState();
61
+ }
62
+ dismissOnboarding() {
63
+ return setWorkDiscoveryOnboardingState({
64
+ status: "dismissed",
65
+ activeRunId: null
66
+ });
67
+ }
68
+ getRun(id) {
69
+ return getWorkDiscoveryRun(id);
70
+ }
71
+ async startRun(input) {
72
+ const existing = getWorkDiscoveryRunByIdempotencyKey(input.idempotencyKey);
73
+ if (existing) return existing;
74
+ const config = this.options.getConfig();
75
+ const modelRef = getAgentDefaultModelRef(config);
76
+ if (!modelRef) throw new Error("No default model configured");
77
+ const rootPath = (await previewWorkDiscoveryRoot(input.rootPath)).canonicalRootPath;
78
+ const agentId = getDefaultAgentId(config);
79
+ const match = this.options.projects.resolveOrCreateForWorkspacePath({
80
+ workspacePath: rootPath,
81
+ defaultAgentId: agentId,
82
+ autoCreate: true
83
+ });
84
+ if (!match) throw new Error("Selected folder cannot be used as a project workspace");
85
+ const projectAgentId = match.project.defaultAgentId || agentId;
86
+ const peerId = `work-discovery-${randomUUID()}`;
87
+ const sessionKey = buildSessionKey({
88
+ agentId: projectAgentId,
89
+ source: "webchat",
90
+ accountId: "default",
91
+ peerKind: "direct",
92
+ peerId
93
+ });
94
+ await this.options.sessions.saveMessages(sessionKey, [], { metadata: sessionMetadata(projectAgentId, peerId) });
95
+ this.options.projects.attachSession(sessionKey, match.project.id);
96
+ const now = Date.now();
97
+ const run = createWorkDiscoveryRun({
98
+ id: randomUUID(),
99
+ idempotencyKey: input.idempotencyKey,
100
+ source: input.source,
101
+ status: "queued",
102
+ rootPath,
103
+ projectId: match.project.id,
104
+ sessionKey,
105
+ agentId: projectAgentId,
106
+ modelRef,
107
+ scanPolicyVersion: 1,
108
+ createdAt: now
109
+ });
110
+ await this.options.sessions.appendTranscriptContextEntry(sessionKey, {
111
+ text: "Work discovery was explicitly requested for the selected folder.",
112
+ data: {
113
+ type: "work_discovery",
114
+ runId: run.id,
115
+ rootPath,
116
+ scanPolicyVersion: 1,
117
+ source: input.source
118
+ }
119
+ });
120
+ if (input.source === "onboarding_selected_directory") setWorkDiscoveryOnboardingState({
121
+ status: "in_progress",
122
+ activeRunId: run.id
123
+ });
124
+ this.activity.record({
125
+ type: "work_discovery.started",
126
+ primaryObject: {
127
+ kind: "project",
128
+ id: match.project.id,
129
+ title: match.project.name
130
+ },
131
+ actor: { kind: "system" },
132
+ initiator: {
133
+ kind: "user",
134
+ sessionKey
135
+ },
136
+ source: {
137
+ kind: "gateway_api",
138
+ runId: run.id
139
+ },
140
+ visibility: "audit",
141
+ payload: {
142
+ policyVersion: 1,
143
+ source: input.source
144
+ },
145
+ scopes: [{
146
+ scopeKind: "project",
147
+ scopeId: match.project.id,
148
+ reason: "object_owner"
149
+ }, {
150
+ scopeKind: "session",
151
+ scopeId: sessionKey,
152
+ reason: "runtime_context"
153
+ }]
154
+ });
155
+ const controller = new AbortController();
156
+ this.abortControllers.set(run.id, controller);
157
+ this.execute(run, controller.signal);
158
+ return run;
159
+ }
160
+ publish(run) {
161
+ const suffix = run.status === "completed" ? "completed" : run.status === "failed" ? "failed" : run.status === "canceled" ? "canceled" : "progress";
162
+ this.options.emit(`work-discovery.${suffix}`, {
163
+ runId: run.id,
164
+ projectId: run.projectId,
165
+ sessionKey: run.sessionKey,
166
+ status: run.status,
167
+ stage: run.stage,
168
+ ...run.status === "completed" ? { result: run.result } : {}
169
+ });
170
+ }
171
+ async execute(run, signal) {
172
+ const startedAt = Date.now();
173
+ try {
174
+ let current = updateWorkDiscoveryRun(run.id, {
175
+ status: "probing",
176
+ stage: "folder_structure",
177
+ startedAt
178
+ });
179
+ this.publish(current);
180
+ const snapshot = await probeWorkDiscoveryRoot(run.rootPath, signal);
181
+ if (signal.aborted) throw new DOMException("Work discovery canceled", "AbortError");
182
+ current = updateWorkDiscoveryRun(run.id, {
183
+ status: "analyzing",
184
+ stage: "recent_progress",
185
+ snapshot: summarizeWorkContextSnapshot(snapshot)
186
+ });
187
+ this.publish(current);
188
+ const analysis = await analyzeWorkContext({
189
+ config: this.options.getConfig(),
190
+ snapshot,
191
+ signal
192
+ });
193
+ current = updateWorkDiscoveryRun(run.id, {
194
+ status: "analyzing",
195
+ stage: "next_steps"
196
+ });
197
+ this.publish(current);
198
+ await this.options.sessions.appendTranscriptCustomMessageEntry(run.sessionKey, {
199
+ customType: "work-discovery-result",
200
+ content: workDiscoveryResultMarkdown(analysis.result),
201
+ display: true,
202
+ details: {
203
+ runId: run.id,
204
+ result: analysis.result
205
+ }
206
+ });
207
+ const project = this.options.projects.get(run.projectId);
208
+ await this.options.sessions.updateSessionMetadata(run.sessionKey, {
209
+ name: project ? `Continue work on ${project.name}` : "Continue recent work",
210
+ hiddenFromSessionList: false
211
+ });
212
+ current = updateWorkDiscoveryRun(run.id, {
213
+ status: "completed",
214
+ stage: "next_steps",
215
+ result: analysis.result,
216
+ completedAt: Date.now()
217
+ });
218
+ if (run.source === "onboarding_selected_directory") setWorkDiscoveryOnboardingState({
219
+ status: "completed",
220
+ activeRunId: run.id
221
+ });
222
+ this.activity.record({
223
+ type: "work_discovery.completed",
224
+ primaryObject: {
225
+ kind: "project",
226
+ id: run.projectId,
227
+ title: project?.name
228
+ },
229
+ actor: {
230
+ kind: "agent",
231
+ agentId: run.agentId,
232
+ sessionKey: run.sessionKey
233
+ },
234
+ initiator: {
235
+ kind: "user",
236
+ sessionKey: run.sessionKey
237
+ },
238
+ source: {
239
+ kind: "system",
240
+ runId: run.id
241
+ },
242
+ payload: {
243
+ policyVersion: run.scanPolicyVersion,
244
+ suggestionCount: analysis.result.suggestions.length,
245
+ lowConfidence: analysis.result.lowConfidence === true
246
+ },
247
+ scopes: [{
248
+ scopeKind: "project",
249
+ scopeId: run.projectId,
250
+ reason: "object_owner"
251
+ }, {
252
+ scopeKind: "session",
253
+ scopeId: run.sessionKey,
254
+ reason: "runtime_context"
255
+ }]
256
+ });
257
+ this.publish(current);
258
+ this.options.emit("session.transcript_updated", { key: run.sessionKey });
259
+ log.info({
260
+ runId: run.id,
261
+ projectId: run.projectId,
262
+ sessionKey: run.sessionKey,
263
+ durationMs: Date.now() - startedAt
264
+ }, "Work discovery completed");
265
+ } catch (error) {
266
+ const canceled = signal.aborted || error instanceof DOMException && error.name === "AbortError";
267
+ const code = canceled ? "canceled" : errorCode(error);
268
+ const message = canceled ? "Analysis canceled" : error instanceof Error ? error.message : String(error);
269
+ const current = updateWorkDiscoveryRun(run.id, {
270
+ status: canceled ? "canceled" : "failed",
271
+ errorCode: code,
272
+ errorMessage: message,
273
+ ...canceled ? { canceledAt: Date.now() } : { completedAt: Date.now() }
274
+ });
275
+ if (current) this.publish(current);
276
+ this.activity.record({
277
+ type: canceled ? "work_discovery.canceled" : "work_discovery.failed",
278
+ primaryObject: {
279
+ kind: "project",
280
+ id: run.projectId
281
+ },
282
+ actor: { kind: "system" },
283
+ initiator: {
284
+ kind: "user",
285
+ sessionKey: run.sessionKey
286
+ },
287
+ source: {
288
+ kind: "system",
289
+ runId: run.id
290
+ },
291
+ visibility: "audit",
292
+ payload: { errorCode: code },
293
+ scopes: [{
294
+ scopeKind: "project",
295
+ scopeId: run.projectId,
296
+ reason: "object_owner"
297
+ }, {
298
+ scopeKind: "session",
299
+ scopeId: run.sessionKey,
300
+ reason: "runtime_context"
301
+ }]
302
+ });
303
+ log.warn({
304
+ err: error,
305
+ runId: run.id,
306
+ projectId: run.projectId,
307
+ phase: "analysis",
308
+ errorCode: code
309
+ }, `Work discovery failed: ${message}`);
310
+ } finally {
311
+ this.abortControllers.delete(run.id);
312
+ }
313
+ }
314
+ cancelRun(id) {
315
+ const run = getWorkDiscoveryRun(id);
316
+ if (!run) return null;
317
+ if (run.status === "completed" || run.status === "failed" || run.status === "canceled") return run;
318
+ this.abortControllers.get(id)?.abort();
319
+ return updateWorkDiscoveryRun(id, {
320
+ status: "canceled",
321
+ errorCode: "canceled",
322
+ errorMessage: "Analysis canceled",
323
+ canceledAt: Date.now()
324
+ });
325
+ }
326
+ retryRun(id) {
327
+ const run = getWorkDiscoveryRun(id);
328
+ if (!run) return null;
329
+ if (run.status !== "failed" && run.status !== "canceled") return run;
330
+ const queued = updateWorkDiscoveryRun(id, {
331
+ status: "queued",
332
+ stage: "folder_structure",
333
+ errorCode: void 0,
334
+ errorMessage: void 0,
335
+ completedAt: void 0,
336
+ canceledAt: void 0
337
+ });
338
+ if (!queued) return null;
339
+ const controller = new AbortController();
340
+ this.abortControllers.set(id, controller);
341
+ if (run.source === "onboarding_selected_directory") setWorkDiscoveryOnboardingState({
342
+ status: "in_progress",
343
+ activeRunId: id
344
+ });
345
+ this.publish(queued);
346
+ this.execute(queued, controller.signal);
347
+ return queued;
348
+ }
349
+ selectSuggestion(runId, suggestionId) {
350
+ const run = getWorkDiscoveryRun(runId);
351
+ const suggestion = run?.result?.suggestions.find((item) => item.id === suggestionId);
352
+ if (!run || !suggestion) return null;
353
+ this.activity.record({
354
+ type: "work_discovery.suggestion_selected",
355
+ primaryObject: {
356
+ kind: "project",
357
+ id: run.projectId
358
+ },
359
+ actor: {
360
+ kind: "user",
361
+ sessionKey: run.sessionKey
362
+ },
363
+ source: {
364
+ kind: "gateway_api",
365
+ runId
366
+ },
367
+ payload: {
368
+ suggestionId,
369
+ title: suggestion.title
370
+ },
371
+ scopes: [{
372
+ scopeKind: "project",
373
+ scopeId: run.projectId,
374
+ reason: "object_owner"
375
+ }, {
376
+ scopeKind: "session",
377
+ scopeId: run.sessionKey,
378
+ reason: "runtime_context"
379
+ }]
380
+ });
381
+ return run;
382
+ }
383
+ };
384
+ //#endregion
385
+ export { WorkDiscoveryService };
386
+
387
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","names":[],"sources":["../../../src/work-discovery/service.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { Config } from '../config/schema.js';\nimport { getAgentDefaultModelRef } from '../config/schema.js';\nimport { ActivityService } from '../activity/service.js';\nimport type { ProjectService } from '../projects/project-service.js';\nimport { buildSessionKey } from '../routing/session-key.js';\nimport { getDefaultAgentId } from '../routing/resolve-route.js';\nimport type { SessionIndex } from '../session/manager.js';\nimport type { SessionMetadataSeed } from '../storage/sqlite/index.js';\nimport { createLogger } from '../utils/logger.js';\n\nimport { analyzeWorkContext, workDiscoveryResultMarkdown } from './analyzer.js';\nimport {\n createWorkDiscoveryRun,\n getWorkDiscoveryOnboardingState,\n getWorkDiscoveryRun,\n getWorkDiscoveryRunByIdempotencyKey,\n setWorkDiscoveryOnboardingState,\n updateWorkDiscoveryRun,\n} from './repository.js';\nimport {\n probeWorkDiscoveryRoot,\n previewWorkDiscoveryRoot,\n summarizeWorkContextSnapshot,\n WORK_DISCOVERY_SCAN_POLICY_VERSION,\n} from './probe.js';\nimport type {\n WorkDiscoveryErrorCode,\n WorkDiscoveryOnboardingState,\n WorkDiscoveryRun,\n WorkDiscoverySource,\n} from './types.js';\n\nconst log = createLogger('WorkDiscovery');\n\nexport interface WorkDiscoveryServiceOptions {\n projects: ProjectService;\n sessions: SessionIndex;\n getConfig: () => Config;\n emit: (type: string, payload: unknown) => void;\n}\n\nfunction sessionMetadata(agentId: string, peerId: string): SessionMetadataSeed {\n return {\n sourceChannel: 'webchat',\n sourceChatId: ['default', 'direct', peerId].join(':'),\n sessionType: 'chat',\n hiddenFromSessionList: true,\n routing: {\n agentId,\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId,\n },\n customData: {\n workDiscovery: true,\n genericNewChatShell: false,\n },\n };\n}\n\nfunction errorCode(error: unknown): WorkDiscoveryErrorCode {\n if (error instanceof DOMException && error.name === 'AbortError') return 'canceled';\n const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n if (message.includes('api key') || message.includes('model') || message.includes('provider')) return 'model_unavailable';\n if (message.includes('directory') || message.includes('folder') || message.includes('enoent')) return 'folder_unavailable';\n if (message.includes('permission') || message.includes('eacces')) return 'folder_not_readable';\n if (message.includes('json') || message.includes('analysis result')) return 'analysis_invalid';\n if (message.includes('timeout')) return 'analysis_timeout';\n return 'internal_error';\n}\n\nexport class WorkDiscoveryService {\n private readonly abortControllers = new Map<string, AbortController>();\n private readonly activity = new ActivityService();\n\n constructor(private readonly options: WorkDiscoveryServiceOptions) {}\n\n isEnabled(): boolean {\n return this.options.getConfig().experimental?.workDiscoveryOnboarding === true;\n }\n\n getOnboardingState(): WorkDiscoveryOnboardingState {\n return getWorkDiscoveryOnboardingState();\n }\n\n dismissOnboarding(): WorkDiscoveryOnboardingState {\n return setWorkDiscoveryOnboardingState({ status: 'dismissed', activeRunId: null });\n }\n\n getRun(id: string): WorkDiscoveryRun | null {\n return getWorkDiscoveryRun(id);\n }\n\n async startRun(input: {\n rootPath: string;\n source: WorkDiscoverySource;\n idempotencyKey: string;\n }): Promise<WorkDiscoveryRun> {\n const existing = getWorkDiscoveryRunByIdempotencyKey(input.idempotencyKey);\n if (existing) return existing;\n const config = this.options.getConfig();\n const modelRef = getAgentDefaultModelRef(config);\n if (!modelRef) throw new Error('No default model configured');\n\n const preview = await previewWorkDiscoveryRoot(input.rootPath);\n const rootPath = preview.canonicalRootPath;\n const agentId = getDefaultAgentId(config);\n const match = this.options.projects.resolveOrCreateForWorkspacePath({\n workspacePath: rootPath,\n defaultAgentId: agentId,\n autoCreate: true,\n });\n if (!match) throw new Error('Selected folder cannot be used as a project workspace');\n const projectAgentId = match.project.defaultAgentId || agentId;\n const peerId = `work-discovery-${randomUUID()}`;\n const sessionKey = buildSessionKey({\n agentId: projectAgentId,\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId,\n });\n await this.options.sessions.saveMessages(sessionKey, [], {\n metadata: sessionMetadata(projectAgentId, peerId),\n });\n this.options.projects.attachSession(sessionKey, match.project.id);\n const now = Date.now();\n const run = createWorkDiscoveryRun({\n id: randomUUID(),\n idempotencyKey: input.idempotencyKey,\n source: input.source,\n status: 'queued',\n rootPath,\n projectId: match.project.id,\n sessionKey,\n agentId: projectAgentId,\n modelRef,\n scanPolicyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION,\n createdAt: now,\n });\n await this.options.sessions.appendTranscriptContextEntry(sessionKey, {\n text: 'Work discovery was explicitly requested for the selected folder.',\n data: {\n type: 'work_discovery',\n runId: run.id,\n rootPath,\n scanPolicyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION,\n source: input.source,\n },\n });\n if (input.source === 'onboarding_selected_directory') {\n setWorkDiscoveryOnboardingState({ status: 'in_progress', activeRunId: run.id });\n }\n this.activity.record({\n type: 'work_discovery.started',\n primaryObject: { kind: 'project', id: match.project.id, title: match.project.name },\n actor: { kind: 'system' },\n initiator: { kind: 'user', sessionKey },\n source: { kind: 'gateway_api', runId: run.id },\n visibility: 'audit',\n payload: { policyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION, source: input.source },\n scopes: [\n { scopeKind: 'project', scopeId: match.project.id, reason: 'object_owner' },\n { scopeKind: 'session', scopeId: sessionKey, reason: 'runtime_context' },\n ],\n });\n const controller = new AbortController();\n this.abortControllers.set(run.id, controller);\n void this.execute(run, controller.signal);\n return run;\n }\n\n private publish(run: WorkDiscoveryRun): void {\n const suffix = run.status === 'completed'\n ? 'completed'\n : run.status === 'failed'\n ? 'failed'\n : run.status === 'canceled'\n ? 'canceled'\n : 'progress';\n this.options.emit(`work-discovery.${suffix}`, {\n runId: run.id,\n projectId: run.projectId,\n sessionKey: run.sessionKey,\n status: run.status,\n stage: run.stage,\n ...(run.status === 'completed' ? { result: run.result } : {}),\n });\n }\n\n private async execute(run: WorkDiscoveryRun, signal: AbortSignal): Promise<void> {\n const startedAt = Date.now();\n try {\n let current = updateWorkDiscoveryRun(run.id, {\n status: 'probing',\n stage: 'folder_structure',\n startedAt,\n })!;\n this.publish(current);\n const snapshot = await probeWorkDiscoveryRoot(run.rootPath, signal);\n if (signal.aborted) throw new DOMException('Work discovery canceled', 'AbortError');\n current = updateWorkDiscoveryRun(run.id, {\n status: 'analyzing',\n stage: 'recent_progress',\n snapshot: summarizeWorkContextSnapshot(snapshot),\n })!;\n this.publish(current);\n const analysis = await analyzeWorkContext({ config: this.options.getConfig(), snapshot, signal });\n current = updateWorkDiscoveryRun(run.id, { status: 'analyzing', stage: 'next_steps' })!;\n this.publish(current);\n await this.options.sessions.appendTranscriptCustomMessageEntry(run.sessionKey, {\n customType: 'work-discovery-result',\n content: workDiscoveryResultMarkdown(analysis.result),\n display: true,\n details: { runId: run.id, result: analysis.result },\n });\n const project = this.options.projects.get(run.projectId);\n await this.options.sessions.updateSessionMetadata(run.sessionKey, {\n name: project ? `Continue work on ${project.name}` : 'Continue recent work',\n hiddenFromSessionList: false,\n });\n current = updateWorkDiscoveryRun(run.id, {\n status: 'completed',\n stage: 'next_steps',\n result: analysis.result,\n completedAt: Date.now(),\n })!;\n if (run.source === 'onboarding_selected_directory') {\n setWorkDiscoveryOnboardingState({ status: 'completed', activeRunId: run.id });\n }\n this.activity.record({\n type: 'work_discovery.completed',\n primaryObject: { kind: 'project', id: run.projectId, title: project?.name },\n actor: { kind: 'agent', agentId: run.agentId, sessionKey: run.sessionKey },\n initiator: { kind: 'user', sessionKey: run.sessionKey },\n source: { kind: 'system', runId: run.id },\n payload: {\n policyVersion: run.scanPolicyVersion,\n suggestionCount: analysis.result.suggestions.length,\n lowConfidence: analysis.result.lowConfidence === true,\n },\n scopes: [\n { scopeKind: 'project', scopeId: run.projectId, reason: 'object_owner' },\n { scopeKind: 'session', scopeId: run.sessionKey, reason: 'runtime_context' },\n ],\n });\n this.publish(current);\n this.options.emit('session.transcript_updated', { key: run.sessionKey });\n log.info({ runId: run.id, projectId: run.projectId, sessionKey: run.sessionKey, durationMs: Date.now() - startedAt }, 'Work discovery completed');\n } catch (error) {\n const canceled = signal.aborted || (error instanceof DOMException && error.name === 'AbortError');\n const code = canceled ? 'canceled' : errorCode(error);\n const message = canceled ? 'Analysis canceled' : error instanceof Error ? error.message : String(error);\n const current = updateWorkDiscoveryRun(run.id, {\n status: canceled ? 'canceled' : 'failed',\n errorCode: code,\n errorMessage: message,\n ...(canceled ? { canceledAt: Date.now() } : { completedAt: Date.now() }),\n });\n if (current) this.publish(current);\n this.activity.record({\n type: canceled ? 'work_discovery.canceled' : 'work_discovery.failed',\n primaryObject: { kind: 'project', id: run.projectId },\n actor: { kind: 'system' },\n initiator: { kind: 'user', sessionKey: run.sessionKey },\n source: { kind: 'system', runId: run.id },\n visibility: 'audit',\n payload: { errorCode: code },\n scopes: [\n { scopeKind: 'project', scopeId: run.projectId, reason: 'object_owner' },\n { scopeKind: 'session', scopeId: run.sessionKey, reason: 'runtime_context' },\n ],\n });\n log.warn({ err: error, runId: run.id, projectId: run.projectId, phase: 'analysis', errorCode: code }, `Work discovery failed: ${message}`);\n } finally {\n this.abortControllers.delete(run.id);\n }\n }\n\n cancelRun(id: string): WorkDiscoveryRun | null {\n const run = getWorkDiscoveryRun(id);\n if (!run) return null;\n if (run.status === 'completed' || run.status === 'failed' || run.status === 'canceled') return run;\n this.abortControllers.get(id)?.abort();\n return updateWorkDiscoveryRun(id, {\n status: 'canceled',\n errorCode: 'canceled',\n errorMessage: 'Analysis canceled',\n canceledAt: Date.now(),\n });\n }\n\n retryRun(id: string): WorkDiscoveryRun | null {\n const run = getWorkDiscoveryRun(id);\n if (!run) return null;\n if (run.status !== 'failed' && run.status !== 'canceled') return run;\n const queued = updateWorkDiscoveryRun(id, {\n status: 'queued',\n stage: 'folder_structure',\n errorCode: undefined,\n errorMessage: undefined,\n completedAt: undefined,\n canceledAt: undefined,\n });\n if (!queued) return null;\n const controller = new AbortController();\n this.abortControllers.set(id, controller);\n if (run.source === 'onboarding_selected_directory') {\n setWorkDiscoveryOnboardingState({ status: 'in_progress', activeRunId: id });\n }\n this.publish(queued);\n void this.execute(queued, controller.signal);\n return queued;\n }\n\n selectSuggestion(runId: string, suggestionId: string): WorkDiscoveryRun | null {\n const run = getWorkDiscoveryRun(runId);\n const suggestion = run?.result?.suggestions.find((item) => item.id === suggestionId);\n if (!run || !suggestion) return null;\n this.activity.record({\n type: 'work_discovery.suggestion_selected',\n primaryObject: { kind: 'project', id: run.projectId },\n actor: { kind: 'user', sessionKey: run.sessionKey },\n source: { kind: 'gateway_api', runId },\n payload: { suggestionId, title: suggestion.title },\n scopes: [\n { scopeKind: 'project', scopeId: run.projectId, reason: 'object_owner' },\n { scopeKind: 'session', scopeId: run.sessionKey, reason: 'runtime_context' },\n ],\n });\n return run;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ export type WorkDiscoveryOnboardingStatus = 'not_started' | 'in_progress' | 'completed' | 'dismissed';
2
+ export interface WorkDiscoveryOnboardingState {
3
+ status: WorkDiscoveryOnboardingStatus;
4
+ activeRunId?: string;
5
+ completedAt?: number;
6
+ dismissedAt?: number;
7
+ updatedAt: number;
8
+ }
9
+ export type WorkDiscoveryRunStatus = 'queued' | 'probing' | 'analyzing' | 'completed' | 'failed' | 'canceled';
10
+ export type WorkDiscoveryStage = 'folder_structure' | 'recent_progress' | 'next_steps';
11
+ export type WorkDiscoverySource = 'onboarding_selected_directory' | 'manual_selected_directory';
12
+ export type WorkDiscoveryErrorCode = 'folder_unavailable' | 'folder_not_readable' | 'nothing_useful_found' | 'model_unavailable' | 'analysis_invalid' | 'analysis_timeout' | 'canceled' | 'internal_error';
13
+ export interface WorkDiscoveryEvidence {
14
+ path?: string;
15
+ observation: string;
16
+ }
17
+ export interface WorkDiscoverySuggestion {
18
+ id: string;
19
+ title: string;
20
+ rationale: string;
21
+ evidence: WorkDiscoveryEvidence[];
22
+ actionPrompt: string;
23
+ confidence: 'high' | 'medium' | 'low';
24
+ }
25
+ export interface WorkDiscoveryResult {
26
+ projectSummary: string;
27
+ currentState: string;
28
+ uncertainties: string[];
29
+ suggestions: WorkDiscoverySuggestion[];
30
+ lowConfidence?: boolean;
31
+ contextQuestion?: string;
32
+ }
33
+ export interface WorkContextDocument {
34
+ relativePath: string;
35
+ modifiedAt?: number;
36
+ excerpt: string;
37
+ truncated: boolean;
38
+ selectionReason: string;
39
+ }
40
+ export interface WorkContextMetadataFile {
41
+ relativePath: string;
42
+ modifiedAt?: number;
43
+ size: number;
44
+ kind: 'document' | 'pdf' | 'image';
45
+ }
46
+ export interface WorkContextSnapshot {
47
+ root: {
48
+ displayName: string;
49
+ projectKind: 'coding' | 'general' | 'unknown';
50
+ markerReasons: string[];
51
+ };
52
+ structure: {
53
+ sampledPaths: string[];
54
+ metadataOnlyFiles: WorkContextMetadataFile[];
55
+ omittedPathCount: number;
56
+ };
57
+ git?: {
58
+ branch?: string;
59
+ changedPaths: string[];
60
+ recentCommits: Array<{
61
+ subject: string;
62
+ committedAt?: number;
63
+ }>;
64
+ };
65
+ documents: WorkContextDocument[];
66
+ limits: {
67
+ policyVersion: number;
68
+ fileCount: number;
69
+ contentBytes: number;
70
+ truncated: boolean;
71
+ };
72
+ }
73
+ export interface WorkContextSnapshotSummary {
74
+ projectKind: 'coding' | 'general' | 'unknown';
75
+ sampledPathCount: number;
76
+ omittedPathCount: number;
77
+ documentCount: number;
78
+ contentBytes: number;
79
+ changedPathCount: number;
80
+ truncated: boolean;
81
+ }
82
+ export interface WorkDiscoveryRun {
83
+ id: string;
84
+ idempotencyKey: string;
85
+ source: WorkDiscoverySource;
86
+ status: WorkDiscoveryRunStatus;
87
+ stage?: WorkDiscoveryStage;
88
+ rootPath: string;
89
+ projectId: string;
90
+ sessionKey: string;
91
+ agentId: string;
92
+ modelRef: string;
93
+ scanPolicyVersion: number;
94
+ snapshot?: WorkContextSnapshotSummary;
95
+ result?: WorkDiscoveryResult;
96
+ errorCode?: WorkDiscoveryErrorCode;
97
+ errorMessage?: string;
98
+ createdAt: number;
99
+ startedAt?: number;
100
+ completedAt?: number;
101
+ canceledAt?: number;
102
+ }
103
+ export interface WorkDiscoveryPreview {
104
+ canonicalRootPath: string;
105
+ displayName: string;
106
+ exists: boolean;
107
+ readable: boolean;
108
+ projectKind: 'coding' | 'general' | 'unknown';
109
+ projectKindConfidence: number;
110
+ markerReasons: string[];
111
+ provider: string;
112
+ remoteModel: boolean;
113
+ policyVersion: number;
114
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -165,7 +165,7 @@ var WorkflowSessionBridge = class {
165
165
  id: `workflow-run:${view.run.id}`,
166
166
  providerId: "workflow-run",
167
167
  kind: "task_lesson",
168
- agentId,
168
+ sourceAgentId: agentId,
169
169
  workspaceId: this.gateway.currentWorkspacePath,
170
170
  sessionKey,
171
171
  projectId,
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-session-bridge.js","names":[],"sources":["../../../../src/workflows/service/workflow-session-bridge.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { renderWorkflowText } from '../../agent/workflow/snapshot.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { SessionStatus } from '../../session/types.js';\nimport { upsertMemoryRecord } from '../../storage/sqlite/index.js';\nimport type { WorkflowRunView } from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { GoalWorkflowJudge } from '../../goals/index.js';\nimport { WorkItemWorkflowJudge } from '../../work-items/index.js';\n\nimport { runViewToSnapshot } from './run-view-to-snapshot.js';\nimport { buildWorkflowRunSessionKey } from './workflow-session-key.js';\n\nexport const WORKFLOW_SESSION_TYPE = 'workflow-run';\nexport const WORKFLOW_RUN_LINK_CONTEXT_KIND = 'workflow-run-link';\n\nexport interface PrepareWorkflowRunSessionParams {\n runId: string;\n agentId: string;\n definitionId: string;\n definitionTitle: string;\n goal: string;\n parentSessionKey?: string;\n projectId?: string;\n}\n\nexport interface PrepareWorkflowRunSessionResult {\n sessionKey: string;\n}\n\nexport class WorkflowSessionBridge {\n private readonly terminalPersistedRunIds = new Set<string>();\n\n constructor(private readonly gateway: GatewayWorkflowHost) {}\n\n async prepareRunSession(params: PrepareWorkflowRunSessionParams): Promise<PrepareWorkflowRunSessionResult> {\n const sessionKey = buildWorkflowRunSessionKey(params.agentId, params.runId);\n const goalText = formatWorkflowGoalUserMessage(params.definitionId, params.goal);\n const sessionName = truncateSessionName(params.goal.trim() || params.definitionTitle || params.definitionId);\n\n const store = this.gateway.sessionIndexInstance.getStore();\n const projectId =\n params.projectId?.trim() ||\n (params.parentSessionKey?.trim()\n ? (await store.getMetadata(params.parentSessionKey.trim()))?.projectId\n : undefined);\n await store.resolveTranscriptPath(sessionKey, {\n metadata: {\n sessionType: WORKFLOW_SESSION_TYPE,\n projectId,\n hiddenFromSessionList: true,\n sourceChannel: 'workflow',\n sourceChatId: params.runId,\n routing: {\n agentId: params.agentId,\n source: 'workflow',\n accountId: 'default',\n peerKind: 'run',\n peerId: params.runId,\n },\n },\n });\n await store.updateMetadata(sessionKey, {\n sessionType: WORKFLOW_SESSION_TYPE,\n hiddenFromSessionList: true,\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n projectId,\n name: sessionName,\n tags: ['workflow', params.definitionId],\n customData: {\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n workflowGoal: params.goal,\n ...(params.parentSessionKey ? { parentSessionKey: params.parentSessionKey } : {}),\n },\n });\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'user',\n content: [{ type: 'text', text: goalText }],\n timestamp: Date.now(),\n });\n\n if (params.parentSessionKey?.trim()) {\n await this.writeParentRunLink({\n parentSessionKey: params.parentSessionKey.trim(),\n runId: params.runId,\n ownerAgentId: params.agentId,\n workflowSessionKey: sessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: 'running',\n });\n }\n\n this.gateway.emit('session.updated', { key: sessionKey, name: sessionName });\n return { sessionKey };\n }\n\n async handleRunViewUpdated(view: WorkflowRunView): Promise<void> {\n const runId = view.run.id;\n const sessionKey = view.run.metadata?.sessionKey?.trim();\n if (!sessionKey || !isTerminalWorkflowRunStatus(view.run.status)) {\n return;\n }\n if (this.terminalPersistedRunIds.has(runId)) {\n return;\n }\n this.terminalPersistedRunIds.add(runId);\n\n await this.persistTerminalTranscript(sessionKey, view);\n\n const parentSessionKey = readParentSessionKey(view);\n if (parentSessionKey) {\n await this.writeParentRunLink({\n parentSessionKey,\n runId,\n ownerAgentId: view.run.metadata?.agentId ?? '',\n workflowSessionKey: sessionKey,\n definitionId: view.run.definitionId,\n goal: view.run.goal,\n status: view.run.status,\n });\n }\n new WorkItemWorkflowJudge().handleTerminalWorkflowRun({ view });\n this.recordProjectWorkflowMemory(sessionKey, view);\n await new GoalWorkflowJudge().handleTerminalWorkflowRun({\n config: this.gateway.currentConfig,\n view,\n sessionKey,\n });\n }\n\n private async persistTerminalTranscript(sessionKey: string, view: WorkflowRunView): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const snapshot = runViewToSnapshot(view);\n const toolCallId = randomUUID();\n const completed = view.run.status === 'succeeded';\n const resultText = renderWorkflowText(snapshot, completed, { showResultPreviews: true });\n const envelope = {\n content: [{ type: 'text', text: resultText }],\n details: snapshot,\n };\n const isError = view.run.status === 'failed' || view.run.status === 'timeout';\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'assistant',\n content: [\n {\n type: 'toolCall',\n id: toolCallId,\n name: 'workflow',\n arguments: { name: view.run.definitionId },\n },\n ],\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'toolResult',\n toolCallId,\n content: [{ type: 'text', text: JSON.stringify(envelope) }],\n details: snapshot,\n isError,\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.updateMetadata(sessionKey, {\n status: SessionStatus.ACTIVE,\n });\n }\n\n private async writeParentRunLink(params: {\n parentSessionKey: string;\n runId: string;\n ownerAgentId?: string;\n workflowSessionKey: string;\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n }): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const text = formatParentRunLinkText(params);\n await store.appendTranscriptContextEntry(params.parentSessionKey, {\n kind: 'context',\n id: `workflow-run-link:${params.runId}`,\n text,\n data: {\n kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,\n runId: params.runId,\n ...(params.ownerAgentId ? { ownerAgentId: params.ownerAgentId } : {}),\n workflowSessionKey: params.workflowSessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: params.status,\n },\n createdAt: new Date().toISOString(),\n });\n }\n\n private recordProjectWorkflowMemory(sessionKey: string, view: WorkflowRunView): void {\n const projectId = view.run.metadata?.projectId?.trim();\n const agentId = view.run.metadata?.agentId?.trim();\n if (!projectId || !agentId) return;\n\n const summary = view.run.result?.summary?.trim();\n const resultText = summary || renderWorkflowText(\n runViewToSnapshot(view),\n view.run.status === 'succeeded',\n { showResultPreviews: true },\n );\n upsertMemoryRecord({\n id: `workflow-run:${view.run.id}`,\n providerId: 'workflow-run',\n kind: 'task_lesson',\n agentId,\n workspaceId: this.gateway.currentWorkspacePath,\n sessionKey,\n projectId,\n content: [\n `Workflow ${view.run.definitionId} finished with status ${view.run.status}.`,\n view.run.goal ? `Goal: ${view.run.goal}` : undefined,\n compactMemoryLine(resultText),\n ].filter((line): line is string => Boolean(line)).join('\\n'),\n source: { provider: 'workflow-run' },\n confidence: view.run.status === 'succeeded' ? 0.7 : 0.82,\n tags: ['project', 'workflow', view.run.definitionId, view.run.status],\n status: view.run.status === 'succeeded' ? 'active' : 'needs_review',\n sensitivity: 'normal',\n evidence: [{\n sessionKey,\n sourceText: `workflow:${view.run.id}`,\n }],\n });\n }\n}\n\nfunction compactMemoryLine(text: string): string {\n const compact = text.trim().replace(/\\s+/g, ' ');\n if (compact.length <= 1200) return compact;\n return `${compact.slice(0, 1197)}...`;\n}\n\nfunction formatWorkflowGoalUserMessage(definitionId: string, goal: string): string {\n const trimmedGoal = goal.trim();\n if (trimmedGoal) {\n return `Run workflow \\`${definitionId}\\`:\\n\\n${trimmedGoal}`;\n }\n return `Run workflow \\`${definitionId}\\``;\n}\n\nfunction truncateSessionName(name: string): string {\n const trimmed = name.trim();\n if (trimmed.length <= 80) return trimmed;\n return `${trimmed.slice(0, 77)}…`;\n}\n\nfunction readParentSessionKey(view: WorkflowRunView): string | null {\n if (view.run.source.kind === 'chat') {\n const originKey = view.run.source.sessionKey?.trim();\n if (originKey) return originKey;\n }\n const customParent = view.run.metadata?.origin?.sessionKey?.trim();\n if (customParent && view.run.metadata?.triggerSource === 'chat') {\n return customParent;\n }\n return null;\n}\n\nexport function formatParentRunLinkText(params: {\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n}): string {\n const label = params.goal.trim() || params.definitionId;\n if (params.status === 'running' || params.status === 'queued') {\n return `Workflow \\`${params.definitionId}\\` is running: ${label}`;\n }\n if (params.status === 'succeeded') {\n return `Workflow \\`${params.definitionId}\\` completed: ${label}`;\n }\n return `Workflow \\`${params.definitionId}\\` finished (${params.status}): ${label}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-session-bridge.js","names":[],"sources":["../../../../src/workflows/service/workflow-session-bridge.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { renderWorkflowText } from '../../agent/workflow/snapshot.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { SessionStatus } from '../../session/types.js';\nimport { upsertMemoryRecord } from '../../storage/sqlite/index.js';\nimport type { WorkflowRunView } from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { GoalWorkflowJudge } from '../../goals/index.js';\nimport { WorkItemWorkflowJudge } from '../../work-items/index.js';\n\nimport { runViewToSnapshot } from './run-view-to-snapshot.js';\nimport { buildWorkflowRunSessionKey } from './workflow-session-key.js';\n\nexport const WORKFLOW_SESSION_TYPE = 'workflow-run';\nexport const WORKFLOW_RUN_LINK_CONTEXT_KIND = 'workflow-run-link';\n\nexport interface PrepareWorkflowRunSessionParams {\n runId: string;\n agentId: string;\n definitionId: string;\n definitionTitle: string;\n goal: string;\n parentSessionKey?: string;\n projectId?: string;\n}\n\nexport interface PrepareWorkflowRunSessionResult {\n sessionKey: string;\n}\n\nexport class WorkflowSessionBridge {\n private readonly terminalPersistedRunIds = new Set<string>();\n\n constructor(private readonly gateway: GatewayWorkflowHost) {}\n\n async prepareRunSession(params: PrepareWorkflowRunSessionParams): Promise<PrepareWorkflowRunSessionResult> {\n const sessionKey = buildWorkflowRunSessionKey(params.agentId, params.runId);\n const goalText = formatWorkflowGoalUserMessage(params.definitionId, params.goal);\n const sessionName = truncateSessionName(params.goal.trim() || params.definitionTitle || params.definitionId);\n\n const store = this.gateway.sessionIndexInstance.getStore();\n const projectId =\n params.projectId?.trim() ||\n (params.parentSessionKey?.trim()\n ? (await store.getMetadata(params.parentSessionKey.trim()))?.projectId\n : undefined);\n await store.resolveTranscriptPath(sessionKey, {\n metadata: {\n sessionType: WORKFLOW_SESSION_TYPE,\n projectId,\n hiddenFromSessionList: true,\n sourceChannel: 'workflow',\n sourceChatId: params.runId,\n routing: {\n agentId: params.agentId,\n source: 'workflow',\n accountId: 'default',\n peerKind: 'run',\n peerId: params.runId,\n },\n },\n });\n await store.updateMetadata(sessionKey, {\n sessionType: WORKFLOW_SESSION_TYPE,\n hiddenFromSessionList: true,\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n projectId,\n name: sessionName,\n tags: ['workflow', params.definitionId],\n customData: {\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n workflowGoal: params.goal,\n ...(params.parentSessionKey ? { parentSessionKey: params.parentSessionKey } : {}),\n },\n });\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'user',\n content: [{ type: 'text', text: goalText }],\n timestamp: Date.now(),\n });\n\n if (params.parentSessionKey?.trim()) {\n await this.writeParentRunLink({\n parentSessionKey: params.parentSessionKey.trim(),\n runId: params.runId,\n ownerAgentId: params.agentId,\n workflowSessionKey: sessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: 'running',\n });\n }\n\n this.gateway.emit('session.updated', { key: sessionKey, name: sessionName });\n return { sessionKey };\n }\n\n async handleRunViewUpdated(view: WorkflowRunView): Promise<void> {\n const runId = view.run.id;\n const sessionKey = view.run.metadata?.sessionKey?.trim();\n if (!sessionKey || !isTerminalWorkflowRunStatus(view.run.status)) {\n return;\n }\n if (this.terminalPersistedRunIds.has(runId)) {\n return;\n }\n this.terminalPersistedRunIds.add(runId);\n\n await this.persistTerminalTranscript(sessionKey, view);\n\n const parentSessionKey = readParentSessionKey(view);\n if (parentSessionKey) {\n await this.writeParentRunLink({\n parentSessionKey,\n runId,\n ownerAgentId: view.run.metadata?.agentId ?? '',\n workflowSessionKey: sessionKey,\n definitionId: view.run.definitionId,\n goal: view.run.goal,\n status: view.run.status,\n });\n }\n new WorkItemWorkflowJudge().handleTerminalWorkflowRun({ view });\n this.recordProjectWorkflowMemory(sessionKey, view);\n await new GoalWorkflowJudge().handleTerminalWorkflowRun({\n config: this.gateway.currentConfig,\n view,\n sessionKey,\n });\n }\n\n private async persistTerminalTranscript(sessionKey: string, view: WorkflowRunView): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const snapshot = runViewToSnapshot(view);\n const toolCallId = randomUUID();\n const completed = view.run.status === 'succeeded';\n const resultText = renderWorkflowText(snapshot, completed, { showResultPreviews: true });\n const envelope = {\n content: [{ type: 'text', text: resultText }],\n details: snapshot,\n };\n const isError = view.run.status === 'failed' || view.run.status === 'timeout';\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'assistant',\n content: [\n {\n type: 'toolCall',\n id: toolCallId,\n name: 'workflow',\n arguments: { name: view.run.definitionId },\n },\n ],\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'toolResult',\n toolCallId,\n content: [{ type: 'text', text: JSON.stringify(envelope) }],\n details: snapshot,\n isError,\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.updateMetadata(sessionKey, {\n status: SessionStatus.ACTIVE,\n });\n }\n\n private async writeParentRunLink(params: {\n parentSessionKey: string;\n runId: string;\n ownerAgentId?: string;\n workflowSessionKey: string;\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n }): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const text = formatParentRunLinkText(params);\n await store.appendTranscriptContextEntry(params.parentSessionKey, {\n kind: 'context',\n id: `workflow-run-link:${params.runId}`,\n text,\n data: {\n kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,\n runId: params.runId,\n ...(params.ownerAgentId ? { ownerAgentId: params.ownerAgentId } : {}),\n workflowSessionKey: params.workflowSessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: params.status,\n },\n createdAt: new Date().toISOString(),\n });\n }\n\n private recordProjectWorkflowMemory(sessionKey: string, view: WorkflowRunView): void {\n const projectId = view.run.metadata?.projectId?.trim();\n const agentId = view.run.metadata?.agentId?.trim();\n if (!projectId || !agentId) return;\n\n const summary = view.run.result?.summary?.trim();\n const resultText = summary || renderWorkflowText(\n runViewToSnapshot(view),\n view.run.status === 'succeeded',\n { showResultPreviews: true },\n );\n upsertMemoryRecord({\n id: `workflow-run:${view.run.id}`,\n providerId: 'workflow-run',\n kind: 'task_lesson',\n sourceAgentId: agentId,\n workspaceId: this.gateway.currentWorkspacePath,\n sessionKey,\n projectId,\n content: [\n `Workflow ${view.run.definitionId} finished with status ${view.run.status}.`,\n view.run.goal ? `Goal: ${view.run.goal}` : undefined,\n compactMemoryLine(resultText),\n ].filter((line): line is string => Boolean(line)).join('\\n'),\n source: { provider: 'workflow-run' },\n confidence: view.run.status === 'succeeded' ? 0.7 : 0.82,\n tags: ['project', 'workflow', view.run.definitionId, view.run.status],\n status: view.run.status === 'succeeded' ? 'active' : 'needs_review',\n sensitivity: 'normal',\n evidence: [{\n sessionKey,\n sourceText: `workflow:${view.run.id}`,\n }],\n });\n }\n}\n\nfunction compactMemoryLine(text: string): string {\n const compact = text.trim().replace(/\\s+/g, ' ');\n if (compact.length <= 1200) return compact;\n return `${compact.slice(0, 1197)}...`;\n}\n\nfunction formatWorkflowGoalUserMessage(definitionId: string, goal: string): string {\n const trimmedGoal = goal.trim();\n if (trimmedGoal) {\n return `Run workflow \\`${definitionId}\\`:\\n\\n${trimmedGoal}`;\n }\n return `Run workflow \\`${definitionId}\\``;\n}\n\nfunction truncateSessionName(name: string): string {\n const trimmed = name.trim();\n if (trimmed.length <= 80) return trimmed;\n return `${trimmed.slice(0, 77)}…`;\n}\n\nfunction readParentSessionKey(view: WorkflowRunView): string | null {\n if (view.run.source.kind === 'chat') {\n const originKey = view.run.source.sessionKey?.trim();\n if (originKey) return originKey;\n }\n const customParent = view.run.metadata?.origin?.sessionKey?.trim();\n if (customParent && view.run.metadata?.triggerSource === 'chat') {\n return customParent;\n }\n return null;\n}\n\nexport function formatParentRunLinkText(params: {\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n}): string {\n const label = params.goal.trim() || params.definitionId;\n if (params.status === 'running' || params.status === 'queued') {\n return `Workflow \\`${params.definitionId}\\` is running: ${label}`;\n }\n if (params.status === 'succeeded') {\n return `Workflow \\`${params.definitionId}\\` completed: ${label}`;\n }\n return `Workflow \\`${params.definitionId}\\` finished (${params.status}): ${label}`;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.145",
3
+ "version": "0.0.147",
4
4
  "description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -98,6 +98,7 @@
98
98
  "jsdom": "^29.1.1",
99
99
  "markdown-it": "^14.2.0",
100
100
  "node-edge-tts": "^1.2.10",
101
+ "onnxruntime-common": "1.21.0",
101
102
  "openai": "^6.39.1",
102
103
  "pino": "^10.3.1",
103
104
  "pino-pretty": "^13.1.3",
@@ -199,13 +200,14 @@
199
200
  "build:extensions-ui": "node scripts/build-extensions-ui.mjs",
200
201
  "pack:browser-ext": "pnpm -C packages/browser-ext run pack",
201
202
  "sync:browser-ext-version": "node scripts/sync-browser-ext-version.mjs",
202
- "electron:dev": "cross-env ELECTRON_ENTRY=out/main/index.js electron-vite dev",
203
+ "electron:native:build": "node scripts/build-voice-hotkey-helper.mjs",
204
+ "electron:dev": "pnpm run electron:native:build && cross-env ELECTRON_ENTRY=out/main/index.js electron-vite dev",
203
205
  "electron:vite:build": "cross-env ELECTRON_ENTRY=out/main/index.js electron-vite build",
204
206
  "electron:vite:build:package": "cross-env ELECTRON_ENTRY=out/main/index.js ELECTRON_VITE_SKIP_RENDERER=1 electron-vite build",
205
207
  "electron:package": "pnpm run assets:brand && node scripts/electron-builder.mjs",
206
208
  "electron:server:build": "node scripts/build-electron-server.mjs",
207
209
  "electron:extensions:build": "node scripts/build-electron-extensions.mjs",
208
- "electron:build:artifacts": "pnpm run electron:vite:build:package && pnpm run electron:server:build && pnpm run electron:extensions:build",
210
+ "electron:build:artifacts": "pnpm run electron:native:build && pnpm run electron:vite:build:package && pnpm run electron:server:build && pnpm run electron:extensions:build",
209
211
  "electron:frpc:download": "node --import tsx/esm scripts/download-frpc-binaries.mjs",
210
212
  "electron:frpc:download:all": "node --import tsx/esm scripts/download-frpc-binaries.mjs --all",
211
213
  "electron:build": "pnpm run generate:bundled && pnpm run build:node && pnpm run build:web && pnpm run electron:build:artifacts && pnpm run electron:package",