@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":"memory.js","names":[],"sources":["../../../../../src/gateway/hono/routes/memory.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { BuiltinMemoryStore } from '../../../agent/memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from '../../../agent/memory/create-memory-manager.js';\nimport { resolveBuiltinMemoryStoreConfig } from '../../../agent/memory/memory-config.js';\nimport { discoverMemoryPlugins } from '../../../agent/memory/plugin-discovery.js';\nimport { resolveAdaptiveUnderstandingCadence } from '../../../agent/memory/understanding/quality.js';\nimport type {\n MemoryDisclosurePolicy,\n MemoryDurability,\n MemoryExplicitness,\n MemoryKind,\n MemorySensitivity,\n MemoryStatus,\n} from '../../../agent/memory/types.js';\nimport { MemoryPolicySchema } from '../../../agent-manifest/schema.js';\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';\nimport type { Config } from '../../../config/schema.js';\nimport type { KnowledgeSynthesisStatus } from '../../../knowledge/types.js';\nimport { prepareUpdateAgent } from '../../agents-admin.js';\nimport {\n appendMemorySignal,\n appendMemoryTraceEvent,\n deleteMemoryRecord,\n findLatestMemoryInjectTrace,\n getMemoryRecord,\n listKnowledgeSourceItems,\n listKnowledgeSyncRuns,\n listMemoryRecords,\n listMemorySignals,\n listMemoryTraceEvents,\n searchMemoryRecords,\n setMemoryTraceFeedback,\n setLatestMemoryInjectFeedback,\n summarizeMemoryRecallFeedback,\n summarizeUserUnderstandingQuality,\n upsertMemoryRecord,\n} from '../../../storage/sqlite/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst MEMORY_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'preference',\n 'boundary',\n 'relationship',\n 'project_context',\n 'commitment',\n 'routine',\n 'personal_logistics',\n 'open_question',\n 'milestone',\n 'current_state',\n 'agent_note',\n 'workspace_fact',\n 'daily_note',\n 'session_summary',\n 'derived_insight',\n 'task_lesson',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst MEMORY_EXPLICITNESS = new Set<MemoryExplicitness>(['explicit', 'observed', 'inferred']);\nconst MEMORY_DURABILITY = new Set<MemoryDurability>(['ephemeral', 'durable', 'recurring']);\nconst MEMORY_DISCLOSURE_POLICIES = new Set<MemoryDisclosurePolicy>([\n 'silent', 'referenceable', 'ask_before_reference',\n]);\n\nconst MEMORY_STATUSES = new Set<MemoryStatus>([\n 'candidate',\n 'active',\n 'needs_review',\n 'stale',\n 'archived',\n 'rejected',\n]);\n\nconst MEMORY_SENSITIVITIES = new Set<MemorySensitivity>([\n 'normal',\n 'personal',\n 'secret',\n 'regulated',\n]);\n\nconst MEMORY_TRACE_FEEDBACK_OUTCOMES = new Set([\n 'helpful',\n 'not_helpful',\n 'mixed',\n 'irrelevant',\n]);\n\nconst KNOWLEDGE_SYNTHESIS_STATUSES = new Set<KnowledgeSynthesisStatus>([\n 'pending', 'processing', 'completed', 'failed', 'ignored',\n]);\n\nfunction parseLimit(raw: string | undefined, fallback = 100): number {\n const parsed = raw ? Number.parseInt(raw, 10) : fallback;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(500, parsed)) : fallback;\n}\n\nfunction parseFeedbackSummaryLimit(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 1000;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(5000, parsed)) : 1000;\n}\n\nfunction parseWindowDays(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 30;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(365, parsed)) : 30;\n}\n\nfunction parseKind(raw: unknown): MemoryKind | undefined {\n return typeof raw === 'string' && MEMORY_KINDS.has(raw as MemoryKind)\n ? (raw as MemoryKind)\n : undefined;\n}\n\nfunction parseStatus(raw: unknown): MemoryStatus | undefined {\n return typeof raw === 'string' && MEMORY_STATUSES.has(raw as MemoryStatus)\n ? (raw as MemoryStatus)\n : undefined;\n}\n\nfunction parseSensitivity(raw: unknown): MemorySensitivity | undefined {\n return typeof raw === 'string' && MEMORY_SENSITIVITIES.has(raw as MemorySensitivity)\n ? (raw as MemorySensitivity)\n : undefined;\n}\n\nfunction parseEnum<T extends string>(raw: unknown, allowed: Set<T>): T | undefined {\n return typeof raw === 'string' && allowed.has(raw as T) ? raw as T : undefined;\n}\n\nexport function registerMemoryRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n authenticated.get('/api/memory/providers', async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const plugins = await discoverMemoryPlugins(cfg);\n return c.json({\n providers: [\n {\n id: 'local',\n displayName: 'Local Knowledge Store',\n available: true,\n configured: true,\n capabilities: {\n search: true,\n read: true,\n write: true,\n update: true,\n delete: true,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: false,\n local: true,\n },\n },\n ...plugins.map((plugin) => ({\n id: plugin.manifest?.id ?? plugin.name,\n displayName: plugin.manifest?.displayName ?? plugin.name,\n available: plugin.available,\n configured: false,\n capabilities: plugin.manifest?.capabilities ?? {},\n })),\n ],\n });\n });\n\n authenticated.get('/api/memory/config', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.patch('/api/memory/config', deps.strictRateLimitMiddleware, async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const body = await c.req.json().catch(() => ({}));\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(cfg);\n const parsed = MemoryPolicySchema.safeParse(body.memory);\n if (!parsed.success) {\n return c.json({ error: `memory ${parsed.error.issues[0]?.message ?? 'is invalid'}` }, 400);\n }\n const prep = prepareUpdateAgent(cfg, agentId, { memory: parsed.data });\n if (prep.ok === false) {\n return c.json({ error: prep.error }, prep.status ?? 400);\n }\n const save = await deps.service.saveConfig(prep.data.nextConfig);\n if (!save.saved) return c.json({ error: save.error ?? 'save failed' }, 500);\n const manifest = resolveEffectiveAgentManifestForAgent(deps.service.currentConfig as Config, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.get('/api/memory/records', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const records = listMemoryRecords({\n providerId: c.req.query('providerId') || undefined,\n agentId,\n workspaceId: c.req.query('workspaceId') || undefined,\n projectId: c.req.query('projectId') || undefined,\n kind: parseKind(c.req.query('kind')),\n status: parseStatus(c.req.query('status')),\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ records });\n });\n\n authenticated.post('/api/memory/search', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const query = typeof body.query === 'string' ? body.query.trim() : '';\n if (!query) {\n return c.json({ error: 'Missing required field: query' }, 400);\n }\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(deps.service.currentConfig as Config);\n const records = searchMemoryRecords({\n query,\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n kinds: Array.isArray(body.kinds)\n ? body.kinds.map(parseKind).filter((v): v is MemoryKind => Boolean(v))\n : undefined,\n statuses: Array.isArray(body.statuses)\n ? body.statuses.map(parseStatus).filter((v): v is MemoryStatus => Boolean(v))\n : undefined,\n maxResults: typeof body.maxResults === 'number' ? body.maxResults : undefined,\n minScore: typeof body.minScore === 'number' ? body.minScore : undefined,\n });\n return c.json({ results: records });\n });\n\n authenticated.post('/api/memory/records', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const kind = parseKind(body.kind);\n const content = typeof body.content === 'string' ? body.content.trim() : '';\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (!kind || !content) {\n return c.json({ error: 'Missing required fields: kind, content' }, 400);\n }\n const record = upsertMemoryRecord({\n id: typeof body.id === 'string' && body.id.trim() ? body.id.trim() : undefined,\n providerId: typeof body.providerId === 'string' && body.providerId.trim() ? body.providerId.trim() : 'local',\n kind,\n agentId,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : deps.service.currentWorkspacePath,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n content,\n source: body.source && typeof body.source === 'object' ? body.source : undefined,\n confidence: typeof body.confidence === 'number' ? body.confidence : undefined,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : undefined,\n status: parseStatus(body.status),\n sensitivity: parseSensitivity(body.sensitivity),\n canonicalKey: typeof body.canonicalKey === 'string' ? body.canonicalKey : undefined,\n explicitness: parseEnum(body.explicitness, MEMORY_EXPLICITNESS),\n durability: parseEnum(body.durability, MEMORY_DURABILITY),\n importance: typeof body.importance === 'number' ? body.importance : undefined,\n disclosurePolicy: parseEnum(body.disclosurePolicy, MEMORY_DISCLOSURE_POLICIES),\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : undefined,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : undefined,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : undefined,\n validFrom: typeof body.validFrom === 'string' ? body.validFrom : undefined,\n validTo: typeof body.validTo === 'string' ? body.validTo : undefined,\n supersedesRecordId: typeof body.supersedesRecordId === 'string' ? body.supersedesRecordId : undefined,\n conflictGroupId: typeof body.conflictGroupId === 'string' ? body.conflictGroupId : undefined,\n });\n return c.json({ record }, 201);\n });\n\n authenticated.patch('/api/memory/records/:id', async (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n if (!existing) return c.json({ error: 'Memory record not found' }, 404);\n const selectedAgentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (existing.scope.agentId !== selectedAgentId) {\n return c.json({ error: 'Memory record not found for selected agent' }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const record = upsertMemoryRecord({\n id: existing.id,\n providerId: existing.source.provider ?? 'local',\n kind: parseKind(body.kind) ?? existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n sessionKey: existing.scope.sessionKey,\n projectId: typeof body.projectId === 'string' ? body.projectId : existing.scope.projectId,\n content: typeof body.content === 'string' ? body.content : existing.content,\n source: body.source && typeof body.source === 'object' ? body.source : existing.source,\n confidence: typeof body.confidence === 'number' ? body.confidence : existing.confidence,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : existing.tags,\n status: parseStatus(body.status) ?? existing.status,\n sensitivity: parseSensitivity(body.sensitivity) ?? existing.sensitivity,\n canonicalKey: typeof body.canonicalKey === 'string' ? body.canonicalKey : existing.canonicalKey,\n explicitness: parseEnum(body.explicitness, MEMORY_EXPLICITNESS) ?? existing.explicitness,\n durability: parseEnum(body.durability, MEMORY_DURABILITY) ?? existing.durability,\n importance: typeof body.importance === 'number' ? body.importance : existing.importance,\n disclosurePolicy: parseEnum(body.disclosurePolicy, MEMORY_DISCLOSURE_POLICIES) ?? existing.disclosurePolicy,\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : existing.evidence,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : existing.reviewAfter,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : existing.expiresAt,\n validFrom: typeof body.validFrom === 'string' ? body.validFrom : existing.validFrom,\n validTo: typeof body.validTo === 'string' ? body.validTo : existing.validTo,\n supersedesRecordId: typeof body.supersedesRecordId === 'string' ? body.supersedesRecordId : existing.supersedesRecordId,\n conflictGroupId: typeof body.conflictGroupId === 'string' ? body.conflictGroupId : existing.conflictGroupId,\n });\n return c.json({ record });\n });\n\n authenticated.delete('/api/memory/records/:id', (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n const selectedAgentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (!existing || existing.scope.agentId !== selectedAgentId) {\n return c.json({ error: 'Memory record not found for selected agent' }, 404);\n }\n const deleted = deleteMemoryRecord(c.req.param('id'));\n if (!deleted) return c.json({ error: 'Memory record not found' }, 404);\n return c.json({ ok: true });\n });\n\n authenticated.get('/api/memory/signals', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const signals = listMemorySignals({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n agentId,\n workspaceId: c.req.query('workspaceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ signals });\n });\n\n authenticated.get('/api/knowledge/source-items', (c) => {\n const sourceItems = listKnowledgeSourceItems({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n synthesisStatus: parseEnum(c.req.query('synthesisStatus'), KNOWLEDGE_SYNTHESIS_STATUSES),\n includeDeleted: c.req.query('includeDeleted') === 'true',\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ sourceItems });\n });\n\n authenticated.get('/api/knowledge/sync-runs', (c) => {\n const syncRuns = listKnowledgeSyncRuns({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ syncRuns });\n });\n\n authenticated.get('/api/memory/traces', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const traces = listMemoryTraceEvents({\n providerId: c.req.query('providerId') || undefined,\n agentId,\n sessionKey: c.req.query('sessionKey') || undefined,\n phase: c.req.query('phase') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ traces });\n });\n\n authenticated.patch('/api/memory/traces/:traceId/feedback', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const outcome = typeof body.outcome === 'string' && MEMORY_TRACE_FEEDBACK_OUTCOMES.has(body.outcome)\n ? body.outcome\n : undefined;\n if (!outcome) {\n return c.json({ error: 'Missing or invalid required field: outcome' }, 400);\n }\n const source = body.source === 'user' || body.source === 'evaluator' || body.source === 'system'\n ? body.source\n : undefined;\n const trace = setMemoryTraceFeedback({\n traceId: c.req.param('traceId'),\n feedback: {\n outcome,\n ...(typeof body.score === 'number' ? { score: body.score } : {}),\n ...(typeof body.reason === 'string' ? { reason: body.reason } : {}),\n ...(source ? { source } : {}),\n },\n });\n if (!trace) return c.json({ error: 'Memory trace not found' }, 404);\n return c.json({ trace });\n });\n\n authenticated.get('/api/memory/feedback-summary', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const summaries = summarizeMemoryRecallFeedback({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n agentId,\n sessionKey: c.req.query('sessionKey') || undefined,\n limit: parseFeedbackSummaryLimit(c.req.query('limit')),\n });\n return c.json({ summaries });\n });\n\n authenticated.get('/api/memory/understanding/quality', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n const metrics = summarizeUserUnderstandingQuality({\n agentId: manifest.id,\n windowDays: parseWindowDays(c.req.query('windowDays')),\n });\n const baseIntervalTurns = manifest.memory.understanding?.reviewIntervalTurns ?? 10;\n const cadence = resolveAdaptiveUnderstandingCadence(\n baseIntervalTurns,\n metrics,\n manifest.memory.understanding?.adaptiveCadence ?? true,\n );\n return c.json({ metrics, cadence });\n });\n\n authenticated.patch(\n '/api/memory/understanding/response-feedback',\n deps.strictRateLimitMiddleware,\n async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const sessionKey = typeof body.sessionKey === 'string' ? body.sessionKey.trim() : '';\n const assistantTimestamp = typeof body.assistantTimestamp === 'number'\n ? body.assistantTimestamp\n : Number.NaN;\n const outcome = body.outcome === 'helpful' || body.outcome === 'not_helpful'\n ? body.outcome\n : undefined;\n if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0 || !outcome) {\n return c.json({ error: 'sessionKey, assistantTimestamp, and a valid outcome are required' }, 400);\n }\n const trace = setLatestMemoryInjectFeedback({\n sessionKey,\n beforeMs: assistantTimestamp,\n feedback: {\n outcome,\n source: 'user',\n reason: 'assistant_response_feedback',\n },\n });\n return c.json({\n matched: Boolean(trace),\n attributedRecordCount: trace?.selectedRecordIds.length ?? 0,\n feedback: trace?.feedback ?? null,\n remediation: trace?.remediation ?? null,\n });\n },\n );\n\n authenticated.get('/api/memory/understanding/response-feedback', (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim() ?? '';\n const assistantTimestamp = Number(c.req.query('assistantTimestamp'));\n if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0) {\n return c.json({ error: 'sessionKey and assistantTimestamp are required' }, 400);\n }\n const trace = findLatestMemoryInjectTrace({\n sessionKey,\n beforeMs: assistantTimestamp,\n });\n return c.json({\n matched: Boolean(trace),\n attributedRecordCount: trace?.selectedRecordIds.length ?? 0,\n feedback: trace?.feedback ?? null,\n });\n });\n\n authenticated.post('/api/memory/signals', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const source = typeof body.source === 'string' ? body.source : '';\n if (!source) return c.json({ error: 'Missing required field: source' }, 400);\n const signalId = appendMemorySignal({\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId: typeof body.agentId === 'string' ? body.agentId : undefined,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n signal: {\n source: source as never,\n recordId: typeof body.recordId === 'string' ? body.recordId : undefined,\n score: typeof body.score === 'number' ? body.score : undefined,\n content: typeof body.content === 'string' ? body.content : undefined,\n metadata: body.metadata && typeof body.metadata === 'object' ? body.metadata : undefined,\n },\n });\n return c.json({ signalId }, 201);\n });\n\n authenticated.post('/api/memory/providers/:id/test', deps.strictRateLimitMiddleware, async (c) => {\n const providerId = c.req.param('id');\n const cfg = deps.service.currentConfig as Config;\n const workspace = deps.service.currentWorkspacePath;\n const store = new BuiltinMemoryStore(resolveBuiltinMemoryStoreConfig(workspace, cfg));\n const manager = createMemoryManagerFromConfig(workspace, store, cfg);\n await manager.initializeAll(`memory-provider-test-${Date.now()}`, { workspace, agentId: resolveDefaultAgentId(cfg) });\n const provider = manager.providersList.find((p) => p.id === providerId);\n if (!provider) return c.json({ providerId, available: false, checks: [{ name: 'load', ok: false, message: 'Provider not loaded' }] }, 404);\n\n const token = `xopc-memory-smoke-${Date.now()}`;\n const checks: Array<{ name: string; ok: boolean; message?: string; resultCount?: number }> = [\n { name: 'load', ok: true },\n { name: 'available', ok: provider.isAvailable() },\n ];\n const started = Date.now();\n try {\n const write = await manager.write({\n kind: 'workspace_fact',\n content: `Smoke test record for ${providerId}: ${token}`,\n scope: { agentId: resolveDefaultAgentId(cfg) },\n tags: ['xopc-smoke-test'],\n });\n checks.push({ name: 'write', ok: write.success, message: write.error ?? write.message });\n const results = await manager.search({ query: token, scope: { agentId: resolveDefaultAgentId(cfg) }, maxResults: 10 });\n const ownResults = results.filter((result) => result.citation.providerId === providerId);\n checks.push({ name: 'search', ok: ownResults.length > 0, resultCount: ownResults.length });\n const recordId = ownResults[0]?.record.id ?? write.record?.id;\n if (recordId) {\n const read = await manager.read({ id: recordId, scope: { agentId: resolveDefaultAgentId(cfg) } });\n checks.push({ name: 'read', ok: Boolean(read), message: read ? undefined : 'Record was not readable' });\n } else {\n checks.push({ name: 'read', ok: false, message: 'No record id available' });\n }\n manager.recordSignal({ source: 'search_recall', content: `Smoke signal for ${providerId}: ${token}` });\n checks.push({ name: 'sync', ok: true });\n } catch (err) {\n checks.push({ name: 'error', ok: false, message: err instanceof Error ? err.message : String(err) });\n } finally {\n appendMemoryTraceEvent({\n phase: 'test',\n providerId,\n request: { token },\n resultCount: checks.filter((check) => check.ok).length,\n error: checks.some((check) => !check.ok) ? 'one or more checks failed' : undefined,\n durationMs: Date.now() - started,\n });\n await manager.shutdownAll();\n }\n return c.json({ providerId, available: provider.isAvailable(), checks });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","names":[],"sources":["../../../../../src/gateway/hono/routes/memory.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { BuiltinMemoryStore } from '../../../agent/memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from '../../../agent/memory/create-memory-manager.js';\nimport { resolveBuiltinMemoryStoreConfig } from '../../../agent/memory/memory-config.js';\nimport { discoverMemoryPlugins } from '../../../agent/memory/plugin-discovery.js';\nimport { resolveAdaptiveUnderstandingCadence } from '../../../agent/memory/understanding/quality.js';\nimport type {\n MemoryDisclosurePolicy,\n MemoryDurability,\n MemoryExplicitness,\n MemoryKind,\n MemorySensitivity,\n MemoryStatus,\n} from '../../../agent/memory/types.js';\nimport { MemoryPolicySchema } from '../../../agent-manifest/schema.js';\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';\nimport type { Config } from '../../../config/schema.js';\nimport type { KnowledgeSynthesisStatus } from '../../../knowledge/types.js';\nimport { prepareUpdateAgent } from '../../agents-admin.js';\nimport {\n appendMemorySignal,\n appendMemoryTraceEvent,\n deleteMemoryRecord,\n findLatestMemoryInjectTrace,\n getMemoryRecord,\n listKnowledgeSourceItems,\n listKnowledgeSyncRuns,\n listMemoryRecords,\n listMemorySignals,\n listMemoryTraceEvents,\n searchMemoryRecords,\n setMemoryTraceFeedback,\n setLatestMemoryInjectFeedback,\n summarizeMemoryRecallFeedback,\n summarizeUserUnderstandingQuality,\n upsertMemoryRecord,\n} from '../../../storage/sqlite/index.js';\nimport { isUserContextRecord, projectUserContextRecord } from '../../../user-context/projection.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst MEMORY_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'preference',\n 'boundary',\n 'relationship',\n 'project_context',\n 'commitment',\n 'routine',\n 'personal_logistics',\n 'open_question',\n 'milestone',\n 'current_state',\n 'agent_note',\n 'workspace_fact',\n 'daily_note',\n 'session_summary',\n 'derived_insight',\n 'task_lesson',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst MEMORY_EXPLICITNESS = new Set<MemoryExplicitness>(['explicit', 'observed', 'inferred']);\nconst MEMORY_DURABILITY = new Set<MemoryDurability>(['ephemeral', 'durable', 'recurring']);\nconst MEMORY_DISCLOSURE_POLICIES = new Set<MemoryDisclosurePolicy>([\n 'silent', 'referenceable', 'ask_before_reference',\n]);\n\nconst MEMORY_STATUSES = new Set<MemoryStatus>([\n 'candidate',\n 'active',\n 'needs_review',\n 'stale',\n 'archived',\n 'rejected',\n]);\n\nconst MEMORY_SENSITIVITIES = new Set<MemorySensitivity>([\n 'normal',\n 'personal',\n 'secret',\n 'regulated',\n]);\n\nconst MEMORY_TRACE_FEEDBACK_OUTCOMES = new Set([\n 'helpful',\n 'not_helpful',\n 'mixed',\n 'irrelevant',\n]);\n\nconst KNOWLEDGE_SYNTHESIS_STATUSES = new Set<KnowledgeSynthesisStatus>([\n 'pending', 'processing', 'completed', 'failed', 'ignored',\n]);\n\nfunction parseLimit(raw: string | undefined, fallback = 100): number {\n const parsed = raw ? Number.parseInt(raw, 10) : fallback;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(500, parsed)) : fallback;\n}\n\nfunction parseFeedbackSummaryLimit(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 1000;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(5000, parsed)) : 1000;\n}\n\nfunction parseWindowDays(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 30;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(365, parsed)) : 30;\n}\n\nfunction parseKind(raw: unknown): MemoryKind | undefined {\n return typeof raw === 'string' && MEMORY_KINDS.has(raw as MemoryKind)\n ? (raw as MemoryKind)\n : undefined;\n}\n\nfunction parseStatus(raw: unknown): MemoryStatus | undefined {\n return typeof raw === 'string' && MEMORY_STATUSES.has(raw as MemoryStatus)\n ? (raw as MemoryStatus)\n : undefined;\n}\n\nfunction parseSensitivity(raw: unknown): MemorySensitivity | undefined {\n return typeof raw === 'string' && MEMORY_SENSITIVITIES.has(raw as MemorySensitivity)\n ? (raw as MemorySensitivity)\n : undefined;\n}\n\nfunction parseEnum<T extends string>(raw: unknown, allowed: Set<T>): T | undefined {\n return typeof raw === 'string' && allowed.has(raw as T) ? raw as T : undefined;\n}\n\nfunction personalContextForTrace(trace: { selectedRecordIds: string[] } | null | undefined) {\n return (trace?.selectedRecordIds ?? [])\n .map((recordId) => getMemoryRecord(recordId))\n .filter((record): record is NonNullable<typeof record> => Boolean(record) && isUserContextRecord(record))\n .filter((record) => record.sensitivity !== 'secret' && record.sensitivity !== 'regulated')\n .filter((record) => record.disclosurePolicy !== 'silent')\n .map(projectUserContextRecord)\n .map(({ id, statement, facet, origin, sourceName }) => ({ id, statement, facet, origin, sourceName }));\n}\n\nexport function registerMemoryRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n authenticated.get('/api/memory/providers', async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const plugins = await discoverMemoryPlugins(cfg);\n return c.json({\n providers: [\n {\n id: 'local',\n displayName: 'Local Knowledge Store',\n available: true,\n configured: true,\n capabilities: {\n search: true,\n read: true,\n write: true,\n update: true,\n delete: true,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: false,\n local: true,\n },\n },\n ...plugins.map((plugin) => ({\n id: plugin.manifest?.id ?? plugin.name,\n displayName: plugin.manifest?.displayName ?? plugin.name,\n available: plugin.available,\n configured: false,\n capabilities: plugin.manifest?.capabilities ?? {},\n })),\n ],\n });\n });\n\n authenticated.get('/api/memory/config', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.patch('/api/memory/config', deps.strictRateLimitMiddleware, async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const body = await c.req.json().catch(() => ({}));\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(cfg);\n const parsed = MemoryPolicySchema.safeParse(body.memory);\n if (!parsed.success) {\n return c.json({ error: `memory ${parsed.error.issues[0]?.message ?? 'is invalid'}` }, 400);\n }\n const prep = prepareUpdateAgent(cfg, agentId, { memory: parsed.data });\n if (prep.ok === false) {\n return c.json({ error: prep.error }, prep.status ?? 400);\n }\n const save = await deps.service.saveConfig(prep.data.nextConfig);\n if (!save.saved) return c.json({ error: save.error ?? 'save failed' }, 500);\n const manifest = resolveEffectiveAgentManifestForAgent(deps.service.currentConfig as Config, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.get('/api/memory/records', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const records = listMemoryRecords({\n providerId: c.req.query('providerId') || undefined,\n agentId,\n workspaceId: c.req.query('workspaceId') || undefined,\n projectId: c.req.query('projectId') || undefined,\n kind: parseKind(c.req.query('kind')),\n status: parseStatus(c.req.query('status')),\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ records });\n });\n\n authenticated.post('/api/memory/search', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const query = typeof body.query === 'string' ? body.query.trim() : '';\n if (!query) {\n return c.json({ error: 'Missing required field: query' }, 400);\n }\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(deps.service.currentConfig as Config);\n const records = searchMemoryRecords({\n query,\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n kinds: Array.isArray(body.kinds)\n ? body.kinds.map(parseKind).filter((v): v is MemoryKind => Boolean(v))\n : undefined,\n statuses: Array.isArray(body.statuses)\n ? body.statuses.map(parseStatus).filter((v): v is MemoryStatus => Boolean(v))\n : undefined,\n maxResults: typeof body.maxResults === 'number' ? body.maxResults : undefined,\n minScore: typeof body.minScore === 'number' ? body.minScore : undefined,\n });\n return c.json({ results: records });\n });\n\n authenticated.post('/api/memory/records', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const kind = parseKind(body.kind);\n const content = typeof body.content === 'string' ? body.content.trim() : '';\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (!kind || !content) {\n return c.json({ error: 'Missing required fields: kind, content' }, 400);\n }\n const record = upsertMemoryRecord({\n id: typeof body.id === 'string' && body.id.trim() ? body.id.trim() : undefined,\n providerId: typeof body.providerId === 'string' && body.providerId.trim() ? body.providerId.trim() : 'local',\n kind,\n agentId,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : deps.service.currentWorkspacePath,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n content,\n source: body.source && typeof body.source === 'object' ? body.source : undefined,\n confidence: typeof body.confidence === 'number' ? body.confidence : undefined,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : undefined,\n status: parseStatus(body.status),\n sensitivity: parseSensitivity(body.sensitivity),\n canonicalKey: typeof body.canonicalKey === 'string' ? body.canonicalKey : undefined,\n explicitness: parseEnum(body.explicitness, MEMORY_EXPLICITNESS),\n durability: parseEnum(body.durability, MEMORY_DURABILITY),\n importance: typeof body.importance === 'number' ? body.importance : undefined,\n disclosurePolicy: parseEnum(body.disclosurePolicy, MEMORY_DISCLOSURE_POLICIES),\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : undefined,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : undefined,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : undefined,\n validFrom: typeof body.validFrom === 'string' ? body.validFrom : undefined,\n validTo: typeof body.validTo === 'string' ? body.validTo : undefined,\n supersedesRecordId: typeof body.supersedesRecordId === 'string' ? body.supersedesRecordId : undefined,\n conflictGroupId: typeof body.conflictGroupId === 'string' ? body.conflictGroupId : undefined,\n });\n return c.json({ record }, 201);\n });\n\n authenticated.patch('/api/memory/records/:id', async (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n if (!existing) return c.json({ error: 'Memory record not found' }, 404);\n const selectedAgentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (existing.scope.agentId !== selectedAgentId) {\n return c.json({ error: 'Memory record not found for selected agent' }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const record = upsertMemoryRecord({\n id: existing.id,\n providerId: existing.source.provider ?? 'local',\n kind: parseKind(body.kind) ?? existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n sessionKey: existing.scope.sessionKey,\n projectId: typeof body.projectId === 'string' ? body.projectId : existing.scope.projectId,\n content: typeof body.content === 'string' ? body.content : existing.content,\n source: body.source && typeof body.source === 'object' ? body.source : existing.source,\n confidence: typeof body.confidence === 'number' ? body.confidence : existing.confidence,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : existing.tags,\n status: parseStatus(body.status) ?? existing.status,\n sensitivity: parseSensitivity(body.sensitivity) ?? existing.sensitivity,\n canonicalKey: typeof body.canonicalKey === 'string' ? body.canonicalKey : existing.canonicalKey,\n explicitness: parseEnum(body.explicitness, MEMORY_EXPLICITNESS) ?? existing.explicitness,\n durability: parseEnum(body.durability, MEMORY_DURABILITY) ?? existing.durability,\n importance: typeof body.importance === 'number' ? body.importance : existing.importance,\n disclosurePolicy: parseEnum(body.disclosurePolicy, MEMORY_DISCLOSURE_POLICIES) ?? existing.disclosurePolicy,\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : existing.evidence,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : existing.reviewAfter,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : existing.expiresAt,\n validFrom: typeof body.validFrom === 'string' ? body.validFrom : existing.validFrom,\n validTo: typeof body.validTo === 'string' ? body.validTo : existing.validTo,\n supersedesRecordId: typeof body.supersedesRecordId === 'string' ? body.supersedesRecordId : existing.supersedesRecordId,\n conflictGroupId: typeof body.conflictGroupId === 'string' ? body.conflictGroupId : existing.conflictGroupId,\n });\n return c.json({ record });\n });\n\n authenticated.delete('/api/memory/records/:id', (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n const selectedAgentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n if (!existing || existing.scope.agentId !== selectedAgentId) {\n return c.json({ error: 'Memory record not found for selected agent' }, 404);\n }\n const deleted = deleteMemoryRecord(c.req.param('id'));\n if (!deleted) return c.json({ error: 'Memory record not found' }, 404);\n return c.json({ ok: true });\n });\n\n authenticated.get('/api/memory/signals', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const signals = listMemorySignals({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n agentId,\n workspaceId: c.req.query('workspaceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ signals });\n });\n\n authenticated.get('/api/knowledge/source-items', (c) => {\n const sourceItems = listKnowledgeSourceItems({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n synthesisStatus: parseEnum(c.req.query('synthesisStatus'), KNOWLEDGE_SYNTHESIS_STATUSES),\n includeDeleted: c.req.query('includeDeleted') === 'true',\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ sourceItems });\n });\n\n authenticated.get('/api/knowledge/sync-runs', (c) => {\n const syncRuns = listKnowledgeSyncRuns({\n sourceInstanceId: c.req.query('sourceInstanceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ syncRuns });\n });\n\n authenticated.get('/api/memory/traces', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const traces = listMemoryTraceEvents({\n providerId: c.req.query('providerId') || undefined,\n agentId,\n sessionKey: c.req.query('sessionKey') || undefined,\n phase: c.req.query('phase') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ traces });\n });\n\n authenticated.patch('/api/memory/traces/:traceId/feedback', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const outcome = typeof body.outcome === 'string' && MEMORY_TRACE_FEEDBACK_OUTCOMES.has(body.outcome)\n ? body.outcome\n : undefined;\n if (!outcome) {\n return c.json({ error: 'Missing or invalid required field: outcome' }, 400);\n }\n const source = body.source === 'user' || body.source === 'evaluator' || body.source === 'system'\n ? body.source\n : undefined;\n const trace = setMemoryTraceFeedback({\n traceId: c.req.param('traceId'),\n feedback: {\n outcome,\n ...(typeof body.score === 'number' ? { score: body.score } : {}),\n ...(typeof body.reason === 'string' ? { reason: body.reason } : {}),\n ...(source ? { source } : {}),\n },\n });\n if (!trace) return c.json({ error: 'Memory trace not found' }, 404);\n return c.json({ trace });\n });\n\n authenticated.get('/api/memory/feedback-summary', (c) => {\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(deps.service.currentConfig as Config);\n const summaries = summarizeMemoryRecallFeedback({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n agentId,\n sessionKey: c.req.query('sessionKey') || undefined,\n limit: parseFeedbackSummaryLimit(c.req.query('limit')),\n });\n return c.json({ summaries });\n });\n\n authenticated.get('/api/memory/understanding/quality', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n const metrics = summarizeUserUnderstandingQuality({\n agentId: manifest.id,\n windowDays: parseWindowDays(c.req.query('windowDays')),\n });\n const baseIntervalTurns = manifest.memory.understanding?.reviewIntervalTurns ?? 10;\n const cadence = resolveAdaptiveUnderstandingCadence(\n baseIntervalTurns,\n metrics,\n manifest.memory.understanding?.adaptiveCadence ?? true,\n );\n return c.json({ metrics, cadence });\n });\n\n authenticated.patch(\n '/api/memory/understanding/response-feedback',\n deps.strictRateLimitMiddleware,\n async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const sessionKey = typeof body.sessionKey === 'string' ? body.sessionKey.trim() : '';\n const assistantTimestamp = typeof body.assistantTimestamp === 'number'\n ? body.assistantTimestamp\n : Number.NaN;\n const outcome = body.outcome === 'helpful' || body.outcome === 'not_helpful'\n ? body.outcome\n : undefined;\n const reason = typeof body.reason === 'string'\n ? body.reason.trim().slice(0, 160)\n : '';\n if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0 || !outcome) {\n return c.json({ error: 'sessionKey, assistantTimestamp, and a valid outcome are required' }, 400);\n }\n const trace = setLatestMemoryInjectFeedback({\n sessionKey,\n beforeMs: assistantTimestamp,\n feedback: {\n outcome,\n source: 'user',\n reason: reason || 'assistant_response_feedback',\n },\n });\n return c.json({\n matched: Boolean(trace),\n attributedRecordCount: trace?.selectedRecordIds.length ?? 0,\n personalContext: personalContextForTrace(trace),\n feedback: trace?.feedback ?? null,\n remediation: trace?.remediation ?? null,\n });\n },\n );\n\n authenticated.get('/api/memory/understanding/response-feedback', (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim() ?? '';\n const assistantTimestamp = Number(c.req.query('assistantTimestamp'));\n if (!sessionKey || !Number.isFinite(assistantTimestamp) || assistantTimestamp <= 0) {\n return c.json({ error: 'sessionKey and assistantTimestamp are required' }, 400);\n }\n const trace = findLatestMemoryInjectTrace({\n sessionKey,\n beforeMs: assistantTimestamp,\n });\n return c.json({\n matched: Boolean(trace),\n attributedRecordCount: trace?.selectedRecordIds.length ?? 0,\n personalContext: personalContextForTrace(trace),\n feedback: trace?.feedback ?? null,\n });\n });\n\n authenticated.post('/api/memory/signals', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const source = typeof body.source === 'string' ? body.source : '';\n if (!source) return c.json({ error: 'Missing required field: source' }, 400);\n const signalId = appendMemorySignal({\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId: typeof body.agentId === 'string' ? body.agentId : undefined,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n signal: {\n source: source as never,\n recordId: typeof body.recordId === 'string' ? body.recordId : undefined,\n score: typeof body.score === 'number' ? body.score : undefined,\n content: typeof body.content === 'string' ? body.content : undefined,\n metadata: body.metadata && typeof body.metadata === 'object' ? body.metadata : undefined,\n },\n });\n return c.json({ signalId }, 201);\n });\n\n authenticated.post('/api/memory/providers/:id/test', deps.strictRateLimitMiddleware, async (c) => {\n const providerId = c.req.param('id');\n const cfg = deps.service.currentConfig as Config;\n const workspace = deps.service.currentWorkspacePath;\n const store = new BuiltinMemoryStore(resolveBuiltinMemoryStoreConfig(workspace, cfg));\n const manager = createMemoryManagerFromConfig(workspace, store, cfg);\n await manager.initializeAll(`memory-provider-test-${Date.now()}`, { workspace, agentId: resolveDefaultAgentId(cfg) });\n const provider = manager.providersList.find((p) => p.id === providerId);\n if (!provider) return c.json({ providerId, available: false, checks: [{ name: 'load', ok: false, message: 'Provider not loaded' }] }, 404);\n\n const token = `xopc-memory-smoke-${Date.now()}`;\n const checks: Array<{ name: string; ok: boolean; message?: string; resultCount?: number }> = [\n { name: 'load', ok: true },\n { name: 'available', ok: provider.isAvailable() },\n ];\n const started = Date.now();\n try {\n const write = await manager.write({\n kind: 'workspace_fact',\n content: `Smoke test record for ${providerId}: ${token}`,\n scope: { agentId: resolveDefaultAgentId(cfg) },\n tags: ['xopc-smoke-test'],\n });\n checks.push({ name: 'write', ok: write.success, message: write.error ?? write.message });\n const results = await manager.search({ query: token, scope: { agentId: resolveDefaultAgentId(cfg) }, maxResults: 10 });\n const ownResults = results.filter((result) => result.citation.providerId === providerId);\n checks.push({ name: 'search', ok: ownResults.length > 0, resultCount: ownResults.length });\n const recordId = ownResults[0]?.record.id ?? write.record?.id;\n if (recordId) {\n const read = await manager.read({ id: recordId, scope: { agentId: resolveDefaultAgentId(cfg) } });\n checks.push({ name: 'read', ok: Boolean(read), message: read ? undefined : 'Record was not readable' });\n } else {\n checks.push({ name: 'read', ok: false, message: 'No record id available' });\n }\n manager.recordSignal({ source: 'search_recall', content: `Smoke signal for ${providerId}: ${token}` });\n checks.push({ name: 'sync', ok: true });\n } catch (err) {\n checks.push({ name: 'error', ok: false, message: err instanceof Error ? err.message : String(err) });\n } finally {\n appendMemoryTraceEvent({\n phase: 'test',\n providerId,\n request: { token },\n resultCount: checks.filter((check) => check.ok).length,\n error: checks.some((check) => !check.ok) ? 'one or more checks failed' : undefined,\n durationMs: Date.now() - started,\n });\n await manager.shutdownAll();\n }\n return c.json({ providerId, available: provider.isAvailable(), checks });\n });\n}\n"],"mappings":"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"}
@@ -4,6 +4,7 @@ import { init_resolve_config_value, testApiKeyResolution } from "../../../config
4
4
  import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
5
5
  import { getModelRegistry } from "../../../providers/model-registry.js";
6
6
  import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
7
+ import "../../../providers/constants.js";
7
8
  import { getProviderRegistry, init_plugin_registry } from "../../../providers/plugin-registry.js";
8
9
  import { PROVIDER_META, getAllModels, getAllProviders, getAvailableModels, getProviderAuthState, init_providers, isProviderConfigured, resolveModel } from "../../../providers/index.js";
9
10
  import { getImageGenerationProvider } from "../../../agent/image/generation/provider-registry.js";
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","names":["getModelsJsonPath"],"sources":["../../../../../src/gateway/hono/routes/models.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport {\n getModelsJsonPath,\n loadModelsJson,\n saveModelsJson,\n validateModelsConfig,\n type ProviderConfig,\n} from '../../../config/models-json.js';\nimport type { Config } from '../../../config/schema.js';\nimport { parseModelRef } from '../../../config/schema.js';\nimport { testApiKeyResolution } from '../../../config/resolve-config-value.js';\nimport {\n getImageGenerationProvider,\n listImageGenerationProvidersSummary,\n} from '../../../agent/image/generation/runtime.js';\nimport {\n EXTENSION_PROVIDER_BASE_URL,\n getAllModels,\n getAvailableModels,\n getModelRegistry,\n getAllProviders,\n getProviderAuthState,\n isProviderConfigured,\n PROVIDER_META,\n resolveModel,\n} from '../../../providers/index.js';\nimport {\n getProviderHint,\n getOnboardingFeaturedProviders,\n getRecommendedModelsForProvider,\n isRecommendedModel,\n sortModelsForPicker,\n sortProvidersForPicker,\n} from '../../../providers/presentation.js';\nimport {\n getDomesticProviderPreset,\n getDomesticProviderPresetIds,\n} from '../../../providers/domestic-presets.js';\nimport { discoverProviderModels, isProviderApiDiscoverable } from '../../../providers/model-discovery.js';\nimport { CredentialResolver } from '../../../auth/credentials.js';\nimport { getProviderRegistry } from '../../../providers/plugin-registry.js';\nimport type { ProviderModelDefinition } from '../../../extensions/types/providers.js';\nimport type { GatewayService } from '../../service.js';\nimport {\n resolveCurrentImageModelCapabilities,\n resolveImageGenerationCapabilities,\n resolveImageUnderstandingCapabilities,\n} from '../../image-capabilities.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport { respondStartupUnavailable } from '../lib/startup-unavailable.js';\n\nfunction readModelsJsonProviderApiKey(providerId: string): string | undefined {\n const { config } = loadModelsJson(getModelsJsonPath());\n const entry = config.providers?.[providerId.trim()];\n const key = entry?.apiKey;\n return typeof key === 'string' && key.trim() ? key.trim() : undefined;\n}\n\nfunction readStringRecord(value: unknown): Record<string, string> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const entries = Object.entries(value as Record<string, unknown>).filter(\n (entry): entry is [string, string] => typeof entry[1] === 'string',\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\n/** Plaintext key only when persisted under `cfg.providers.<id>.apiKey` (not env / credential store). */\nfunction readProviderApiKeyFromConfigFileOnly(cfg: Config, providerId: string): string | undefined {\n const id = providerId.trim().toLowerCase();\n const bucket = cfg.providers?.[id];\n if (!bucket || typeof bucket !== 'object' || Array.isArray(bucket)) return undefined;\n const k = (bucket as { apiKey?: unknown }).apiKey;\n return typeof k === 'string' && k.trim() ? k.trim() : undefined;\n}\n\n/** Extension id from manifest `providers[]` (e.g. provider `demo` → extension `demo-provider`). */\nfunction resolveExtensionIdForProvider(service: GatewayService, providerId: string): string | undefined {\n const loader = service.getExtensionLoader();\n if (!loader) return undefined;\n return loader.buildManifestRegistry().findByProvider(providerId)?.id;\n}\n\n/** Effective LLM REST base URL for a provider (models.json overrides included). */\nfunction resolveProviderApiBaseUrl(providerId: string): string | undefined {\n const model = getModelRegistry().getAll().find((m) => m.provider === providerId);\n if (!model?.baseUrl || model.baseUrl === EXTENSION_PROVIDER_BASE_URL) return undefined;\n return model.baseUrl;\n}\n\nfunction mapPluginModel(providerId: string, model: ProviderModelDefinition, available: boolean) {\n return {\n id: `${providerId}/${model.id}`,\n name: model.name,\n provider: providerId,\n contextWindow: model.contextWindow ?? 128000,\n maxTokens: model.maxOutputTokens ?? 4096,\n reasoning: false,\n vision: model.supportsImages ?? false,\n cost: { input: model.pricing?.input ?? 0, output: model.pricing?.output ?? 0 },\n available,\n recommended: isRecommendedModel(providerId, model.id),\n source: 'extension' as const,\n };\n}\n\nexport function registerModelsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n // GET /api/models-json - Get models.json configuration\n authenticated.get('/api/models-json', async (c) => {\n const path = getModelsJsonPath();\n const { config, error } = loadModelsJson(path);\n const registry = getModelRegistry();\n \n return c.json({\n ok: true,\n payload: {\n config,\n path,\n exists: error === undefined,\n loadError: error || registry.getError(),\n },\n });\n });\n\n // POST /api/models-json/validate - Validate models.json configuration\n authenticated.post('/api/models-json/validate', async (c) => {\n const body = await c.req.json();\n const { config } = body;\n \n const result = validateModelsConfig(config);\n \n return c.json({\n ok: true,\n payload: result,\n });\n });\n\n // PATCH /api/models-json - Save models.json configuration\n authenticated.patch('/api/models-json', async (c) => {\n const body = await c.req.json();\n const { config } = body;\n \n const path = getModelsJsonPath();\n const result = saveModelsJson(path, config);\n \n if (!result.success) {\n return c.json({ ok: false, error: result.error }, 400);\n }\n \n // Refresh registry\n const registry = getModelRegistry();\n registry.refresh();\n \n // Emit event\n service.emit('models-json.updated', { \n modelCount: registry.getAll().length,\n });\n \n return c.json({ \n ok: true, \n payload: { \n saved: true,\n modelCount: registry.getAll().length,\n },\n });\n });\n\n // POST /api/models-json/reload - Hot reload models.json\n authenticated.post('/api/models-json/reload', async (c) => {\n const registry = getModelRegistry();\n registry.refresh();\n \n const error = registry.getError();\n const models = registry.getAll();\n \n service.emit('models-json.reloaded', { \n modelCount: models.length,\n error: error || undefined,\n });\n \n return c.json({\n ok: true,\n payload: {\n modelCount: models.length,\n error,\n },\n });\n });\n\n // POST /api/models-json/test-api-key - Test API key resolution\n authenticated.post('/api/models-json/test-api-key', async (c) => {\n const body = await c.req.json();\n const { value } = body;\n \n const result = testApiKeyResolution(value);\n \n return c.json({\n ok: true,\n payload: result,\n });\n });\n\n // POST /api/models-json/discover-models - Best-effort /models discovery for OpenAI-compatible providers\n authenticated.post('/api/models-json/discover-models', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const rawProviderId = typeof body.providerId === 'string' ? body.providerId.trim() : '';\n const rawBaseUrl = typeof body.baseUrl === 'string' ? body.baseUrl.trim() : '';\n const rawApiKey = typeof body.apiKey === 'string' ? body.apiKey.trim() : undefined;\n const api = typeof body.api === 'string' ? body.api : undefined;\n const headers = readStringRecord(body.headers);\n\n if (!rawProviderId) {\n return c.json({ ok: false, error: { message: 'Missing providerId' } }, 400);\n }\n if (!rawBaseUrl || !URL.canParse(rawBaseUrl)) {\n return c.json({ ok: false, error: { message: 'Missing or invalid baseUrl' } }, 400);\n }\n const providerApi = api as ProviderConfig['api'];\n if (!isProviderApiDiscoverable(providerApi)) {\n return c.json({ ok: false, error: { message: 'Model discovery requires an OpenAI-compatible API type' } }, 400);\n }\n\n try {\n const models = await discoverProviderModels({\n providerId: rawProviderId,\n baseUrl: rawBaseUrl,\n apiKey: rawApiKey,\n api: providerApi,\n headers,\n });\n return c.json({\n ok: true,\n payload: {\n models: models.map((model) => ({\n id: model.id,\n name: model.name ?? model.id,\n input: model.input ?? ['text'],\n source: model.source,\n })),\n },\n });\n } catch (error) {\n return c.json(\n { ok: false, error: { message: error instanceof Error ? error.message : String(error) } },\n 502,\n );\n }\n });\n\n // GET /api/models - Get available models (only configured providers)\n authenticated.get('/api/models', async (c) => {\n if (!service.isGatewayReady()) {\n return respondStartupUnavailable(c, 'models.list');\n }\n const pluginRegistry = getProviderRegistry();\n const models = sortModelsForPicker(await getAvailableModels()).map(m => ({\n id: `${m.provider}/${m.id}`,\n name: m.name,\n provider: m.provider,\n contextWindow: m.contextWindow ?? 128000,\n maxTokens: m.maxTokens ?? 4096,\n reasoning: m.reasoning ?? false,\n vision: m.input?.includes('image') ?? false,\n recommended: isRecommendedModel(m.provider, m.id),\n cost: {\n input: m.cost?.input ?? 0,\n output: m.cost?.output ?? 0,\n },\n ...(pluginRegistry.has(m.provider) ? { source: 'extension' as const } : {}),\n }));\n\n const existingIds = new Set(models.map(m => m.id));\n for (const plugin of pluginRegistry.listAll()) {\n for (const model of plugin.models) {\n const compositeId = `${plugin.id}/${model.id}`;\n if (!existingIds.has(compositeId)) {\n models.push(mapPluginModel(plugin.id, model, true));\n existingIds.add(compositeId);\n }\n }\n }\n\n models.sort((a, b) => {\n if (a.recommended !== b.recommended) return a.recommended ? -1 : 1;\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });\n });\n\n return c.json({ ok: true, payload: { models } });\n });\n\n authenticated.get('/api/image/capabilities', async (c) => {\n const config = service.currentConfig as Config;\n const agentId = c.req.query('agentId')?.trim() || undefined;\n const imageGenerationProviders = await resolveImageGenerationCapabilities(config);\n const imageUnderstandingProviders = await resolveImageUnderstandingCapabilities(config);\n return c.json({\n ok: true,\n payload: {\n current: resolveCurrentImageModelCapabilities(config, agentId),\n imageGeneration: { providers: imageGenerationProviders },\n imageUnderstanding: { providers: imageUnderstandingProviders },\n },\n });\n });\n\n authenticated.post('/api/image/validate-model', strictRateLimitMiddleware, async (c) => {\n let body: { modelRef?: unknown };\n try {\n body = (await c.req.json()) as { modelRef?: unknown };\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const modelRef = body.modelRef;\n if (!modelRef || typeof modelRef !== 'string') {\n return c.json({ ok: false, error: 'modelRef is required' }, 400);\n }\n\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'invalid_format',\n message: 'Model reference must be in \"provider/model\" format',\n },\n });\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'provider_not_configured',\n message: `Provider \"${parsed.provider}\" is not configured. Set the API key first.`,\n provider: parsed.provider,\n },\n });\n }\n\n try {\n resolveModel(modelRef);\n } catch {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'model_not_found',\n message: `Model not found in registry: ${modelRef}`,\n provider: parsed.provider,\n model: parsed.model,\n },\n });\n }\n\n return c.json({\n ok: true,\n payload: {\n valid: true,\n provider: parsed.provider,\n model: parsed.model,\n },\n });\n });\n\n // GET /api/image/providers — registered image generation providers and models (not in LLM model registry)\n authenticated.get('/api/image/providers', (c) => {\n const cfg = deps.service.currentConfig;\n const summaries = listImageGenerationProvidersSummary(cfg);\n const providers = summaries.map((p) => {\n const provider = getImageGenerationProvider(p.id, cfg);\n let configured = false;\n try {\n configured = provider?.isConfigured?.({ cfg }) === true;\n } catch {\n configured = false;\n }\n return { ...p, configured };\n });\n return c.json({ ok: true, payload: { providers } });\n });\n\n // POST /api/image/providers/:id/test — lightweight credential probe; does NOT\n // hit the vendor (no quota burn). Returns `{ ok, configured, reason }`.\n authenticated.post('/api/image/providers/:id/test', (c) => {\n const id = c.req.param('id');\n const cfg = deps.service.currentConfig;\n const provider = getImageGenerationProvider(id, cfg);\n if (!provider) {\n return c.json(\n { ok: false, error: { message: `Image generation provider not found: ${id}` } },\n 404,\n );\n }\n let configured = false;\n let reason: string | undefined;\n try {\n configured = provider.isConfigured?.({ cfg }) === true;\n if (!configured) reason = 'Missing API key (set via config or environment).';\n } catch (err) {\n reason = err instanceof Error ? err.message : String(err);\n }\n return c.json({\n ok: true,\n payload: {\n id: provider.id,\n configured,\n ...(reason ? { reason } : {}),\n defaultModel: provider.defaultModel ?? null,\n },\n });\n });\n\n /**\n * POST /api/image/providers/:id/reveal-api-key — return `cfg.providers.<id>.apiKey` plaintext for the\n * gateway console (same auth as PATCH /api/config). Does not resolve env vars or credential files.\n */\n authenticated.post(\n '/api/image/providers/:id/reveal-api-key',\n strictRateLimitMiddleware,\n async (c) => {\n const rawId = c.req.param('id');\n const cfg = deps.service.currentConfig;\n const provider = getImageGenerationProvider(rawId, cfg);\n if (!provider) {\n return c.json(\n { ok: false, error: { message: `Image generation provider not found: ${rawId}` } },\n 404,\n );\n }\n const apiKey = readProviderApiKeyFromConfigFileOnly(cfg, provider.id);\n return c.json({\n ok: true,\n payload: {\n id: provider.id,\n apiKey: apiKey ?? null,\n source: apiKey ? ('config' as const) : ('none' as const),\n },\n });\n },\n );\n\n // GET /api/providers - Get ALL available providers and models\n authenticated.get('/api/providers', async (c) => {\n const pluginRegistry = getProviderRegistry();\n const allModels = getAllModels();\n const availableModels = await getAvailableModels();\n const configured = new Set(availableModels.map(m => `${m.provider}/${m.id}`));\n\n const models = sortModelsForPicker(allModels).map(m => ({\n id: `${m.provider}/${m.id}`,\n name: m.name,\n provider: m.provider,\n contextWindow: m.contextWindow ?? 128000,\n maxTokens: m.maxTokens ?? 4096,\n reasoning: m.reasoning ?? false,\n vision: m.input?.includes('image') ?? false,\n recommended: isRecommendedModel(m.provider, m.id),\n cost: {\n input: m.cost?.input ?? 0,\n output: m.cost?.output ?? 0,\n },\n available: configured.has(`${m.provider}/${m.id}`),\n ...(pluginRegistry.has(m.provider) ? { source: 'extension' as const } : {}),\n }));\n\n const existingIds = new Set(models.map(m => m.id));\n for (const plugin of pluginRegistry.listAll()) {\n for (const model of plugin.models) {\n const compositeId = `${plugin.id}/${model.id}`;\n if (!existingIds.has(compositeId)) {\n models.push(mapPluginModel(plugin.id, model, configured.has(compositeId)));\n existingIds.add(compositeId);\n }\n }\n }\n\n models.sort((a, b) => {\n if (a.recommended !== b.recommended) return a.recommended ? -1 : 1;\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });\n });\n\n return c.json({ ok: true, payload: { models } });\n });\n\n // GET /api/providers/meta - Get provider metadata (categories, display names)\n authenticated.get('/api/providers/meta', async (c) => {\n const providers = sortProvidersForPicker([...new Set([...getAllProviders(), ...getDomesticProviderPresetIds()])]);\n const pluginRegistry = getProviderRegistry();\n\n const meta = await Promise.all(\n providers.map(async (provider) => {\n const plugin = pluginRegistry.get(provider);\n const domesticPreset = getDomesticProviderPreset(provider);\n const extensionId = plugin\n ? resolveExtensionIdForProvider(service, provider)\n : undefined;\n const authState = await getProviderAuthState(provider);\n const configured = authState.authMode !== 'none' || (await isProviderConfigured(provider));\n const registryModelCount = getAllModels().filter((m) => m.provider === provider).length;\n return {\n id: provider,\n name: plugin?.name ?? domesticPreset?.displayName ?? PROVIDER_META[provider]?.name ?? provider,\n category: plugin ? ('extension' as const) : PROVIDER_META[provider]?.category || (domesticPreset ? 'domestic' : 'specialty'),\n supportsOAuth: plugin ? false : (PROVIDER_META[provider]?.supportsOAuth ?? false),\n supportsApiKey: plugin ? false : (PROVIDER_META[provider]?.supportsApiKey ?? true),\n configured,\n onboardingFeatured: getOnboardingFeaturedProviders().includes(provider),\n recommendedModels: getRecommendedModelsForProvider(provider),\n modelCount: registryModelCount || domesticPreset?.models.length || 0,\n ...(getProviderHint(provider) ? { hint: getProviderHint(provider) } : {}),\n activeKeySource: authState.authMode,\n authMode: authState.authMode,\n authStatus: authState.authStatus,\n ...(authState.expiresAt ? { expiresAt: authState.expiresAt } : {}),\n baseUrl: resolveProviderApiBaseUrl(provider),\n ...(extensionId ? { extensionId } : {}),\n };\n }),\n );\n\n const knownProviderIds = new Set(providers);\n for (const plugin of pluginRegistry.listAll()) {\n if (!knownProviderIds.has(plugin.id)) {\n const extensionId = resolveExtensionIdForProvider(service, plugin.id);\n meta.push({\n id: plugin.id,\n name: plugin.name,\n category: 'extension',\n supportsOAuth: false,\n supportsApiKey: false,\n configured: true,\n onboardingFeatured: false,\n recommendedModels: getRecommendedModelsForProvider(plugin.id),\n modelCount: plugin.models.length,\n activeKeySource: 'extension',\n authMode: 'extension',\n authStatus: 'connected',\n baseUrl: resolveProviderApiBaseUrl(plugin.id),\n ...(extensionId ? { extensionId } : {}),\n });\n }\n }\n\n return c.json({ ok: true, payload: { providers: meta } });\n });\n\n /**\n * POST /api/providers/:providerId/reveal-api-key — plaintext key when stored in the\n * gateway credential store or models.json (not env vars or OAuth tokens).\n */\n authenticated.post(\n '/api/providers/:providerId/reveal-api-key',\n strictRateLimitMiddleware,\n async (c) => {\n const rawId = c.req.param('providerId')?.trim();\n if (!rawId) {\n return c.json({ ok: false, error: { message: 'Missing providerId' } }, 400);\n }\n const providerId = rawId.toLowerCase();\n const resolver = new CredentialResolver();\n const stored = await resolver.revealGatewayStoredApiKey(providerId);\n if (stored) {\n return c.json({\n ok: true,\n payload: { id: providerId, apiKey: stored, source: 'credential' as const },\n });\n }\n const fromModelsJson = readModelsJsonProviderApiKey(providerId);\n if (fromModelsJson) {\n return c.json({\n ok: true,\n payload: { id: providerId, apiKey: fromModelsJson, source: 'models_json' as const },\n });\n }\n return c.json({\n ok: true,\n payload: { id: providerId, apiKey: null, source: 'none' as const },\n });\n },\n );\n\n // DELETE /api/providers/:providerId/key - Remove a provider's stored API key\n authenticated.delete('/api/providers/:providerId/key', strictRateLimitMiddleware, async (c) => {\n const providerId = c.req.param('providerId');\n if (!providerId) {\n return c.json({ ok: false, error: { message: 'Missing providerId' } }, 400);\n }\n\n const normalizedProvider = providerId.toLowerCase();\n const resolver = new CredentialResolver();\n\n try {\n await resolver.deleteProviderCredential(normalizedProvider);\n return c.json({ ok: true, payload: { deleted: normalizedProvider } });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return c.json({ ok: false, error: { message: `Failed to delete key: ${errorMessage}` } }, 500);\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"models.js","names":["getModelsJsonPath"],"sources":["../../../../../src/gateway/hono/routes/models.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport {\n getModelsJsonPath,\n loadModelsJson,\n saveModelsJson,\n validateModelsConfig,\n type ProviderConfig,\n} from '../../../config/models-json.js';\nimport type { Config } from '../../../config/schema.js';\nimport { parseModelRef } from '../../../config/schema.js';\nimport { testApiKeyResolution } from '../../../config/resolve-config-value.js';\nimport {\n getImageGenerationProvider,\n listImageGenerationProvidersSummary,\n} from '../../../agent/image/generation/runtime.js';\nimport {\n EXTENSION_PROVIDER_BASE_URL,\n getAllModels,\n getAvailableModels,\n getModelRegistry,\n getAllProviders,\n getProviderAuthState,\n isProviderConfigured,\n PROVIDER_META,\n resolveModel,\n} from '../../../providers/index.js';\nimport {\n getProviderHint,\n getOnboardingFeaturedProviders,\n getRecommendedModelsForProvider,\n isRecommendedModel,\n sortModelsForPicker,\n sortProvidersForPicker,\n} from '../../../providers/presentation.js';\nimport {\n getDomesticProviderPreset,\n getDomesticProviderPresetIds,\n} from '../../../providers/domestic-presets.js';\nimport { discoverProviderModels, isProviderApiDiscoverable } from '../../../providers/model-discovery.js';\nimport { CredentialResolver } from '../../../auth/credentials.js';\nimport { getProviderRegistry } from '../../../providers/plugin-registry.js';\nimport type { ProviderModelDefinition } from '../../../extensions/types/providers.js';\nimport type { GatewayService } from '../../service.js';\nimport {\n resolveCurrentImageModelCapabilities,\n resolveImageGenerationCapabilities,\n resolveImageUnderstandingCapabilities,\n} from '../../image-capabilities.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport { respondStartupUnavailable } from '../lib/startup-unavailable.js';\n\nfunction readModelsJsonProviderApiKey(providerId: string): string | undefined {\n const { config } = loadModelsJson(getModelsJsonPath());\n const entry = config.providers?.[providerId.trim()];\n const key = entry?.apiKey;\n return typeof key === 'string' && key.trim() ? key.trim() : undefined;\n}\n\nfunction readStringRecord(value: unknown): Record<string, string> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const entries = Object.entries(value as Record<string, unknown>).filter(\n (entry): entry is [string, string] => typeof entry[1] === 'string',\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\n/** Plaintext key only when persisted under `cfg.providers.<id>.apiKey` (not env / credential store). */\nfunction readProviderApiKeyFromConfigFileOnly(cfg: Config, providerId: string): string | undefined {\n const id = providerId.trim().toLowerCase();\n const bucket = cfg.providers?.[id];\n if (!bucket || typeof bucket !== 'object' || Array.isArray(bucket)) return undefined;\n const k = (bucket as { apiKey?: unknown }).apiKey;\n return typeof k === 'string' && k.trim() ? k.trim() : undefined;\n}\n\n/** Extension id from manifest `providers[]` (e.g. provider `demo` → extension `demo-provider`). */\nfunction resolveExtensionIdForProvider(service: GatewayService, providerId: string): string | undefined {\n const loader = service.getExtensionLoader();\n if (!loader) return undefined;\n return loader.buildManifestRegistry().findByProvider(providerId)?.id;\n}\n\n/** Effective LLM REST base URL for a provider (models.json overrides included). */\nfunction resolveProviderApiBaseUrl(providerId: string): string | undefined {\n const model = getModelRegistry().getAll().find((m) => m.provider === providerId);\n if (!model?.baseUrl || model.baseUrl === EXTENSION_PROVIDER_BASE_URL) return undefined;\n return model.baseUrl;\n}\n\nfunction mapPluginModel(providerId: string, model: ProviderModelDefinition, available: boolean) {\n return {\n id: `${providerId}/${model.id}`,\n name: model.name,\n provider: providerId,\n contextWindow: model.contextWindow ?? 128000,\n maxTokens: model.maxOutputTokens ?? 4096,\n reasoning: false,\n vision: model.supportsImages ?? false,\n cost: { input: model.pricing?.input ?? 0, output: model.pricing?.output ?? 0 },\n available,\n recommended: isRecommendedModel(providerId, model.id),\n source: 'extension' as const,\n };\n}\n\nexport function registerModelsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n // GET /api/models-json - Get models.json configuration\n authenticated.get('/api/models-json', async (c) => {\n const path = getModelsJsonPath();\n const { config, error } = loadModelsJson(path);\n const registry = getModelRegistry();\n \n return c.json({\n ok: true,\n payload: {\n config,\n path,\n exists: error === undefined,\n loadError: error || registry.getError(),\n },\n });\n });\n\n // POST /api/models-json/validate - Validate models.json configuration\n authenticated.post('/api/models-json/validate', async (c) => {\n const body = await c.req.json();\n const { config } = body;\n \n const result = validateModelsConfig(config);\n \n return c.json({\n ok: true,\n payload: result,\n });\n });\n\n // PATCH /api/models-json - Save models.json configuration\n authenticated.patch('/api/models-json', async (c) => {\n const body = await c.req.json();\n const { config } = body;\n \n const path = getModelsJsonPath();\n const result = saveModelsJson(path, config);\n \n if (!result.success) {\n return c.json({ ok: false, error: result.error }, 400);\n }\n \n // Refresh registry\n const registry = getModelRegistry();\n registry.refresh();\n \n // Emit event\n service.emit('models-json.updated', { \n modelCount: registry.getAll().length,\n });\n \n return c.json({ \n ok: true, \n payload: { \n saved: true,\n modelCount: registry.getAll().length,\n },\n });\n });\n\n // POST /api/models-json/reload - Hot reload models.json\n authenticated.post('/api/models-json/reload', async (c) => {\n const registry = getModelRegistry();\n registry.refresh();\n \n const error = registry.getError();\n const models = registry.getAll();\n \n service.emit('models-json.reloaded', { \n modelCount: models.length,\n error: error || undefined,\n });\n \n return c.json({\n ok: true,\n payload: {\n modelCount: models.length,\n error,\n },\n });\n });\n\n // POST /api/models-json/test-api-key - Test API key resolution\n authenticated.post('/api/models-json/test-api-key', async (c) => {\n const body = await c.req.json();\n const { value } = body;\n \n const result = testApiKeyResolution(value);\n \n return c.json({\n ok: true,\n payload: result,\n });\n });\n\n // POST /api/models-json/discover-models - Best-effort /models discovery for OpenAI-compatible providers\n authenticated.post('/api/models-json/discover-models', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const rawProviderId = typeof body.providerId === 'string' ? body.providerId.trim() : '';\n const rawBaseUrl = typeof body.baseUrl === 'string' ? body.baseUrl.trim() : '';\n const rawApiKey = typeof body.apiKey === 'string' ? body.apiKey.trim() : undefined;\n const api = typeof body.api === 'string' ? body.api : undefined;\n const headers = readStringRecord(body.headers);\n\n if (!rawProviderId) {\n return c.json({ ok: false, error: { message: 'Missing providerId' } }, 400);\n }\n if (!rawBaseUrl || !URL.canParse(rawBaseUrl)) {\n return c.json({ ok: false, error: { message: 'Missing or invalid baseUrl' } }, 400);\n }\n const providerApi = api as ProviderConfig['api'];\n if (!isProviderApiDiscoverable(providerApi)) {\n return c.json({ ok: false, error: { message: 'Model discovery requires an OpenAI-compatible API type' } }, 400);\n }\n\n try {\n const models = await discoverProviderModels({\n providerId: rawProviderId,\n baseUrl: rawBaseUrl,\n apiKey: rawApiKey,\n api: providerApi,\n headers,\n });\n return c.json({\n ok: true,\n payload: {\n models: models.map((model) => ({\n id: model.id,\n name: model.name ?? model.id,\n input: model.input ?? ['text'],\n source: model.source,\n })),\n },\n });\n } catch (error) {\n return c.json(\n { ok: false, error: { message: error instanceof Error ? error.message : String(error) } },\n 502,\n );\n }\n });\n\n // GET /api/models - Get available models (only configured providers)\n authenticated.get('/api/models', async (c) => {\n if (!service.isGatewayReady()) {\n return respondStartupUnavailable(c, 'models.list');\n }\n const pluginRegistry = getProviderRegistry();\n const models = sortModelsForPicker(await getAvailableModels()).map(m => ({\n id: `${m.provider}/${m.id}`,\n name: m.name,\n provider: m.provider,\n contextWindow: m.contextWindow ?? 128000,\n maxTokens: m.maxTokens ?? 4096,\n reasoning: m.reasoning ?? false,\n vision: m.input?.includes('image') ?? false,\n recommended: isRecommendedModel(m.provider, m.id),\n cost: {\n input: m.cost?.input ?? 0,\n output: m.cost?.output ?? 0,\n },\n ...(pluginRegistry.has(m.provider) ? { source: 'extension' as const } : {}),\n }));\n\n const existingIds = new Set(models.map(m => m.id));\n for (const plugin of pluginRegistry.listAll()) {\n for (const model of plugin.models) {\n const compositeId = `${plugin.id}/${model.id}`;\n if (!existingIds.has(compositeId)) {\n models.push(mapPluginModel(plugin.id, model, true));\n existingIds.add(compositeId);\n }\n }\n }\n\n models.sort((a, b) => {\n if (a.recommended !== b.recommended) return a.recommended ? -1 : 1;\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });\n });\n\n return c.json({ ok: true, payload: { models } });\n });\n\n authenticated.get('/api/image/capabilities', async (c) => {\n const config = service.currentConfig as Config;\n const agentId = c.req.query('agentId')?.trim() || undefined;\n const imageGenerationProviders = await resolveImageGenerationCapabilities(config);\n const imageUnderstandingProviders = await resolveImageUnderstandingCapabilities(config);\n return c.json({\n ok: true,\n payload: {\n current: resolveCurrentImageModelCapabilities(config, agentId),\n imageGeneration: { providers: imageGenerationProviders },\n imageUnderstanding: { providers: imageUnderstandingProviders },\n },\n });\n });\n\n authenticated.post('/api/image/validate-model', strictRateLimitMiddleware, async (c) => {\n let body: { modelRef?: unknown };\n try {\n body = (await c.req.json()) as { modelRef?: unknown };\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const modelRef = body.modelRef;\n if (!modelRef || typeof modelRef !== 'string') {\n return c.json({ ok: false, error: 'modelRef is required' }, 400);\n }\n\n const parsed = parseModelRef(modelRef);\n if (!parsed) {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'invalid_format',\n message: 'Model reference must be in \"provider/model\" format',\n },\n });\n }\n\n const configured = await isProviderConfigured(parsed.provider);\n if (!configured) {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'provider_not_configured',\n message: `Provider \"${parsed.provider}\" is not configured. Set the API key first.`,\n provider: parsed.provider,\n },\n });\n }\n\n try {\n resolveModel(modelRef);\n } catch {\n return c.json({\n ok: true,\n payload: {\n valid: false,\n reason: 'model_not_found',\n message: `Model not found in registry: ${modelRef}`,\n provider: parsed.provider,\n model: parsed.model,\n },\n });\n }\n\n return c.json({\n ok: true,\n payload: {\n valid: true,\n provider: parsed.provider,\n model: parsed.model,\n },\n });\n });\n\n // GET /api/image/providers — registered image generation providers and models (not in LLM model registry)\n authenticated.get('/api/image/providers', (c) => {\n const cfg = deps.service.currentConfig;\n const summaries = listImageGenerationProvidersSummary(cfg);\n const providers = summaries.map((p) => {\n const provider = getImageGenerationProvider(p.id, cfg);\n let configured = false;\n try {\n configured = provider?.isConfigured?.({ cfg }) === true;\n } catch {\n configured = false;\n }\n return { ...p, configured };\n });\n return c.json({ ok: true, payload: { providers } });\n });\n\n // POST /api/image/providers/:id/test — lightweight credential probe; does NOT\n // hit the vendor (no quota burn). Returns `{ ok, configured, reason }`.\n authenticated.post('/api/image/providers/:id/test', (c) => {\n const id = c.req.param('id');\n const cfg = deps.service.currentConfig;\n const provider = getImageGenerationProvider(id, cfg);\n if (!provider) {\n return c.json(\n { ok: false, error: { message: `Image generation provider not found: ${id}` } },\n 404,\n );\n }\n let configured = false;\n let reason: string | undefined;\n try {\n configured = provider.isConfigured?.({ cfg }) === true;\n if (!configured) reason = 'Missing API key (set via config or environment).';\n } catch (err) {\n reason = err instanceof Error ? err.message : String(err);\n }\n return c.json({\n ok: true,\n payload: {\n id: provider.id,\n configured,\n ...(reason ? { reason } : {}),\n defaultModel: provider.defaultModel ?? null,\n },\n });\n });\n\n /**\n * POST /api/image/providers/:id/reveal-api-key — return `cfg.providers.<id>.apiKey` plaintext for the\n * gateway console (same auth as PATCH /api/config). Does not resolve env vars or credential files.\n */\n authenticated.post(\n '/api/image/providers/:id/reveal-api-key',\n strictRateLimitMiddleware,\n async (c) => {\n const rawId = c.req.param('id');\n const cfg = deps.service.currentConfig;\n const provider = getImageGenerationProvider(rawId, cfg);\n if (!provider) {\n return c.json(\n { ok: false, error: { message: `Image generation provider not found: ${rawId}` } },\n 404,\n );\n }\n const apiKey = readProviderApiKeyFromConfigFileOnly(cfg, provider.id);\n return c.json({\n ok: true,\n payload: {\n id: provider.id,\n apiKey: apiKey ?? null,\n source: apiKey ? ('config' as const) : ('none' as const),\n },\n });\n },\n );\n\n // GET /api/providers - Get ALL available providers and models\n authenticated.get('/api/providers', async (c) => {\n const pluginRegistry = getProviderRegistry();\n const allModels = getAllModels();\n const availableModels = await getAvailableModels();\n const configured = new Set(availableModels.map(m => `${m.provider}/${m.id}`));\n\n const models = sortModelsForPicker(allModels).map(m => ({\n id: `${m.provider}/${m.id}`,\n name: m.name,\n provider: m.provider,\n contextWindow: m.contextWindow ?? 128000,\n maxTokens: m.maxTokens ?? 4096,\n reasoning: m.reasoning ?? false,\n vision: m.input?.includes('image') ?? false,\n recommended: isRecommendedModel(m.provider, m.id),\n cost: {\n input: m.cost?.input ?? 0,\n output: m.cost?.output ?? 0,\n },\n available: configured.has(`${m.provider}/${m.id}`),\n ...(pluginRegistry.has(m.provider) ? { source: 'extension' as const } : {}),\n }));\n\n const existingIds = new Set(models.map(m => m.id));\n for (const plugin of pluginRegistry.listAll()) {\n for (const model of plugin.models) {\n const compositeId = `${plugin.id}/${model.id}`;\n if (!existingIds.has(compositeId)) {\n models.push(mapPluginModel(plugin.id, model, configured.has(compositeId)));\n existingIds.add(compositeId);\n }\n }\n }\n\n models.sort((a, b) => {\n if (a.recommended !== b.recommended) return a.recommended ? -1 : 1;\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });\n });\n\n return c.json({ ok: true, payload: { models } });\n });\n\n // GET /api/providers/meta - Get provider metadata (categories, display names)\n authenticated.get('/api/providers/meta', async (c) => {\n const providers = sortProvidersForPicker([...new Set([...getAllProviders(), ...getDomesticProviderPresetIds()])]);\n const pluginRegistry = getProviderRegistry();\n\n const meta = await Promise.all(\n providers.map(async (provider) => {\n const plugin = pluginRegistry.get(provider);\n const domesticPreset = getDomesticProviderPreset(provider);\n const extensionId = plugin\n ? resolveExtensionIdForProvider(service, provider)\n : undefined;\n const authState = await getProviderAuthState(provider);\n const configured = authState.authMode !== 'none' || (await isProviderConfigured(provider));\n const registryModelCount = getAllModels().filter((m) => m.provider === provider).length;\n return {\n id: provider,\n name: plugin?.name ?? domesticPreset?.displayName ?? PROVIDER_META[provider]?.name ?? provider,\n category: plugin ? ('extension' as const) : PROVIDER_META[provider]?.category || (domesticPreset ? 'domestic' : 'specialty'),\n supportsOAuth: plugin ? false : (PROVIDER_META[provider]?.supportsOAuth ?? false),\n supportsApiKey: plugin ? false : (PROVIDER_META[provider]?.supportsApiKey ?? true),\n configured,\n onboardingFeatured: getOnboardingFeaturedProviders().includes(provider),\n recommendedModels: getRecommendedModelsForProvider(provider),\n modelCount: registryModelCount || domesticPreset?.models.length || 0,\n ...(getProviderHint(provider) ? { hint: getProviderHint(provider) } : {}),\n activeKeySource: authState.authMode,\n authMode: authState.authMode,\n authStatus: authState.authStatus,\n ...(authState.expiresAt ? { expiresAt: authState.expiresAt } : {}),\n baseUrl: resolveProviderApiBaseUrl(provider),\n ...(extensionId ? { extensionId } : {}),\n };\n }),\n );\n\n const knownProviderIds = new Set(providers);\n for (const plugin of pluginRegistry.listAll()) {\n if (!knownProviderIds.has(plugin.id)) {\n const extensionId = resolveExtensionIdForProvider(service, plugin.id);\n meta.push({\n id: plugin.id,\n name: plugin.name,\n category: 'extension',\n supportsOAuth: false,\n supportsApiKey: false,\n configured: true,\n onboardingFeatured: false,\n recommendedModels: getRecommendedModelsForProvider(plugin.id),\n modelCount: plugin.models.length,\n activeKeySource: 'extension',\n authMode: 'extension',\n authStatus: 'connected',\n baseUrl: resolveProviderApiBaseUrl(plugin.id),\n ...(extensionId ? { extensionId } : {}),\n });\n }\n }\n\n return c.json({ ok: true, payload: { providers: meta } });\n });\n\n /**\n * POST /api/providers/:providerId/reveal-api-key — plaintext key when stored in the\n * gateway credential store or models.json (not env vars or OAuth tokens).\n */\n authenticated.post(\n '/api/providers/:providerId/reveal-api-key',\n strictRateLimitMiddleware,\n async (c) => {\n const rawId = c.req.param('providerId')?.trim();\n if (!rawId) {\n return c.json({ ok: false, error: { message: 'Missing providerId' } }, 400);\n }\n const providerId = rawId.toLowerCase();\n const resolver = new CredentialResolver();\n const stored = await resolver.revealGatewayStoredApiKey(providerId);\n if (stored) {\n return c.json({\n ok: true,\n payload: { id: providerId, apiKey: stored, source: 'credential' as const },\n });\n }\n const fromModelsJson = readModelsJsonProviderApiKey(providerId);\n if (fromModelsJson) {\n return c.json({\n ok: true,\n payload: { id: providerId, apiKey: fromModelsJson, source: 'models_json' as const },\n });\n }\n return c.json({\n ok: true,\n payload: { id: providerId, apiKey: null, source: 'none' as const },\n });\n },\n );\n\n // DELETE /api/providers/:providerId/key - Remove a provider's stored API key\n authenticated.delete('/api/providers/:providerId/key', strictRateLimitMiddleware, async (c) => {\n const providerId = c.req.param('providerId');\n if (!providerId) {\n return c.json({ ok: false, error: { message: 'Missing providerId' } }, 400);\n }\n\n const normalizedProvider = providerId.toLowerCase();\n const resolver = new CredentialResolver();\n\n try {\n await resolver.deleteProviderCredential(normalizedProvider);\n return c.json({ ok: true, payload: { deleted: normalizedProvider } });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return c.json({ ok: false, error: { message: `Failed to delete key: ${errorMessage}` } }, 500);\n }\n });\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { getSqliteDatabase } from "../../../storage/sqlite/transaction.js";
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "../../../storage/sqlite/transaction.js";
2
2
  import { getSessionMetadata } from "../../../storage/sqlite/session-repository.js";
3
3
  import { loadTranscriptRowsForSession } from "../../../storage/sqlite/transcript-repository.js";
4
4
  import { listMemoryRecords, upsertMemoryRecord } from "../../../storage/sqlite/memory-records-repository.js";
@@ -7,7 +7,8 @@ import { ActivityService } from "../../../activity/service.js";
7
7
  import "../../../activity/index.js";
8
8
  import { buildSessionKey, init_session_key } from "../../../routing/session-key.js";
9
9
  import { resolveEffectiveAgentProfile } from "../../../config/agent-profile.js";
10
- import { GoalService } from "../../../goals/goal-service.js";
10
+ import { GoalService, normalizeGoalUiLocale } from "../../../goals/goal-service.js";
11
+ import { draftGoalContract } from "../../../goals/goal-contract-draft.js";
11
12
  import "../../../goals/index.js";
12
13
  import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError } from "../../../projects/workspace-project.js";
13
14
  import { isValidProjectAgentId, normalizeProjectAgentId, resolveProjectAgentId } from "../../../projects/project-agent.js";
@@ -26,6 +27,10 @@ import { readFile, readdir, realpath, stat, writeFile } from "node:fs/promises";
26
27
  //#region src/gateway/hono/routes/projects.ts
27
28
  init_session_key();
28
29
  const log = createGatewayRouteLogger("Projects");
30
+ const DELEGATED_OUTCOME_MAX_LENGTH = 12e3;
31
+ function inferDelegatedWorkName(outcome) {
32
+ return (outcome.split(/\r?\n/).map((line) => line.trim()).find(Boolean) ?? outcome.trim()).replace(/^[#*\-\s]+/, "").replace(/[。.!!??]+$/, "").trim().slice(0, 72) || "Untitled work";
33
+ }
29
34
  function parseProjectStatus(raw) {
30
35
  return raw === "active" || raw === "paused" || raw === "archived" ? raw : void 0;
31
36
  }
@@ -374,6 +379,102 @@ function registerProjectsRoutes(authenticated, deps) {
374
379
  const activity = new ActivityService();
375
380
  const goals = new GoalService();
376
381
  const workItems = new WorkItemService();
382
+ authenticated.post("/api/projects/delegate", async (c) => {
383
+ const body = await c.req.json().catch(() => ({}));
384
+ const outcome = textField(body, "outcome")?.trim() ?? "";
385
+ if (!outcome) return c.json({
386
+ ok: false,
387
+ error: "Missing outcome"
388
+ }, 400);
389
+ if (outcome.length > DELEGATED_OUTCOME_MAX_LENGTH) return c.json({
390
+ ok: false,
391
+ error: `Outcome exceeds ${DELEGATED_OUTCOME_MAX_LENGTH} characters`
392
+ }, 400);
393
+ const name = textField(body, "name")?.trim().slice(0, 72) || inferDelegatedWorkName(outcome);
394
+ const uiLocale = normalizeGoalUiLocale(body.uiLocale);
395
+ const defaultAgentId = inferSuggestedProjectDefaultAgentId({
396
+ config: service.currentConfig,
397
+ name,
398
+ description: outcome,
399
+ projectKind: "auto"
400
+ });
401
+ if (!isValidProjectAgentId(service.currentConfig, defaultAgentId)) return c.json({
402
+ ok: false,
403
+ error: "Default agent not found"
404
+ }, 400);
405
+ const contractDraft = await draftGoalContract({
406
+ title: name,
407
+ context: outcome,
408
+ uiLocale,
409
+ modelRef: service.currentConfig.goals?.judgeModelRef
410
+ });
411
+ let created;
412
+ try {
413
+ created = runSqliteWriteTransaction(() => {
414
+ const project = service.projects.create({
415
+ name,
416
+ description: outcome,
417
+ defaultAgentId,
418
+ projectKind: "auto",
419
+ brief: outcome
420
+ });
421
+ const goal = goals.create({
422
+ title: name,
423
+ description: outcome,
424
+ agentId: defaultAgentId,
425
+ priority: "normal",
426
+ uiLocale,
427
+ source: "api",
428
+ projectId: project.id,
429
+ contract: contractDraft.contract,
430
+ config: service.currentConfig
431
+ });
432
+ const detailedGoal = goals.setContextMessage({
433
+ goalId: goal.id,
434
+ text: outcome
435
+ });
436
+ if (!detailedGoal) throw new Error("Goal context could not be saved");
437
+ return {
438
+ project,
439
+ goal: detailedGoal
440
+ };
441
+ });
442
+ } catch (error) {
443
+ log.warn({
444
+ err: error,
445
+ phase: "delegate_create"
446
+ }, `Delegated work could not be created: ${error instanceof Error ? error.message : String(error)}`);
447
+ return c.json({
448
+ ok: false,
449
+ error: error instanceof Error ? error.message : String(error)
450
+ }, 400);
451
+ }
452
+ let queued;
453
+ let executionWarning;
454
+ try {
455
+ queued = service.enqueueGoalRun(created.goal.id, { source: "api" });
456
+ } catch (error) {
457
+ executionWarning = error instanceof Error ? error.message : String(error);
458
+ log.warn({
459
+ err: error,
460
+ projectId: created.project.id,
461
+ goalId: created.goal.id,
462
+ phase: "delegate_enqueue"
463
+ }, `Delegated work was saved but could not be queued: ${executionWarning}`);
464
+ }
465
+ return c.json({
466
+ ok: true,
467
+ project: enrichProjectWorkspace(service, created.project),
468
+ goal: created.goal,
469
+ contractGenerated: contractDraft.generated,
470
+ contractWarning: contractDraft.warning,
471
+ execution: {
472
+ status: queued ? "queued" : "saved",
473
+ queueItem: queued,
474
+ warning: executionWarning
475
+ }
476
+ }, 201);
477
+ });
377
478
  authenticated.post("/api/projects", async (c) => {
378
479
  const body = await c.req.json().catch(() => ({}));
379
480
  const name = textField(body, "name")?.trim();