@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
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","names":[],"sources":["../../../src/auth/credentials.ts"],"sourcesContent":["import { readFile, mkdir, rm, readdir } from 'fs/promises';\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { join, dirname } from 'path';\nimport { createLogger } from '../utils/logger.js';\nimport { getApiKeyFromEnv } from '../providers/env-keys.js';\nimport {\n resolveCredentialsDir,\n resolveAuthProfilesPath,\n resolveAgentAuthProfilesPath,\n resolveOAuthPath,\n} from '../config/paths.js';\nimport type { Config } from '../config/schema.js';\n\nconst log = createLogger('Credentials');\nconst warnedExpiredOAuthTokens = new Set<string>();\n\n// ============================================\n// Types\n// ============================================\n\nexport type CredentialType = 'api_key' | 'oauth';\n\nexport interface ApiKeyProfile {\n type: 'api_key';\n provider: string;\n profileName?: string;\n envVar?: string | null;\n key: string | null;\n}\n\nexport interface OAuthToken {\n type: 'oauth';\n provider: string;\n access: string;\n refresh?: string;\n expiresAt?: number;\n scope?: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport type CredentialProfile = ApiKeyProfile;\n\nexport interface AuthProfilesFile {\n version: number;\n profiles: Record<string, ApiKeyProfile>;\n}\n\n// ============================================\n// Credential Resolver\n// ============================================\n\nexport interface CredentialResolverOptions {\n stateDir?: string;\n /** When set, per-agent auth profiles are read from `resolveAgentAuthProfilesPath(appConfig, agentId)`. */\n agentId?: string;\n /** Required when `agentId` is set. */\n appConfig?: Config;\n}\n\nexport class CredentialResolver {\n private readonly credentialsDir: string;\n private readonly agentId?: string;\n private readonly appConfig?: Config;\n\n constructor(options: CredentialResolverOptions = {}) {\n this.credentialsDir = options.stateDir\n ? join(options.stateDir, 'credentials')\n : resolveCredentialsDir();\n this.agentId = options.agentId;\n this.appConfig = options.appConfig;\n if (this.agentId && !this.appConfig) {\n throw new Error('CredentialResolver: appConfig is required when agentId is set');\n }\n }\n\n /**\n * Resolve API key for a provider\n * Priority: Agent private > Global > OAuth > Environment\n */\n async resolveApiKey(provider: string): Promise<string | null> {\n const normalizedProvider = provider.toLowerCase();\n\n // 1. Try agent private credentials\n if (this.agentId) {\n const agentKey = await this.loadFromAgentCredentials(normalizedProvider);\n if (agentKey) {\n log.debug({ provider, source: 'agent' }, 'Resolved API key from agent credentials');\n return agentKey;\n }\n }\n\n // 2. Try global credentials\n const globalKey = await this.loadFromGlobalCredentials(normalizedProvider);\n if (globalKey) {\n log.debug({ provider, source: 'global' }, 'Resolved API key from global credentials');\n return globalKey;\n }\n\n // 3. Try OAuth token (convert to Bearer)\n const oauthToken = await this.loadOAuthToken(normalizedProvider);\n if (oauthToken) {\n log.debug({ provider, source: 'oauth' }, 'Resolved API key from OAuth token');\n return oauthToken.access;\n }\n\n // 4. Environment variables (see `src/providers/env-keys.ts`)\n const envKey = getApiKeyFromEnv(normalizedProvider);\n if (envKey) {\n log.debug({ provider, source: 'env' }, 'Resolved API key from environment');\n return envKey;\n }\n\n return null;\n }\n\n /**\n * Check if a provider has credentials configured\n */\n async hasCredentials(provider: string): Promise<boolean> {\n const key = await this.resolveApiKey(provider);\n return key !== null;\n }\n\n /**\n * Which step in {@link resolveApiKey} would supply the key (no secret material).\n */\n async resolveApiKeySource(\n provider: string,\n ): Promise<'agent' | 'global' | 'oauth' | 'env' | null> {\n const normalizedProvider = provider.toLowerCase();\n\n if (this.agentId) {\n const agentKey = await this.loadFromAgentCredentials(normalizedProvider);\n if (agentKey) return 'agent';\n }\n\n const globalKey = await this.loadFromGlobalCredentials(normalizedProvider);\n if (globalKey) return 'global';\n\n const oauthToken = await this.loadOAuthToken(normalizedProvider);\n if (oauthToken) return 'oauth';\n\n if (getApiKeyFromEnv(normalizedProvider)) return 'env';\n\n return null;\n }\n\n /**\n * List all available credential profiles\n */\n async listProfiles(): Promise<Array<ApiKeyProfile & { id: string; source: 'agent' | 'global' }>> {\n const profiles: Array<ApiKeyProfile & { id: string; source: 'agent' | 'global' }> = [];\n\n // Global profiles\n const globalProfiles = await this.loadAuthProfilesFile();\n for (const [id, profile] of Object.entries(globalProfiles.profiles)) {\n profiles.push({ ...profile, id, source: 'global' });\n }\n\n // Agent private profiles\n if (this.agentId) {\n const agentProfiles = await this.loadAgentAuthProfilesFile();\n for (const [id, profile] of Object.entries(agentProfiles.profiles)) {\n profiles.push({ ...profile, id, source: 'agent' });\n }\n }\n\n return profiles;\n }\n\n /**\n * Plaintext API key from global auth profiles only (no env/oauth fallback).\n * Used by the gateway console reveal endpoint.\n */\n async revealGatewayStoredApiKey(provider: string): Promise<string | null> {\n const normalizedProvider = provider.toLowerCase();\n const profiles = await this.loadAuthProfilesFile();\n const profile = this.findProfileForProvider(profiles, normalizedProvider);\n const key = profile?.key?.trim();\n return key || null;\n }\n\n /**\n * Save an API key profile\n */\n async saveApiKey(\n provider: string,\n key: string,\n options: {\n profileName?: string;\n envVar?: string | null;\n agentPrivate?: boolean;\n } = {}\n ): Promise<void> {\n const normalizedProvider = provider.toLowerCase();\n const profileId = options.profileName\n ? `${normalizedProvider}:${options.profileName}`\n : `${normalizedProvider}:default`;\n\n const profile: ApiKeyProfile = {\n type: 'api_key',\n provider: normalizedProvider,\n profileName: options.profileName,\n envVar: options.envVar ?? null,\n key,\n };\n\n if (options.agentPrivate && this.agentId) {\n await this.saveAgentAuthProfile(profileId, profile);\n } else {\n await this.saveGlobalAuthProfile(profileId, profile);\n }\n\n log.info({ provider, profileId, agentPrivate: options.agentPrivate }, 'Saved API key');\n }\n\n /**\n * Delete a credential profile\n */\n async deleteProfile(profileId: string, options: { agentPrivate?: boolean } = {}): Promise<void> {\n if (options.agentPrivate && this.agentId) {\n await this.deleteAgentAuthProfile(profileId);\n } else {\n await this.deleteGlobalAuthProfile(profileId);\n }\n\n log.info({ profileId, agentPrivate: options.agentPrivate }, 'Deleted credential profile');\n }\n\n /**\n * Load OAuth token for a provider.\n */\n async loadOAuthToken(provider: string): Promise<OAuthToken | null> {\n const token = await this.loadOAuthTokenRecord(provider);\n if (!token) return null;\n\n if (token.expiresAt && token.expiresAt < Date.now()) {\n const warnKey = `${provider}:${token.expiresAt}`;\n if (!warnedExpiredOAuthTokens.has(warnKey)) {\n warnedExpiredOAuthTokens.add(warnKey);\n log.warn({ provider, expiresAt: token.expiresAt }, 'OAuth token is expired');\n }\n return null;\n }\n\n return token;\n }\n\n /**\n * Load the raw OAuth token record, including expired tokens for status UIs.\n */\n async loadOAuthTokenRecord(provider: string): Promise<OAuthToken | null> {\n const normalizedProvider = provider.toLowerCase();\n const oauthPath = resolveOAuthPath(normalizedProvider);\n\n try {\n const content = await readFile(oauthPath, 'utf-8');\n const token = JSON.parse(content) as OAuthToken;\n return token.provider === normalizedProvider ? token : null;\n } catch {\n return null;\n }\n }\n\n /**\n * List persisted OAuth tokens without exposing access/refresh values.\n */\n async listOAuthTokens(): Promise<Array<Omit<OAuthToken, 'access' | 'refresh'> & { hasAccess: boolean; hasRefresh: boolean }>> {\n const oauthDir = join(this.credentialsDir, 'oauth');\n let files: string[];\n try {\n files = await readdir(oauthDir);\n } catch {\n return [];\n }\n\n const tokens: Array<Omit<OAuthToken, 'access' | 'refresh'> & { hasAccess: boolean; hasRefresh: boolean }> = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n try {\n const content = await readFile(join(oauthDir, file), 'utf-8');\n const token = JSON.parse(content) as OAuthToken;\n if (token.type !== 'oauth' || !token.provider) continue;\n const { access, refresh, ...safe } = token;\n tokens.push({ ...safe, hasAccess: Boolean(access?.trim()), hasRefresh: Boolean(refresh?.trim()) });\n } catch {\n continue;\n }\n }\n return tokens.sort((a, b) => a.provider.localeCompare(b.provider));\n }\n\n /**\n * Save OAuth token for a provider.\n */\n async saveOAuthToken(provider: string, token: Omit<OAuthToken, 'type' | 'provider' | 'updatedAt'>): Promise<void> {\n const normalizedProvider = provider.toLowerCase();\n const oauthPath = resolveOAuthPath(normalizedProvider);\n\n await mkdir(dirname(oauthPath), { recursive: true });\n\n const fullToken: OAuthToken = {\n ...token,\n type: 'oauth',\n provider: normalizedProvider,\n updatedAt: new Date().toISOString(),\n };\n\n await writeTextAtomic(oauthPath, JSON.stringify(fullToken, null, 2));\n log.info({ provider: normalizedProvider }, 'Saved OAuth token');\n }\n\n /**\n * Delete the OAuth token persisted for a provider.\n */\n async deleteOAuthToken(provider: string): Promise<void> {\n const normalizedProvider = provider.toLowerCase();\n const oauthPath = resolveOAuthPath(normalizedProvider);\n await rm(oauthPath, { force: true });\n log.info({ provider: normalizedProvider }, 'Deleted OAuth token');\n }\n\n /**\n * Disconnect the default credential for a provider from local storage.\n */\n async deleteProviderCredential(provider: string): Promise<void> {\n const normalizedProvider = provider.toLowerCase();\n const file = await this.loadAuthProfilesFile();\n await mkdir(dirname(resolveAuthProfilesPath()), { recursive: true });\n for (const [profileId, profile] of Object.entries(file.profiles)) {\n if (profile.provider === normalizedProvider) {\n delete file.profiles[profileId];\n }\n }\n await writeTextAtomic(resolveAuthProfilesPath(), JSON.stringify(file, null, 2));\n await this.deleteOAuthToken(normalizedProvider);\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async loadFromAgentCredentials(provider: string): Promise<string | null> {\n if (!this.agentId) return null;\n\n const profiles = await this.loadAgentAuthProfilesFile();\n const profile = this.findProfileForProvider(profiles, provider);\n\n if (!profile) return null;\n if (profile.envVar) return this.loadFromEnv(profile.envVar) ?? profile.key;\n return profile.key;\n }\n\n private async loadFromGlobalCredentials(provider: string): Promise<string | null> {\n const profiles = await this.loadAuthProfilesFile();\n const profile = this.findProfileForProvider(profiles, provider);\n\n if (!profile) return null;\n if (profile.envVar) return this.loadFromEnv(profile.envVar) ?? profile.key;\n return profile.key;\n }\n\n private loadFromEnv(envVarName: string): string | null {\n return process.env[envVarName] || null;\n }\n\n private findProfileForProvider(\n file: AuthProfilesFile,\n provider: string\n ): ApiKeyProfile | null {\n const normalizedProvider = provider.toLowerCase();\n\n // Look for exact match first\n for (const [, profile] of Object.entries(file.profiles)) {\n if (profile.provider === normalizedProvider) {\n return profile;\n }\n }\n\n return null;\n }\n\n private async loadAuthProfilesFile(): Promise<AuthProfilesFile> {\n const path = resolveAuthProfilesPath();\n\n try {\n const content = await readFile(path, 'utf-8');\n const data = JSON.parse(content);\n return {\n version: data.version || 1,\n profiles: data.profiles || {},\n };\n } catch {\n return { version: 2, profiles: {} };\n }\n }\n\n private async loadAgentAuthProfilesFile(): Promise<AuthProfilesFile> {\n if (!this.agentId || !this.appConfig) return { version: 2, profiles: {} };\n\n const path = resolveAgentAuthProfilesPath(this.appConfig, this.agentId);\n\n try {\n const content = await readFile(path, 'utf-8');\n const data = JSON.parse(content);\n return {\n version: data.version || 1,\n profiles: data.profiles || {},\n };\n } catch {\n return { version: 2, profiles: {} };\n }\n }\n\n private async saveGlobalAuthProfile(profileId: string, profile: ApiKeyProfile): Promise<void> {\n const path = resolveAuthProfilesPath();\n await mkdir(dirname(path), { recursive: true });\n\n const file = await this.loadAuthProfilesFile();\n file.profiles[profileId] = profile;\n\n await writeTextAtomic(path, JSON.stringify(file, null, 2));\n }\n\n private async saveAgentAuthProfile(profileId: string, profile: ApiKeyProfile): Promise<void> {\n if (!this.agentId || !this.appConfig) throw new Error('Agent ID and appConfig required for agent-private profiles');\n\n const path = resolveAgentAuthProfilesPath(this.appConfig, this.agentId);\n await mkdir(dirname(path), { recursive: true });\n\n const file = await this.loadAgentAuthProfilesFile();\n file.profiles[profileId] = profile;\n\n await writeTextAtomic(path, JSON.stringify(file, null, 2));\n }\n\n private async deleteGlobalAuthProfile(profileId: string): Promise<void> {\n const path = resolveAuthProfilesPath();\n const file = await this.loadAuthProfilesFile();\n\n delete file.profiles[profileId];\n\n await writeTextAtomic(path, JSON.stringify(file, null, 2));\n }\n\n private async deleteAgentAuthProfile(profileId: string): Promise<void> {\n if (!this.agentId || !this.appConfig) throw new Error('Agent ID and appConfig required for agent-private profiles');\n\n const path = resolveAgentAuthProfilesPath(this.appConfig, this.agentId);\n const file = await this.loadAgentAuthProfilesFile();\n\n delete file.profiles[profileId];\n\n await writeTextAtomic(path, JSON.stringify(file, null, 2));\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\nlet defaultResolver: CredentialResolver | null = null;\n\nexport function getCredentialResolver(options?: CredentialResolverOptions): CredentialResolver {\n if (!defaultResolver || options) {\n return new CredentialResolver(options);\n }\n return defaultResolver;\n}\n\nexport async function resolveApiKey(provider: string, options?: CredentialResolverOptions): Promise<string | null> {\n const resolver = getCredentialResolver(options);\n return resolver.resolveApiKey(provider);\n}\n\nexport async function hasCredentials(provider: string, options?: CredentialResolverOptions): Promise<boolean> {\n const resolver = getCredentialResolver(options);\n return resolver.hasCredentials(provider);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","names":[],"sources":["../../../src/auth/credentials.ts"],"sourcesContent":["import { readFile, mkdir, rm, readdir } from 'fs/promises';\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { join, dirname } from 'path';\nimport { createLogger } from '../utils/logger.js';\nimport { getApiKeyFromEnv } from '../providers/env-keys.js';\nimport {\n resolveCredentialsDir,\n resolveAuthProfilesPath,\n resolveAgentAuthProfilesPath,\n resolveOAuthPath,\n} from '../config/paths.js';\nimport type { Config } from '../config/schema.js';\n\nconst log = createLogger('Credentials');\nconst warnedExpiredOAuthTokens = new Set<string>();\n\n// ============================================\n// Types\n// ============================================\n\nexport type CredentialType = 'api_key' | 'oauth';\n\nexport interface ApiKeyProfile {\n type: 'api_key';\n provider: string;\n profileName?: string;\n envVar?: string | null;\n key: string | null;\n}\n\nexport interface OAuthToken {\n type: 'oauth';\n provider: string;\n access: string;\n refresh?: string;\n expiresAt?: number;\n scope?: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport type CredentialProfile = ApiKeyProfile;\n\nexport interface AuthProfilesFile {\n version: number;\n profiles: Record<string, ApiKeyProfile>;\n}\n\n// ============================================\n// Credential Resolver\n// ============================================\n\nexport interface CredentialResolverOptions {\n stateDir?: string;\n /** When set, per-agent auth profiles are read from `resolveAgentAuthProfilesPath(appConfig, agentId)`. */\n agentId?: string;\n /** Required when `agentId` is set. */\n appConfig?: Config;\n}\n\nexport class CredentialResolver {\n private readonly credentialsDir: string;\n private readonly agentId?: string;\n private readonly appConfig?: Config;\n\n constructor(options: CredentialResolverOptions = {}) {\n this.credentialsDir = options.stateDir\n ? join(options.stateDir, 'credentials')\n : resolveCredentialsDir();\n this.agentId = options.agentId;\n this.appConfig = options.appConfig;\n if (this.agentId && !this.appConfig) {\n throw new Error('CredentialResolver: appConfig is required when agentId is set');\n }\n }\n\n /**\n * Resolve API key for a provider\n * Priority: Agent private > Global > OAuth > Environment\n */\n async resolveApiKey(provider: string): Promise<string | null> {\n const normalizedProvider = provider.toLowerCase();\n\n // 1. Try agent private credentials\n if (this.agentId) {\n const agentKey = await this.loadFromAgentCredentials(normalizedProvider);\n if (agentKey) {\n log.debug({ provider, source: 'agent' }, 'Resolved API key from agent credentials');\n return agentKey;\n }\n }\n\n // 2. Try global credentials\n const globalKey = await this.loadFromGlobalCredentials(normalizedProvider);\n if (globalKey) {\n log.debug({ provider, source: 'global' }, 'Resolved API key from global credentials');\n return globalKey;\n }\n\n // 3. Try OAuth token (convert to Bearer)\n const oauthToken = await this.loadOAuthToken(normalizedProvider);\n if (oauthToken) {\n log.debug({ provider, source: 'oauth' }, 'Resolved API key from OAuth token');\n return oauthToken.access;\n }\n\n // 4. Environment variables (see `src/providers/env-keys.ts`)\n const envKey = getApiKeyFromEnv(normalizedProvider);\n if (envKey) {\n log.debug({ provider, source: 'env' }, 'Resolved API key from environment');\n return envKey;\n }\n\n return null;\n }\n\n /**\n * Check if a provider has credentials configured\n */\n async hasCredentials(provider: string): Promise<boolean> {\n const key = await this.resolveApiKey(provider);\n return key !== null;\n }\n\n /**\n * Which step in {@link resolveApiKey} would supply the key (no secret material).\n */\n async resolveApiKeySource(\n provider: string,\n ): Promise<'agent' | 'global' | 'oauth' | 'env' | null> {\n const normalizedProvider = provider.toLowerCase();\n\n if (this.agentId) {\n const agentKey = await this.loadFromAgentCredentials(normalizedProvider);\n if (agentKey) return 'agent';\n }\n\n const globalKey = await this.loadFromGlobalCredentials(normalizedProvider);\n if (globalKey) return 'global';\n\n const oauthToken = await this.loadOAuthToken(normalizedProvider);\n if (oauthToken) return 'oauth';\n\n if (getApiKeyFromEnv(normalizedProvider)) return 'env';\n\n return null;\n }\n\n /**\n * List all available credential profiles\n */\n async listProfiles(): Promise<Array<ApiKeyProfile & { id: string; source: 'agent' | 'global' }>> {\n const profiles: Array<ApiKeyProfile & { id: string; source: 'agent' | 'global' }> = [];\n\n // Global profiles\n const globalProfiles = await this.loadAuthProfilesFile();\n for (const [id, profile] of Object.entries(globalProfiles.profiles)) {\n profiles.push({ ...profile, id, source: 'global' });\n }\n\n // Agent private profiles\n if (this.agentId) {\n const agentProfiles = await this.loadAgentAuthProfilesFile();\n for (const [id, profile] of Object.entries(agentProfiles.profiles)) {\n profiles.push({ ...profile, id, source: 'agent' });\n }\n }\n\n return profiles;\n }\n\n /**\n * Plaintext API key from global auth profiles only (no env/oauth fallback).\n * Used by the gateway console reveal endpoint.\n */\n async revealGatewayStoredApiKey(provider: string): Promise<string | null> {\n const normalizedProvider = provider.toLowerCase();\n const profiles = await this.loadAuthProfilesFile();\n const profile = this.findProfileForProvider(profiles, normalizedProvider);\n const key = profile?.key?.trim();\n return key || null;\n }\n\n /**\n * Save an API key profile\n */\n async saveApiKey(\n provider: string,\n key: string,\n options: {\n profileName?: string;\n envVar?: string | null;\n agentPrivate?: boolean;\n } = {}\n ): Promise<void> {\n const normalizedProvider = provider.toLowerCase();\n const profileId = options.profileName\n ? `${normalizedProvider}:${options.profileName}`\n : `${normalizedProvider}:default`;\n\n const profile: ApiKeyProfile = {\n type: 'api_key',\n provider: normalizedProvider,\n profileName: options.profileName,\n envVar: options.envVar ?? null,\n key,\n };\n\n if (options.agentPrivate && this.agentId) {\n await this.saveAgentAuthProfile(profileId, profile);\n } else {\n await this.saveGlobalAuthProfile(profileId, profile);\n }\n\n log.info({ provider, profileId, agentPrivate: options.agentPrivate }, 'Saved API key');\n }\n\n /**\n * Delete a credential profile\n */\n async deleteProfile(profileId: string, options: { agentPrivate?: boolean } = {}): Promise<void> {\n if (options.agentPrivate && this.agentId) {\n await this.deleteAgentAuthProfile(profileId);\n } else {\n await this.deleteGlobalAuthProfile(profileId);\n }\n\n log.info({ profileId, agentPrivate: options.agentPrivate }, 'Deleted credential profile');\n }\n\n /**\n * Load OAuth token for a provider.\n */\n async loadOAuthToken(provider: string): Promise<OAuthToken | null> {\n const token = await this.loadOAuthTokenRecord(provider);\n if (!token) return null;\n\n if (token.expiresAt && token.expiresAt < Date.now()) {\n const warnKey = `${provider}:${token.expiresAt}`;\n if (!warnedExpiredOAuthTokens.has(warnKey)) {\n warnedExpiredOAuthTokens.add(warnKey);\n log.warn({ provider, expiresAt: token.expiresAt }, 'OAuth token is expired');\n }\n return null;\n }\n\n return token;\n }\n\n /**\n * Load the raw OAuth token record, including expired tokens for status UIs.\n */\n async loadOAuthTokenRecord(provider: string): Promise<OAuthToken | null> {\n const normalizedProvider = provider.toLowerCase();\n const oauthPath = resolveOAuthPath(normalizedProvider);\n\n try {\n const content = await readFile(oauthPath, 'utf-8');\n const token = JSON.parse(content) as OAuthToken;\n return token.provider === normalizedProvider ? token : null;\n } catch {\n return null;\n }\n }\n\n /**\n * List persisted OAuth tokens without exposing access/refresh values.\n */\n async listOAuthTokens(): Promise<Array<Omit<OAuthToken, 'access' | 'refresh'> & { hasAccess: boolean; hasRefresh: boolean }>> {\n const oauthDir = join(this.credentialsDir, 'oauth');\n let files: string[];\n try {\n files = await readdir(oauthDir);\n } catch {\n return [];\n }\n\n const tokens: Array<Omit<OAuthToken, 'access' | 'refresh'> & { hasAccess: boolean; hasRefresh: boolean }> = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n try {\n const content = await readFile(join(oauthDir, file), 'utf-8');\n const token = JSON.parse(content) as OAuthToken;\n if (token.type !== 'oauth' || !token.provider) continue;\n const { access, refresh, ...safe } = token;\n tokens.push({ ...safe, hasAccess: Boolean(access?.trim()), hasRefresh: Boolean(refresh?.trim()) });\n } catch {\n continue;\n }\n }\n return tokens.sort((a, b) => a.provider.localeCompare(b.provider));\n }\n\n /**\n * Save OAuth token for a provider.\n */\n async saveOAuthToken(provider: string, token: Omit<OAuthToken, 'type' | 'provider' | 'updatedAt'>): Promise<void> {\n const normalizedProvider = provider.toLowerCase();\n const oauthPath = resolveOAuthPath(normalizedProvider);\n\n await mkdir(dirname(oauthPath), { recursive: true });\n\n const fullToken: OAuthToken = {\n ...token,\n type: 'oauth',\n provider: normalizedProvider,\n updatedAt: new Date().toISOString(),\n };\n\n await writeTextAtomic(oauthPath, JSON.stringify(fullToken, null, 2));\n log.info({ provider: normalizedProvider }, 'Saved OAuth token');\n }\n\n /**\n * Delete the OAuth token persisted for a provider.\n */\n async deleteOAuthToken(provider: string): Promise<void> {\n const normalizedProvider = provider.toLowerCase();\n const oauthPath = resolveOAuthPath(normalizedProvider);\n await rm(oauthPath, { force: true });\n log.info({ provider: normalizedProvider }, 'Deleted OAuth token');\n }\n\n /**\n * Disconnect the default credential for a provider from local storage.\n */\n async deleteProviderCredential(provider: string): Promise<void> {\n const normalizedProvider = provider.toLowerCase();\n const file = await this.loadAuthProfilesFile();\n await mkdir(dirname(resolveAuthProfilesPath()), { recursive: true });\n for (const [profileId, profile] of Object.entries(file.profiles)) {\n if (profile.provider === normalizedProvider) {\n delete file.profiles[profileId];\n }\n }\n await writeTextAtomic(resolveAuthProfilesPath(), JSON.stringify(file, null, 2));\n await this.deleteOAuthToken(normalizedProvider);\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async loadFromAgentCredentials(provider: string): Promise<string | null> {\n if (!this.agentId) return null;\n\n const profiles = await this.loadAgentAuthProfilesFile();\n const profile = this.findProfileForProvider(profiles, provider);\n\n if (!profile) return null;\n if (profile.envVar) return this.loadFromEnv(profile.envVar) ?? profile.key;\n return profile.key;\n }\n\n private async loadFromGlobalCredentials(provider: string): Promise<string | null> {\n const profiles = await this.loadAuthProfilesFile();\n const profile = this.findProfileForProvider(profiles, provider);\n\n if (!profile) return null;\n if (profile.envVar) return this.loadFromEnv(profile.envVar) ?? profile.key;\n return profile.key;\n }\n\n private loadFromEnv(envVarName: string): string | null {\n return process.env[envVarName] || null;\n }\n\n private findProfileForProvider(\n file: AuthProfilesFile,\n provider: string\n ): ApiKeyProfile | null {\n const normalizedProvider = provider.toLowerCase();\n\n // Look for exact match first\n for (const [, profile] of Object.entries(file.profiles)) {\n if (profile.provider === normalizedProvider) {\n return profile;\n }\n }\n\n return null;\n }\n\n private async loadAuthProfilesFile(): Promise<AuthProfilesFile> {\n const path = resolveAuthProfilesPath();\n\n try {\n const content = await readFile(path, 'utf-8');\n const data = JSON.parse(content);\n return {\n version: data.version || 1,\n profiles: data.profiles || {},\n };\n } catch {\n return { version: 2, profiles: {} };\n }\n }\n\n private async loadAgentAuthProfilesFile(): Promise<AuthProfilesFile> {\n if (!this.agentId || !this.appConfig) return { version: 2, profiles: {} };\n\n const path = resolveAgentAuthProfilesPath(this.appConfig, this.agentId);\n\n try {\n const content = await readFile(path, 'utf-8');\n const data = JSON.parse(content);\n return {\n version: data.version || 1,\n profiles: data.profiles || {},\n };\n } catch {\n return { version: 2, profiles: {} };\n }\n }\n\n private async saveGlobalAuthProfile(profileId: string, profile: ApiKeyProfile): Promise<void> {\n const path = resolveAuthProfilesPath();\n await mkdir(dirname(path), { recursive: true });\n\n const file = await this.loadAuthProfilesFile();\n file.profiles[profileId] = profile;\n\n await writeTextAtomic(path, JSON.stringify(file, null, 2));\n }\n\n private async saveAgentAuthProfile(profileId: string, profile: ApiKeyProfile): Promise<void> {\n if (!this.agentId || !this.appConfig) throw new Error('Agent ID and appConfig required for agent-private profiles');\n\n const path = resolveAgentAuthProfilesPath(this.appConfig, this.agentId);\n await mkdir(dirname(path), { recursive: true });\n\n const file = await this.loadAgentAuthProfilesFile();\n file.profiles[profileId] = profile;\n\n await writeTextAtomic(path, JSON.stringify(file, null, 2));\n }\n\n private async deleteGlobalAuthProfile(profileId: string): Promise<void> {\n const path = resolveAuthProfilesPath();\n const file = await this.loadAuthProfilesFile();\n\n delete file.profiles[profileId];\n\n await writeTextAtomic(path, JSON.stringify(file, null, 2));\n }\n\n private async deleteAgentAuthProfile(profileId: string): Promise<void> {\n if (!this.agentId || !this.appConfig) throw new Error('Agent ID and appConfig required for agent-private profiles');\n\n const path = resolveAgentAuthProfilesPath(this.appConfig, this.agentId);\n const file = await this.loadAgentAuthProfilesFile();\n\n delete file.profiles[profileId];\n\n await writeTextAtomic(path, JSON.stringify(file, null, 2));\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\nlet defaultResolver: CredentialResolver | null = null;\n\nexport function getCredentialResolver(options?: CredentialResolverOptions): CredentialResolver {\n if (options) return new CredentialResolver(options);\n defaultResolver ??= new CredentialResolver();\n return defaultResolver;\n}\n\nexport async function resolveApiKey(provider: string, options?: CredentialResolverOptions): Promise<string | null> {\n const resolver = getCredentialResolver(options);\n return resolver.resolveApiKey(provider);\n}\n\nexport async function hasCredentials(provider: string, options?: CredentialResolverOptions): Promise<boolean> {\n const resolver = getCredentialResolver(options);\n return resolver.hasCredentials(provider);\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- /**
2
- * GitHub Copilot OAuth device code flow.
3
- */
4
- export { githubCopilotOAuthProvider, getGitHubCopilotBaseUrl, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken, } from '@earendil-works/pi-ai/oauth';
1
+ /** GitHub Copilot OAuth adapter for pi-ai's provider-auth API. */
2
+ import type { OAuthProviderInterface } from './types.js';
3
+ export declare const githubCopilotOAuthProvider: OAuthProviderInterface;
@@ -1,2 +1,66 @@
1
- import { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken } from "@earendil-works/pi-ai/oauth";
2
- export { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken };
1
+ import { githubCopilotProvider } from "@earendil-works/pi-ai/providers/github-copilot";
2
+ //#region src/auth/oauth/github-copilot.ts
3
+ /** GitHub Copilot OAuth adapter for pi-ai's provider-auth API. */
4
+ function getCopilotOAuth() {
5
+ const oauth = githubCopilotProvider().auth.oauth;
6
+ if (!oauth) throw new Error("GitHub Copilot OAuth is unavailable");
7
+ return oauth;
8
+ }
9
+ function toPiCredential(credentials) {
10
+ return {
11
+ ...credentials,
12
+ type: "oauth"
13
+ };
14
+ }
15
+ function fromPiCredential({ type: _type, ...credentials }) {
16
+ return credentials;
17
+ }
18
+ function toAuthInteraction(callbacks) {
19
+ return {
20
+ signal: callbacks.signal,
21
+ async prompt(prompt) {
22
+ if (prompt.type === "select") return await callbacks.onSelect({
23
+ message: prompt.message,
24
+ options: [...prompt.options].map(({ id, label }) => ({
25
+ id,
26
+ label
27
+ }))
28
+ }) ?? "";
29
+ return callbacks.onPrompt({
30
+ message: prompt.message,
31
+ placeholder: prompt.placeholder
32
+ });
33
+ },
34
+ notify(event) {
35
+ if (event.type === "auth_url") callbacks.onAuth({
36
+ url: event.url,
37
+ instructions: event.instructions
38
+ });
39
+ else if (event.type === "device_code") callbacks.onDeviceCode({
40
+ userCode: event.userCode,
41
+ verificationUri: event.verificationUri,
42
+ intervalSeconds: event.intervalSeconds,
43
+ expiresInSeconds: event.expiresInSeconds
44
+ });
45
+ else if (event.type === "progress" || event.type === "info") callbacks.onProgress?.(event.message);
46
+ }
47
+ };
48
+ }
49
+ const githubCopilotOAuthProvider = {
50
+ id: "github-copilot",
51
+ name: "GitHub Copilot",
52
+ usesCallbackServer: false,
53
+ async login(callbacks) {
54
+ return fromPiCredential(await getCopilotOAuth().login(toAuthInteraction(callbacks)));
55
+ },
56
+ async refreshToken(credentials) {
57
+ return fromPiCredential(await getCopilotOAuth().refresh(toPiCredential(credentials)));
58
+ },
59
+ getApiKey(credentials) {
60
+ return credentials.access;
61
+ }
62
+ };
63
+ //#endregion
64
+ export { githubCopilotOAuthProvider };
65
+
66
+ //# sourceMappingURL=github-copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-copilot.js","names":[],"sources":["../../../../src/auth/oauth/github-copilot.ts"],"sourcesContent":["/** GitHub Copilot OAuth adapter for pi-ai's provider-auth API. */\n\nimport { githubCopilotProvider } from '@earendil-works/pi-ai/providers/github-copilot';\nimport type { AuthInteraction, OAuthAuth, OAuthCredential } from '@earendil-works/pi-ai';\n\nimport type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface } from './types.js';\n\nfunction getCopilotOAuth(): OAuthAuth {\n const oauth = githubCopilotProvider().auth.oauth;\n if (!oauth) {\n throw new Error('GitHub Copilot OAuth is unavailable');\n }\n return oauth;\n}\n\nfunction toPiCredential(credentials: OAuthCredentials): OAuthCredential {\n return { ...credentials, type: 'oauth' };\n}\n\nfunction fromPiCredential({ type: _type, ...credentials }: OAuthCredential): OAuthCredentials {\n return credentials;\n}\n\nfunction toAuthInteraction(callbacks: OAuthLoginCallbacks): AuthInteraction {\n return {\n signal: callbacks.signal,\n async prompt(prompt) {\n if (prompt.type === 'select') {\n return (await callbacks.onSelect({\n message: prompt.message,\n options: [...prompt.options].map(({ id, label }) => ({ id, label })),\n })) ?? '';\n }\n return callbacks.onPrompt({\n message: prompt.message,\n placeholder: prompt.placeholder,\n });\n },\n notify(event) {\n if (event.type === 'auth_url') {\n callbacks.onAuth({ url: event.url, instructions: event.instructions });\n } else if (event.type === 'device_code') {\n callbacks.onDeviceCode({\n userCode: event.userCode,\n verificationUri: event.verificationUri,\n intervalSeconds: event.intervalSeconds,\n expiresInSeconds: event.expiresInSeconds,\n });\n } else if (event.type === 'progress' || event.type === 'info') {\n callbacks.onProgress?.(event.message);\n }\n },\n };\n}\n\nexport const githubCopilotOAuthProvider: OAuthProviderInterface = {\n id: 'github-copilot',\n name: 'GitHub Copilot',\n usesCallbackServer: false,\n async login(callbacks) {\n return fromPiCredential(await getCopilotOAuth().login(toAuthInteraction(callbacks)));\n },\n async refreshToken(credentials) {\n return fromPiCredential(await getCopilotOAuth().refresh(toPiCredential(credentials)));\n },\n getApiKey(credentials) {\n return credentials.access;\n },\n};\n"],"mappings":";;;AAOA,SAAS,kBAA6B;CACpC,MAAM,QAAQ,uBAAuB,CAAC,KAAK;AAC3C,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,sCAAsC;AAExD,QAAO;;AAGT,SAAS,eAAe,aAAgD;AACtE,QAAO;EAAE,GAAG;EAAa,MAAM;EAAS;;AAG1C,SAAS,iBAAiB,EAAE,MAAM,OAAO,GAAG,eAAkD;AAC5F,QAAO;;AAGT,SAAS,kBAAkB,WAAiD;AAC1E,QAAO;EACL,QAAQ,UAAU;EAClB,MAAM,OAAO,QAAQ;AACnB,OAAI,OAAO,SAAS,SAClB,QAAQ,MAAM,UAAU,SAAS;IAC/B,SAAS,OAAO;IAChB,SAAS,CAAC,GAAG,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,aAAa;KAAE;KAAI;KAAO,EAAE;IACrE,CAAC,IAAK;AAET,UAAO,UAAU,SAAS;IACxB,SAAS,OAAO;IAChB,aAAa,OAAO;IACrB,CAAC;;EAEJ,OAAO,OAAO;AACZ,OAAI,MAAM,SAAS,WACjB,WAAU,OAAO;IAAE,KAAK,MAAM;IAAK,cAAc,MAAM;IAAc,CAAC;YAC7D,MAAM,SAAS,cACxB,WAAU,aAAa;IACrB,UAAU,MAAM;IAChB,iBAAiB,MAAM;IACvB,iBAAiB,MAAM;IACvB,kBAAkB,MAAM;IACzB,CAAC;YACO,MAAM,SAAS,cAAc,MAAM,SAAS,OACrD,WAAU,aAAa,MAAM,QAAQ;;EAG1C;;AAGH,MAAa,6BAAqD;CAChE,IAAI;CACJ,MAAM;CACN,oBAAoB;CACpB,MAAM,MAAM,WAAW;AACrB,SAAO,iBAAiB,MAAM,iBAAiB,CAAC,MAAM,kBAAkB,UAAU,CAAC,CAAC;;CAEtF,MAAM,aAAa,aAAa;AAC9B,SAAO,iBAAiB,MAAM,iBAAiB,CAAC,QAAQ,eAAe,YAAY,CAAC,CAAC;;CAEvF,UAAU,aAAa;AACrB,SAAO,YAAY;;CAEtB"}
@@ -2,10 +2,10 @@ import { anthropicOAuthProvider, loginAnthropic, refreshAnthropicToken } from ".
2
2
  import { minimaxOAuthProvider } from "./minimax.js";
3
3
  import { minimaxCnOAuthProvider } from "./minimax-cn.js";
4
4
  import { kimiCodingOAuthProvider } from "./kimi-coding.js";
5
- import { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken } from "./github-copilot.js";
5
+ import { githubCopilotOAuthProvider } from "./github-copilot.js";
6
6
  import { geminiCliOAuthProvider, loginGeminiCli, refreshGoogleCloudToken } from "./google-oauth/google-gemini-cli.js";
7
7
  import "./google-gemini-cli.js";
8
8
  import { antigravityOAuthProvider, loginAntigravity, refreshAntigravityToken } from "./google-oauth/google-antigravity.js";
9
9
  import "./google-antigravity.js";
10
10
  import { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from "./openai-codex.js";
11
- export { anthropicOAuthProvider, getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, antigravityOAuthProvider as googleAntigravityOAuthProvider, geminiCliOAuthProvider as googleGeminiCliOAuthProvider, kimiCodingOAuthProvider, loginAnthropic, loginAntigravity, loginGeminiCli, loginGitHubCopilot, loginOpenAICodex, minimaxCnOAuthProvider, minimaxOAuthProvider, normalizeDomain, openaiCodexOAuthProvider, refreshAnthropicToken, refreshAntigravityToken, refreshGitHubCopilotToken, refreshGoogleCloudToken, refreshOpenAICodexToken };
11
+ export { anthropicOAuthProvider, githubCopilotOAuthProvider, antigravityOAuthProvider as googleAntigravityOAuthProvider, geminiCliOAuthProvider as googleGeminiCliOAuthProvider, kimiCodingOAuthProvider, loginAnthropic, loginAntigravity, loginGeminiCli, loginOpenAICodex, minimaxCnOAuthProvider, minimaxOAuthProvider, openaiCodexOAuthProvider, refreshAnthropicToken, refreshAntigravityToken, refreshGoogleCloudToken, refreshOpenAICodexToken };
@@ -1,5 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { resolveAutomationSafetyForTrust } from "../../user-context/trust-policy.js";
4
+ import { getUserTrustPolicy } from "../../storage/sqlite/user-trust-repository.js";
5
+ import "../../storage/sqlite/index.js";
3
6
  import { init_agent_scope, resolveDefaultAgentId } from "../../agent/agent-scope.js";
4
7
  import { AutomationAlreadyRunningError } from "../service/automation-service.js";
5
8
  import { logRouteError } from "../../gateway/hono/lib/route-logger.js";
@@ -52,7 +55,16 @@ function registerAutomationRoutes(authenticated, deps) {
52
55
  agentId,
53
56
  language: body?.language === "zh" ? "zh" : "en"
54
57
  }, c.req.raw.signal);
55
- return c.json({ draft }, 201);
58
+ const safetyMode = resolveAutomationSafetyForTrust(getUserTrustPolicy().defaultActionLevel, draft.automation.safety?.mode);
59
+ const trustedDraft = {
60
+ ...draft,
61
+ automation: {
62
+ ...draft.automation,
63
+ safety: { mode: safetyMode }
64
+ }
65
+ };
66
+ trustedDraft.simulation = simulateAutomation(trustedDraft.automation);
67
+ return c.json({ draft: trustedDraft }, 201);
56
68
  } catch (err) {
57
69
  logRouteError(log, c, err, "gateway.route.automations", { operation: "draft" });
58
70
  return c.json({ error: err instanceof Error ? err.message : "Failed to create automation draft" }, 400);
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","names":[],"sources":["../../../../src/automations/api/routes.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { resolveDefaultAgentId } from '../../agent/agent-scope.js';\nimport type { AuthenticatedRouteDeps } from '../../gateway/hono/routes/deps.js';\nimport { logRouteError } from '../../gateway/hono/lib/route-logger.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { AutomationDraftService, simulateAutomation } from '../draft/index.js';\nimport type { CreateAutomationInput } from '../domain/validation.js';\nimport { AutomationAlreadyRunningError } from '../service/automation-service.js';\n\nconst log = createLogger('Gateway:Automations');\n\nfunction parseLimit(raw: string | undefined, fallback: number): number {\n const parsed = raw ? Number.parseInt(raw, 10) : fallback;\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction parseProjectId(raw: string | undefined): string | undefined {\n const trimmed = raw?.trim();\n return trimmed || undefined;\n}\n\nexport function registerAutomationRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/automations', async (c) => {\n const projectId = parseProjectId(c.req.query('projectId'));\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const automations = await service.automationServiceInstance.list({ projectId });\n return c.json({ automations });\n });\n\n authenticated.post('/api/automations', async (c) => {\n try {\n const body = await c.req.json() as CreateAutomationInput;\n if (body.projectId && !service.projects.get(body.projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const automation = await service.automationServiceInstance.create(body);\n return c.json({ automation }, 201);\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'create' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to create automation' }, 400);\n }\n });\n\n authenticated.get('/api/automations/metrics', async (c) => {\n const metrics = await service.automationServiceInstance.getMetrics();\n return c.json(metrics);\n });\n\n authenticated.post('/api/automations/draft', async (c) => {\n const body = await c.req.json().catch(() => null) as {\n prompt?: unknown;\n agentId?: unknown;\n language?: unknown;\n } | null;\n const prompt = typeof body?.prompt === 'string' ? body.prompt.trim() : '';\n if (!prompt) return c.json({ error: 'prompt is required' }, 400);\n const agentId = typeof body?.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(service.currentConfig);\n const draftService = new AutomationDraftService({ config: service.currentConfig });\n try {\n const draft = await draftService.createDraft({\n prompt,\n agentId,\n language: body?.language === 'zh' ? 'zh' : 'en',\n }, c.req.raw.signal);\n return c.json({ draft }, 201);\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'draft' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to create automation draft' }, 400);\n }\n });\n\n authenticated.post('/api/automations/simulate', async (c) => {\n try {\n const body = await c.req.json() as CreateAutomationInput;\n return c.json({ simulation: simulateAutomation(body) });\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'simulate' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to simulate automation' }, 400);\n }\n });\n\n authenticated.get('/api/automation-runs', async (c) => {\n const automationId = c.req.query('automationId')?.trim();\n const projectId = parseProjectId(c.req.query('projectId'));\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const runs = await service.automationServiceInstance.listRuns({\n automationId: automationId || undefined,\n projectId: automationId ? undefined : projectId,\n limit: parseLimit(c.req.query('limit'), 50),\n });\n return c.json({ runs });\n });\n\n authenticated.get('/api/automation-runs/product-events', async (c) => {\n const eventType = c.req.query('eventType')?.trim();\n if (!eventType) return c.json({ error: 'eventType is required' }, 400);\n const payloadKey = c.req.query('payloadKey')?.trim();\n const payloadValue = c.req.query('payloadValue')?.trim();\n const items = await service.automationServiceInstance.listRunsForProductEvent({\n eventType,\n source: c.req.query('source')?.trim() || undefined,\n payloadKey: payloadKey || undefined,\n payloadValue: payloadValue || undefined,\n limit: parseLimit(c.req.query('limit'), 10),\n });\n return c.json({ items });\n });\n\n authenticated.get('/api/automation-runs/:runId', async (c) => {\n const run = await service.automationServiceInstance.getRun(c.req.param('runId'));\n if (!run) return c.json({ error: 'Run not found' }, 404);\n return c.json({ run });\n });\n\n authenticated.get('/api/automation-runs/:runId/events', async (c) => {\n const runId = c.req.param('runId');\n const run = await service.automationServiceInstance.getRun(runId);\n if (!run) return c.json({ error: 'Run not found' }, 404);\n const events = await service.automationServiceInstance.listRunEvents(runId);\n return c.json({ events });\n });\n\n authenticated.post('/api/automation-runs/:runId/rerun', async (c) => {\n try {\n const run = await service.automationServiceInstance.rerunFromRun(c.req.param('runId'));\n return c.json({ run }, 201);\n } catch (err) {\n if (err instanceof AutomationAlreadyRunningError) {\n return c.json({\n error: err.message,\n code: 'automation_already_running',\n automationId: err.automationId,\n runningRunId: err.runningRunId,\n }, 409);\n }\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'rerun' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to rerun automation' }, 400);\n }\n });\n\n authenticated.post('/api/automation-runs/:runId/repair-draft', async (c) => {\n const runId = c.req.param('runId');\n const run = await service.automationServiceInstance.getRun(runId);\n if (!run) return c.json({ error: 'Run not found' }, 404);\n if (!['failed', 'timeout', 'cancelled'].includes(run.status)) {\n return c.json({ error: 'Repair draft is only available for failed, timed out, or cancelled runs' }, 400);\n }\n const automation = await service.automationServiceInstance.get(run.automationId);\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n const body = await c.req.json().catch(() => null) as { agentId?: unknown; language?: unknown } | null;\n const agentId = typeof body?.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(service.currentConfig);\n const events = await service.automationServiceInstance.listRunEvents(runId);\n const draftService = new AutomationDraftService({ config: service.currentConfig });\n try {\n const repair = await draftService.createRepairDraft({\n agentId,\n automation,\n run,\n events,\n language: body?.language === 'zh' ? 'zh' : 'en',\n }, c.req.raw.signal);\n return c.json({ repair }, 201);\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'repairDraft' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to create automation repair draft' }, 400);\n }\n });\n\n authenticated.post('/api/automation-runs/:runId/cancel', async (c) => {\n const cancelled = await service.automationServiceInstance.cancelRun(c.req.param('runId'));\n return c.json({ cancelled });\n });\n\n authenticated.get('/api/automations/:id', async (c) => {\n const automation = await service.automationServiceInstance.get(c.req.param('id'));\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n return c.json({ automation });\n });\n\n authenticated.patch('/api/automations/:id', async (c) => {\n try {\n const patch = await c.req.json() as Partial<CreateAutomationInput> & { enabled?: boolean };\n if (patch.projectId && !service.projects.get(patch.projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const automation = await service.automationServiceInstance.update(c.req.param('id'), patch);\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n return c.json({ automation });\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'update' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to update automation' }, 400);\n }\n });\n\n authenticated.delete('/api/automations/:id', async (c) => {\n const removed = await service.automationServiceInstance.remove(c.req.param('id'));\n return c.json({ removed });\n });\n\n authenticated.post('/api/automations/:id/run', async (c) => {\n try {\n const run = await service.automationServiceInstance.runNow(c.req.param('id'));\n return c.json({ run });\n } catch (err) {\n if (err instanceof AutomationAlreadyRunningError) {\n return c.json({\n error: err.message,\n code: 'automation_already_running',\n automationId: err.automationId,\n runningRunId: err.runningRunId,\n }, 409);\n }\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'run' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to run automation' }, 400);\n }\n });\n\n authenticated.post('/api/automations/:id/pause', async (c) => {\n const automation = await service.automationServiceInstance.pause(c.req.param('id'));\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n return c.json({ automation });\n });\n\n authenticated.post('/api/automations/:id/resume', async (c) => {\n const automation = await service.automationServiceInstance.resume(c.req.param('id'));\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n return c.json({ automation });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","names":[],"sources":["../../../../src/automations/api/routes.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { resolveDefaultAgentId } from '../../agent/agent-scope.js';\nimport type { AuthenticatedRouteDeps } from '../../gateway/hono/routes/deps.js';\nimport { logRouteError } from '../../gateway/hono/lib/route-logger.js';\nimport { getUserTrustPolicy } from '../../storage/sqlite/index.js';\nimport { resolveAutomationSafetyForTrust } from '../../user-context/trust-policy.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { AutomationDraftService, simulateAutomation } from '../draft/index.js';\nimport type { CreateAutomationInput } from '../domain/validation.js';\nimport { AutomationAlreadyRunningError } from '../service/automation-service.js';\n\nconst log = createLogger('Gateway:Automations');\n\nfunction parseLimit(raw: string | undefined, fallback: number): number {\n const parsed = raw ? Number.parseInt(raw, 10) : fallback;\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction parseProjectId(raw: string | undefined): string | undefined {\n const trimmed = raw?.trim();\n return trimmed || undefined;\n}\n\nexport function registerAutomationRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/automations', async (c) => {\n const projectId = parseProjectId(c.req.query('projectId'));\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const automations = await service.automationServiceInstance.list({ projectId });\n return c.json({ automations });\n });\n\n authenticated.post('/api/automations', async (c) => {\n try {\n const body = await c.req.json() as CreateAutomationInput;\n if (body.projectId && !service.projects.get(body.projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const automation = await service.automationServiceInstance.create(body);\n return c.json({ automation }, 201);\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'create' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to create automation' }, 400);\n }\n });\n\n authenticated.get('/api/automations/metrics', async (c) => {\n const metrics = await service.automationServiceInstance.getMetrics();\n return c.json(metrics);\n });\n\n authenticated.post('/api/automations/draft', async (c) => {\n const body = await c.req.json().catch(() => null) as {\n prompt?: unknown;\n agentId?: unknown;\n language?: unknown;\n } | null;\n const prompt = typeof body?.prompt === 'string' ? body.prompt.trim() : '';\n if (!prompt) return c.json({ error: 'prompt is required' }, 400);\n const agentId = typeof body?.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(service.currentConfig);\n const draftService = new AutomationDraftService({ config: service.currentConfig });\n try {\n const draft = await draftService.createDraft({\n prompt,\n agentId,\n language: body?.language === 'zh' ? 'zh' : 'en',\n }, c.req.raw.signal);\n const safetyMode = resolveAutomationSafetyForTrust(\n getUserTrustPolicy().defaultActionLevel,\n draft.automation.safety?.mode,\n );\n const trustedDraft = {\n ...draft,\n automation: { ...draft.automation, safety: { mode: safetyMode } },\n };\n trustedDraft.simulation = simulateAutomation(trustedDraft.automation);\n return c.json({ draft: trustedDraft }, 201);\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'draft' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to create automation draft' }, 400);\n }\n });\n\n authenticated.post('/api/automations/simulate', async (c) => {\n try {\n const body = await c.req.json() as CreateAutomationInput;\n return c.json({ simulation: simulateAutomation(body) });\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'simulate' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to simulate automation' }, 400);\n }\n });\n\n authenticated.get('/api/automation-runs', async (c) => {\n const automationId = c.req.query('automationId')?.trim();\n const projectId = parseProjectId(c.req.query('projectId'));\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const runs = await service.automationServiceInstance.listRuns({\n automationId: automationId || undefined,\n projectId: automationId ? undefined : projectId,\n limit: parseLimit(c.req.query('limit'), 50),\n });\n return c.json({ runs });\n });\n\n authenticated.get('/api/automation-runs/product-events', async (c) => {\n const eventType = c.req.query('eventType')?.trim();\n if (!eventType) return c.json({ error: 'eventType is required' }, 400);\n const payloadKey = c.req.query('payloadKey')?.trim();\n const payloadValue = c.req.query('payloadValue')?.trim();\n const items = await service.automationServiceInstance.listRunsForProductEvent({\n eventType,\n source: c.req.query('source')?.trim() || undefined,\n payloadKey: payloadKey || undefined,\n payloadValue: payloadValue || undefined,\n limit: parseLimit(c.req.query('limit'), 10),\n });\n return c.json({ items });\n });\n\n authenticated.get('/api/automation-runs/:runId', async (c) => {\n const run = await service.automationServiceInstance.getRun(c.req.param('runId'));\n if (!run) return c.json({ error: 'Run not found' }, 404);\n return c.json({ run });\n });\n\n authenticated.get('/api/automation-runs/:runId/events', async (c) => {\n const runId = c.req.param('runId');\n const run = await service.automationServiceInstance.getRun(runId);\n if (!run) return c.json({ error: 'Run not found' }, 404);\n const events = await service.automationServiceInstance.listRunEvents(runId);\n return c.json({ events });\n });\n\n authenticated.post('/api/automation-runs/:runId/rerun', async (c) => {\n try {\n const run = await service.automationServiceInstance.rerunFromRun(c.req.param('runId'));\n return c.json({ run }, 201);\n } catch (err) {\n if (err instanceof AutomationAlreadyRunningError) {\n return c.json({\n error: err.message,\n code: 'automation_already_running',\n automationId: err.automationId,\n runningRunId: err.runningRunId,\n }, 409);\n }\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'rerun' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to rerun automation' }, 400);\n }\n });\n\n authenticated.post('/api/automation-runs/:runId/repair-draft', async (c) => {\n const runId = c.req.param('runId');\n const run = await service.automationServiceInstance.getRun(runId);\n if (!run) return c.json({ error: 'Run not found' }, 404);\n if (!['failed', 'timeout', 'cancelled'].includes(run.status)) {\n return c.json({ error: 'Repair draft is only available for failed, timed out, or cancelled runs' }, 400);\n }\n const automation = await service.automationServiceInstance.get(run.automationId);\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n const body = await c.req.json().catch(() => null) as { agentId?: unknown; language?: unknown } | null;\n const agentId = typeof body?.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(service.currentConfig);\n const events = await service.automationServiceInstance.listRunEvents(runId);\n const draftService = new AutomationDraftService({ config: service.currentConfig });\n try {\n const repair = await draftService.createRepairDraft({\n agentId,\n automation,\n run,\n events,\n language: body?.language === 'zh' ? 'zh' : 'en',\n }, c.req.raw.signal);\n return c.json({ repair }, 201);\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'repairDraft' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to create automation repair draft' }, 400);\n }\n });\n\n authenticated.post('/api/automation-runs/:runId/cancel', async (c) => {\n const cancelled = await service.automationServiceInstance.cancelRun(c.req.param('runId'));\n return c.json({ cancelled });\n });\n\n authenticated.get('/api/automations/:id', async (c) => {\n const automation = await service.automationServiceInstance.get(c.req.param('id'));\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n return c.json({ automation });\n });\n\n authenticated.patch('/api/automations/:id', async (c) => {\n try {\n const patch = await c.req.json() as Partial<CreateAutomationInput> & { enabled?: boolean };\n if (patch.projectId && !service.projects.get(patch.projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const automation = await service.automationServiceInstance.update(c.req.param('id'), patch);\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n return c.json({ automation });\n } catch (err) {\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'update' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to update automation' }, 400);\n }\n });\n\n authenticated.delete('/api/automations/:id', async (c) => {\n const removed = await service.automationServiceInstance.remove(c.req.param('id'));\n return c.json({ removed });\n });\n\n authenticated.post('/api/automations/:id/run', async (c) => {\n try {\n const run = await service.automationServiceInstance.runNow(c.req.param('id'));\n return c.json({ run });\n } catch (err) {\n if (err instanceof AutomationAlreadyRunningError) {\n return c.json({\n error: err.message,\n code: 'automation_already_running',\n automationId: err.automationId,\n runningRunId: err.runningRunId,\n }, 409);\n }\n logRouteError(log, c, err, 'gateway.route.automations', { operation: 'run' });\n return c.json({ error: err instanceof Error ? err.message : 'Failed to run automation' }, 400);\n }\n });\n\n authenticated.post('/api/automations/:id/pause', async (c) => {\n const automation = await service.automationServiceInstance.pause(c.req.param('id'));\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n return c.json({ automation });\n });\n\n authenticated.post('/api/automations/:id/resume', async (c) => {\n const automation = await service.automationServiceInstance.resume(c.req.param('id'));\n if (!automation) return c.json({ error: 'Automation not found' }, 404);\n return c.json({ automation });\n });\n}\n"],"mappings":"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"}
@@ -214,13 +214,6 @@ export declare const CreateAutomationSchema: z.ZodObject<{
214
214
  maxSubagents: z.ZodOptional<z.ZodNumber>;
215
215
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
216
216
  }, z.core.$strict>], "kind">;
217
- safety: z.ZodOptional<z.ZodObject<{
218
- mode: z.ZodEnum<{
219
- suggest_only: "suggest_only";
220
- ask_before_apply: "ask_before_apply";
221
- auto_apply: "auto_apply";
222
- }>;
223
- }, z.core.$strict>>;
224
217
  description: z.ZodOptional<z.ZodString>;
225
218
  trigger: z.ZodDiscriminatedUnion<[z.ZodObject<{
226
219
  kind: z.ZodLiteral<"manual">;
@@ -247,6 +240,13 @@ export declare const CreateAutomationSchema: z.ZodObject<{
247
240
  source: z.ZodPreprocess<z.ZodOptional<z.ZodString>>;
248
241
  payloadMatch: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>>;
249
242
  }, z.core.$strict>], "kind">;
243
+ safety: z.ZodOptional<z.ZodObject<{
244
+ mode: z.ZodEnum<{
245
+ suggest_only: "suggest_only";
246
+ ask_before_apply: "ask_before_apply";
247
+ auto_apply: "auto_apply";
248
+ }>;
249
+ }, z.core.$strict>>;
250
250
  afterRun: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
251
251
  kind: z.ZodLiteral<"none">;
252
252
  }, z.core.$strict>, z.ZodObject<{
@@ -306,13 +306,6 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
306
306
  maxSubagents: z.ZodOptional<z.ZodNumber>;
307
307
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
308
308
  }, z.core.$strict>], "kind">>;
309
- safety: z.ZodOptional<z.ZodOptional<z.ZodObject<{
310
- mode: z.ZodEnum<{
311
- suggest_only: "suggest_only";
312
- ask_before_apply: "ask_before_apply";
313
- auto_apply: "auto_apply";
314
- }>;
315
- }, z.core.$strict>>>;
316
309
  description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
317
310
  trigger: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
318
311
  kind: z.ZodLiteral<"manual">;
@@ -354,6 +347,13 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
354
347
  lastError: z.ZodOptional<z.ZodString>;
355
348
  consecutiveFailures: z.ZodOptional<z.ZodNumber>;
356
349
  }, z.core.$strict>>>;
350
+ safety: z.ZodOptional<z.ZodOptional<z.ZodObject<{
351
+ mode: z.ZodEnum<{
352
+ suggest_only: "suggest_only";
353
+ ask_before_apply: "ask_before_apply";
354
+ auto_apply: "auto_apply";
355
+ }>;
356
+ }, z.core.$strict>>>;
357
357
  afterRun: z.ZodOptional<z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
358
358
  kind: z.ZodLiteral<"none">;
359
359
  }, z.core.$strict>, z.ZodObject<{
@@ -1,10 +1,10 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { init_providers, resolveModel } from "../../providers/index.js";
4
+ import { completeWithResolvedCredentials } from "../../providers/model-call.js";
4
5
  import { resolveDraftModelRef } from "../../workflows/draft/workflow-draft-service.js";
5
6
  import { buildAutomationDraftPrompt, buildAutomationDraftRepairPrompt, buildAutomationRunRepairPrompt, buildAutomationRunRepairRetryPrompt } from "./automation-draft-prompt.js";
6
7
  import { buildAutomationDraftResponse, parseGeneratedAutomationDraft, parseGeneratedAutomationRepairDraft } from "./automation-draft-validator.js";
7
- import { complete } from "@earendil-works/pi-ai/compat";
8
8
  //#region src/automations/draft/automation-draft-service.ts
9
9
  init_providers();
10
10
  init_logger();
@@ -27,7 +27,7 @@ var AutomationDraftService = class {
27
27
  let lastText = "";
28
28
  let lastIssues = [];
29
29
  for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {
30
- lastText = extractText(await complete(model, { messages: [{
30
+ lastText = extractText(await completeWithResolvedCredentials(model, { messages: [{
31
31
  role: "user",
32
32
  content: messageContent,
33
33
  timestamp: Date.now()
@@ -80,7 +80,7 @@ var AutomationDraftService = class {
80
80
  let lastText = "";
81
81
  let lastIssues = [];
82
82
  for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {
83
- lastText = extractText(await complete(model, { messages: [{
83
+ lastText = extractText(await completeWithResolvedCredentials(model, { messages: [{
84
84
  role: "user",
85
85
  content: messageContent,
86
86
  timestamp: Date.now()
@@ -1 +1 @@
1
- {"version":3,"file":"automation-draft-service.js","names":[],"sources":["../../../../src/automations/draft/automation-draft-service.ts"],"sourcesContent":["import { complete, type UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveModel } from '../../providers/index.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { resolveDraftModelRef } from '../../workflows/draft/workflow-draft-service.js';\nimport {\n buildAutomationDraftPrompt,\n buildAutomationDraftRepairPrompt,\n buildAutomationRunRepairPrompt,\n buildAutomationRunRepairRetryPrompt,\n type AutomationDraftRepairIssue,\n} from './automation-draft-prompt.js';\nimport type {\n AutomationDraftResponse,\n AutomationRepairDraftResponse,\n CreateAutomationDraftRequest,\n CreateAutomationRepairDraftRequest,\n} from './automation-draft.types.js';\nimport {\n buildAutomationDraftResponse,\n parseGeneratedAutomationDraft,\n parseGeneratedAutomationRepairDraft,\n} from './automation-draft-validator.js';\n\nconst log = createLogger('AutomationDraft');\nconst DEFAULT_MAX_REPAIR_ATTEMPTS = 2;\n\nexport interface AutomationDraftServiceOptions {\n config: Config;\n maxRepairAttempts?: number;\n}\n\nexport class AutomationDraftService {\n constructor(private readonly options: AutomationDraftServiceOptions) {}\n\n async createDraft(request: CreateAutomationDraftRequest, signal?: AbortSignal): Promise<AutomationDraftResponse> {\n const prompt = request.prompt.trim();\n if (!prompt) throw new Error('prompt is required');\n\n const modelRef = resolveDraftModelRef(this.options.config, request.agentId);\n const model = resolveModel(modelRef);\n const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;\n let messageContent = buildAutomationDraftPrompt({ prompt, language: request.language });\n let lastText = '';\n let lastIssues: AutomationDraftRepairIssue[] = [];\n\n for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {\n const userMsg: UserMessage = {\n role: 'user',\n content: messageContent,\n timestamp: Date.now(),\n };\n const result = await complete(\n model,\n { messages: [userMsg] },\n { maxTokens: 2048, temperature: attempt === 0 ? 0.2 : 0.1, signal },\n );\n lastText = extractText(result);\n try {\n const draft = parseGeneratedAutomationDraft(lastText);\n return buildAutomationDraftResponse(draft, attempt);\n } catch (err) {\n lastIssues = [{\n source: 'validation',\n severity: 'error',\n message: err instanceof Error ? err.message : String(err),\n }];\n }\n\n if (attempt >= maxRepairAttempts) break;\n log.warn(\n { modelRef, attempt: attempt + 1, issueCount: lastIssues.length, preview: lastText.slice(0, 500) },\n 'Automation draft validation failed; asking model to repair',\n );\n messageContent = buildAutomationDraftRepairPrompt({\n prompt,\n language: request.language,\n previousOutput: lastText,\n issues: lastIssues,\n });\n }\n\n const message = `Unable to generate a valid automation draft after ${maxRepairAttempts + 1} attempts`;\n log.warn({ modelRef, issues: lastIssues, preview: lastText.slice(0, 500) }, message);\n throw new Error(message);\n }\n\n async createRepairDraft(\n request: CreateAutomationRepairDraftRequest,\n signal?: AbortSignal,\n ): Promise<AutomationRepairDraftResponse> {\n const modelRef = resolveDraftModelRef(this.options.config, request.agentId);\n const model = resolveModel(modelRef);\n const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;\n let messageContent = buildAutomationRunRepairPrompt({\n language: request.language,\n automation: request.automation,\n run: request.run,\n events: request.events,\n });\n let lastText = '';\n let lastIssues: AutomationDraftRepairIssue[] = [];\n\n for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {\n const userMsg: UserMessage = {\n role: 'user',\n content: messageContent,\n timestamp: Date.now(),\n };\n const result = await complete(\n model,\n { messages: [userMsg] },\n { maxTokens: 2048, temperature: attempt === 0 ? 0.15 : 0.05, signal },\n );\n lastText = extractText(result);\n try {\n return parseGeneratedAutomationRepairDraft(lastText, attempt);\n } catch (err) {\n lastIssues = [{\n source: 'validation',\n severity: 'error',\n message: err instanceof Error ? err.message : String(err),\n }];\n }\n\n if (attempt >= maxRepairAttempts) break;\n log.warn(\n { modelRef, attempt: attempt + 1, issueCount: lastIssues.length, preview: lastText.slice(0, 500) },\n 'Automation repair draft validation failed; asking model to repair',\n );\n messageContent = buildAutomationRunRepairRetryPrompt({\n language: request.language,\n previousOutput: lastText,\n issues: lastIssues,\n });\n }\n\n const message = `Unable to generate a valid automation repair draft after ${maxRepairAttempts + 1} attempts`;\n log.warn({ modelRef, issues: lastIssues, preview: lastText.slice(0, 500) }, message);\n throw new Error(message);\n }\n}\n\nfunction extractText(result: unknown): string {\n const content = (result as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content.map((item) => {\n if (item && typeof item === 'object' && (item as { type?: string }).type === 'text') {\n return String((item as { text?: string }).text ?? '');\n }\n return '';\n }).join('');\n }\n return '';\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"automation-draft-service.js","names":[],"sources":["../../../../src/automations/draft/automation-draft-service.ts"],"sourcesContent":["import { type UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveModel } from '../../providers/index.js';\nimport { completeWithResolvedCredentials } from '../../providers/model-call.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { resolveDraftModelRef } from '../../workflows/draft/workflow-draft-service.js';\nimport {\n buildAutomationDraftPrompt,\n buildAutomationDraftRepairPrompt,\n buildAutomationRunRepairPrompt,\n buildAutomationRunRepairRetryPrompt,\n type AutomationDraftRepairIssue,\n} from './automation-draft-prompt.js';\nimport type {\n AutomationDraftResponse,\n AutomationRepairDraftResponse,\n CreateAutomationDraftRequest,\n CreateAutomationRepairDraftRequest,\n} from './automation-draft.types.js';\nimport {\n buildAutomationDraftResponse,\n parseGeneratedAutomationDraft,\n parseGeneratedAutomationRepairDraft,\n} from './automation-draft-validator.js';\n\nconst log = createLogger('AutomationDraft');\nconst DEFAULT_MAX_REPAIR_ATTEMPTS = 2;\n\nexport interface AutomationDraftServiceOptions {\n config: Config;\n maxRepairAttempts?: number;\n}\n\nexport class AutomationDraftService {\n constructor(private readonly options: AutomationDraftServiceOptions) {}\n\n async createDraft(request: CreateAutomationDraftRequest, signal?: AbortSignal): Promise<AutomationDraftResponse> {\n const prompt = request.prompt.trim();\n if (!prompt) throw new Error('prompt is required');\n\n const modelRef = resolveDraftModelRef(this.options.config, request.agentId);\n const model = resolveModel(modelRef);\n const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;\n let messageContent = buildAutomationDraftPrompt({ prompt, language: request.language });\n let lastText = '';\n let lastIssues: AutomationDraftRepairIssue[] = [];\n\n for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {\n const userMsg: UserMessage = {\n role: 'user',\n content: messageContent,\n timestamp: Date.now(),\n };\n const result = await completeWithResolvedCredentials(\n model,\n { messages: [userMsg] },\n { maxTokens: 2048, temperature: attempt === 0 ? 0.2 : 0.1, signal },\n );\n lastText = extractText(result);\n try {\n const draft = parseGeneratedAutomationDraft(lastText);\n return buildAutomationDraftResponse(draft, attempt);\n } catch (err) {\n lastIssues = [{\n source: 'validation',\n severity: 'error',\n message: err instanceof Error ? err.message : String(err),\n }];\n }\n\n if (attempt >= maxRepairAttempts) break;\n log.warn(\n { modelRef, attempt: attempt + 1, issueCount: lastIssues.length, preview: lastText.slice(0, 500) },\n 'Automation draft validation failed; asking model to repair',\n );\n messageContent = buildAutomationDraftRepairPrompt({\n prompt,\n language: request.language,\n previousOutput: lastText,\n issues: lastIssues,\n });\n }\n\n const message = `Unable to generate a valid automation draft after ${maxRepairAttempts + 1} attempts`;\n log.warn({ modelRef, issues: lastIssues, preview: lastText.slice(0, 500) }, message);\n throw new Error(message);\n }\n\n async createRepairDraft(\n request: CreateAutomationRepairDraftRequest,\n signal?: AbortSignal,\n ): Promise<AutomationRepairDraftResponse> {\n const modelRef = resolveDraftModelRef(this.options.config, request.agentId);\n const model = resolveModel(modelRef);\n const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;\n let messageContent = buildAutomationRunRepairPrompt({\n language: request.language,\n automation: request.automation,\n run: request.run,\n events: request.events,\n });\n let lastText = '';\n let lastIssues: AutomationDraftRepairIssue[] = [];\n\n for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {\n const userMsg: UserMessage = {\n role: 'user',\n content: messageContent,\n timestamp: Date.now(),\n };\n const result = await completeWithResolvedCredentials(\n model,\n { messages: [userMsg] },\n { maxTokens: 2048, temperature: attempt === 0 ? 0.15 : 0.05, signal },\n );\n lastText = extractText(result);\n try {\n return parseGeneratedAutomationRepairDraft(lastText, attempt);\n } catch (err) {\n lastIssues = [{\n source: 'validation',\n severity: 'error',\n message: err instanceof Error ? err.message : String(err),\n }];\n }\n\n if (attempt >= maxRepairAttempts) break;\n log.warn(\n { modelRef, attempt: attempt + 1, issueCount: lastIssues.length, preview: lastText.slice(0, 500) },\n 'Automation repair draft validation failed; asking model to repair',\n );\n messageContent = buildAutomationRunRepairRetryPrompt({\n language: request.language,\n previousOutput: lastText,\n issues: lastIssues,\n });\n }\n\n const message = `Unable to generate a valid automation repair draft after ${maxRepairAttempts + 1} attempts`;\n log.warn({ modelRef, issues: lastIssues, preview: lastText.slice(0, 500) }, message);\n throw new Error(message);\n }\n}\n\nfunction extractText(result: unknown): string {\n const content = (result as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content.map((item) => {\n if (item && typeof item === 'object' && (item as { type?: string }).type === 'text') {\n return String((item as { text?: string }).text ?? '');\n }\n return '';\n }).join('');\n }\n return '';\n}\n"],"mappings":"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"}
@@ -35,9 +35,6 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
35
35
  maxSubagents?: number;
36
36
  timeoutSeconds?: number;
37
37
  };
38
- safety?: {
39
- mode: "suggest_only" | "ask_before_apply" | "auto_apply";
40
- };
41
38
  description?: string;
42
39
  trigger?: {
43
40
  kind: "manual";
@@ -64,6 +61,9 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
64
61
  source?: string;
65
62
  payloadMatch?: Record<string, string | number | boolean>;
66
63
  };
64
+ safety?: {
65
+ mode: "suggest_only" | "ask_before_apply" | "auto_apply";
66
+ };
67
67
  afterRun?: {
68
68
  kind: "none";
69
69
  } | {
@@ -59,12 +59,22 @@ export declare function ensureBrowserExtensionArtifacts(opts?: {
59
59
  export declare function ensureBrowserExtensionOnStartup(_config: unknown): Promise<void>;
60
60
  export declare function readInstalledExtensionDir(cacheDir?: string): Promise<string | null>;
61
61
  export type BrowserExtensionOpenAction = 'chrome' | 'folder' | 'both';
62
+ type ExtensionManagerBrowser = 'chrome' | 'edge';
63
+ interface ExtensionManagerTarget {
64
+ browser: ExtensionManagerBrowser;
65
+ executablePath: string;
66
+ url: string;
67
+ }
68
+ export declare function resolveWindowsExtensionManager(env?: NodeJS.ProcessEnv): ExtensionManagerTarget | null;
62
69
  /**
63
- * Open chrome://extensions and/or reveal the installed extension folder on the gateway host.
70
+ * Open the compatible browser's extension manager and/or reveal the installed extension folder
71
+ * on the gateway host.
64
72
  */
65
73
  export declare function openBrowserExtensionInstallUi(opts: {
66
74
  action: BrowserExtensionOpenAction;
67
75
  cacheDir?: string;
68
76
  }): Promise<{
69
77
  extensionDir: string;
78
+ browser?: ExtensionManagerBrowser;
70
79
  }>;
80
+ export {};
@@ -283,26 +283,46 @@ function spawnDetached(command, args) {
283
283
  detached: true
284
284
  }).unref();
285
285
  }
286
- function openChromeExtensionsPage() {
287
- const chromeUrl = "chrome://extensions";
286
+ function windowsExtensionManagerCandidates(env) {
287
+ const programFiles = [
288
+ env.PROGRAMFILES,
289
+ env["PROGRAMFILES(X86)"],
290
+ env.LOCALAPPDATA
291
+ ].filter((path) => Boolean(path?.trim()));
292
+ const candidates = [];
293
+ for (const root of programFiles) candidates.push({
294
+ browser: "chrome",
295
+ executablePath: join(root, "Google", "Chrome", "Application", "chrome.exe"),
296
+ url: "chrome://extensions/"
297
+ });
298
+ for (const root of programFiles) candidates.push({
299
+ browser: "edge",
300
+ executablePath: join(root, "Microsoft", "Edge", "Application", "msedge.exe"),
301
+ url: "edge://extensions/"
302
+ });
303
+ return candidates;
304
+ }
305
+ function resolveWindowsExtensionManager(env = process.env) {
306
+ return windowsExtensionManagerCandidates(env).find(({ executablePath }) => existsSync(executablePath)) ?? null;
307
+ }
308
+ function openBrowserExtensionManager() {
309
+ const chromeUrl = "chrome://extensions/";
288
310
  if (process.platform === "darwin") {
289
311
  spawnDetached("open", [
290
312
  "-a",
291
313
  "Google Chrome",
292
314
  chromeUrl
293
315
  ]);
294
- return;
316
+ return "chrome";
295
317
  }
296
318
  if (process.platform === "win32") {
297
- spawnDetached("cmd", [
298
- "/c",
299
- "start",
300
- "chrome",
301
- chromeUrl
302
- ]);
303
- return;
319
+ const target = resolveWindowsExtensionManager();
320
+ if (!target) throw new Error("No compatible browser found. Install Google Chrome or Microsoft Edge, then try again.");
321
+ spawnDetached(target.executablePath, [target.url]);
322
+ return target.browser;
304
323
  }
305
324
  spawnDetached("xdg-open", [chromeUrl]);
325
+ return "chrome";
306
326
  }
307
327
  function revealFolderInFileManager(dir) {
308
328
  if (process.platform === "darwin") {
@@ -316,16 +336,21 @@ function revealFolderInFileManager(dir) {
316
336
  spawnDetached("xdg-open", [dir]);
317
337
  }
318
338
  /**
319
- * Open chrome://extensions and/or reveal the installed extension folder on the gateway host.
339
+ * Open the compatible browser's extension manager and/or reveal the installed extension folder
340
+ * on the gateway host.
320
341
  */
321
342
  async function openBrowserExtensionInstallUi(opts) {
322
343
  const dir = (await browserExtDoctor({ cacheDir: opts.cacheDir })).extensionDir;
323
344
  if (!dir) throw new Error("Extension not installed. Run xopc browser extension install first.");
324
- if (opts.action === "chrome" || opts.action === "both") openChromeExtensionsPage();
345
+ let browser;
346
+ if (opts.action === "chrome" || opts.action === "both") browser = openBrowserExtensionManager();
325
347
  if (opts.action === "folder" || opts.action === "both") revealFolderInFileManager(dir);
326
- return { extensionDir: dir };
348
+ return {
349
+ extensionDir: dir,
350
+ browser
351
+ };
327
352
  }
328
353
  //#endregion
329
- export { BROWSER_EXT_REQUIRED_FILES, browserExtDoctor, computeNeedsRefresh, ensureBrowserExtensionArtifacts, ensureBrowserExtensionOnStartup, openBrowserExtensionInstallUi, readInstalledExtensionDir, resolveBundledBrowserExtDir, resolveInstalledExtensionPath, validateBrowserExtLayout };
354
+ export { BROWSER_EXT_REQUIRED_FILES, browserExtDoctor, computeNeedsRefresh, ensureBrowserExtensionArtifacts, ensureBrowserExtensionOnStartup, openBrowserExtensionInstallUi, readInstalledExtensionDir, resolveBundledBrowserExtDir, resolveInstalledExtensionPath, resolveWindowsExtensionManager, validateBrowserExtLayout };
330
355
 
331
356
  //# sourceMappingURL=browser-ext-install.js.map