@xopcai/xopc 0.0.141 → 0.0.143

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 (605) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BRTCpm3t.js → agent-avatar-dicebear-DiME9u_P.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DzBXhZXO.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DaMMZBAT.js → app-management-settings-panel-Cuo7SbUP.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-BXHThPyM.js → appearance-settings-DUfdNQqk.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CKuKK5AU.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-izB-4N4L.js → archive-plugin-B-Qk6cGr.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CJihXa5y.js → attachment-load-Di6EEbQX.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DGxvRxtO.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-D-FF_WKV.js +4 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-D3VUeG8s.js → binary-plugins-ZaOZDH2I.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-KnA0sLI3.js → block-editor-BTFhjWfg.js} +36 -36
  16. package/dist/gateway/static/root/assets/browser-settings-page-BvKLdEQt.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-D8rRNhc6.js → capability-presets-api-BU-pVZiZ.js} +1 -1
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DgyeEwzh.js +2 -0
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-BWgqwC5h.js → channel-recipient-api-DuulnhIj.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-BbVsdD_I.js +1 -0
  21. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
  22. package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
  23. package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
  24. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
  25. package/dist/gateway/static/root/assets/connectors-page-B8QqVy3I.js +2 -0
  26. package/dist/gateway/static/root/assets/{desktop-pet-CzdqX001.js → desktop-pet---yzVxVR.js} +1 -1
  27. package/dist/gateway/static/root/assets/desktop-pet-settings-Dc3gqBJE.js +1 -0
  28. package/dist/gateway/static/root/assets/{directory-picker-path-field-PzlO5tSM.js → directory-picker-path-field-DCmOGLtK.js} +1 -1
  29. package/dist/gateway/static/root/assets/dreaming-settings-BgT5KZVe.js +3 -0
  30. package/dist/gateway/static/root/assets/{extension-debug-page-DcW8Ie3r.js → extension-debug-page-ByaKTTq4.js} +1 -1
  31. package/dist/gateway/static/root/assets/extension-page-BmRzHAZr.js +1 -0
  32. package/dist/gateway/static/root/assets/extension-settings-page-JUtwIhbF.js +1 -0
  33. package/dist/gateway/static/root/assets/{fetch-06q5eCMA.js → fetch-8QNN25Sh.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-4VXUJtLz.js → gateway-config-api-CxicF50_.js} +1 -1
  35. package/dist/gateway/static/root/assets/gateway-settings-Bz2I_EO5.js +1 -0
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-2f7_vsv7.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
  37. package/dist/gateway/static/root/assets/goal-create-dialog-VcoyuZGN.js +1 -0
  38. package/dist/gateway/static/root/assets/goal-detail-page-Cilkap2G.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-BpuQTufF.js → goals-config-api-CwcHRdC0.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-C6eoni4z.js +2 -0
  41. package/dist/gateway/static/root/assets/goals-settings-o4i-qAOS.js +1 -0
  42. package/dist/gateway/static/root/assets/heartbeat-settings-DQQkETX8.js +1 -0
  43. package/dist/gateway/static/root/assets/index-BKRqeRHm.js +257 -0
  44. package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
  45. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-LT6qB-ua.js +1 -0
  46. package/dist/gateway/static/root/assets/logs-page-Dli2e3fS.js +7 -0
  47. package/dist/gateway/static/root/assets/{markdown-split-zS4KLNAf.js → markdown-split-Dw-yE2-y.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-_BgNJ9_7.js → media-plugins-D9NNNUgE.js} +1 -1
  49. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
  50. package/dist/gateway/static/root/assets/models-hub-panel-DVn2Q1Ik.js +2 -0
  51. package/dist/gateway/static/root/assets/notes-page-CRgbJGgk.js +1 -0
  52. package/dist/gateway/static/root/assets/notes-workbench-BxZRHLWx.js +2 -0
  53. package/dist/gateway/static/root/assets/{page-tabs-B7sGQkgU.js → page-tabs-D4hkWVt_.js} +1 -1
  54. package/dist/gateway/static/root/assets/{preview-open-alternatives-D1ri4s_O.js → preview-open-alternatives-CIckv0uy.js} +1 -1
  55. package/dist/gateway/static/root/assets/project-detail-page-Doz53xLn.js +1 -0
  56. package/dist/gateway/static/root/assets/projects-page-DoMtcRLg.js +1 -0
  57. package/dist/gateway/static/root/assets/remote-access-hub-BeHVEgrm.js +1 -0
  58. package/dist/gateway/static/root/assets/{save-bar-controls-BClrOinh.js → save-bar-controls-B0b42kB2.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schedule-field-CL7YTwLV.js → schedule-field-BtjEkczK.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schema-form-ww4PiIje.js → schema-form-Bf0bk3i6.js} +1 -1
  61. package/dist/gateway/static/root/assets/sessions-page-Bk4bQsBe.js +1 -0
  62. package/dist/gateway/static/root/assets/settings-advanced-gate-DdFyaRMm.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-collapsible-section-D9gEEVm2.js → settings-collapsible-section-BTKTdTNX.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-form-section-DGeEoBkb.js → settings-form-section-DL4P0sAj.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BXUeMR37.js → settings-loading-skeleton-BV6KFNj4.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-page-B_4DsX5W.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-page-layout-CEepfbCa.js → settings-page-layout-CyGlrInB.js} +1 -1
  68. package/dist/gateway/static/root/assets/setup-status-panel-DJ1_MLgX.js +1 -0
  69. package/dist/gateway/static/root/assets/share-preview-page-BQBV7YrV.js +2 -0
  70. package/dist/gateway/static/root/assets/shares-settings-0VuFLBeU.js +1 -0
  71. package/dist/gateway/static/root/assets/skill-reload-api-DO87Ckeo.js +1 -0
  72. package/dist/gateway/static/root/assets/skills-page-D3VdtxAn.js +2 -0
  73. package/dist/gateway/static/root/assets/{system-settings-panel-W6MBJXrr.js → system-settings-panel-D85fBBuI.js} +1 -1
  74. package/dist/gateway/static/root/assets/{typed-models-lib-BkODXN7T.js → typed-models-lib-CwEuYrHX.js} +1 -1
  75. package/dist/gateway/static/root/assets/{use-channel-catalog-CTbwLZXc.js → use-channel-catalog-COXIfXcl.js} +1 -1
  76. package/dist/gateway/static/root/assets/user-context-page-m9JVQ73F.js +1 -0
  77. package/dist/gateway/static/root/assets/user-profile-fields-editor-DtQiuY7E.js +1 -0
  78. package/dist/gateway/static/root/assets/user-profile-settings-panel-CWM0fEpb.js +1 -0
  79. package/dist/gateway/static/root/assets/{utils-ZxrKHxyb.js → utils--BO6xT3u.js} +1 -1
  80. package/dist/gateway/static/root/assets/voice-api-key-field-LoT3wgZ9.js +1 -0
  81. package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
  82. package/dist/gateway/static/root/assets/work-item-detail-page-DSTMz_mO.js +1 -0
  83. package/dist/gateway/static/root/assets/workflow-run-setup-panel-B35lJzvm.js +3 -0
  84. package/dist/gateway/static/root/assets/workflows-page-BfSm9oR8.js +11 -0
  85. package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
  86. package/dist/gateway/static/root/connector-icons/README.md +11 -0
  87. package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
  88. package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
  89. package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
  90. package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
  91. package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
  92. package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
  93. package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
  94. package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
  95. package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
  96. package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
  97. package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
  98. package/dist/gateway/static/root/connector-icons/github.svg +10 -0
  99. package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
  100. package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
  101. package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
  102. package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
  103. package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
  104. package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
  105. package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
  106. package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
  107. package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
  108. package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
  109. package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
  110. package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
  111. package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
  112. package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
  113. package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
  114. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
  115. package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
  116. package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
  117. package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
  118. package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
  119. package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
  120. package/dist/gateway/static/root/connector-icons/time.svg +6 -0
  121. package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
  122. package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
  123. package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
  124. package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
  125. package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
  126. package/dist/gateway/static/root/index.html +9 -6
  127. package/dist/package.js +1 -1
  128. package/dist/src/agent/agent-manager.d.ts +2 -0
  129. package/dist/src/agent/agent-manager.js +8 -0
  130. package/dist/src/agent/agent-manager.js.map +1 -1
  131. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  132. package/dist/src/agent/background-review/prompts.js +3 -2
  133. package/dist/src/agent/background-review/prompts.js.map +1 -1
  134. package/dist/src/agent/embedded/session-runner.js +5 -5
  135. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  136. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  137. package/dist/src/agent/embedded/xopc-auth-storage.d.ts +4 -3
  138. package/dist/src/agent/embedded/xopc-auth-storage.js +6 -6
  139. package/dist/src/agent/embedded/xopc-auth-storage.js.map +1 -1
  140. package/dist/src/agent/embedded/xopc-stream-bridge.js +1 -0
  141. package/dist/src/agent/embedded/xopc-stream-bridge.js.map +1 -1
  142. package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
  143. package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
  144. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  145. package/dist/src/agent/goals/checklist-judge.js +3 -3
  146. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  147. package/dist/src/agent/goals/judge.js +2 -2
  148. package/dist/src/agent/goals/judge.js.map +1 -1
  149. package/dist/src/agent/goals/post-turn.js +5 -4
  150. package/dist/src/agent/goals/post-turn.js.map +1 -1
  151. package/dist/src/agent/image/understanding/pi-ai-provider.js +2 -2
  152. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
  153. package/dist/src/agent/mcp/mcp-transport.js +4 -1
  154. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  155. package/dist/src/agent/memory/compaction.js +2 -2
  156. package/dist/src/agent/memory/compaction.js.map +1 -1
  157. package/dist/src/agent/memory/context/planner.d.ts +1 -0
  158. package/dist/src/agent/memory/context/planner.js +60 -14
  159. package/dist/src/agent/memory/context/planner.js.map +1 -1
  160. package/dist/src/agent/memory/context/types.d.ts +3 -1
  161. package/dist/src/agent/memory/lifecycle.d.ts +11 -0
  162. package/dist/src/agent/memory/lifecycle.js +50 -0
  163. package/dist/src/agent/memory/lifecycle.js.map +1 -0
  164. package/dist/src/agent/memory/source-origin.d.ts +3 -0
  165. package/dist/src/agent/memory/source-origin.js +19 -0
  166. package/dist/src/agent/memory/source-origin.js.map +1 -0
  167. package/dist/src/agent/memory/understanding/service.js +5 -0
  168. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  169. package/dist/src/agent/memory/user-context-coordinator.js +7 -2
  170. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  171. package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
  172. package/dist/src/agent/prompt/sections/behavior.js +30 -1
  173. package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
  174. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  175. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  176. package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
  177. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  178. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  179. package/dist/src/agent/prompt/system-prompt.js +6 -3
  180. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  181. package/dist/src/agent/service/btw-query.d.ts +4 -0
  182. package/dist/src/agent/service/btw-query.js +94 -13
  183. package/dist/src/agent/service/btw-query.js.map +1 -1
  184. package/dist/src/agent/service/process-direct-streaming.js +22 -0
  185. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  186. package/dist/src/agent/service.d.ts +2 -0
  187. package/dist/src/agent/service.js +9 -3
  188. package/dist/src/agent/service.js.map +1 -1
  189. package/dist/src/agent/session/session-inspector.js +9 -1
  190. package/dist/src/agent/session/session-inspector.js.map +1 -1
  191. package/dist/src/agent/starter-agents.js +1 -1
  192. package/dist/src/agent/starter-agents.js.map +1 -1
  193. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  194. package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
  195. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
  196. package/dist/src/agent/tools/composio-tool.d.ts +18 -5
  197. package/dist/src/agent/tools/composio-tool.js +252 -35
  198. package/dist/src/agent/tools/composio-tool.js.map +1 -1
  199. package/dist/src/agent/tools/factory.js +7 -3
  200. package/dist/src/agent/tools/factory.js.map +1 -1
  201. package/dist/src/agent/tools/index.d.ts +1 -1
  202. package/dist/src/agent/tools/index.js +2 -2
  203. package/dist/src/agent/tools/session-search-tool.js +2 -2
  204. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  205. package/dist/src/agent/tools/web-extract.js +2 -2
  206. package/dist/src/agent/tools/web-extract.js.map +1 -1
  207. package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
  208. package/dist/src/agent/tools/workflow-tool.js +3 -16
  209. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  210. package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
  211. package/dist/src/agent/workflow/builtins/index.js +226 -41
  212. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  213. package/dist/src/agent/workflow/catalog.d.ts +32 -34
  214. package/dist/src/agent/workflow/catalog.js +158 -154
  215. package/dist/src/agent/workflow/catalog.js.map +1 -1
  216. package/dist/src/agent/workflow/index.d.ts +4 -6
  217. package/dist/src/agent/workflow/index.js +2 -5
  218. package/dist/src/agent/workflow/snapshot.d.ts +2 -2
  219. package/dist/src/agent/workflow/snapshot.js +2 -2
  220. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  221. package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
  222. package/dist/src/agent/workflow/structured-output-tool.js +2 -2
  223. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
  224. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  225. package/dist/src/agent/workflow/types.d.ts +31 -26
  226. package/dist/src/agent-manifest/index.d.ts +1 -0
  227. package/dist/src/agent-manifest/index.js +3 -1
  228. package/dist/src/agent-manifest/index.js.map +1 -1
  229. package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
  230. package/dist/src/agent-manifest/preset-chain.js +32 -0
  231. package/dist/src/agent-manifest/preset-chain.js.map +1 -0
  232. package/dist/src/agent-manifest/resolver.js +3 -10
  233. package/dist/src/agent-manifest/resolver.js.map +1 -1
  234. package/dist/src/agent-manifest/schema.d.ts +4 -4
  235. package/dist/src/ai-assist/text-assist.d.ts +2 -1
  236. package/dist/src/ai-assist/text-assist.js +10 -23
  237. package/dist/src/ai-assist/text-assist.js.map +1 -1
  238. package/dist/src/auth/credentials.js +5 -2
  239. package/dist/src/auth/credentials.js.map +1 -1
  240. package/dist/src/auth/oauth/github-copilot.d.ts +3 -4
  241. package/dist/src/auth/oauth/github-copilot.js +66 -2
  242. package/dist/src/auth/oauth/github-copilot.js.map +1 -0
  243. package/dist/src/auth/oauth/index.js +2 -2
  244. package/dist/src/automations/api/routes.js +13 -1
  245. package/dist/src/automations/api/routes.js.map +1 -1
  246. package/dist/src/automations/domain/validation.d.ts +14 -14
  247. package/dist/src/automations/draft/automation-draft-service.js +3 -3
  248. package/dist/src/automations/draft/automation-draft-service.js.map +1 -1
  249. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  250. package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
  251. package/dist/src/browser/providers/browser-ext-install.js +39 -14
  252. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  253. package/dist/src/capabilities/store-connector.d.ts +0 -1
  254. package/dist/src/capabilities/store-connector.js +3 -5
  255. package/dist/src/capabilities/store-connector.js.map +1 -1
  256. package/dist/src/chat-commands/builtins/review.js +84 -68
  257. package/dist/src/chat-commands/builtins/review.js.map +1 -1
  258. package/dist/src/chat-commands/builtins/workflow.js +9 -54
  259. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  260. package/dist/src/chat-commands/types.d.ts +4 -0
  261. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  262. package/dist/src/cli/commands/extension-create.js +2 -2
  263. package/dist/src/cli/commands/extension-create.js.map +1 -1
  264. package/dist/src/cli/commands/extension-marketplace.js +42 -36
  265. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  266. package/dist/src/cli/commands/extension-pack.d.ts +6 -0
  267. package/dist/src/cli/commands/extension-pack.js +3 -2
  268. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  269. package/dist/src/commands/agents.config.d.ts +1 -0
  270. package/dist/src/commands/agents.config.js +1 -0
  271. package/dist/src/commands/agents.config.js.map +1 -1
  272. package/dist/src/config/schema.d.ts +6 -6
  273. package/dist/src/config/schema.js +6 -22
  274. package/dist/src/config/schema.js.map +1 -1
  275. package/dist/src/config/web-patch.d.ts +1 -1
  276. package/dist/src/connectors/approval.d.ts +2 -0
  277. package/dist/src/connectors/approval.js +33 -0
  278. package/dist/src/connectors/approval.js.map +1 -0
  279. package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
  280. package/dist/src/connectors/auth-provider-registry.js +17 -0
  281. package/dist/src/connectors/auth-provider-registry.js.map +1 -0
  282. package/dist/src/connectors/builtin-catalog.js +55 -116
  283. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  284. package/dist/src/connectors/catalog.js +7 -2
  285. package/dist/src/connectors/catalog.js.map +1 -1
  286. package/dist/src/connectors/composio-catalog.d.ts +19 -0
  287. package/dist/src/connectors/composio-catalog.js +237 -0
  288. package/dist/src/connectors/composio-catalog.js.map +1 -0
  289. package/dist/src/connectors/composio-logo.d.ts +1 -0
  290. package/dist/src/connectors/composio-logo.js +51 -0
  291. package/dist/src/connectors/composio-logo.js.map +1 -0
  292. package/dist/src/connectors/composio-sessions.d.ts +116 -0
  293. package/dist/src/connectors/composio-sessions.js +296 -0
  294. package/dist/src/connectors/composio-sessions.js.map +1 -0
  295. package/dist/src/connectors/composio-triggers.d.ts +17 -0
  296. package/dist/src/connectors/composio-triggers.js +48 -5
  297. package/dist/src/connectors/composio-triggers.js.map +1 -1
  298. package/dist/src/connectors/composio.d.ts +31 -2
  299. package/dist/src/connectors/composio.js +374 -151
  300. package/dist/src/connectors/composio.js.map +1 -1
  301. package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
  302. package/dist/src/connectors/connector-memory-sync.js +90 -0
  303. package/dist/src/connectors/connector-memory-sync.js.map +1 -0
  304. package/dist/src/connectors/install.js +35 -92
  305. package/dist/src/connectors/install.js.map +1 -1
  306. package/dist/src/connectors/instances.js +6 -2
  307. package/dist/src/connectors/instances.js.map +1 -1
  308. package/dist/src/connectors/integration-strategy.d.ts +3 -0
  309. package/dist/src/connectors/integration-strategy.js +29 -0
  310. package/dist/src/connectors/integration-strategy.js.map +1 -0
  311. package/dist/src/connectors/policy.d.ts +13 -0
  312. package/dist/src/connectors/policy.js +48 -0
  313. package/dist/src/connectors/policy.js.map +1 -0
  314. package/dist/src/connectors/providers.js +1 -1
  315. package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
  316. package/dist/src/connectors/runtime-adapter-registry.js +154 -0
  317. package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
  318. package/dist/src/connectors/types.d.ts +113 -4
  319. package/dist/src/connectors/workflow-preflight.d.ts +20 -0
  320. package/dist/src/connectors/workflow-preflight.js +70 -0
  321. package/dist/src/connectors/workflow-preflight.js.map +1 -0
  322. package/dist/src/extensions/install-transaction.d.ts +16 -0
  323. package/dist/src/extensions/install-transaction.js +76 -0
  324. package/dist/src/extensions/install-transaction.js.map +1 -0
  325. package/dist/src/extensions/install.d.ts +2 -0
  326. package/dist/src/extensions/install.js +23 -1
  327. package/dist/src/extensions/install.js.map +1 -1
  328. package/dist/src/gateway/agents-admin.d.ts +2 -0
  329. package/dist/src/gateway/agents-admin.js +7 -0
  330. package/dist/src/gateway/agents-admin.js.map +1 -1
  331. package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
  332. package/dist/src/gateway/capability-presets-admin.js +11 -4
  333. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  334. package/dist/src/gateway/chat-stream/mapper.js +17 -0
  335. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  336. package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
  337. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
  338. package/dist/src/gateway/hono/routes/agents.js +3 -0
  339. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  340. package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
  341. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  342. package/dist/src/gateway/hono/routes/connectors.js +188 -25
  343. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  344. package/dist/src/gateway/hono/routes/goals.js +22 -3
  345. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/home.d.ts +60 -1
  347. package/dist/src/gateway/hono/routes/home.js +244 -18
  348. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  349. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  350. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  351. package/dist/src/gateway/hono/routes/memory.js +14 -1
  352. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  353. package/dist/src/gateway/hono/routes/models.js +1 -0
  354. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  355. package/dist/src/gateway/hono/routes/projects.js +103 -2
  356. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  357. package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
  358. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  359. package/dist/src/gateway/hono/routes/voice.js +2 -2
  360. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/workflows.js +137 -22
  362. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/you.d.ts +23 -0
  364. package/dist/src/gateway/hono/routes/you.js +538 -0
  365. package/dist/src/gateway/hono/routes/you.js.map +1 -0
  366. package/dist/src/gateway/hono/sse.d.ts +2 -1
  367. package/dist/src/gateway/hono/sse.js +2 -1
  368. package/dist/src/gateway/hono/sse.js.map +1 -1
  369. package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
  370. package/dist/src/gateway/service/marketplace-service.js +96 -40
  371. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  372. package/dist/src/gateway/service.d.ts +2 -0
  373. package/dist/src/gateway/service.js +7 -1
  374. package/dist/src/gateway/service.js.map +1 -1
  375. package/dist/src/goals/goal-contract-draft.js +2 -2
  376. package/dist/src/goals/goal-contract-draft.js.map +1 -1
  377. package/dist/src/goals/goal-evidence-review.js +2 -2
  378. package/dist/src/goals/goal-evidence-review.js.map +1 -1
  379. package/dist/src/goals/goal-service.d.ts +7 -5
  380. package/dist/src/goals/goal-service.js +25 -13
  381. package/dist/src/goals/goal-service.js.map +1 -1
  382. package/dist/src/goals/goal-store.js +46 -7
  383. package/dist/src/goals/goal-store.js.map +1 -1
  384. package/dist/src/goals/types.d.ts +24 -0
  385. package/dist/src/notes/service.js +2 -2
  386. package/dist/src/notes/service.js.map +1 -1
  387. package/dist/src/providers/constants.d.ts +2 -0
  388. package/dist/src/providers/constants.js +11 -0
  389. package/dist/src/providers/constants.js.map +1 -0
  390. package/dist/src/providers/extension-stream-bridge.js +1 -0
  391. package/dist/src/providers/extension-stream-bridge.js.map +1 -1
  392. package/dist/src/providers/index.d.ts +3 -3
  393. package/dist/src/providers/index.js +5 -4
  394. package/dist/src/providers/index.js.map +1 -1
  395. package/dist/src/providers/model-call.d.ts +17 -0
  396. package/dist/src/providers/model-call.js +60 -0
  397. package/dist/src/providers/model-call.js.map +1 -0
  398. package/dist/src/session/session-title.js +2 -2
  399. package/dist/src/session/session-title.js.map +1 -1
  400. package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
  401. package/dist/src/storage/sqlite/connector-repository.js +385 -0
  402. package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
  403. package/dist/src/storage/sqlite/index.d.ts +3 -0
  404. package/dist/src/storage/sqlite/index.js +4 -1
  405. package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
  406. package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
  407. package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
  408. package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
  409. package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
  410. package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
  411. package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
  412. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  413. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  414. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  415. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  416. package/dist/src/storage/sqlite/schema.js +1 -1
  417. package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
  418. package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
  419. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
  420. package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
  421. package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
  422. package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
  423. package/dist/src/tui/components/assistant-message.js +15 -0
  424. package/dist/src/tui/components/assistant-message.js.map +1 -1
  425. package/dist/src/tui/tui-agent-events.js +85 -1
  426. package/dist/src/tui/tui-agent-events.js.map +1 -1
  427. package/dist/src/tui/tui-command-formatters.js +7 -7
  428. package/dist/src/tui/tui-command-formatters.js.map +1 -1
  429. package/dist/src/tui/tui-commands.js +1 -1
  430. package/dist/src/tui/tui-startup-resources.js +1 -1
  431. package/dist/src/user-context/import.d.ts +12 -0
  432. package/dist/src/user-context/import.js +48 -0
  433. package/dist/src/user-context/import.js.map +1 -0
  434. package/dist/src/user-context/profile.d.ts +37 -0
  435. package/dist/src/user-context/profile.js +165 -0
  436. package/dist/src/user-context/profile.js.map +1 -0
  437. package/dist/src/user-context/projection.d.ts +54 -0
  438. package/dist/src/user-context/projection.js +121 -0
  439. package/dist/src/user-context/projection.js.map +1 -0
  440. package/dist/src/user-context/source-recommendations.d.ts +13 -0
  441. package/dist/src/user-context/source-recommendations.js +86 -0
  442. package/dist/src/user-context/source-recommendations.js.map +1 -0
  443. package/dist/src/user-context/trust-policy.d.ts +11 -0
  444. package/dist/src/user-context/trust-policy.js +31 -0
  445. package/dist/src/user-context/trust-policy.js.map +1 -0
  446. package/dist/src/voice/tts/summarize.js +2 -2
  447. package/dist/src/voice/tts/summarize.js.map +1 -1
  448. package/dist/src/workflows/authoring/index.d.ts +1 -0
  449. package/dist/src/workflows/authoring/index.js +2 -0
  450. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
  451. package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
  452. package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
  453. package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
  454. package/dist/src/workflows/domain/definition-utils.js +28 -26
  455. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  456. package/dist/src/workflows/domain/definition.d.ts +79 -6
  457. package/dist/src/workflows/domain/event.d.ts +18 -2
  458. package/dist/src/workflows/domain/index.js +3 -3
  459. package/dist/src/workflows/domain/run.d.ts +16 -2
  460. package/dist/src/workflows/domain/run.js.map +1 -1
  461. package/dist/src/workflows/domain/validation.d.ts +9 -5
  462. package/dist/src/workflows/domain/validation.js +183 -40
  463. package/dist/src/workflows/domain/validation.js.map +1 -1
  464. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
  465. package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
  466. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
  467. package/dist/src/workflows/draft/workflow-draft-service.js +6 -10
  468. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  469. package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
  470. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
  471. package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
  472. package/dist/src/workflows/engine/projector.js +43 -1
  473. package/dist/src/workflows/engine/projector.js.map +1 -1
  474. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
  475. package/dist/src/workflows/engine/workflow-engine.js +24 -4
  476. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  477. package/dist/src/workflows/index.js +4 -7
  478. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
  479. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
  480. package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
  481. package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
  482. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
  483. package/dist/src/workflows/runtime/index.d.ts +1 -2
  484. package/dist/src/workflows/runtime/index.js +2 -5
  485. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
  486. package/dist/src/workflows/service/workflow-run-service.js +15 -1
  487. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  488. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
  489. package/package.json +8 -7
  490. package/dist/gateway/static/root/assets/agents-Bd863Akz.js +0 -2
  491. package/dist/gateway/static/root/assets/apps-page-B4omjLxa.js +0 -1
  492. package/dist/gateway/static/root/assets/automation-suggestion-card-fgtj5Gek.js +0 -1
  493. package/dist/gateway/static/root/assets/automations-page-Dz2mgjIR.js +0 -4
  494. package/dist/gateway/static/root/assets/browser-settings-page-DZZz5v_i.js +0 -8
  495. package/dist/gateway/static/root/assets/capability-presets-settings-panel-sCHojZr4.js +0 -1
  496. package/dist/gateway/static/root/assets/channels-settings-UyVSnf9s.js +0 -1
  497. package/dist/gateway/static/root/assets/channels-status-swr-CB5FzcLf.js +0 -1
  498. package/dist/gateway/static/root/assets/connectors-page-BzhHiUO4.js +0 -2
  499. package/dist/gateway/static/root/assets/desktop-pet-settings-DqqUPC7G.js +0 -1
  500. package/dist/gateway/static/root/assets/dreaming-settings-BmL54kQq.js +0 -3
  501. package/dist/gateway/static/root/assets/extension-page-DT5cpace.js +0 -1
  502. package/dist/gateway/static/root/assets/extension-settings-page-CbMk4GhQ.js +0 -1
  503. package/dist/gateway/static/root/assets/gateway-settings-CdghmKHJ.js +0 -1
  504. package/dist/gateway/static/root/assets/goal-create-dialog-CAlsM9MP.js +0 -1
  505. package/dist/gateway/static/root/assets/goal-detail-page-CLPa4F2y.js +0 -4
  506. package/dist/gateway/static/root/assets/goals-page-B2VpdzfH.js +0 -2
  507. package/dist/gateway/static/root/assets/goals-settings-CW1NwxvV.js +0 -1
  508. package/dist/gateway/static/root/assets/heartbeat-settings-C86k5tff.js +0 -1
  509. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
  510. package/dist/gateway/static/root/assets/index-ehajXmqL.js +0 -262
  511. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-8xwKEhui.js +0 -1
  512. package/dist/gateway/static/root/assets/logs-page-C_BMONOO.js +0 -7
  513. package/dist/gateway/static/root/assets/messages-B-8CqAeX.js +0 -3
  514. package/dist/gateway/static/root/assets/models-hub-panel-Do_cwNjF.js +0 -2
  515. package/dist/gateway/static/root/assets/notes-page-5IdlPHaX.js +0 -1
  516. package/dist/gateway/static/root/assets/notes-workbench-0KsRZJIZ.js +0 -2
  517. package/dist/gateway/static/root/assets/project-detail-page-Dk2zB1gy.js +0 -1
  518. package/dist/gateway/static/root/assets/projects-page-CJQntm2G.js +0 -1
  519. package/dist/gateway/static/root/assets/remote-access-hub-CHeZZg7O.js +0 -1
  520. package/dist/gateway/static/root/assets/sessions-page-9Hb_r0AG.js +0 -1
  521. package/dist/gateway/static/root/assets/settings-advanced-gate-PmzVFvAv.js +0 -1
  522. package/dist/gateway/static/root/assets/settings-page-C5G2klUB.js +0 -1
  523. package/dist/gateway/static/root/assets/setup-status-panel-oQ8OLnw3.js +0 -1
  524. package/dist/gateway/static/root/assets/share-preview-page-CXtDHMSi.js +0 -2
  525. package/dist/gateway/static/root/assets/shares-settings-BlNoairj.js +0 -1
  526. package/dist/gateway/static/root/assets/skill-reload-api-BYV5x1KO.js +0 -1
  527. package/dist/gateway/static/root/assets/skills-page-ClBcKQZP.js +0 -2
  528. package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
  529. package/dist/gateway/static/root/assets/user-profile-settings-panel-CeC308-E.js +0 -1
  530. package/dist/gateway/static/root/assets/voice-api-key-field-BE57S-nS.js +0 -1
  531. package/dist/gateway/static/root/assets/work-item-detail-page-Di1ww5Aa.js +0 -1
  532. package/dist/gateway/static/root/assets/workflow-run-setup-panel-CzK84i-B.js +0 -3
  533. package/dist/gateway/static/root/assets/workflow-start-dialog-CtLTtNUB.js +0 -1
  534. package/dist/gateway/static/root/assets/workflows-page-CZFZdua9.js +0 -18
  535. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
  536. package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
  537. package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
  538. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
  539. package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
  540. package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
  541. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
  542. package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
  543. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
  544. package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
  545. package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
  546. package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
  547. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
  548. package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
  549. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
  550. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
  551. package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
  552. package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
  553. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
  554. package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
  555. package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
  556. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
  557. package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
  558. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
  559. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
  560. package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
  561. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
  562. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
  563. package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
  564. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
  565. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
  566. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
  567. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
  568. package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
  569. package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
  570. package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
  571. package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
  572. package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
  573. package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
  574. package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
  575. package/dist/src/agent/workflow/builtins/release-check.js +0 -174
  576. package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
  577. package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
  578. package/dist/src/agent/workflow/builtins/research.js +0 -188
  579. package/dist/src/agent/workflow/builtins/research.js.map +0 -1
  580. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
  581. package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
  582. package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
  583. package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
  584. package/dist/src/agent/workflow/last-run-memory.js +0 -60
  585. package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
  586. package/dist/src/agent/workflow/lint.d.ts +0 -38
  587. package/dist/src/agent/workflow/lint.js +0 -74
  588. package/dist/src/agent/workflow/lint.js.map +0 -1
  589. package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
  590. package/dist/src/agent/workflow/meta-locale.js +0 -62
  591. package/dist/src/agent/workflow/meta-locale.js.map +0 -1
  592. package/dist/src/agent/workflow/parser.d.ts +0 -20
  593. package/dist/src/agent/workflow/parser.js +0 -152
  594. package/dist/src/agent/workflow/parser.js.map +0 -1
  595. package/dist/src/agent/workflow/runtime.d.ts +0 -34
  596. package/dist/src/agent/workflow/runtime.js +0 -402
  597. package/dist/src/agent/workflow/runtime.js.map +0 -1
  598. package/dist/src/connectors/oauth.d.ts +0 -22
  599. package/dist/src/connectors/oauth.js +0 -99
  600. package/dist/src/connectors/oauth.js.map +0 -1
  601. package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
  602. package/dist/src/workflows/runtime/script-runtime.js +0 -3
  603. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
  604. package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
  605. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
@@ -0,0 +1,165 @@
1
+ import * as os$1 from "node:os";
2
+ import { createHash } from "node:crypto";
3
+ //#region src/user-context/profile.ts
4
+ const EMPTY_PROFILE = {
5
+ callName: "",
6
+ pronouns: "",
7
+ timezone: "",
8
+ notes: ""
9
+ };
10
+ const TECHNICAL_USER_NAMES = new Set([
11
+ "admin",
12
+ "administrator",
13
+ "app",
14
+ "daemon",
15
+ "defaultuser0",
16
+ "guest",
17
+ "nobody",
18
+ "node",
19
+ "owner",
20
+ "root",
21
+ "runner",
22
+ "service",
23
+ "system",
24
+ "ubuntu",
25
+ "user",
26
+ "wdagutilityaccount",
27
+ "www-data",
28
+ "xopc"
29
+ ]);
30
+ function markdownField(line) {
31
+ const match = line.match(/^[-*]\s+\*\*(.+?):\*\*\s*(.*)$/i);
32
+ if (!match) return void 0;
33
+ return {
34
+ label: match[1].trim().toLowerCase(),
35
+ value: match[2].trim()
36
+ };
37
+ }
38
+ function contextSection(lines) {
39
+ const heading = lines.findIndex((line) => /^##\s+Context\s*$/i.test(line.trim()));
40
+ if (heading < 0) return void 0;
41
+ const nextHeadingOffset = lines.slice(heading + 1).findIndex((line) => /^##\s+/.test(line.trim()));
42
+ return {
43
+ start: heading,
44
+ end: nextHeadingOffset < 0 ? lines.length : heading + 1 + nextHeadingOffset
45
+ };
46
+ }
47
+ function parseUserProfileMarkdown(content) {
48
+ if (!content.trim()) return { ...EMPTY_PROFILE };
49
+ const profile = { ...EMPTY_PROFILE };
50
+ let nameFallback = "";
51
+ let preferredName = "";
52
+ const lines = content.replace(/\r\n/g, "\n").split("\n");
53
+ for (const line of lines) {
54
+ const field = markdownField(line);
55
+ if (!field) continue;
56
+ if (field.label === "name") nameFallback = field.value;
57
+ if (field.label === "what to call them") preferredName = field.value;
58
+ if (field.label === "pronouns") profile.pronouns = field.value;
59
+ if (field.label === "timezone") profile.timezone = field.value;
60
+ if (field.label === "notes") profile.notes = field.value;
61
+ }
62
+ profile.callName = preferredName || nameFallback;
63
+ const context = contextSection(lines);
64
+ if (context && !profile.notes) profile.notes = lines.slice(context.start + 1, context.end).join("\n").replace(/^_\(.*?\)_\s*$/gm, "").replace(/^---\s*$/gm, "").trim();
65
+ return profile;
66
+ }
67
+ function serializeUserProfileMarkdown(profile) {
68
+ const lines = [
69
+ "# PROFILE.md - About You",
70
+ "",
71
+ `- **Name:** ${profile.callName.trim()}`,
72
+ `- **Pronouns:** ${profile.pronouns.trim()}`,
73
+ `- **Timezone:** ${profile.timezone.trim()}`,
74
+ ""
75
+ ];
76
+ if (profile.notes.trim()) lines.push("## Context", "", profile.notes.trim(), "");
77
+ return lines.join("\n");
78
+ }
79
+ function patchSimpleField(lines, labels, insertLabel, value, updateEveryMatch = false) {
80
+ const matches = lines.flatMap((line, index) => {
81
+ const field = markdownField(line);
82
+ return field && labels.includes(field.label) ? [index] : [];
83
+ });
84
+ const targets = updateEveryMatch ? matches : matches.slice(-1);
85
+ if (targets.length > 0) {
86
+ for (const index of targets) lines[index] = `- **${lines[index].match(/^[-*]\s+\*\*(.+?):\*\*/i)?.[1] ?? insertLabel}:** ${value}`;
87
+ return;
88
+ }
89
+ const insertAt = contextSection(lines)?.start ?? lines.length;
90
+ lines.splice(insertAt, 0, `- **${insertLabel}:** ${value}`, "");
91
+ }
92
+ function patchUserProfileMarkdown(content, patch) {
93
+ if (!content.trim()) return serializeUserProfileMarkdown({
94
+ ...EMPTY_PROFILE,
95
+ ...patch
96
+ });
97
+ const lines = content.replace(/\r\n/g, "\n").split("\n");
98
+ if (patch.callName !== void 0) {
99
+ const hasPreferred = lines.some((line) => markdownField(line)?.label === "what to call them");
100
+ patchSimpleField(lines, hasPreferred ? ["what to call them"] : ["name"], hasPreferred ? "What to call them" : "Name", patch.callName.trim(), patch.callName.trim().length === 0);
101
+ if (patch.callName.trim().length === 0 && hasPreferred) patchSimpleField(lines, ["name"], "Name", "", true);
102
+ }
103
+ if (patch.pronouns !== void 0) patchSimpleField(lines, ["pronouns"], "Pronouns", patch.pronouns.trim());
104
+ if (patch.timezone !== void 0) patchSimpleField(lines, ["timezone"], "Timezone", patch.timezone.trim());
105
+ if (patch.notes !== void 0) {
106
+ const context = contextSection(lines);
107
+ const replacement = patch.notes.trim() ? [
108
+ "## Context",
109
+ "",
110
+ patch.notes.trim(),
111
+ ""
112
+ ] : [];
113
+ if (context) lines.splice(context.start, context.end - context.start, ...replacement);
114
+ else if (replacement.length > 0) lines.push("", ...replacement);
115
+ }
116
+ return lines.join("\n").replace(/\n{4,}/g, "\n\n\n").trimEnd() + "\n";
117
+ }
118
+ function normalizeGatewayUserName(raw) {
119
+ const account = raw.trim().split(/[\\/]/).at(-1)?.split("@")[0]?.trim() ?? "";
120
+ if (!account || account.length < 2 || account.length > 40) return void 0;
121
+ const normalizedKey = account.toLowerCase();
122
+ if (TECHNICAL_USER_NAMES.has(normalizedKey) || account.endsWith("$")) return void 0;
123
+ if (/^\d+$/.test(account) || /^[0-9a-f]{8,}$/i.test(account)) return void 0;
124
+ if ([...account].filter((character) => /\d/.test(character)).length / account.length > .35) return void 0;
125
+ const friendly = account.replace(/[._-]+/g, " ").replace(/\s+/g, " ").trim();
126
+ if (!friendly) return void 0;
127
+ return friendly.replace(/\b[a-z]/g, (character) => character.toUpperCase());
128
+ }
129
+ function detectGatewayCallNameSuggestion(config) {
130
+ if (config.gateway?.auth?.mode === "trusted-proxy") return void 0;
131
+ try {
132
+ const value = normalizeGatewayUserName(os$1.userInfo().username);
133
+ if (!value) return void 0;
134
+ return {
135
+ id: createHash("sha256").update(`gateway_os:${value}`).digest("hex").slice(0, 16),
136
+ value,
137
+ source: "gateway_os",
138
+ confidence: "medium"
139
+ };
140
+ } catch {
141
+ return;
142
+ }
143
+ }
144
+ function buildUserProfileSetup(input) {
145
+ const missing = Object.keys(input.profile).filter((field) => !input.profile[field].trim());
146
+ if (!missing.includes("callName")) return {
147
+ missing,
148
+ shouldPrompt: false,
149
+ state: "complete"
150
+ };
151
+ const now = input.now ?? /* @__PURE__ */ new Date();
152
+ const snoozed = input.promptState.state === "snoozed" && Boolean(input.promptState.snoozedUntil) && Date.parse(input.promptState.snoozedUntil) > now.getTime();
153
+ const suggestion = detectGatewayCallNameSuggestion(input.config);
154
+ return {
155
+ missing,
156
+ shouldPrompt: !snoozed,
157
+ state: snoozed ? "snoozed" : "active",
158
+ callNameSuggestion: suggestion,
159
+ snoozedUntil: snoozed ? input.promptState.snoozedUntil : void 0
160
+ };
161
+ }
162
+ //#endregion
163
+ export { buildUserProfileSetup, detectGatewayCallNameSuggestion, normalizeGatewayUserName, parseUserProfileMarkdown, patchUserProfileMarkdown, serializeUserProfileMarkdown };
164
+
165
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","names":["os"],"sources":["../../../src/user-context/profile.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport * as os from 'node:os';\n\nimport type { Config } from '../config/schema.js';\n\nexport type UserProfileFields = {\n callName: string;\n pronouns: string;\n timezone: string;\n notes: string;\n};\n\nexport type UserProfileSuggestion = {\n id: string;\n value: string;\n source: 'gateway_os';\n confidence: 'medium';\n};\n\nexport type UserProfilePromptState = {\n state: 'active' | 'snoozed';\n suggestionHash?: string;\n snoozedUntil?: string;\n updatedAt?: string;\n};\n\nexport type UserProfileSetup = {\n missing: Array<keyof UserProfileFields>;\n shouldPrompt: boolean;\n state: 'complete' | 'active' | 'snoozed';\n callNameSuggestion?: UserProfileSuggestion;\n snoozedUntil?: string;\n};\n\nconst EMPTY_PROFILE: UserProfileFields = {\n callName: '',\n pronouns: '',\n timezone: '',\n notes: '',\n};\n\nconst TECHNICAL_USER_NAMES = new Set([\n 'admin',\n 'administrator',\n 'app',\n 'daemon',\n 'defaultuser0',\n 'guest',\n 'nobody',\n 'node',\n 'owner',\n 'root',\n 'runner',\n 'service',\n 'system',\n 'ubuntu',\n 'user',\n 'wdagutilityaccount',\n 'www-data',\n 'xopc',\n]);\n\nfunction markdownField(line: string): { label: string; value: string } | undefined {\n const match = line.match(/^[-*]\\s+\\*\\*(.+?):\\*\\*\\s*(.*)$/i);\n if (!match) return undefined;\n return { label: match[1]!.trim().toLowerCase(), value: match[2]!.trim() };\n}\n\nfunction contextSection(lines: string[]): { start: number; end: number } | undefined {\n const heading = lines.findIndex((line) => /^##\\s+Context\\s*$/i.test(line.trim()));\n if (heading < 0) return undefined;\n const nextHeadingOffset = lines.slice(heading + 1).findIndex((line) => /^##\\s+/.test(line.trim()));\n return {\n start: heading,\n end: nextHeadingOffset < 0 ? lines.length : heading + 1 + nextHeadingOffset,\n };\n}\n\nexport function parseUserProfileMarkdown(content: string): UserProfileFields {\n if (!content.trim()) return { ...EMPTY_PROFILE };\n const profile = { ...EMPTY_PROFILE };\n let nameFallback = '';\n let preferredName = '';\n const lines = content.replace(/\\r\\n/g, '\\n').split('\\n');\n for (const line of lines) {\n const field = markdownField(line);\n if (!field) continue;\n if (field.label === 'name') nameFallback = field.value;\n if (field.label === 'what to call them') preferredName = field.value;\n if (field.label === 'pronouns') profile.pronouns = field.value;\n if (field.label === 'timezone') profile.timezone = field.value;\n if (field.label === 'notes') profile.notes = field.value;\n }\n profile.callName = preferredName || nameFallback;\n const context = contextSection(lines);\n if (context && !profile.notes) {\n profile.notes = lines\n .slice(context.start + 1, context.end)\n .join('\\n')\n .replace(/^_\\(.*?\\)_\\s*$/gm, '')\n .replace(/^---\\s*$/gm, '')\n .trim();\n }\n return profile;\n}\n\nexport function serializeUserProfileMarkdown(profile: UserProfileFields): string {\n const lines = [\n '# PROFILE.md - About You',\n '',\n `- **Name:** ${profile.callName.trim()}`,\n `- **Pronouns:** ${profile.pronouns.trim()}`,\n `- **Timezone:** ${profile.timezone.trim()}`,\n '',\n ];\n if (profile.notes.trim()) lines.push('## Context', '', profile.notes.trim(), '');\n return lines.join('\\n');\n}\n\nfunction patchSimpleField(\n lines: string[],\n labels: string[],\n insertLabel: string,\n value: string,\n updateEveryMatch = false,\n): void {\n const matches = lines.flatMap((line, index) => {\n const field = markdownField(line);\n return field && labels.includes(field.label) ? [index] : [];\n });\n const targets = updateEveryMatch ? matches : matches.slice(-1);\n if (targets.length > 0) {\n for (const index of targets) {\n const label = lines[index]!.match(/^[-*]\\s+\\*\\*(.+?):\\*\\*/i)?.[1] ?? insertLabel;\n lines[index] = `- **${label}:** ${value}`;\n }\n return;\n }\n const context = contextSection(lines);\n const insertAt = context?.start ?? lines.length;\n lines.splice(insertAt, 0, `- **${insertLabel}:** ${value}`, '');\n}\n\nexport function patchUserProfileMarkdown(\n content: string,\n patch: Partial<UserProfileFields>,\n): string {\n if (!content.trim()) return serializeUserProfileMarkdown({ ...EMPTY_PROFILE, ...patch });\n const lines = content.replace(/\\r\\n/g, '\\n').split('\\n');\n if (patch.callName !== undefined) {\n const hasPreferred = lines.some((line) => markdownField(line)?.label === 'what to call them');\n patchSimpleField(\n lines,\n hasPreferred ? ['what to call them'] : ['name'],\n hasPreferred ? 'What to call them' : 'Name',\n patch.callName.trim(),\n patch.callName.trim().length === 0,\n );\n if (patch.callName.trim().length === 0 && hasPreferred) {\n patchSimpleField(lines, ['name'], 'Name', '', true);\n }\n }\n if (patch.pronouns !== undefined) {\n patchSimpleField(lines, ['pronouns'], 'Pronouns', patch.pronouns.trim());\n }\n if (patch.timezone !== undefined) {\n patchSimpleField(lines, ['timezone'], 'Timezone', patch.timezone.trim());\n }\n if (patch.notes !== undefined) {\n const context = contextSection(lines);\n const replacement = patch.notes.trim() ? ['## Context', '', patch.notes.trim(), ''] : [];\n if (context) lines.splice(context.start, context.end - context.start, ...replacement);\n else if (replacement.length > 0) lines.push('', ...replacement);\n }\n return lines.join('\\n').replace(/\\n{4,}/g, '\\n\\n\\n').trimEnd() + '\\n';\n}\n\nexport function normalizeGatewayUserName(raw: string): string | undefined {\n const account = raw.trim().split(/[\\\\/]/).at(-1)?.split('@')[0]?.trim() ?? '';\n if (!account || account.length < 2 || account.length > 40) return undefined;\n const normalizedKey = account.toLowerCase();\n if (TECHNICAL_USER_NAMES.has(normalizedKey) || account.endsWith('$')) return undefined;\n if (/^\\d+$/.test(account) || /^[0-9a-f]{8,}$/i.test(account)) return undefined;\n const digits = [...account].filter((character) => /\\d/.test(character)).length;\n if (digits / account.length > 0.35) return undefined;\n const friendly = account.replace(/[._-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n if (!friendly) return undefined;\n return friendly.replace(/\\b[a-z]/g, (character) => character.toUpperCase());\n}\n\nexport function detectGatewayCallNameSuggestion(config: Config): UserProfileSuggestion | undefined {\n if (config.gateway?.auth?.mode === 'trusted-proxy') return undefined;\n try {\n const value = normalizeGatewayUserName(os.userInfo().username);\n if (!value) return undefined;\n const id = createHash('sha256').update(`gateway_os:${value}`).digest('hex').slice(0, 16);\n return { id, value, source: 'gateway_os', confidence: 'medium' };\n } catch {\n return undefined;\n }\n}\n\nexport function buildUserProfileSetup(input: {\n profile: UserProfileFields;\n promptState: UserProfilePromptState;\n config: Config;\n now?: Date;\n}): UserProfileSetup {\n const missing = (Object.keys(input.profile) as Array<keyof UserProfileFields>)\n .filter((field) => !input.profile[field].trim());\n if (!missing.includes('callName')) return { missing, shouldPrompt: false, state: 'complete' };\n const now = input.now ?? new Date();\n const snoozed = input.promptState.state === 'snoozed'\n && Boolean(input.promptState.snoozedUntil)\n && Date.parse(input.promptState.snoozedUntil!) > now.getTime();\n const suggestion = detectGatewayCallNameSuggestion(input.config);\n return {\n missing,\n shouldPrompt: !snoozed,\n state: snoozed ? 'snoozed' : 'active',\n callNameSuggestion: suggestion,\n snoozedUntil: snoozed ? input.promptState.snoozedUntil : undefined,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { MemoryKind, MemoryRecord } from '../agent/memory/types.js';
2
+ import type { ConnectorDefinition, ConnectorInstance } from '../connectors/types.js';
3
+ export type UserContextFacet = 'basics' | 'collaboration' | 'boundaries' | 'priorities' | 'people' | 'current';
4
+ export type UserContextOrigin = 'told_by_you' | 'observed' | 'inferred' | 'connected_source';
5
+ export declare function isUserContextRecord(record: MemoryRecord): boolean;
6
+ export declare function isUserContextMemoryKind(value: unknown): value is MemoryKind;
7
+ export declare function facetForMemoryKind(kind: MemoryKind): UserContextFacet;
8
+ export declare function originForMemoryRecord(record: MemoryRecord): UserContextOrigin;
9
+ export declare function projectUserContextRecord(record: MemoryRecord): {
10
+ id: string;
11
+ statement: string;
12
+ facet: UserContextFacet;
13
+ kind: MemoryKind;
14
+ status: import("../agent/memory/types.js").MemoryStatus;
15
+ origin: UserContextOrigin;
16
+ sourceName: string;
17
+ updatedAt: string;
18
+ sensitivity: import("../agent/memory/types.js").MemorySensitivity;
19
+ explicitness: import("../agent/memory/types.js").MemoryExplicitness;
20
+ durability: import("../agent/memory/types.js").MemoryDurability;
21
+ canReference: boolean;
22
+ stability: import("../agent/memory/lifecycle.js").MemoryStabilityBand;
23
+ stabilityScore: number;
24
+ reviewAt: string;
25
+ reviewDue: boolean;
26
+ evidenceCount: number;
27
+ sourcePath: string;
28
+ latestEvidenceAt: string;
29
+ };
30
+ export declare function isPersonalContextConnector(definition: ConnectorDefinition): boolean;
31
+ export declare function recordsDerivedFromPersonalContextSource(records: MemoryRecord[], agentId: string, connectorId: string): MemoryRecord[];
32
+ export declare function projectPersonalContextSources(definitions: ConnectorDefinition[], instances: ConnectorInstance[], records?: MemoryRecord[]): {
33
+ id: string;
34
+ displayName: string;
35
+ description: string;
36
+ category: import("../connectors/types.js").ConnectorCategory;
37
+ capabilities: ("context" | "tools" | "events" | "memory_source")[];
38
+ access: {
39
+ context: boolean;
40
+ memory: boolean;
41
+ read: boolean;
42
+ write: boolean;
43
+ };
44
+ permissionDetails: string[];
45
+ installed: boolean;
46
+ enabled: boolean;
47
+ status: string;
48
+ instanceId: string;
49
+ lastConnectedAt: string;
50
+ lastHealthCheckAt: string;
51
+ lastHealthStatus: import("../connectors/types.js").ConnectorHealthStatus;
52
+ lastActivityAt: string;
53
+ derivedUnderstandingCount: number;
54
+ }[];
@@ -0,0 +1,121 @@
1
+ import { effectiveMemoryStatus, resolveMemoryStability } from "../agent/memory/lifecycle.js";
2
+ import { classifyMemoryContextOrigin } from "../agent/memory/source-origin.js";
3
+ //#region src/user-context/projection.ts
4
+ const ALWAYS_PERSONAL_KINDS = new Set([
5
+ "user_profile",
6
+ "preference",
7
+ "boundary",
8
+ "relationship",
9
+ "commitment",
10
+ "routine",
11
+ "personal_logistics",
12
+ "current_state",
13
+ "tool_preference",
14
+ "long_term_goal"
15
+ ]);
16
+ const CONTEXTUAL_USER_KINDS = new Set([
17
+ "project_context",
18
+ "open_question",
19
+ "milestone",
20
+ "derived_insight",
21
+ "task_lesson"
22
+ ]);
23
+ function isUserContextRecord(record) {
24
+ if (ALWAYS_PERSONAL_KINDS.has(record.kind)) return true;
25
+ return CONTEXTUAL_USER_KINDS.has(record.kind) && record.tags?.includes("user-understanding") === true;
26
+ }
27
+ function isUserContextMemoryKind(value) {
28
+ return typeof value === "string" && (ALWAYS_PERSONAL_KINDS.has(value) || CONTEXTUAL_USER_KINDS.has(value));
29
+ }
30
+ function facetForMemoryKind(kind) {
31
+ if (kind === "user_profile" || kind === "personal_logistics") return "basics";
32
+ if (kind === "preference" || kind === "routine" || kind === "tool_preference" || kind === "task_lesson") return "collaboration";
33
+ if (kind === "boundary") return "boundaries";
34
+ if (kind === "relationship") return "people";
35
+ if (kind === "current_state" || kind === "open_question") return "current";
36
+ return "priorities";
37
+ }
38
+ function originForMemoryRecord(record) {
39
+ const origin = classifyMemoryContextOrigin(record);
40
+ return origin === "told_by_user" ? "told_by_you" : origin;
41
+ }
42
+ function projectUserContextRecord(record) {
43
+ const lifecycle = resolveMemoryStability(record);
44
+ const latestEvidenceAt = record.evidence?.map((evidence) => evidence.observedAt).filter((value) => Boolean(value)).sort().at(-1);
45
+ return {
46
+ id: record.id,
47
+ statement: record.content,
48
+ facet: facetForMemoryKind(record.kind),
49
+ kind: record.kind,
50
+ status: effectiveMemoryStatus(record),
51
+ origin: originForMemoryRecord(record),
52
+ sourceName: record.source.provider ?? "local",
53
+ updatedAt: record.updatedAt,
54
+ sensitivity: record.sensitivity ?? "normal",
55
+ explicitness: record.explicitness,
56
+ durability: record.durability,
57
+ canReference: record.disclosurePolicy !== "silent",
58
+ stability: lifecycle.band,
59
+ stabilityScore: lifecycle.score,
60
+ reviewAt: lifecycle.reviewAt,
61
+ reviewDue: lifecycle.reviewDue,
62
+ evidenceCount: record.evidence?.length ?? 0,
63
+ sourcePath: record.source.path,
64
+ latestEvidenceAt
65
+ };
66
+ }
67
+ function isPersonalContextConnector(definition) {
68
+ return definition.capabilities.includes("context") || definition.capabilities.includes("memory_source");
69
+ }
70
+ function recordsDerivedFromPersonalContextSource(records, agentId, connectorId) {
71
+ return records.filter((record) => record.scope.agentId === agentId && record.source.provider === connectorId && isUserContextRecord(record));
72
+ }
73
+ function projectPersonalContextSources(definitions, instances, records = []) {
74
+ const instanceByConnector = /* @__PURE__ */ new Map();
75
+ for (const instance of instances) {
76
+ const current = instanceByConnector.get(instance.connectorId) ?? [];
77
+ current.push(instance);
78
+ instanceByConnector.set(instance.connectorId, current);
79
+ }
80
+ return definitions.filter(isPersonalContextConnector).map((definition) => {
81
+ const connected = instanceByConnector.get(definition.id) ?? [];
82
+ const relatedRecords = records.filter((record) => record.source.provider === definition.id);
83
+ const latestHealth = connected.filter((instance) => instance.usage.lastHealthCheckAt && instance.usage.lastHealthStatus).sort((left, right) => Date.parse(right.usage.lastHealthCheckAt) - Date.parse(left.usage.lastHealthCheckAt))[0]?.usage;
84
+ const permissionDetails = definition.permissions?.data ?? [];
85
+ const canWrite = permissionDetails.some((permission) => /(?:^|[.:/_-])(write|create|update|delete|manage|send|admin)(?:$|[.:/_-])/i.test(permission));
86
+ return {
87
+ id: definition.id,
88
+ displayName: definition.displayName,
89
+ description: definition.description,
90
+ category: definition.category,
91
+ capabilities: definition.capabilities.filter((capability) => capability === "context" || capability === "memory_source" || capability === "tools" || capability === "events"),
92
+ access: {
93
+ context: definition.capabilities.includes("context"),
94
+ memory: definition.capabilities.includes("memory_source"),
95
+ read: definition.capabilities.includes("context") || definition.capabilities.includes("resources") || definition.capabilities.includes("tools"),
96
+ write: canWrite
97
+ },
98
+ permissionDetails,
99
+ installed: connected.length > 0,
100
+ enabled: connected.some((instance) => instance.enabled),
101
+ status: connected[0]?.status ?? "not_installed",
102
+ instanceId: connected[0]?.instanceId,
103
+ lastConnectedAt: connected.map((instance) => instance.lastConnectedAt).filter((value) => Boolean(value)).sort().at(-1),
104
+ lastHealthCheckAt: latestHealth?.lastHealthCheckAt,
105
+ lastHealthStatus: latestHealth?.lastHealthStatus,
106
+ lastActivityAt: connected.flatMap((instance) => [
107
+ instance.lastConnectedAt,
108
+ instance.usage.lastHealthCheckAt,
109
+ ...instance.audit.map((entry) => entry.at)
110
+ ]).filter((value) => Boolean(value)).sort().at(-1),
111
+ derivedUnderstandingCount: relatedRecords.length
112
+ };
113
+ }).sort((left, right) => {
114
+ if (left.installed !== right.installed) return left.installed ? -1 : 1;
115
+ return left.displayName.localeCompare(right.displayName);
116
+ });
117
+ }
118
+ //#endregion
119
+ export { facetForMemoryKind, isPersonalContextConnector, isUserContextMemoryKind, isUserContextRecord, originForMemoryRecord, projectPersonalContextSources, projectUserContextRecord, recordsDerivedFromPersonalContextSource };
120
+
121
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","names":[],"sources":["../../../src/user-context/projection.ts"],"sourcesContent":["import type { MemoryKind, MemoryRecord } from '../agent/memory/types.js';\nimport { effectiveMemoryStatus, resolveMemoryStability } from '../agent/memory/lifecycle.js';\nimport { classifyMemoryContextOrigin } from '../agent/memory/source-origin.js';\nimport type { ConnectorDefinition, ConnectorInstance } from '../connectors/types.js';\n\nexport type UserContextFacet =\n | 'basics'\n | 'collaboration'\n | 'boundaries'\n | 'priorities'\n | 'people'\n | 'current';\n\nexport type UserContextOrigin = 'told_by_you' | 'observed' | 'inferred' | 'connected_source';\n\nconst ALWAYS_PERSONAL_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'preference',\n 'boundary',\n 'relationship',\n 'commitment',\n 'routine',\n 'personal_logistics',\n 'current_state',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst CONTEXTUAL_USER_KINDS = new Set<MemoryKind>([\n 'project_context',\n 'open_question',\n 'milestone',\n 'derived_insight',\n 'task_lesson',\n]);\n\nexport function isUserContextRecord(record: MemoryRecord): boolean {\n if (ALWAYS_PERSONAL_KINDS.has(record.kind)) return true;\n return CONTEXTUAL_USER_KINDS.has(record.kind) && record.tags?.includes('user-understanding') === true;\n}\n\nexport function isUserContextMemoryKind(value: unknown): value is MemoryKind {\n return typeof value === 'string'\n && (ALWAYS_PERSONAL_KINDS.has(value as MemoryKind) || CONTEXTUAL_USER_KINDS.has(value as MemoryKind));\n}\n\nexport function facetForMemoryKind(kind: MemoryKind): UserContextFacet {\n if (kind === 'user_profile' || kind === 'personal_logistics') return 'basics';\n if (kind === 'preference' || kind === 'routine' || kind === 'tool_preference' || kind === 'task_lesson') {\n return 'collaboration';\n }\n if (kind === 'boundary') return 'boundaries';\n if (kind === 'relationship') return 'people';\n if (kind === 'current_state' || kind === 'open_question') return 'current';\n return 'priorities';\n}\n\nexport function originForMemoryRecord(record: MemoryRecord): UserContextOrigin {\n const origin = classifyMemoryContextOrigin(record);\n return origin === 'told_by_user' ? 'told_by_you' : origin;\n}\n\nexport function projectUserContextRecord(record: MemoryRecord) {\n const lifecycle = resolveMemoryStability(record);\n const latestEvidenceAt = record.evidence\n ?.map((evidence) => evidence.observedAt)\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1);\n return {\n id: record.id,\n statement: record.content,\n facet: facetForMemoryKind(record.kind),\n kind: record.kind,\n status: effectiveMemoryStatus(record),\n origin: originForMemoryRecord(record),\n sourceName: record.source.provider ?? 'local',\n updatedAt: record.updatedAt,\n sensitivity: record.sensitivity ?? 'normal',\n explicitness: record.explicitness,\n durability: record.durability,\n canReference: record.disclosurePolicy !== 'silent',\n stability: lifecycle.band,\n stabilityScore: lifecycle.score,\n reviewAt: lifecycle.reviewAt,\n reviewDue: lifecycle.reviewDue,\n evidenceCount: record.evidence?.length ?? 0,\n sourcePath: record.source.path,\n latestEvidenceAt,\n };\n}\n\nexport function isPersonalContextConnector(definition: ConnectorDefinition): boolean {\n return definition.capabilities.includes('context') || definition.capabilities.includes('memory_source');\n}\n\nexport function recordsDerivedFromPersonalContextSource(\n records: MemoryRecord[],\n agentId: string,\n connectorId: string,\n): MemoryRecord[] {\n return records.filter((record) => (\n record.scope.agentId === agentId\n && record.source.provider === connectorId\n && isUserContextRecord(record)\n ));\n}\n\nexport function projectPersonalContextSources(\n definitions: ConnectorDefinition[],\n instances: ConnectorInstance[],\n records: MemoryRecord[] = [],\n) {\n const instanceByConnector = new Map<string, ConnectorInstance[]>();\n for (const instance of instances) {\n const current = instanceByConnector.get(instance.connectorId) ?? [];\n current.push(instance);\n instanceByConnector.set(instance.connectorId, current);\n }\n return definitions\n .filter(isPersonalContextConnector)\n .map((definition) => {\n const connected = instanceByConnector.get(definition.id) ?? [];\n const relatedRecords = records.filter((record) => record.source.provider === definition.id);\n const latestHealth = connected\n .filter((instance) => instance.usage.lastHealthCheckAt && instance.usage.lastHealthStatus)\n .sort((left, right) => (\n Date.parse(right.usage.lastHealthCheckAt!) - Date.parse(left.usage.lastHealthCheckAt!)\n ))[0]?.usage;\n const permissionDetails = definition.permissions?.data ?? [];\n const canWrite = permissionDetails.some((permission) => (\n /(?:^|[.:/_-])(write|create|update|delete|manage|send|admin)(?:$|[.:/_-])/i.test(permission)\n ));\n return {\n id: definition.id,\n displayName: definition.displayName,\n description: definition.description,\n category: definition.category,\n capabilities: definition.capabilities.filter((capability) => (\n capability === 'context' || capability === 'memory_source' || capability === 'tools' || capability === 'events'\n )),\n access: {\n context: definition.capabilities.includes('context'),\n memory: definition.capabilities.includes('memory_source'),\n read: definition.capabilities.includes('context')\n || definition.capabilities.includes('resources')\n || definition.capabilities.includes('tools'),\n write: canWrite,\n },\n permissionDetails,\n installed: connected.length > 0,\n enabled: connected.some((instance) => instance.enabled),\n status: connected[0]?.status ?? 'not_installed',\n instanceId: connected[0]?.instanceId,\n lastConnectedAt: connected\n .map((instance) => instance.lastConnectedAt)\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1),\n lastHealthCheckAt: latestHealth?.lastHealthCheckAt,\n lastHealthStatus: latestHealth?.lastHealthStatus,\n lastActivityAt: connected\n .flatMap((instance) => [\n instance.lastConnectedAt,\n instance.usage.lastHealthCheckAt,\n ...instance.audit.map((entry) => entry.at),\n ])\n .filter((value): value is string => Boolean(value))\n .sort()\n .at(-1),\n derivedUnderstandingCount: relatedRecords.length,\n };\n })\n .sort((left, right) => {\n if (left.installed !== right.installed) return left.installed ? -1 : 1;\n return left.displayName.localeCompare(right.displayName);\n });\n}\n"],"mappings":";;;AAeA,MAAM,wBAAwB,IAAI,IAAgB;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,wBAAwB,IAAI,IAAgB;CAChD;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,oBAAoB,QAA+B;AACjE,KAAI,sBAAsB,IAAI,OAAO,KAAK,CAAE,QAAO;AACnD,QAAO,sBAAsB,IAAI,OAAO,KAAK,IAAI,OAAO,MAAM,SAAS,qBAAqB,KAAK;;AAGnG,SAAgB,wBAAwB,OAAqC;AAC3E,QAAO,OAAO,UAAU,aAClB,sBAAsB,IAAI,MAAoB,IAAI,sBAAsB,IAAI,MAAoB;;AAGxG,SAAgB,mBAAmB,MAAoC;AACrE,KAAI,SAAS,kBAAkB,SAAS,qBAAsB,QAAO;AACrE,KAAI,SAAS,gBAAgB,SAAS,aAAa,SAAS,qBAAqB,SAAS,cACxF,QAAO;AAET,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,eAAgB,QAAO;AACpC,KAAI,SAAS,mBAAmB,SAAS,gBAAiB,QAAO;AACjE,QAAO;;AAGT,SAAgB,sBAAsB,QAAyC;CAC7E,MAAM,SAAS,4BAA4B,OAAO;AAClD,QAAO,WAAW,iBAAiB,gBAAgB;;AAGrD,SAAgB,yBAAyB,QAAsB;CAC7D,MAAM,YAAY,uBAAuB,OAAO;CAChD,MAAM,mBAAmB,OAAO,UAC5B,KAAK,aAAa,SAAS,WAAW,CACvC,QAAQ,UAA2B,QAAQ,MAAM,CAAC,CAClD,MAAM,CACN,GAAG,GAAG;AACT,QAAO;EACL,IAAI,OAAO;EACX,WAAW,OAAO;EAClB,OAAO,mBAAmB,OAAO,KAAK;EACtC,MAAM,OAAO;EACb,QAAQ,sBAAsB,OAAO;EACrC,QAAQ,sBAAsB,OAAO;EACrC,YAAY,OAAO,OAAO,YAAY;EACtC,WAAW,OAAO;EAClB,aAAa,OAAO,eAAe;EACnC,cAAc,OAAO;EACrB,YAAY,OAAO;EACnB,cAAc,OAAO,qBAAqB;EAC1C,WAAW,UAAU;EACrB,gBAAgB,UAAU;EAC1B,UAAU,UAAU;EACpB,WAAW,UAAU;EACrB,eAAe,OAAO,UAAU,UAAU;EAC1C,YAAY,OAAO,OAAO;EAC1B;EACD;;AAGH,SAAgB,2BAA2B,YAA0C;AACnF,QAAO,WAAW,aAAa,SAAS,UAAU,IAAI,WAAW,aAAa,SAAS,gBAAgB;;AAGzG,SAAgB,wCACd,SACA,SACA,aACgB;AAChB,QAAO,QAAQ,QAAQ,WACrB,OAAO,MAAM,YAAY,WACtB,OAAO,OAAO,aAAa,eAC3B,oBAAoB,OAAO,CAC9B;;AAGJ,SAAgB,8BACd,aACA,WACA,UAA0B,EAAE,EAC5B;CACA,MAAM,sCAAsB,IAAI,KAAkC;AAClE,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,UAAU,oBAAoB,IAAI,SAAS,YAAY,IAAI,EAAE;AACnE,UAAQ,KAAK,SAAS;AACtB,sBAAoB,IAAI,SAAS,aAAa,QAAQ;;AAExD,QAAO,YACJ,OAAO,2BAA2B,CAClC,KAAK,eAAe;EACnB,MAAM,YAAY,oBAAoB,IAAI,WAAW,GAAG,IAAI,EAAE;EAC9D,MAAM,iBAAiB,QAAQ,QAAQ,WAAW,OAAO,OAAO,aAAa,WAAW,GAAG;EAC3F,MAAM,eAAe,UAClB,QAAQ,aAAa,SAAS,MAAM,qBAAqB,SAAS,MAAM,iBAAiB,CACzF,MAAM,MAAM,UACX,KAAK,MAAM,MAAM,MAAM,kBAAmB,GAAG,KAAK,MAAM,KAAK,MAAM,kBAAmB,CACtF,CAAC,IAAI;EACT,MAAM,oBAAoB,WAAW,aAAa,QAAQ,EAAE;EAC5D,MAAM,WAAW,kBAAkB,MAAM,eACvC,4EAA4E,KAAK,WAAW,CAC5F;AACF,SAAO;GACL,IAAI,WAAW;GACf,aAAa,WAAW;GACxB,aAAa,WAAW;GACxB,UAAU,WAAW;GACrB,cAAc,WAAW,aAAa,QAAQ,eAC5C,eAAe,aAAa,eAAe,mBAAmB,eAAe,WAAW,eAAe,SACvG;GACF,QAAQ;IACN,SAAS,WAAW,aAAa,SAAS,UAAU;IACpD,QAAQ,WAAW,aAAa,SAAS,gBAAgB;IACzD,MAAM,WAAW,aAAa,SAAS,UAAU,IAC5C,WAAW,aAAa,SAAS,YAAY,IAC7C,WAAW,aAAa,SAAS,QAAQ;IAC9C,OAAO;IACR;GACD;GACA,WAAW,UAAU,SAAS;GAC9B,SAAS,UAAU,MAAM,aAAa,SAAS,QAAQ;GACvD,QAAQ,UAAU,IAAI,UAAU;GAChC,YAAY,UAAU,IAAI;GAC1B,iBAAiB,UACd,KAAK,aAAa,SAAS,gBAAgB,CAC3C,QAAQ,UAA2B,QAAQ,MAAM,CAAC,CAClD,MAAM,CACN,GAAG,GAAG;GACT,mBAAmB,cAAc;GACjC,kBAAkB,cAAc;GAChC,gBAAgB,UACb,SAAS,aAAa;IACrB,SAAS;IACT,SAAS,MAAM;IACf,GAAG,SAAS,MAAM,KAAK,UAAU,MAAM,GAAG;IAC3C,CAAC,CACD,QAAQ,UAA2B,QAAQ,MAAM,CAAC,CAClD,MAAM,CACN,GAAG,GAAG;GACT,2BAA2B,eAAe;GAC3C;GACD,CACD,MAAM,MAAM,UAAU;AACrB,MAAI,KAAK,cAAc,MAAM,UAAW,QAAO,KAAK,YAAY,KAAK;AACrE,SAAO,KAAK,YAAY,cAAc,MAAM,YAAY;GACxD"}
@@ -0,0 +1,13 @@
1
+ import type { ConnectorDefinition } from '../connectors/types.js';
2
+ type GoalSummary = {
3
+ id: string;
4
+ title: string;
5
+ description?: string;
6
+ };
7
+ export declare function buildGoalSourceRecommendations(definitions: ConnectorDefinition[], installedConnectorIds: Set<string>, goals: GoalSummary[]): {
8
+ sourceId: string;
9
+ sourceName: string;
10
+ goalId: string;
11
+ goalTitle: string;
12
+ }[];
13
+ export {};
@@ -0,0 +1,86 @@
1
+ //#region src/user-context/source-recommendations.ts
2
+ const DOMAINS = [
3
+ [
4
+ "calendar",
5
+ "schedule",
6
+ "meeting",
7
+ "deadline",
8
+ "event",
9
+ "日历",
10
+ "日程",
11
+ "会议",
12
+ "截止",
13
+ "预约"
14
+ ],
15
+ [
16
+ "email",
17
+ "gmail",
18
+ "outlook",
19
+ "mail",
20
+ "inbox",
21
+ "邮件",
22
+ "邮箱",
23
+ "收件箱"
24
+ ],
25
+ [
26
+ "docs",
27
+ "document",
28
+ "notion",
29
+ "drive",
30
+ "knowledge",
31
+ "wiki",
32
+ "文档",
33
+ "知识库",
34
+ "资料"
35
+ ],
36
+ [
37
+ "github",
38
+ "gitlab",
39
+ "code",
40
+ "repository",
41
+ "issue",
42
+ "代码",
43
+ "仓库",
44
+ "开发"
45
+ ],
46
+ [
47
+ "slack",
48
+ "teams",
49
+ "chat",
50
+ "message",
51
+ "消息",
52
+ "群聊",
53
+ "沟通"
54
+ ]
55
+ ];
56
+ function buildGoalSourceRecommendations(definitions, installedConnectorIds, goals) {
57
+ const recommendations = [];
58
+ for (const definition of definitions) {
59
+ if (installedConnectorIds.has(definition.id)) continue;
60
+ const sourceText = [
61
+ definition.id,
62
+ definition.displayName,
63
+ definition.description,
64
+ ...definition.tags ?? []
65
+ ].join(" ").toLowerCase();
66
+ for (const goal of goals) {
67
+ const goalText = `${goal.title} ${goal.description ?? ""}`.toLowerCase();
68
+ let score = 0;
69
+ for (const keywords of DOMAINS) if (keywords.some((keyword) => sourceText.includes(keyword)) && keywords.some((keyword) => goalText.includes(keyword))) score += 3;
70
+ const genericTerms = goalText.match(/[a-z][a-z0-9_-]{3,}/g) ?? [];
71
+ score += new Set(genericTerms.filter((term) => sourceText.includes(term))).size;
72
+ if (score > 0) recommendations.push({
73
+ sourceId: definition.id,
74
+ sourceName: definition.displayName,
75
+ goalId: goal.id,
76
+ goalTitle: goal.title,
77
+ score
78
+ });
79
+ }
80
+ }
81
+ return recommendations.sort((left, right) => right.score - left.score || left.sourceName.localeCompare(right.sourceName)).filter((item, index, all) => all.findIndex((candidate) => candidate.sourceId === item.sourceId) === index).slice(0, 3).map(({ score: _score, ...item }) => item);
82
+ }
83
+ //#endregion
84
+ export { buildGoalSourceRecommendations };
85
+
86
+ //# sourceMappingURL=source-recommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-recommendations.js","names":[],"sources":["../../../src/user-context/source-recommendations.ts"],"sourcesContent":["import type { ConnectorDefinition } from '../connectors/types.js';\n\ntype GoalSummary = { id: string; title: string; description?: string };\n\nconst DOMAINS = [\n ['calendar', 'schedule', 'meeting', 'deadline', 'event', '日历', '日程', '会议', '截止', '预约'],\n ['email', 'gmail', 'outlook', 'mail', 'inbox', '邮件', '邮箱', '收件箱'],\n ['docs', 'document', 'notion', 'drive', 'knowledge', 'wiki', '文档', '知识库', '资料'],\n ['github', 'gitlab', 'code', 'repository', 'issue', '代码', '仓库', '开发'],\n ['slack', 'teams', 'chat', 'message', '消息', '群聊', '沟通'],\n] as const;\n\nexport function buildGoalSourceRecommendations(\n definitions: ConnectorDefinition[],\n installedConnectorIds: Set<string>,\n goals: GoalSummary[],\n) {\n const recommendations: Array<{\n sourceId: string;\n sourceName: string;\n goalId: string;\n goalTitle: string;\n score: number;\n }> = [];\n\n for (const definition of definitions) {\n if (installedConnectorIds.has(definition.id)) continue;\n const sourceText = [definition.id, definition.displayName, definition.description, ...(definition.tags ?? [])]\n .join(' ')\n .toLowerCase();\n for (const goal of goals) {\n const goalText = `${goal.title} ${goal.description ?? ''}`.toLowerCase();\n let score = 0;\n for (const keywords of DOMAINS) {\n if (keywords.some((keyword) => sourceText.includes(keyword)) && keywords.some((keyword) => goalText.includes(keyword))) {\n score += 3;\n }\n }\n const genericTerms = goalText.match(/[a-z][a-z0-9_-]{3,}/g) ?? [];\n score += new Set(genericTerms.filter((term) => sourceText.includes(term))).size;\n if (score > 0) {\n recommendations.push({\n sourceId: definition.id,\n sourceName: definition.displayName,\n goalId: goal.id,\n goalTitle: goal.title,\n score,\n });\n }\n }\n }\n\n return recommendations\n .sort((left, right) => right.score - left.score || left.sourceName.localeCompare(right.sourceName))\n .filter((item, index, all) => all.findIndex((candidate) => candidate.sourceId === item.sourceId) === index)\n .slice(0, 3)\n .map(({ score: _score, ...item }) => item);\n}\n"],"mappings":";AAIA,MAAM,UAAU;CACd;EAAC;EAAY;EAAY;EAAW;EAAY;EAAS;EAAM;EAAM;EAAM;EAAM;EAAK;CACtF;EAAC;EAAS;EAAS;EAAW;EAAQ;EAAS;EAAM;EAAM;EAAM;CACjE;EAAC;EAAQ;EAAY;EAAU;EAAS;EAAa;EAAQ;EAAM;EAAO;EAAK;CAC/E;EAAC;EAAU;EAAU;EAAQ;EAAc;EAAS;EAAM;EAAM;EAAK;CACrE;EAAC;EAAS;EAAS;EAAQ;EAAW;EAAM;EAAM;EAAK;CACxD;AAED,SAAgB,+BACd,aACA,uBACA,OACA;CACA,MAAM,kBAMD,EAAE;AAEP,MAAK,MAAM,cAAc,aAAa;AACpC,MAAI,sBAAsB,IAAI,WAAW,GAAG,CAAE;EAC9C,MAAM,aAAa;GAAC,WAAW;GAAI,WAAW;GAAa,WAAW;GAAa,GAAI,WAAW,QAAQ,EAAE;GAAE,CAC3G,KAAK,IAAI,CACT,aAAa;AAChB,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,WAAW,GAAG,KAAK,MAAM,GAAG,KAAK,eAAe,KAAK,aAAa;GACxE,IAAI,QAAQ;AACZ,QAAK,MAAM,YAAY,QACrB,KAAI,SAAS,MAAM,YAAY,WAAW,SAAS,QAAQ,CAAC,IAAI,SAAS,MAAM,YAAY,SAAS,SAAS,QAAQ,CAAC,CACpH,UAAS;GAGb,MAAM,eAAe,SAAS,MAAM,uBAAuB,IAAI,EAAE;AACjE,YAAS,IAAI,IAAI,aAAa,QAAQ,SAAS,WAAW,SAAS,KAAK,CAAC,CAAC,CAAC;AAC3E,OAAI,QAAQ,EACV,iBAAgB,KAAK;IACnB,UAAU,WAAW;IACrB,YAAY,WAAW;IACvB,QAAQ,KAAK;IACb,WAAW,KAAK;IAChB;IACD,CAAC;;;AAKR,QAAO,gBACJ,MAAM,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK,WAAW,cAAc,MAAM,WAAW,CAAC,CAClG,QAAQ,MAAM,OAAO,QAAQ,IAAI,WAAW,cAAc,UAAU,aAAa,KAAK,SAAS,KAAK,MAAM,CAC1G,MAAM,GAAG,EAAE,CACX,KAAK,EAAE,OAAO,QAAQ,GAAG,WAAW,KAAK"}
@@ -0,0 +1,11 @@
1
+ export declare const USER_TRUST_LEVELS: readonly ["observe", "suggest", "confirm", "auto"];
2
+ export type UserTrustLevel = typeof USER_TRUST_LEVELS[number];
3
+ export declare const DEFAULT_USER_TRUST_LEVEL: UserTrustLevel;
4
+ export type UserTrustPolicy = {
5
+ principalId: string;
6
+ defaultActionLevel: UserTrustLevel;
7
+ updatedAt?: string;
8
+ };
9
+ export declare function isUserTrustLevel(value: unknown): value is UserTrustLevel;
10
+ export declare function resolveAutomationSafetyForTrust(level: UserTrustLevel, requested: 'suggest_only' | 'ask_before_apply' | 'auto_apply' | undefined): 'suggest_only' | 'ask_before_apply' | 'auto_apply';
11
+ export declare function buildActionTrustPrompt(level: UserTrustLevel): string;
@@ -0,0 +1,31 @@
1
+ //#region src/user-context/trust-policy.ts
2
+ const USER_TRUST_LEVELS = [
3
+ "observe",
4
+ "suggest",
5
+ "confirm",
6
+ "auto"
7
+ ];
8
+ const DEFAULT_USER_TRUST_LEVEL = "confirm";
9
+ function isUserTrustLevel(value) {
10
+ return typeof value === "string" && USER_TRUST_LEVELS.includes(value);
11
+ }
12
+ function resolveAutomationSafetyForTrust(level, requested) {
13
+ if (level === "observe" || level === "suggest") return "suggest_only";
14
+ if (level === "confirm") return requested === "suggest_only" ? "suggest_only" : "ask_before_apply";
15
+ return requested ?? "suggest_only";
16
+ }
17
+ function buildActionTrustPrompt(level) {
18
+ const shared = [
19
+ "## Action Trust Boundary",
20
+ `Current default: ${level}.`,
21
+ "- This controls agent-initiated or proactive actions. A direct user request in the current turn is explicit approval to carry out that request within existing safety and permission boundaries.",
22
+ "- Never expand connector permissions, workflow scope, credentials, or access because of this setting.",
23
+ "- Irreversible, destructive, financial, permission-expanding, or public external actions still require explicit confirmation."
24
+ ];
25
+ const instruction = level === "observe" ? "- For proactive work, observe and build context only; do not prepare or initiate actions." : level === "suggest" ? "- For proactive work, explain the recommendation and rationale, then let the user decide whether to proceed." : level === "confirm" ? "- For proactive work, prepare the action, but request approval before executing any mutating or external step." : "- For proactive work, you may execute within already-authorized, recoverable boundaries without asking each time.";
26
+ return [...shared, instruction].join("\n");
27
+ }
28
+ //#endregion
29
+ export { DEFAULT_USER_TRUST_LEVEL, USER_TRUST_LEVELS, buildActionTrustPrompt, isUserTrustLevel, resolveAutomationSafetyForTrust };
30
+
31
+ //# sourceMappingURL=trust-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-policy.js","names":[],"sources":["../../../src/user-context/trust-policy.ts"],"sourcesContent":["export const USER_TRUST_LEVELS = ['observe', 'suggest', 'confirm', 'auto'] as const;\n\nexport type UserTrustLevel = typeof USER_TRUST_LEVELS[number];\n\nexport const DEFAULT_USER_TRUST_LEVEL: UserTrustLevel = 'confirm';\n\nexport type UserTrustPolicy = {\n principalId: string;\n defaultActionLevel: UserTrustLevel;\n updatedAt?: string;\n};\n\nexport function isUserTrustLevel(value: unknown): value is UserTrustLevel {\n return typeof value === 'string' && USER_TRUST_LEVELS.includes(value as UserTrustLevel);\n}\n\nexport function resolveAutomationSafetyForTrust(\n level: UserTrustLevel,\n requested: 'suggest_only' | 'ask_before_apply' | 'auto_apply' | undefined,\n): 'suggest_only' | 'ask_before_apply' | 'auto_apply' {\n if (level === 'observe' || level === 'suggest') return 'suggest_only';\n if (level === 'confirm') {\n return requested === 'suggest_only' ? 'suggest_only' : 'ask_before_apply';\n }\n return requested ?? 'suggest_only';\n}\n\nexport function buildActionTrustPrompt(level: UserTrustLevel): string {\n const shared = [\n '## Action Trust Boundary',\n `Current default: ${level}.`,\n '- This controls agent-initiated or proactive actions. A direct user request in the current turn is explicit approval to carry out that request within existing safety and permission boundaries.',\n '- Never expand connector permissions, workflow scope, credentials, or access because of this setting.',\n '- Irreversible, destructive, financial, permission-expanding, or public external actions still require explicit confirmation.',\n ];\n const instruction = level === 'observe'\n ? '- For proactive work, observe and build context only; do not prepare or initiate actions.'\n : level === 'suggest'\n ? '- For proactive work, explain the recommendation and rationale, then let the user decide whether to proceed.'\n : level === 'confirm'\n ? '- For proactive work, prepare the action, but request approval before executing any mutating or external step.'\n : '- For proactive work, you may execute within already-authorized, recoverable boundaries without asking each time.';\n return [...shared, instruction].join('\\n');\n}\n"],"mappings":";AAAA,MAAa,oBAAoB;CAAC;CAAW;CAAW;CAAW;CAAO;AAI1E,MAAa,2BAA2C;AAQxD,SAAgB,iBAAiB,OAAyC;AACxE,QAAO,OAAO,UAAU,YAAY,kBAAkB,SAAS,MAAwB;;AAGzF,SAAgB,gCACd,OACA,WACoD;AACpD,KAAI,UAAU,aAAa,UAAU,UAAW,QAAO;AACvD,KAAI,UAAU,UACZ,QAAO,cAAc,iBAAiB,iBAAiB;AAEzD,QAAO,aAAa;;AAGtB,SAAgB,uBAAuB,OAA+B;CACpE,MAAM,SAAS;EACb;EACA,oBAAoB,MAAM;EAC1B;EACA;EACA;EACD;CACD,MAAM,cAAc,UAAU,YAC1B,8FACA,UAAU,YACR,iHACA,UAAU,YACR,mHACA;AACR,QAAO,CAAC,GAAG,QAAQ,YAAY,CAAC,KAAK,KAAK"}
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
4
+ import { completeWithResolvedCredentials } from "../../providers/model-call.js";
4
5
  import { truncateAtSentenceBoundary } from "./sentence-boundary.js";
5
- import { complete } from "@earendil-works/pi-ai/compat";
6
6
  //#region src/voice/tts/summarize.ts
7
7
  init_providers();
8
8
  init_logger();
@@ -67,7 +67,7 @@ async function summarizeForTts(options) {
67
67
  };
68
68
  const timeoutSignal = typeof AbortSignal !== "undefined" && typeof AbortSignal.timeout === "function" ? AbortSignal.timeout(SUMMARIZE_TIMEOUT_MS) : void 0;
69
69
  const mergedSignal = signal && timeoutSignal && typeof AbortSignal.any === "function" ? AbortSignal.any([signal, timeoutSignal]) : signal ?? timeoutSignal;
70
- const result = await complete(model, { messages: [userMsg] }, {
70
+ const result = await completeWithResolvedCredentials(model, { messages: [userMsg] }, {
71
71
  maxTokens: Math.min(Math.ceil(targetLength / 2), 4096),
72
72
  temperature: .3,
73
73
  signal: mergedSignal
@@ -1 +1 @@
1
- {"version":3,"file":"summarize.js","names":[],"sources":["../../../../src/voice/tts/summarize.ts"],"sourcesContent":["import { complete, type UserMessage } from '@earendil-works/pi-ai/compat';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../providers/index.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { truncateAtSentenceBoundary } from './sentence-boundary.js';\n\nconst log = createLogger('TTS:Summarize');\n\nconst SUMMARIZE_TIMEOUT_MS = 45_000;\n\nconst SUMMARIZE_SYSTEM_PROMPT = `You are a text summarizer for a text-to-speech system.\nYour task is to condense the given text while preserving the key information and meaning.\n\nRules:\n1. Output ONLY the summarized text, no explanations or meta-commentary\n2. Keep the summary in the same language as the input\n3. Preserve key facts, numbers, names, and conclusions\n4. Use natural, spoken language suitable for audio playback\n5. Remove code blocks, URLs, markdown formatting, and technical syntax where possible\n6. Keep the summary under the specified character limit\n7. End with a complete sentence, never mid-sentence`;\n\nexport interface SummarizeForTtsOptions {\n text: string;\n targetLength: number;\n config?: Config;\n modelRef?: string;\n signal?: AbortSignal;\n}\n\nexport interface SummarizeResult {\n summary: string;\n originalLength: number;\n summaryLength: number;\n wasSummarized: boolean;\n}\n\nfunction resolveSummarizeModel(config: Config | undefined, modelRef?: string): Model<Api> {\n const envRef = process.env.XOPC_TTS_SUMMARIZE_MODEL?.trim();\n const ref = modelRef?.trim() || envRef;\n if (ref) {\n try {\n return resolveModel(ref);\n } catch {\n /* fall through */\n }\n }\n for (const candidate of ['openai/gpt-5.6-luna', 'google/gemini-3.5-flash']) {\n try {\n return resolveModel(candidate);\n } catch {\n /* next */\n }\n }\n return resolveModel(getDefaultModelSync(config));\n}\n\nfunction fallbackTruncate(text: string, maxLength: number): SummarizeResult {\n const truncated = truncateAtSentenceBoundary(text, maxLength);\n return {\n summary: truncated,\n originalLength: text.length,\n summaryLength: truncated.length,\n wasSummarized: false,\n };\n}\n\n/**\n * Condense text for TTS using a small LLM pass; falls back to sentence-boundary truncation.\n */\nexport async function summarizeForTts(options: SummarizeForTtsOptions): Promise<SummarizeResult> {\n const { text, targetLength, config, modelRef, signal } = options;\n\n if (text.length <= targetLength) {\n return {\n summary: text,\n originalLength: text.length,\n summaryLength: text.length,\n wasSummarized: false,\n };\n }\n\n const startTime = Date.now();\n\n try {\n const model = resolveSummarizeModel(config, modelRef);\n const userPrompt = [\n `Summarize the following text to fit within ${targetLength} characters.`,\n `The summary will be read aloud by a text-to-speech system, so use natural spoken language.`,\n '',\n '---',\n '',\n text,\n ].join('\\n');\n\n const userMsg: UserMessage = {\n role: 'user',\n content: `${SUMMARIZE_SYSTEM_PROMPT}\\n\\n---\\n\\n${userPrompt}`,\n timestamp: Date.now(),\n };\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'\n ? AbortSignal.timeout(SUMMARIZE_TIMEOUT_MS)\n : undefined;\n const mergedSignal =\n signal && timeoutSignal && typeof AbortSignal.any === 'function'\n ? AbortSignal.any([signal, timeoutSignal])\n : signal ?? timeoutSignal;\n\n const result = await complete(\n model,\n { messages: [userMsg] },\n {\n maxTokens: Math.min(Math.ceil(targetLength / 2), 4096),\n temperature: 0.3,\n signal: mergedSignal as AbortSignal,\n },\n );\n\n let out = '';\n if (Array.isArray(result.content)) {\n for (const c of result.content) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === 'text') {\n out += String((c as { text?: string }).text || '');\n }\n }\n }\n\n const summary = out.trim();\n if (!summary) {\n log.warn('Empty summary returned, falling back to truncation');\n return fallbackTruncate(text, targetLength);\n }\n\n const finalSummary =\n summary.length > targetLength ? truncateAtSentenceBoundary(summary, targetLength) : summary;\n\n log.info(\n {\n originalLength: text.length,\n summaryLength: finalSummary.length,\n durationMs: Date.now() - startTime,\n },\n 'Text summarized for TTS',\n );\n\n return {\n summary: finalSummary,\n originalLength: text.length,\n summaryLength: finalSummary.length,\n wasSummarized: true,\n };\n } catch (error) {\n const em = error instanceof Error ? error.message : String(error);\n log.warn({ errorMessage: em }, 'Summarization failed, falling back to truncation');\n return fallbackTruncate(text, targetLength);\n }\n}\n"],"mappings":";;;;;;gBAI6E;aACxB;AAGrD,MAAM,MAAM,aAAa,gBAAgB;AAEzC,MAAM,uBAAuB;AAE7B,MAAM,0BAA0B;;;;;;;;;;;AA2BhC,SAAS,sBAAsB,QAA4B,UAA+B;CACxF,MAAM,SAAS,QAAQ,IAAI,0BAA0B,MAAM;CAC3D,MAAM,MAAM,UAAU,MAAM,IAAI;AAChC,KAAI,IACF,KAAI;AACF,SAAO,aAAa,IAAI;SAClB;AAIV,MAAK,MAAM,aAAa,CAAC,uBAAuB,0BAA0B,CACxE,KAAI;AACF,SAAO,aAAa,UAAU;SACxB;AAIV,QAAO,aAAa,oBAAoB,OAAO,CAAC;;AAGlD,SAAS,iBAAiB,MAAc,WAAoC;CAC1E,MAAM,YAAY,2BAA2B,MAAM,UAAU;AAC7D,QAAO;EACL,SAAS;EACT,gBAAgB,KAAK;EACrB,eAAe,UAAU;EACzB,eAAe;EAChB;;;;;AAMH,eAAsB,gBAAgB,SAA2D;CAC/F,MAAM,EAAE,MAAM,cAAc,QAAQ,UAAU,WAAW;AAEzD,KAAI,KAAK,UAAU,aACjB,QAAO;EACL,SAAS;EACT,gBAAgB,KAAK;EACrB,eAAe,KAAK;EACpB,eAAe;EAChB;CAGH,MAAM,YAAY,KAAK,KAAK;AAE5B,KAAI;EACF,MAAM,QAAQ,sBAAsB,QAAQ,SAAS;EAUrD,MAAM,UAAuB;GAC3B,MAAM;GACN,SAAS,GAAG,wBAAwB,aAXnB;IACjB,8CAA8C,aAAa;IAC3D;IACA;IACA;IACA;IACA;IACD,CAAC,KAAK,KAIsD;GAC3D,WAAW,KAAK,KAAK;GACtB;EAED,MAAM,gBACJ,OAAO,gBAAgB,eAAe,OAAO,YAAY,YAAY,aACjE,YAAY,QAAQ,qBAAqB,GACzC,KAAA;EACN,MAAM,eACJ,UAAU,iBAAiB,OAAO,YAAY,QAAQ,aAClD,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,GACxC,UAAU;EAEhB,MAAM,SAAS,MAAM,SACnB,OACA,EAAE,UAAU,CAAC,QAAQ,EAAE,EACvB;GACE,WAAW,KAAK,IAAI,KAAK,KAAK,eAAe,EAAE,EAAE,KAAK;GACtD,aAAa;GACb,QAAQ;GACT,CACF;EAED,IAAI,MAAM;AACV,MAAI,MAAM,QAAQ,OAAO,QAAQ;QAC1B,MAAM,KAAK,OAAO,QACrB,KAAI,KAAK,OAAO,MAAM,YAAa,EAAwB,SAAS,OAClE,QAAO,OAAQ,EAAwB,QAAQ,GAAG;;EAKxD,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAI,CAAC,SAAS;AACZ,OAAI,KAAK,qDAAqD;AAC9D,UAAO,iBAAiB,MAAM,aAAa;;EAG7C,MAAM,eACJ,QAAQ,SAAS,eAAe,2BAA2B,SAAS,aAAa,GAAG;AAEtF,MAAI,KACF;GACE,gBAAgB,KAAK;GACrB,eAAe,aAAa;GAC5B,YAAY,KAAK,KAAK,GAAG;GAC1B,EACD,0BACD;AAED,SAAO;GACL,SAAS;GACT,gBAAgB,KAAK;GACrB,eAAe,aAAa;GAC5B,eAAe;GAChB;UACM,OAAO;EACd,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,MAAI,KAAK,EAAE,cAAc,IAAI,EAAE,mDAAmD;AAClF,SAAO,iBAAiB,MAAM,aAAa"}
1
+ {"version":3,"file":"summarize.js","names":[],"sources":["../../../../src/voice/tts/summarize.ts"],"sourcesContent":["import { type UserMessage } from '@earendil-works/pi-ai/compat';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../providers/index.js';\nimport { completeWithResolvedCredentials } from '../../providers/model-call.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { truncateAtSentenceBoundary } from './sentence-boundary.js';\n\nconst log = createLogger('TTS:Summarize');\n\nconst SUMMARIZE_TIMEOUT_MS = 45_000;\n\nconst SUMMARIZE_SYSTEM_PROMPT = `You are a text summarizer for a text-to-speech system.\nYour task is to condense the given text while preserving the key information and meaning.\n\nRules:\n1. Output ONLY the summarized text, no explanations or meta-commentary\n2. Keep the summary in the same language as the input\n3. Preserve key facts, numbers, names, and conclusions\n4. Use natural, spoken language suitable for audio playback\n5. Remove code blocks, URLs, markdown formatting, and technical syntax where possible\n6. Keep the summary under the specified character limit\n7. End with a complete sentence, never mid-sentence`;\n\nexport interface SummarizeForTtsOptions {\n text: string;\n targetLength: number;\n config?: Config;\n modelRef?: string;\n signal?: AbortSignal;\n}\n\nexport interface SummarizeResult {\n summary: string;\n originalLength: number;\n summaryLength: number;\n wasSummarized: boolean;\n}\n\nfunction resolveSummarizeModel(config: Config | undefined, modelRef?: string): Model<Api> {\n const envRef = process.env.XOPC_TTS_SUMMARIZE_MODEL?.trim();\n const ref = modelRef?.trim() || envRef;\n if (ref) {\n try {\n return resolveModel(ref);\n } catch {\n /* fall through */\n }\n }\n for (const candidate of ['openai/gpt-5.6-luna', 'google/gemini-3.5-flash']) {\n try {\n return resolveModel(candidate);\n } catch {\n /* next */\n }\n }\n return resolveModel(getDefaultModelSync(config));\n}\n\nfunction fallbackTruncate(text: string, maxLength: number): SummarizeResult {\n const truncated = truncateAtSentenceBoundary(text, maxLength);\n return {\n summary: truncated,\n originalLength: text.length,\n summaryLength: truncated.length,\n wasSummarized: false,\n };\n}\n\n/**\n * Condense text for TTS using a small LLM pass; falls back to sentence-boundary truncation.\n */\nexport async function summarizeForTts(options: SummarizeForTtsOptions): Promise<SummarizeResult> {\n const { text, targetLength, config, modelRef, signal } = options;\n\n if (text.length <= targetLength) {\n return {\n summary: text,\n originalLength: text.length,\n summaryLength: text.length,\n wasSummarized: false,\n };\n }\n\n const startTime = Date.now();\n\n try {\n const model = resolveSummarizeModel(config, modelRef);\n const userPrompt = [\n `Summarize the following text to fit within ${targetLength} characters.`,\n `The summary will be read aloud by a text-to-speech system, so use natural spoken language.`,\n '',\n '---',\n '',\n text,\n ].join('\\n');\n\n const userMsg: UserMessage = {\n role: 'user',\n content: `${SUMMARIZE_SYSTEM_PROMPT}\\n\\n---\\n\\n${userPrompt}`,\n timestamp: Date.now(),\n };\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'\n ? AbortSignal.timeout(SUMMARIZE_TIMEOUT_MS)\n : undefined;\n const mergedSignal =\n signal && timeoutSignal && typeof AbortSignal.any === 'function'\n ? AbortSignal.any([signal, timeoutSignal])\n : signal ?? timeoutSignal;\n\n const result = await completeWithResolvedCredentials(\n model,\n { messages: [userMsg] },\n {\n maxTokens: Math.min(Math.ceil(targetLength / 2), 4096),\n temperature: 0.3,\n signal: mergedSignal as AbortSignal,\n },\n );\n\n let out = '';\n if (Array.isArray(result.content)) {\n for (const c of result.content) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === 'text') {\n out += String((c as { text?: string }).text || '');\n }\n }\n }\n\n const summary = out.trim();\n if (!summary) {\n log.warn('Empty summary returned, falling back to truncation');\n return fallbackTruncate(text, targetLength);\n }\n\n const finalSummary =\n summary.length > targetLength ? truncateAtSentenceBoundary(summary, targetLength) : summary;\n\n log.info(\n {\n originalLength: text.length,\n summaryLength: finalSummary.length,\n durationMs: Date.now() - startTime,\n },\n 'Text summarized for TTS',\n );\n\n return {\n summary: finalSummary,\n originalLength: text.length,\n summaryLength: finalSummary.length,\n wasSummarized: true,\n };\n } catch (error) {\n const em = error instanceof Error ? error.message : String(error);\n log.warn({ errorMessage: em }, 'Summarization failed, falling back to truncation');\n return fallbackTruncate(text, targetLength);\n }\n}\n"],"mappings":";;;;;;gBAI6E;aAExB;AAGrD,MAAM,MAAM,aAAa,gBAAgB;AAEzC,MAAM,uBAAuB;AAE7B,MAAM,0BAA0B;;;;;;;;;;;AA2BhC,SAAS,sBAAsB,QAA4B,UAA+B;CACxF,MAAM,SAAS,QAAQ,IAAI,0BAA0B,MAAM;CAC3D,MAAM,MAAM,UAAU,MAAM,IAAI;AAChC,KAAI,IACF,KAAI;AACF,SAAO,aAAa,IAAI;SAClB;AAIV,MAAK,MAAM,aAAa,CAAC,uBAAuB,0BAA0B,CACxE,KAAI;AACF,SAAO,aAAa,UAAU;SACxB;AAIV,QAAO,aAAa,oBAAoB,OAAO,CAAC;;AAGlD,SAAS,iBAAiB,MAAc,WAAoC;CAC1E,MAAM,YAAY,2BAA2B,MAAM,UAAU;AAC7D,QAAO;EACL,SAAS;EACT,gBAAgB,KAAK;EACrB,eAAe,UAAU;EACzB,eAAe;EAChB;;;;;AAMH,eAAsB,gBAAgB,SAA2D;CAC/F,MAAM,EAAE,MAAM,cAAc,QAAQ,UAAU,WAAW;AAEzD,KAAI,KAAK,UAAU,aACjB,QAAO;EACL,SAAS;EACT,gBAAgB,KAAK;EACrB,eAAe,KAAK;EACpB,eAAe;EAChB;CAGH,MAAM,YAAY,KAAK,KAAK;AAE5B,KAAI;EACF,MAAM,QAAQ,sBAAsB,QAAQ,SAAS;EAUrD,MAAM,UAAuB;GAC3B,MAAM;GACN,SAAS,GAAG,wBAAwB,aAXnB;IACjB,8CAA8C,aAAa;IAC3D;IACA;IACA;IACA;IACA;IACD,CAAC,KAAK,KAIsD;GAC3D,WAAW,KAAK,KAAK;GACtB;EAED,MAAM,gBACJ,OAAO,gBAAgB,eAAe,OAAO,YAAY,YAAY,aACjE,YAAY,QAAQ,qBAAqB,GACzC,KAAA;EACN,MAAM,eACJ,UAAU,iBAAiB,OAAO,YAAY,QAAQ,aAClD,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,GACxC,UAAU;EAEhB,MAAM,SAAS,MAAM,gCACnB,OACA,EAAE,UAAU,CAAC,QAAQ,EAAE,EACvB;GACE,WAAW,KAAK,IAAI,KAAK,KAAK,eAAe,EAAE,EAAE,KAAK;GACtD,aAAa;GACb,QAAQ;GACT,CACF;EAED,IAAI,MAAM;AACV,MAAI,MAAM,QAAQ,OAAO,QAAQ;QAC1B,MAAM,KAAK,OAAO,QACrB,KAAI,KAAK,OAAO,MAAM,YAAa,EAAwB,SAAS,OAClE,QAAO,OAAQ,EAAwB,QAAQ,GAAG;;EAKxD,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAI,CAAC,SAAS;AACZ,OAAI,KAAK,qDAAqD;AAC9D,UAAO,iBAAiB,MAAM,aAAa;;EAG7C,MAAM,eACJ,QAAQ,SAAS,eAAe,2BAA2B,SAAS,aAAa,GAAG;AAEtF,MAAI,KACF;GACE,gBAAgB,KAAK;GACrB,eAAe,aAAa;GAC5B,YAAY,KAAK,KAAK,GAAG;GAC1B,EACD,0BACD;AAED,SAAO;GACL,SAAS;GACT,gBAAgB,KAAK;GACrB,eAAe,aAAa;GAC5B,eAAe;GAChB;UACM,OAAO;EACd,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,MAAI,KAAK,EAAE,cAAc,IAAI,EAAE,mDAAmD;AAClF,SAAO,iBAAiB,MAAM,aAAa"}
@@ -0,0 +1 @@
1
+ export * from './workflow-draft-store.js';
@@ -0,0 +1,2 @@
1
+ import { WorkflowDraftConflictError, WorkflowDraftStore } from "./workflow-draft-store.js";
2
+ export { WorkflowDraftConflictError, WorkflowDraftStore };