@xopcai/xopc 0.0.116 → 0.0.117

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 (599) hide show
  1. package/README.md +21 -6
  2. package/README.zh-CN.md +21 -6
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/demo-memory/src/index.d.ts +6 -0
  5. package/dist/extensions/demo-memory/src/index.js +132 -0
  6. package/dist/extensions/demo-memory/src/index.js.map +1 -0
  7. package/dist/extensions/demo-memory/xopc.extension.json +15 -0
  8. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  9. package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
  10. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  11. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  12. package/dist/extensions/telegram/src/command-handler.js +1 -2
  13. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  14. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  15. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  16. package/dist/extensions/telegram/src/plugin.js +1 -1
  17. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  18. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  19. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  20. package/dist/extensions/telegram/xopc.extension.json +1 -1
  21. package/dist/extensions/weixin/src/api/api.js +2 -2
  22. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  23. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  24. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  25. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  26. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  27. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  28. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  29. package/dist/extensions/weixin/src/plugin.js +1 -1
  30. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  31. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  32. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CWM1UU5P.js → agent-avatar-dicebear-BBLhJ2C6.js} +1 -1
  33. package/dist/gateway/static/root/assets/agents-C6xgagZd.js +71 -0
  34. package/dist/gateway/static/root/assets/{app-management-settings-panel-yXSXY_bu.js → app-management-settings-panel-CBpLONvG.js} +1 -1
  35. package/dist/gateway/static/root/assets/{appearance-settings-DjY1P_ug.js → appearance-settings-CGcc54yj.js} +1 -1
  36. package/dist/gateway/static/root/assets/apps-page-DdDx0V4z.js +1 -0
  37. package/dist/gateway/static/root/assets/{archive-plugin-CytE5j-e.js → archive-plugin-DZsVqMhU.js} +1 -1
  38. package/dist/gateway/static/root/assets/{attachment-load-BvvrN6rF.js → attachment-load-CIol6JWX.js} +1 -1
  39. package/dist/gateway/static/root/assets/{binary-plugins-IBWSitnj.js → binary-plugins-B3UauMfp.js} +1 -1
  40. package/dist/gateway/static/root/assets/{block-editor-C-wDpsf-.js → block-editor-2HJoFchH.js} +3 -3
  41. package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +8 -0
  42. package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +1 -0
  43. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +1 -0
  44. package/dist/gateway/static/root/assets/{channels-settings-Cd3JbeQ1.js → channels-settings-BYyRzsex.js} +1 -1
  45. package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +2 -0
  46. package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +1 -0
  47. package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +3 -0
  48. package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +1 -0
  49. package/dist/gateway/static/root/assets/{extension-debug-page-BAIyjDlq.js → extension-debug-page-DX5WRE_t.js} +1 -1
  50. package/dist/gateway/static/root/assets/{extension-page-DEhv2GpC.js → extension-page-Buah7Bw-.js} +1 -1
  51. package/dist/gateway/static/root/assets/{extension-settings-page-DOuAxTDW.js → extension-settings-page-DuroLVnf.js} +1 -1
  52. package/dist/gateway/static/root/assets/{fetch-CTsREQIe.js → fetch-B5zdl27C.js} +1 -1
  53. package/dist/gateway/static/root/assets/{format-interval-label-D35Bfhtx.js → format-interval-label-Dn_QKIqb.js} +1 -1
  54. package/dist/gateway/static/root/assets/gateway-config-api-gT4ZhE7h.js +1 -0
  55. package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +1 -0
  56. package/dist/gateway/static/root/assets/{gateway-startup-retry-C1KAHrd2.js → gateway-startup-retry-B3kL8KGY.js} +1 -1
  57. package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +1 -0
  58. package/dist/gateway/static/root/assets/{goals-config-api-KnLGpu6h.js → goals-config-api-AR-fVh0P.js} +1 -1
  59. package/dist/gateway/static/root/assets/goals-page-Cpb21ezg.js +2 -0
  60. package/dist/gateway/static/root/assets/{goals-settings-DtPtqZi8.js → goals-settings-CPAuFwoD.js} +1 -1
  61. package/dist/gateway/static/root/assets/{heartbeat-config-api-uKw1f0IG.js → heartbeat-config-api-D7bKFEeO.js} +1 -1
  62. package/dist/gateway/static/root/assets/{heartbeat-settings-DN9vEj9P.js → heartbeat-settings-CC69vNx0.js} +1 -1
  63. package/dist/gateway/static/root/assets/index-CwhK8qCh.js +122 -0
  64. package/dist/gateway/static/root/assets/index-CyfhARL-.css +1 -0
  65. package/dist/gateway/static/root/assets/{interval-presets-Dq0FXJ65.js → interval-presets-0DtsnxE0.js} +1 -1
  66. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C9_t4m7t.js → keyboard-shortcuts-settings-BPREtN8B.js} +1 -1
  67. package/dist/gateway/static/root/assets/{logs-page-SNkWzidV.js → logs-page-DefCgF4o.js} +2 -2
  68. package/dist/gateway/static/root/assets/{markdown-split-Ca87W8-h.js → markdown-split-ChbR9LGO.js} +1 -1
  69. package/dist/gateway/static/root/assets/{media-plugins-BAcUjPRJ.js → media-plugins-B82oP80n.js} +1 -1
  70. package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +3 -0
  71. package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +2 -0
  72. package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +2 -0
  73. package/dist/gateway/static/root/assets/{note-image-lightbox-hnSX5SSn.js → note-image-lightbox-CDknITM3.js} +1 -1
  74. package/dist/gateway/static/root/assets/{notes-page-ycsDlkFA.js → notes-page-X2slSx7V.js} +1 -1
  75. package/dist/gateway/static/root/assets/{preview-open-alternatives-CNgM20H5.js → preview-open-alternatives-DV3xQsWB.js} +1 -1
  76. package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +1 -0
  77. package/dist/gateway/static/root/assets/{save-bar-controls-CcdjGcfT.js → save-bar-controls-BODCXnvY.js} +1 -1
  78. package/dist/gateway/static/root/assets/{schedule-field-CYr39z76.js → schedule-field-CgJSCD3B.js} +1 -1
  79. package/dist/gateway/static/root/assets/{schema-form-BRAJgZQ2.js → schema-form-qtfEI6QM.js} +1 -1
  80. package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +1 -0
  81. package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +1 -0
  82. package/dist/gateway/static/root/assets/{settings-collapsible-section-BhzjeGWi.js → settings-collapsible-section-BHZKjVcS.js} +1 -1
  83. package/dist/gateway/static/root/assets/{settings-form-section-Cz3Pcr9b.js → settings-form-section-5i35D-J1.js} +1 -1
  84. package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +1 -0
  85. package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +1 -0
  86. package/dist/gateway/static/root/assets/{share-preview-page-DL4y9K5e.js → share-preview-page-B0H63tDv.js} +1 -1
  87. package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +1 -0
  88. package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +1 -0
  89. package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +2 -0
  90. package/dist/gateway/static/root/assets/{system-settings-panel-FD2jxRZ3.js → system-settings-panel-DXs2VmBt.js} +1 -1
  91. package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +1 -0
  92. package/dist/gateway/static/root/assets/{use-channel-catalog-BInPrfR5.js → use-channel-catalog-BCjP_VHb.js} +1 -1
  93. package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +1 -0
  94. package/dist/gateway/static/root/assets/{voice-player-store-1U3vFppm.js → voice-player-store-BlF9V05n.js} +1 -1
  95. package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +18 -0
  96. package/dist/gateway/static/root/index.html +5 -5
  97. package/dist/package.js +1 -1
  98. package/dist/src/agent/agent-manager.d.ts +1 -1
  99. package/dist/src/agent/agent-manager.js +13 -14
  100. package/dist/src/agent/agent-manager.js.map +1 -1
  101. package/dist/src/agent/agent-scope.js +7 -9
  102. package/dist/src/agent/agent-scope.js.map +1 -1
  103. package/dist/src/agent/background-review/coordinator.js +0 -1
  104. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  105. package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
  106. package/dist/src/agent/background-review/run-background-review.js +2 -4
  107. package/dist/src/agent/background-review/run-background-review.js.map +1 -1
  108. package/dist/src/agent/background-review/settings.js +8 -7
  109. package/dist/src/agent/background-review/settings.js.map +1 -1
  110. package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
  111. package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
  112. package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
  113. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  114. package/dist/src/agent/bootstrap/project-agents-context.js +1 -1
  115. package/dist/src/agent/context/workspace-seed.js +3 -3
  116. package/dist/src/agent/context/workspace-state.js +1 -1
  117. package/dist/src/agent/context/workspace.js +1 -1
  118. package/dist/src/agent/embedded/run-for-session.js +1 -1
  119. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  120. package/dist/src/agent/fallback/candidates.js +6 -3
  121. package/dist/src/agent/fallback/candidates.js.map +1 -1
  122. package/dist/src/agent/goals/goal-locale.js +2 -2
  123. package/dist/src/agent/goals/post-turn.js +3 -3
  124. package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
  125. package/dist/src/agent/image/generation/runtime.js +1 -1
  126. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  127. package/dist/src/agent/image/image-helpers.d.ts +1 -1
  128. package/dist/src/agent/image/image-helpers.js +4 -17
  129. package/dist/src/agent/image/image-helpers.js.map +1 -1
  130. package/dist/src/agent/image/image-model-fallback.js +1 -1
  131. package/dist/src/agent/image/image-model-fallback.js.map +1 -1
  132. package/dist/src/agent/image/inbound-image-handling.js +1 -1
  133. package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
  134. package/dist/src/agent/image/load-image-media.js +2 -2
  135. package/dist/src/agent/image/tool-model-config.d.ts +1 -1
  136. package/dist/src/agent/image/tool-model-config.js +2 -2
  137. package/dist/src/agent/image/tool-model-config.js.map +1 -1
  138. package/dist/src/agent/ipc/inbox.js +3 -3
  139. package/dist/src/agent/ipc/socket.js +1 -1
  140. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  141. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  142. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  143. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  144. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
  145. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
  146. package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
  147. package/dist/src/agent/media-generation/runtime-shared.js +1 -1
  148. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  149. package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -0
  150. package/dist/src/agent/memory/builtin-memory-store.js +5 -1
  151. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  152. package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
  153. package/dist/src/agent/memory/builtin-provider.js +261 -11
  154. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  155. package/dist/src/agent/memory/context-assembler.d.ts +10 -0
  156. package/dist/src/agent/memory/context-assembler.js +26 -0
  157. package/dist/src/agent/memory/context-assembler.js.map +1 -0
  158. package/dist/src/agent/memory/create-memory-manager.js +25 -7
  159. package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
  160. package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
  161. package/dist/src/agent/memory/dreaming/config.js +8 -8
  162. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  163. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
  164. package/dist/src/agent/memory/dreaming/deep-promotion.js +25 -1
  165. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  166. package/dist/src/agent/memory/dreaming/events.js +1 -1
  167. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  168. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  169. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  170. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  171. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  172. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  173. package/dist/src/agent/memory/index.d.ts +1 -0
  174. package/dist/src/agent/memory/index.js +4 -3
  175. package/dist/src/agent/memory/inject-prefetch.js +6 -2
  176. package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
  177. package/dist/src/agent/memory/manager.d.ts +37 -1
  178. package/dist/src/agent/memory/manager.js +332 -40
  179. package/dist/src/agent/memory/manager.js.map +1 -1
  180. package/dist/src/agent/memory/memory-config.js +12 -15
  181. package/dist/src/agent/memory/memory-config.js.map +1 -1
  182. package/dist/src/agent/memory/memory-flush.js +1 -1
  183. package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
  184. package/dist/src/agent/memory/plugin-discovery.js +97 -31
  185. package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
  186. package/dist/src/agent/memory/provider.d.ts +20 -15
  187. package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
  188. package/dist/src/agent/memory/stub-memory-provider.js +20 -3
  189. package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
  190. package/dist/src/agent/memory/types.d.ts +136 -0
  191. package/dist/src/agent/models/manager.d.ts +1 -1
  192. package/dist/src/agent/models/manager.js +2 -2
  193. package/dist/src/agent/models/manager.js.map +1 -1
  194. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
  195. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
  196. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  197. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
  198. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  199. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  200. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
  201. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
  202. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
  203. package/dist/src/agent/prompt/memory/index.js +1 -1
  204. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  205. package/dist/src/agent/reply/post-compaction-context.js +12 -7
  206. package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
  207. package/dist/src/agent/reply/startup-context.js +8 -9
  208. package/dist/src/agent/reply/startup-context.js.map +1 -1
  209. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  210. package/dist/src/agent/sandbox/path-policy.js +2 -2
  211. package/dist/src/agent/service/process-direct-streaming.js +1 -4
  212. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  213. package/dist/src/agent/service/session-context-report.js +1 -1
  214. package/dist/src/agent/service/session-context-report.js.map +1 -1
  215. package/dist/src/agent/service.js +25 -29
  216. package/dist/src/agent/service.js.map +1 -1
  217. package/dist/src/agent/service.types.d.ts +1 -2
  218. package/dist/src/agent/session/session-hydrator.js +1 -2
  219. package/dist/src/agent/session/session-hydrator.js.map +1 -1
  220. package/dist/src/agent/session/session-inspector.d.ts +1 -1
  221. package/dist/src/agent/session/session-inspector.js +10 -15
  222. package/dist/src/agent/session/session-inspector.js.map +1 -1
  223. package/dist/src/agent/skills/config.js +2 -2
  224. package/dist/src/agent/skills/filesystem-watcher.js +1 -1
  225. package/dist/src/agent/skills/hub-hash.js +2 -2
  226. package/dist/src/agent/skills/hub-lock.js +1 -1
  227. package/dist/src/agent/skills/hub-pull.js +3 -3
  228. package/dist/src/agent/skills/index.js +2 -2
  229. package/dist/src/agent/skills/installer.js +2 -2
  230. package/dist/src/agent/skills/managed-store.js +1 -1
  231. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  232. package/dist/src/agent/skills/skill-manager.js +1 -1
  233. package/dist/src/agent/skills/skill-view-path.js +1 -1
  234. package/dist/src/agent/skills/test-framework.js +1 -1
  235. package/dist/src/agent/starter-agents.d.ts +1 -3
  236. package/dist/src/agent/starter-agents.js +14 -22
  237. package/dist/src/agent/starter-agents.js.map +1 -1
  238. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
  239. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  240. package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
  241. package/dist/src/agent/tools/curated-memory-tool.js +20 -16
  242. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  243. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  244. package/dist/src/agent/tools/factory.d.ts +0 -4
  245. package/dist/src/agent/tools/factory.js +19 -58
  246. package/dist/src/agent/tools/factory.js.map +1 -1
  247. package/dist/src/agent/tools/find.js +1 -1
  248. package/dist/src/agent/tools/grep.js +1 -1
  249. package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
  250. package/dist/src/agent/tools/image-generate-tool.js +20 -15
  251. package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
  252. package/dist/src/agent/tools/image-tool.js +1 -3
  253. package/dist/src/agent/tools/image-tool.js.map +1 -1
  254. package/dist/src/agent/tools/memory-tool.d.ts +2 -2
  255. package/dist/src/agent/tools/memory-tool.js +39 -14
  256. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  257. package/dist/src/agent/tools/session-search-tool.js +1 -3
  258. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  259. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  260. package/dist/src/agent/tools/web-extract.js +6 -5
  261. package/dist/src/agent/tools/web-extract.js.map +1 -1
  262. package/dist/src/agent/tools/workflow-tool.js +1 -1
  263. package/dist/src/agent/workflow/catalog.js +1 -1
  264. package/dist/src/agent/workflow/subagent-runner.js +1 -3
  265. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  266. package/dist/src/agent-manifest/index.d.ts +4 -0
  267. package/dist/src/agent-manifest/index.js +10 -0
  268. package/dist/src/agent-manifest/index.js.map +1 -0
  269. package/dist/src/agent-manifest/prompt.d.ts +2 -0
  270. package/dist/src/agent-manifest/prompt.js +57 -0
  271. package/dist/src/agent-manifest/prompt.js.map +1 -0
  272. package/dist/src/agent-manifest/resolver.d.ts +11 -0
  273. package/dist/src/agent-manifest/resolver.js +93 -0
  274. package/dist/src/agent-manifest/resolver.js.map +1 -0
  275. package/dist/src/agent-manifest/schema.d.ts +778 -0
  276. package/dist/src/agent-manifest/schema.js +267 -0
  277. package/dist/src/agent-manifest/schema.js.map +1 -0
  278. package/dist/src/agent-manifest/validator.d.ts +24 -0
  279. package/dist/src/agent-manifest/validator.js +87 -0
  280. package/dist/src/agent-manifest/validator.js.map +1 -0
  281. package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
  282. package/dist/src/agent-runtime/boundary-guard.js +23 -0
  283. package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
  284. package/dist/src/agent-runtime/index.d.ts +7 -0
  285. package/dist/src/agent-runtime/index.js +8 -0
  286. package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
  287. package/dist/src/agent-runtime/memory-runtime.js +50 -0
  288. package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
  289. package/dist/src/agent-runtime/model-router.d.ts +11 -0
  290. package/dist/src/agent-runtime/model-router.js +16 -0
  291. package/dist/src/agent-runtime/model-router.js.map +1 -0
  292. package/dist/src/agent-runtime/run-trace.d.ts +27 -0
  293. package/dist/src/agent-runtime/run-trace.js +53 -0
  294. package/dist/src/agent-runtime/run-trace.js.map +1 -0
  295. package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
  296. package/dist/src/agent-runtime/runtime-profile.js +44 -0
  297. package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
  298. package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
  299. package/dist/src/agent-runtime/tool-registry.js +52 -0
  300. package/dist/src/agent-runtime/tool-registry.js.map +1 -0
  301. package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
  302. package/dist/src/agent-runtime/workflow-runtime.js +34 -0
  303. package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
  304. package/dist/src/ai-assist/text-assist.js +1 -1
  305. package/dist/src/auth/credentials.js +2 -2
  306. package/dist/src/auth/profiles/store.js +2 -2
  307. package/dist/src/auth/sync-provider-auth.js +1 -1
  308. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  309. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  310. package/dist/src/browser/actions/registry.js +5 -8
  311. package/dist/src/browser/actions/registry.js.map +1 -1
  312. package/dist/src/browser/backend-from-config.d.ts +1 -1
  313. package/dist/src/browser/backend-from-config.js +50 -71
  314. package/dist/src/browser/backend-from-config.js.map +1 -1
  315. package/dist/src/browser/browser-command-timeout.d.ts +0 -1
  316. package/dist/src/browser/browser-command-timeout.js +3 -7
  317. package/dist/src/browser/browser-command-timeout.js.map +1 -1
  318. package/dist/src/browser/cache-dir-policy.js +1 -1
  319. package/dist/src/browser/cdp-local-launcher.js +2 -2
  320. package/dist/src/browser/pipeline/source.js +1 -1
  321. package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
  322. package/dist/src/browser/providers/browser-ext-install.js +7 -12
  323. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  324. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  325. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  326. package/dist/src/browser/readiness.js +16 -16
  327. package/dist/src/browser/readiness.js.map +1 -1
  328. package/dist/src/browser/schemas.js +1 -1
  329. package/dist/src/browser/schemas.js.map +1 -1
  330. package/dist/src/browser/stealth.js +1 -1
  331. package/dist/src/channels/catalog/channel-catalog-service.js +1 -1
  332. package/dist/src/channels/outbound/persist-store.js +1 -1
  333. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  334. package/dist/src/channels/pairing/pairing-store.js +2 -2
  335. package/dist/src/chat-commands/agent-edit.js +2 -2
  336. package/dist/src/chat-commands/builtins/config.js +6 -6
  337. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  338. package/dist/src/chat-commands/builtins/thinking.js +16 -42
  339. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  340. package/dist/src/chat-commands/config-paths.js +1 -1
  341. package/dist/src/chat-commands/config-paths.js.map +1 -1
  342. package/dist/src/chat-commands/context.js +3 -4
  343. package/dist/src/chat-commands/context.js.map +1 -1
  344. package/dist/src/cli/command-manifest.js +1 -1
  345. package/dist/src/cli/command-manifest.js.map +1 -1
  346. package/dist/src/cli/commands/agent.js +3 -1
  347. package/dist/src/cli/commands/agent.js.map +1 -1
  348. package/dist/src/cli/commands/agents.js +3 -6
  349. package/dist/src/cli/commands/agents.js.map +1 -1
  350. package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
  351. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  352. package/dist/src/cli/commands/config.js +6 -6
  353. package/dist/src/cli/commands/config.js.map +1 -1
  354. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  355. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  356. package/dist/src/cli/commands/doctor/checks/provider-auth.js +2 -18
  357. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  358. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  359. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  360. package/dist/src/cli/commands/extension-create.js +1 -1
  361. package/dist/src/cli/commands/extension-dev.js +2 -2
  362. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  363. package/dist/src/cli/commands/extension-pack.js +2 -2
  364. package/dist/src/cli/commands/extension.js +3 -3
  365. package/dist/src/cli/commands/gateway/logs.js +1 -1
  366. package/dist/src/cli/commands/goal.js +1 -1
  367. package/dist/src/cli/commands/image.js +13 -372
  368. package/dist/src/cli/commands/image.js.map +1 -1
  369. package/dist/src/cli/commands/init.js +2 -2
  370. package/dist/src/cli/commands/models.js +27 -11
  371. package/dist/src/cli/commands/models.js.map +1 -1
  372. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  373. package/dist/src/cli/commands/onboard/model.js +20 -22
  374. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  375. package/dist/src/cli/commands/onboard.js +1 -1
  376. package/dist/src/cli/commands/onboard.js.map +1 -1
  377. package/dist/src/cli/commands/skills-test.js +1 -1
  378. package/dist/src/cli/templates.js +1 -1
  379. package/dist/src/cli/utils/gateway-client.js +1 -1
  380. package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
  381. package/dist/src/cli/utils/init-workspace-core.js +9 -8
  382. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  383. package/dist/src/commands/agents.config.d.ts +0 -1
  384. package/dist/src/commands/agents.config.js +66 -12
  385. package/dist/src/commands/agents.config.js.map +1 -1
  386. package/dist/src/config/agent-profile.d.ts +5 -17
  387. package/dist/src/config/agent-profile.js +31 -64
  388. package/dist/src/config/agent-profile.js.map +1 -1
  389. package/dist/src/config/agent-typed-models.d.ts +1 -1
  390. package/dist/src/config/agent-typed-models.js +1 -2
  391. package/dist/src/config/agent-typed-models.js.map +1 -1
  392. package/dist/src/config/gateway-bind.js +1 -1
  393. package/dist/src/config/index.js +8 -8
  394. package/dist/src/config/integration.d.ts +1 -1
  395. package/dist/src/config/loader.js +4 -4
  396. package/dist/src/config/models-json.js +2 -2
  397. package/dist/src/config/paths-state.js +1 -1
  398. package/dist/src/config/paths.js +1 -1
  399. package/dist/src/config/profile.js +1 -1
  400. package/dist/src/config/reload.js +2 -2
  401. package/dist/src/config/reload.js.map +1 -1
  402. package/dist/src/config/rules.js +6 -56
  403. package/dist/src/config/rules.js.map +1 -1
  404. package/dist/src/config/schema.d.ts +918 -781
  405. package/dist/src/config/schema.js +154 -423
  406. package/dist/src/config/schema.js.map +1 -1
  407. package/dist/src/config/workspace-path.js +1 -1
  408. package/dist/src/connectors/composio-triggers.js +1 -1
  409. package/dist/src/cron/executor.js +1 -1
  410. package/dist/src/cron/index.js +1 -1
  411. package/dist/src/cron/service.js +2 -2
  412. package/dist/src/cron/validation.d.ts +3 -3
  413. package/dist/src/daemon/constants.js +1 -1
  414. package/dist/src/daemon/install-plan.js +2 -2
  415. package/dist/src/daemon/launchd.js +2 -2
  416. package/dist/src/daemon/schtasks.js +2 -2
  417. package/dist/src/daemon/systemd.js +2 -2
  418. package/dist/src/extensions/activation-context.js +13 -7
  419. package/dist/src/extensions/activation-context.js.map +1 -1
  420. package/dist/src/extensions/bundle-mcp.js +1 -1
  421. package/dist/src/extensions/discover-extensions.js +2 -2
  422. package/dist/src/extensions/health.js +1 -1
  423. package/dist/src/extensions/install.js +2 -2
  424. package/dist/src/extensions/loader.js +2 -2
  425. package/dist/src/extensions/lockfile.js +3 -3
  426. package/dist/src/extensions/security.js +1 -1
  427. package/dist/src/extensions/update.js +2 -2
  428. package/dist/src/gateway/agents-admin.d.ts +17 -18
  429. package/dist/src/gateway/agents-admin.js +125 -90
  430. package/dist/src/gateway/agents-admin.js.map +1 -1
  431. package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
  432. package/dist/src/gateway/capability-presets-admin.js +214 -0
  433. package/dist/src/gateway/capability-presets-admin.js.map +1 -0
  434. package/dist/src/gateway/file-path-classifier.js +2 -2
  435. package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
  436. package/dist/src/gateway/hono/lib/agent-model.js +1 -1
  437. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  438. package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
  439. package/dist/src/gateway/hono/lib/config-payload.js +14 -38
  440. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  441. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  442. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  443. package/dist/src/gateway/hono/routes/agents.js +56 -33
  444. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  445. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  446. package/dist/src/gateway/hono/routes/browser.js +8 -15
  447. package/dist/src/gateway/hono/routes/browser.js.map +1 -1
  448. package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
  449. package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
  450. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
  451. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
  452. package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
  453. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  454. package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
  455. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  456. package/dist/src/gateway/hono/routes/config.js +1 -1
  457. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  458. package/dist/src/gateway/hono/routes/dreaming.js +8 -1
  459. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  460. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  461. package/dist/src/gateway/hono/routes/index.js +2 -0
  462. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  463. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  464. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  465. package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
  466. package/dist/src/gateway/hono/routes/memory.js +290 -0
  467. package/dist/src/gateway/hono/routes/memory.js.map +1 -0
  468. package/dist/src/gateway/hono/routes/models.js +1 -1
  469. package/dist/src/gateway/hono/routes/shares.js +1 -1
  470. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  471. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  472. package/dist/src/gateway/lock.js +3 -3
  473. package/dist/src/gateway/ports.js +1 -1
  474. package/dist/src/gateway/service/config-coordinator.js +1 -1
  475. package/dist/src/gateway/service/marketplace-service.js +2 -2
  476. package/dist/src/gateway/service.d.ts +1 -1
  477. package/dist/src/gateway/service.js +15 -16
  478. package/dist/src/gateway/service.js.map +1 -1
  479. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  480. package/dist/src/goals/goal-workflow-judge.js +2 -2
  481. package/dist/src/i18n/goals-bundle.js +1 -1
  482. package/dist/src/i18n/index.js +1 -1
  483. package/dist/src/i18n/share-tool-bundle.js +2 -2
  484. package/dist/src/infra/brew.js +1 -1
  485. package/dist/src/infra/package-json.js +1 -1
  486. package/dist/src/infra/package-update-steps.js +1 -1
  487. package/dist/src/infra/path-env.js +2 -2
  488. package/dist/src/infra/restart.js +1 -1
  489. package/dist/src/infra/stable-node-path.js +1 -1
  490. package/dist/src/infra/update-check.js +1 -1
  491. package/dist/src/infra/update-global.js +1 -1
  492. package/dist/src/infra/update-lock.js +2 -2
  493. package/dist/src/infra/update-restart.js +1 -1
  494. package/dist/src/infra/update-runner.js +1 -1
  495. package/dist/src/infra/update-startup.js +1 -1
  496. package/dist/src/infra/write-file-atomic.js +2 -2
  497. package/dist/src/media/store.js +1 -1
  498. package/dist/src/notes/agent-context.js +3 -3
  499. package/dist/src/notes/service.js +1 -1
  500. package/dist/src/notes/store.js +2 -2
  501. package/dist/src/project-trust/trust-store.js +2 -2
  502. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  503. package/dist/src/providers/index.d.ts +2 -2
  504. package/dist/src/providers/index.js +11 -15
  505. package/dist/src/providers/index.js.map +1 -1
  506. package/dist/src/providers/model-registry.js +4 -4
  507. package/dist/src/session/index.js +1 -1
  508. package/dist/src/session/init-session-turn.js +1 -1
  509. package/dist/src/session/resolve-session.js +1 -1
  510. package/dist/src/session/session-title.js +2 -2
  511. package/dist/src/session/session-workspace.js +7 -2
  512. package/dist/src/session/session-workspace.js.map +1 -1
  513. package/dist/src/session/store.js +6 -1
  514. package/dist/src/session/store.js.map +1 -1
  515. package/dist/src/session/thinking-resolve.d.ts +1 -1
  516. package/dist/src/session/thinking-resolve.js +1 -1
  517. package/dist/src/session/thinking-resolve.js.map +1 -1
  518. package/dist/src/share/share-auto.js +2 -2
  519. package/dist/src/share/share-store.js +3 -3
  520. package/dist/src/share/share-thumbnail.js +2 -2
  521. package/dist/src/share/share-zip.js +1 -1
  522. package/dist/src/share/site-share-store.js +3 -3
  523. package/dist/src/share/site-static-serve.js +1 -1
  524. package/dist/src/storage/sqlite/connection.js +2 -2
  525. package/dist/src/storage/sqlite/index.d.ts +1 -0
  526. package/dist/src/storage/sqlite/index.js +2 -1
  527. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  528. package/dist/src/storage/sqlite/memory-records-repository.d.ts +101 -0
  529. package/dist/src/storage/sqlite/memory-records-repository.js +309 -0
  530. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
  531. package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
  532. package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
  533. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  534. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  535. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  536. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  537. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  538. package/dist/src/storage/sqlite/schema.js +2 -2
  539. package/dist/src/storage/sqlite/schema.sql +86 -0
  540. package/dist/src/tui/backends/embedded-backend.js +7 -5
  541. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  542. package/dist/src/tui/clipboard-image.js +3 -3
  543. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  544. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  545. package/dist/src/tui/theme-manager.js +1 -1
  546. package/dist/src/tui/tui-command-formatters.js +4 -4
  547. package/dist/src/tui/tui-commands.js +2 -2
  548. package/dist/src/tui/tui-keybindings-file.js +1 -1
  549. package/dist/src/tui/tui-scoped-models.js +2 -2
  550. package/dist/src/tui/tui-settings.js +1 -1
  551. package/dist/src/tui/tui-startup-resources.js +1 -1
  552. package/dist/src/tui/tui.js +6 -6
  553. package/dist/src/tunnel/frpc-binary.js +4 -4
  554. package/dist/src/tunnel/frpc-config.js +1 -1
  555. package/dist/src/tunnel/frpc-extract.js +1 -1
  556. package/dist/src/tunnel/tunnel-state.js +1 -1
  557. package/dist/src/utils/logger/audit.js +1 -1
  558. package/dist/src/utils/logger/log-store.js +1 -1
  559. package/dist/src/utils/logger/rotation.js +1 -1
  560. package/dist/src/utils/logger/streams.js +1 -1
  561. package/dist/src/voice/tts/audio.js +1 -1
  562. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  563. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  564. package/dist/src/workflows/service/workflow-run-service.js +4 -5
  565. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  566. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  567. package/dist/src/workflows/store/event-store.js +1 -1
  568. package/dist/src/workflows/store/run-store.js +1 -1
  569. package/package.json +3 -2
  570. package/dist/gateway/static/root/assets/agent-browser-settings-page-D1SyFYeh.js +0 -6
  571. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-C9YxgvuI.js +0 -1
  572. package/dist/gateway/static/root/assets/agents-CteVs3UO.js +0 -71
  573. package/dist/gateway/static/root/assets/apps-page-CVQ1M8Ax.js +0 -1
  574. package/dist/gateway/static/root/assets/config-api-C4RAtTKW.js +0 -3
  575. package/dist/gateway/static/root/assets/connectors-page-MsMa5qBr.js +0 -2
  576. package/dist/gateway/static/root/assets/cron-api-sJNMqB6P.js +0 -1
  577. package/dist/gateway/static/root/assets/cron-page-D30CSwkn.js +0 -3
  578. package/dist/gateway/static/root/assets/dreaming-settings-6fCUWRQf.js +0 -1
  579. package/dist/gateway/static/root/assets/gateway-config-api-C6989a-W.js +0 -1
  580. package/dist/gateway/static/root/assets/gateway-settings-BpF26t91.js +0 -1
  581. package/dist/gateway/static/root/assets/goal-detail-page-DOjhmRyf.js +0 -1
  582. package/dist/gateway/static/root/assets/goals-page-Xl9_wrFc.js +0 -2
  583. package/dist/gateway/static/root/assets/index-C8ytlAF2.js +0 -122
  584. package/dist/gateway/static/root/assets/index-CVpJW2NS.css +0 -1
  585. package/dist/gateway/static/root/assets/messages-BqzIDrlr.js +0 -3
  586. package/dist/gateway/static/root/assets/models-hub-panel-BO4o-GmO.js +0 -2
  587. package/dist/gateway/static/root/assets/note-detail-page-DLV_XDmT.js +0 -2
  588. package/dist/gateway/static/root/assets/remote-access-hub-DQpnE8K9.js +0 -1
  589. package/dist/gateway/static/root/assets/sessions-page-BZui7iAY.js +0 -1
  590. package/dist/gateway/static/root/assets/settings-advanced-gate-DEfzZ1ax.js +0 -1
  591. package/dist/gateway/static/root/assets/settings-page-CLuSsu1-.js +0 -1
  592. package/dist/gateway/static/root/assets/setup-status-panel-Cq4qpXLi.js +0 -1
  593. package/dist/gateway/static/root/assets/shares-settings-B9F3HyYQ.js +0 -1
  594. package/dist/gateway/static/root/assets/skill-reload-api-Bp9UPPwm.js +0 -1
  595. package/dist/gateway/static/root/assets/skills-page-BIoBsfSV.js +0 -2
  596. package/dist/gateway/static/root/assets/use-agent-defaults-form-Cz2_pPzu.js +0 -1
  597. package/dist/gateway/static/root/assets/use-settings-tab-guard-nuHMmZQv.js +0 -1
  598. package/dist/gateway/static/root/assets/voice-api-key-field-BUIrKb8s.js +0 -1
  599. package/dist/gateway/static/root/assets/workflows-page-qE3SexnO.js +0 -18
@@ -1,11 +1,12 @@
1
+ import { MemoryPolicySchema, ToolPolicySetSchema, init_schema } from "../../../agent-manifest/schema.js";
2
+ import { AgentModelsSchema, init_schema as init_schema$1, parseModelRef } from "../../../config/schema.js";
1
3
  import { init_agent_scope, normalizeAgentId } from "../../../agent/agent-scope.js";
2
- import { AgentModelsSchema, init_schema, parseModelRef } from "../../../config/schema.js";
3
4
  import { init_providers, isProviderConfigured, resolveModel } from "../../../providers/index.js";
4
5
  import { getVoiceModelsConfig } from "../../../config/voice.js";
5
- import { deleteAgentAvatarFile, finalizeCreateAgentDirs, listAgentProfileFiles, listGatewayAgents, prepareCreateAgent, prepareDeleteAgent, prepareUpdateAgent, readAgentAvatarFile, readAgentProfileFile, runAfterDeletePurge, writeAgentAvatarFromBase64, writeAgentProfileFile } from "../../agents-admin.js";
6
+ import { deleteAgentAvatarFile, finalizeCreateAgentDirs, getGatewayAgentEffectiveManifest, listAgentProfileFiles, listGatewayAgents, prepareCreateAgent, prepareDeleteAgent, prepareUpdateAgent, readAgentAvatarFile, readAgentProfileFile, runAfterDeletePurge, writeAgentAvatarFromBase64, writeAgentProfileFile } from "../../agents-admin.js";
6
7
  import { resolveImageGenerationCapabilities, resolveImageUnderstandingCapabilities } from "../../image-capabilities.js";
7
- import { agentModelFallbacksToArray, agentModelRefToString } from "../lib/agent-model.js";
8
8
  //#region src/gateway/hono/routes/agents.ts
9
+ init_schema$1();
9
10
  init_schema();
10
11
  init_providers();
11
12
  init_agent_scope();
@@ -25,15 +26,15 @@ function isParseError(value) {
25
26
  function parseCreateAgentBody(raw) {
26
27
  if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return { error: "each agent must be an object" };
27
28
  const body = raw;
28
- if (Object.hasOwn(body, "model")) return { error: "model is not supported; use models.chat.primary" };
29
- if (Object.hasOwn(body, "toolsDisable")) return { error: "toolsDisable is not supported; use tools.disable" };
29
+ if (Object.hasOwn(body, "model")) return { error: "model is not supported; use models.defaultRole and models.roles" };
30
+ if (Object.hasOwn(body, "toolsDisable")) return { error: "toolsDisable was removed; use tools.builtin policies" };
30
31
  if (Object.hasOwn(body, "typedModels")) return { error: "typedModels is not supported; use models.roles" };
32
+ if (Object.hasOwn(body, "agentDir")) return { error: "agentDir was removed from agent manifests" };
31
33
  if (Object.hasOwn(body, "name")) return { error: "name is not supported; write IDENTITY.md in profileFiles" };
32
34
  if (Object.hasOwn(body, "description")) return { error: "description is not supported; write IDENTITY.md in profileFiles" };
33
35
  const workspace = typeof body.workspace === "string" ? body.workspace : "";
34
36
  const models = Object.hasOwn(body, "models") ? AgentModelsSchema.safeParse(body.models) : void 0;
35
37
  if (models && !models.success) return { error: `models ${models.error.issues[0]?.message ?? "is invalid"}` };
36
- const agentDir = typeof body.agentDir === "string" ? body.agentDir : void 0;
37
38
  const id = typeof body.id === "string" ? body.id : void 0;
38
39
  const skills = Object.hasOwn(body, "skills") ? Array.isArray(body.skills) ? body.skills.map((x) => String(x).trim()).filter(Boolean) : null : void 0;
39
40
  if (skills === null) return { error: "skills must be an array" };
@@ -41,10 +42,9 @@ function parseCreateAgentBody(raw) {
41
42
  let tools;
42
43
  if (toolsRaw !== void 0) {
43
44
  if (toolsRaw === null || typeof toolsRaw !== "object" || Array.isArray(toolsRaw)) return { error: "tools must be an object" };
44
- const disableRaw = toolsRaw.disable;
45
- if (disableRaw !== void 0 && !Array.isArray(disableRaw)) return { error: "tools.disable must be an array" };
46
- const disable = Array.isArray(disableRaw) ? disableRaw.map((x) => String(x).trim()).filter(Boolean) : void 0;
47
- tools = disable !== void 0 ? { disable } : {};
45
+ const parsedTools = ToolPolicySetSchema.safeParse(toolsRaw);
46
+ if (!parsedTools.success) return { error: `tools ${parsedTools.error.issues[0]?.message ?? "is invalid"}` };
47
+ tools = parsedTools.data;
48
48
  }
49
49
  let profileFiles;
50
50
  if (Object.hasOwn(body, "profileFiles")) {
@@ -57,7 +57,6 @@ function parseCreateAgentBody(raw) {
57
57
  return {
58
58
  workspace,
59
59
  ...models && models.data !== void 0 ? { models: models.data } : {},
60
- ...agentDir !== void 0 ? { agentDir } : {},
61
60
  ...id !== void 0 ? { id } : {},
62
61
  ...skills !== void 0 ? { skills } : {},
63
62
  ...tools !== void 0 ? { tools } : {},
@@ -71,13 +70,8 @@ function parsePatchModels(raw) {
71
70
  if (typeof raw !== "object" || Array.isArray(raw)) return { error: "models must be an object or null" };
72
71
  const body = raw;
73
72
  const out = {};
74
- if (Object.hasOwn(body, "chat")) if (body.chat === null) out.chat = null;
75
- else {
76
- const parsed = AgentModelsSchema.safeParse({ chat: body.chat });
77
- if (!parsed.success) return { error: `models.chat ${parsed.error.issues[0]?.message ?? "is invalid"}` };
78
- out.chat = parsed.data?.chat;
79
- }
80
- if (Object.hasOwn(body, "roles")) if (body.roles === null) out.roles = null;
73
+ if (Object.hasOwn(body, "defaultRole")) out.defaultRole = body.defaultRole === null ? null : String(body.defaultRole ?? "").trim();
74
+ if (Object.hasOwn(body, "roles")) if (body.roles === null) return { error: "models.roles must be an object" };
81
75
  else {
82
76
  const parsed = AgentModelsSchema.safeParse({ roles: body.roles });
83
77
  if (!parsed.success) return { error: `models.roles ${parsed.error.issues[0]?.message ?? "is invalid"}` };
@@ -139,6 +133,18 @@ function registerAgentsRoutes(authenticated, deps) {
139
133
  }
140
134
  });
141
135
  });
136
+ authenticated.get("/api/agents/:id/effective-manifest", async (c) => {
137
+ const id = normalizeAgentId(c.req.param("id") ?? "");
138
+ const res = getGatewayAgentEffectiveManifest(service.currentConfig, id);
139
+ if (res.ok === false) return c.json({
140
+ ok: false,
141
+ error: { message: res.error }
142
+ }, res.status ?? 400);
143
+ return c.json({
144
+ ok: true,
145
+ payload: res.data
146
+ });
147
+ });
142
148
  authenticated.patch("/api/agents/:id", strictRateLimitMiddleware, async (c) => {
143
149
  const id = normalizeAgentId(c.req.param("id") ?? "");
144
150
  let body = {};
@@ -152,7 +158,7 @@ function registerAgentsRoutes(authenticated, deps) {
152
158
  }
153
159
  if (Object.hasOwn(body, "model")) return c.json({
154
160
  ok: false,
155
- error: { message: "model is not supported; use models.chat" }
161
+ error: { message: "model is not supported; use models.defaultRole and models.roles" }
156
162
  }, 400);
157
163
  if (Object.hasOwn(body, "typedModels")) return c.json({
158
164
  ok: false,
@@ -160,7 +166,11 @@ function registerAgentsRoutes(authenticated, deps) {
160
166
  }, 400);
161
167
  if (Object.hasOwn(body, "toolsDisable")) return c.json({
162
168
  ok: false,
163
- error: { message: "toolsDisable is not supported; use tools.disable" }
169
+ error: { message: "toolsDisable was removed; use tools.builtin policies" }
170
+ }, 400);
171
+ if (Object.hasOwn(body, "agentDir")) return c.json({
172
+ ok: false,
173
+ error: { message: "agentDir was removed from agent manifests" }
164
174
  }, 400);
165
175
  if (Object.hasOwn(body, "name")) return c.json({
166
176
  ok: false,
@@ -171,17 +181,20 @@ function registerAgentsRoutes(authenticated, deps) {
171
181
  error: { message: "description is not supported; edit IDENTITY.md" }
172
182
  }, 400);
173
183
  const skillsPatch = body.skills === null ? null : Array.isArray(body.skills) ? body.skills.map((x) => String(x).trim()).filter(Boolean) : void 0;
184
+ const extendsPatch = Object.hasOwn(body, "extends") ? Array.isArray(body.extends) ? body.extends.map((x) => String(x).trim()).filter(Boolean) : void 0 : void 0;
185
+ if (Object.hasOwn(body, "extends") && extendsPatch === void 0) return c.json({
186
+ ok: false,
187
+ error: { message: "extends must be an array" }
188
+ }, 400);
174
189
  let toolsPatch;
175
190
  if (Object.hasOwn(body, "tools")) if (body.tools === null) toolsPatch = null;
176
191
  else if (typeof body.tools === "object" && !Array.isArray(body.tools)) {
177
- const disable = body.tools.disable;
178
- if (disable === null) toolsPatch = { disable: null };
179
- else if (disable === void 0) toolsPatch = {};
180
- else if (Array.isArray(disable)) toolsPatch = { disable: disable.map((x) => String(x).trim()).filter(Boolean) };
181
- else return c.json({
192
+ const parsedTools = ToolPolicySetSchema.safeParse(body.tools);
193
+ if (!parsedTools.success) return c.json({
182
194
  ok: false,
183
- error: { message: "tools.disable must be an array or null" }
195
+ error: { message: `tools ${parsedTools.error.issues[0]?.message ?? "is invalid"}` }
184
196
  }, 400);
197
+ toolsPatch = parsedTools.data;
185
198
  } else return c.json({
186
199
  ok: false,
187
200
  error: { message: "tools must be an object or null" }
@@ -191,13 +204,23 @@ function registerAgentsRoutes(authenticated, deps) {
191
204
  ok: false,
192
205
  error: { message: modelsPatch.error }
193
206
  }, 400);
207
+ let memoryPatch;
208
+ if (Object.hasOwn(body, "memory")) {
209
+ const parsedMemory = MemoryPolicySchema.safeParse(body.memory);
210
+ if (!parsedMemory.success) return c.json({
211
+ ok: false,
212
+ error: { message: `memory ${parsedMemory.error.issues[0]?.message ?? "is invalid"}` }
213
+ }, 400);
214
+ memoryPatch = parsedMemory.data;
215
+ }
194
216
  const prep = prepareUpdateAgent(service.currentConfig, id, {
195
217
  workspace: typeof body.workspace === "string" ? body.workspace : void 0,
218
+ ...extendsPatch !== void 0 ? { extends: extendsPatch } : {},
196
219
  ...modelsPatch !== void 0 ? { models: modelsPatch } : {},
197
- agentDir: body.agentDir === null ? null : typeof body.agentDir === "string" ? body.agentDir : void 0,
198
220
  setDefault: body.setDefault === true,
199
221
  ...skillsPatch !== void 0 ? { skills: skillsPatch } : {},
200
- ...toolsPatch !== void 0 ? { tools: toolsPatch } : {}
222
+ ...toolsPatch !== void 0 ? { tools: toolsPatch } : {},
223
+ ...memoryPatch !== void 0 ? { memory: memoryPatch } : {}
201
224
  });
202
225
  if (prep.ok === false) return c.json({
203
226
  ok: false,
@@ -361,11 +384,11 @@ function registerAgentsRoutes(authenticated, deps) {
361
384
  ok: true,
362
385
  payload: {
363
386
  current: {
364
- imageModel: agentModelRefToString(config.agents?.defaults?.imageModel) ?? null,
365
- imageModelFallbacks: agentModelFallbacksToArray(config.agents?.defaults?.imageModel),
366
- imageGenerationModel: agentModelRefToString(config.agents?.defaults?.imageGenerationModel) ?? null,
367
- imageGenerationModelFallbacks: agentModelFallbacksToArray(config.agents?.defaults?.imageGenerationModel),
368
- mediaMaxMb: config.agents?.defaults?.mediaMaxMb ?? null
387
+ imageModel: null,
388
+ imageModelFallbacks: [],
389
+ imageGenerationModel: null,
390
+ imageGenerationModelFallbacks: [],
391
+ mediaMaxMb: null
369
392
  },
370
393
  imageGeneration: { providers: imageGenerationProviders },
371
394
  imageUnderstanding: { providers: imageUnderstandingProviders }
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","names":[],"sources":["../../../../../src/gateway/hono/routes/agents.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { AgentModelsSchema, type Config, parseModelRef } from '../../../config/schema.js';\nimport { getVoiceModelsConfig } from '../../../config/voice.js';\nimport {\n isProviderConfigured,\n resolveModel,\n} from '../../../providers/index.js';\nimport { normalizeAgentId } from '../../../agent/agent-scope.js';\nimport {\n deleteAgentAvatarFile,\n finalizeCreateAgentDirs,\n listAgentProfileFiles,\n listGatewayAgents,\n prepareCreateAgent,\n prepareDeleteAgent,\n prepareUpdateAgent,\n readAgentAvatarFile,\n readAgentProfileFile,\n runAfterDeletePurge,\n writeAgentAvatarFromBase64,\n writeAgentProfileFile,\n type CreateAgentBody,\n} from '../../agents-admin.js';\nimport {\n resolveImageGenerationCapabilities,\n resolveImageUnderstandingCapabilities,\n} from '../../image-capabilities.js';\nimport {\n agentModelFallbacksToArray,\n agentModelRefToString,\n} from '../lib/agent-model.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseProfileFiles(raw: unknown): Record<string, string> | undefined | { error: string } {\n if (raw === undefined) {\n return undefined;\n }\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'profileFiles must be an object' };\n }\n const profileFiles: Record<string, string> = {};\n for (const [name, content] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof content !== 'string') {\n return { error: `profileFiles[\"${name}\"] must be a string` };\n }\n profileFiles[name] = content;\n }\n return profileFiles;\n}\n\nfunction isParseError(value: unknown): value is { error: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: string }).error === 'string'\n );\n}\n\nfunction parseCreateAgentBody(raw: unknown): CreateAgentBody | { error: string } {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'each agent must be an object' };\n }\n const body = raw as Record<string, unknown>;\n if (Object.hasOwn(body, 'model')) {\n return { error: 'model is not supported; use models.chat.primary' };\n }\n if (Object.hasOwn(body, 'toolsDisable')) {\n return { error: 'toolsDisable is not supported; use tools.disable' };\n }\n if (Object.hasOwn(body, 'typedModels')) {\n return { error: 'typedModels is not supported; use models.roles' };\n }\n if (Object.hasOwn(body, 'name')) {\n return { error: 'name is not supported; write IDENTITY.md in profileFiles' };\n }\n if (Object.hasOwn(body, 'description')) {\n return { error: 'description is not supported; write IDENTITY.md in profileFiles' };\n }\n const workspace = typeof body.workspace === 'string' ? body.workspace : '';\n const models = Object.hasOwn(body, 'models')\n ? AgentModelsSchema.safeParse(body.models)\n : undefined;\n if (models && !models.success) {\n return { error: `models ${models.error.issues[0]?.message ?? 'is invalid'}` };\n }\n const agentDir = typeof body.agentDir === 'string' ? body.agentDir : undefined;\n const id = typeof body.id === 'string' ? body.id : undefined;\n const skills = Object.hasOwn(body, 'skills')\n ? Array.isArray(body.skills)\n ? body.skills.map((x: unknown) => String(x).trim()).filter(Boolean)\n : null\n : undefined;\n if (skills === null) {\n return { error: 'skills must be an array' };\n }\n const toolsRaw = Object.hasOwn(body, 'tools') ? body.tools : undefined;\n let tools: CreateAgentBody['tools'] | undefined;\n if (toolsRaw !== undefined) {\n if (toolsRaw === null || typeof toolsRaw !== 'object' || Array.isArray(toolsRaw)) {\n return { error: 'tools must be an object' };\n }\n const disableRaw = (toolsRaw as Record<string, unknown>).disable;\n if (disableRaw !== undefined && !Array.isArray(disableRaw)) {\n return { error: 'tools.disable must be an array' };\n }\n const disable = Array.isArray(disableRaw)\n ? disableRaw.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n tools = disable !== undefined ? { disable } : {};\n }\n let profileFiles: Record<string, string> | undefined;\n if (Object.hasOwn(body, 'profileFiles')) {\n const parsed = parseProfileFiles(body.profileFiles);\n if (isParseError(parsed)) {\n return parsed;\n }\n profileFiles = parsed;\n }\n if (!profileFiles?.['IDENTITY.md'] && typeof body.cloneFrom !== 'string') {\n return { error: 'profileFiles.IDENTITY.md is required' };\n }\n const cloneFrom = typeof body.cloneFrom === 'string' ? body.cloneFrom : undefined;\n return {\n workspace,\n ...(models && models.data !== undefined ? { models: models.data } : {}),\n ...(agentDir !== undefined ? { agentDir } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(skills !== undefined ? { skills } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(profileFiles !== undefined ? { profileFiles } : {}),\n ...(cloneFrom !== undefined ? { cloneFrom } : {}),\n };\n}\n\ntype PatchModels = {\n chat?: { primary: string; fallbacks?: string[] } | null;\n roles?: Record<string, { model: string; description?: string }> | null;\n};\n\nfunction parsePatchModels(raw: unknown): PatchModels | null | undefined | { error: string } {\n if (raw === undefined) {\n return undefined;\n }\n if (raw === null) {\n return null;\n }\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'models must be an object or null' };\n }\n const body = raw as Record<string, unknown>;\n const out: PatchModels = {};\n if (Object.hasOwn(body, 'chat')) {\n if (body.chat === null) {\n out.chat = null;\n } else {\n const parsed = AgentModelsSchema.safeParse({ chat: body.chat });\n if (!parsed.success) {\n return { error: `models.chat ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out.chat = parsed.data?.chat;\n }\n }\n if (Object.hasOwn(body, 'roles')) {\n if (body.roles === null) {\n out.roles = null;\n } else {\n const parsed = AgentModelsSchema.safeParse({ roles: body.roles });\n if (!parsed.success) {\n return { error: `models.roles ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out.roles = parsed.data?.roles;\n }\n }\n return out;\n}\n\nexport function registerAgentsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/agents', async (c) => {\n const cfg = service.currentConfig as Config;\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const payload = await listGatewayAgents(cfg, { locale });\n return c.json({ ok: true, payload });\n });\n\n\n authenticated.post('/api/agents', strictRateLimitMiddleware, async (c) => {\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const parsed = parseCreateAgentBody(body);\n if ('error' in parsed) {\n return c.json({ ok: false, error: { message: parsed.error } }, 400);\n }\n const prep = prepareCreateAgent(service.currentConfig as Config, parsed);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, agentId } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const finalized = await finalizeCreateAgentDirs(service.currentConfig as Config, agentId, {\n ...(parsed.profileFiles !== undefined ? { profileFiles: parsed.profileFiles } : {}),\n ...(parsed.cloneFrom ? { cloneFrom: parsed.cloneFrom } : {}),\n });\n if (finalized.ok === false) {\n return c.json({ ok: false, error: { message: finalized.error } }, finalized.status ?? 400);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({\n ok: true,\n payload: {\n agentId,\n agents: agentsPayload,\n },\n });\n });\n\n authenticated.patch('/api/agents/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n if (Object.hasOwn(body, 'model')) {\n return c.json({ ok: false, error: { message: 'model is not supported; use models.chat' } }, 400);\n }\n if (Object.hasOwn(body, 'typedModels')) {\n return c.json({ ok: false, error: { message: 'typedModels is not supported; use models.roles' } }, 400);\n }\n if (Object.hasOwn(body, 'toolsDisable')) {\n return c.json({ ok: false, error: { message: 'toolsDisable is not supported; use tools.disable' } }, 400);\n }\n if (Object.hasOwn(body, 'name')) {\n return c.json({ ok: false, error: { message: 'name is not supported; edit IDENTITY.md' } }, 400);\n }\n if (Object.hasOwn(body, 'description')) {\n return c.json({ ok: false, error: { message: 'description is not supported; edit IDENTITY.md' } }, 400);\n }\n const skillsPatch =\n body.skills === null\n ? null\n : Array.isArray(body.skills)\n ? body.skills.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n let toolsPatch: { disable?: string[] | null } | null | undefined;\n if (Object.hasOwn(body, 'tools')) {\n if (body.tools === null) {\n toolsPatch = null;\n } else if (typeof body.tools === 'object' && !Array.isArray(body.tools)) {\n const disable = (body.tools as Record<string, unknown>).disable;\n if (disable === null) {\n toolsPatch = { disable: null };\n } else if (disable === undefined) {\n toolsPatch = {};\n } else if (Array.isArray(disable)) {\n toolsPatch = { disable: disable.map((x: unknown) => String(x).trim()).filter(Boolean) };\n } else {\n return c.json({ ok: false, error: { message: 'tools.disable must be an array or null' } }, 400);\n }\n } else {\n return c.json({ ok: false, error: { message: 'tools must be an object or null' } }, 400);\n }\n }\n const modelsPatch = Object.hasOwn(body, 'models') ? parsePatchModels(body.models) : undefined;\n if (isParseError(modelsPatch)) {\n return c.json({ ok: false, error: { message: modelsPatch.error } }, 400);\n }\n\n const prep = prepareUpdateAgent(service.currentConfig as Config, id, {\n workspace: typeof body.workspace === 'string' ? body.workspace : undefined,\n ...(modelsPatch !== undefined ? { models: modelsPatch } : {}),\n agentDir:\n body.agentDir === null\n ? null\n : typeof body.agentDir === 'string'\n ? body.agentDir\n : undefined,\n setDefault: body.setDefault === true,\n ...(skillsPatch !== undefined ? { skills: skillsPatch } : {}),\n ...(toolsPatch !== undefined ? { tools: toolsPatch } : {}),\n });\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({ ok: true, payload: agentsPayload });\n });\n\n authenticated.delete('/api/agents/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const purge = c.req.query('purge') === '1' || c.req.query('purge') === 'true';\n const prep = prepareDeleteAgent(service.currentConfig as Config, id);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, agentId } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n if (purge) {\n await runAfterDeletePurge(service.currentConfig as Config, agentId);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({\n ok: true,\n payload: { agentId, purged: purge, agents: agentsPayload },\n });\n });\n\n authenticated.get('/api/agents/:id/avatar', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await readAgentAvatarFile(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return new Response(res.data.buffer, {\n status: 200,\n headers: {\n 'Content-Type': res.data.contentType,\n 'Cache-Control': 'private, max-age=3600',\n },\n });\n });\n\n authenticated.put('/api/agents/:id/avatar', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const base64 = typeof body.base64 === 'string' ? body.base64 : '';\n const mimeType = typeof body.mimeType === 'string' ? body.mimeType : '';\n const res = await writeAgentAvatarFromBase64(service.currentConfig as Config, id, base64, mimeType);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId } });\n });\n\n authenticated.delete('/api/agents/:id/avatar', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await deleteAgentAvatarFile(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId } });\n });\n\n authenticated.get('/api/agents/:id/files', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await listAgentProfileFiles(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: res.data });\n });\n\n authenticated.get('/api/agents/:id/files/:name', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const name = decodeURIComponent(c.req.param('name') ?? '');\n const res = await readAgentProfileFile(service.currentConfig as Config, id, name);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId, name, content: res.data.content } });\n });\n\n authenticated.put('/api/agents/:id/files/:name', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const name = decodeURIComponent(c.req.param('name') ?? '');\n let content = '';\n try {\n const body = (await c.req.json()) as { content?: unknown };\n content = typeof body.content === 'string' ? body.content : '';\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const res = await writeAgentProfileFile(service.currentConfig as Config, id, name, content);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId, name } });\n });\n\n // GET /api/voice/models - Get available STT/TTS models\n authenticated.get('/api/voice/models', (c) => {\n const models = getVoiceModelsConfig();\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 imageGenerationProviders = await resolveImageGenerationCapabilities(config);\n const imageUnderstandingProviders = await resolveImageUnderstandingCapabilities(config);\n return c.json({\n ok: true,\n payload: {\n current: {\n imageModel: agentModelRefToString(config.agents?.defaults?.imageModel) ?? null,\n imageModelFallbacks: agentModelFallbacksToArray(config.agents?.defaults?.imageModel),\n imageGenerationModel: agentModelRefToString(config.agents?.defaults?.imageGenerationModel) ?? null,\n imageGenerationModelFallbacks: agentModelFallbacksToArray(\n config.agents?.defaults?.imageGenerationModel,\n ),\n mediaMaxMb: config.agents?.defaults?.mediaMaxMb ?? null,\n },\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}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","names":[],"sources":["../../../../../src/gateway/hono/routes/agents.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { AgentModelsSchema, type Config, parseModelRef } from '../../../config/schema.js';\nimport { MemoryPolicySchema, ToolPolicySetSchema } from '../../../agent-manifest/schema.js';\nimport { getVoiceModelsConfig } from '../../../config/voice.js';\nimport {\n isProviderConfigured,\n resolveModel,\n} from '../../../providers/index.js';\nimport { normalizeAgentId } from '../../../agent/agent-scope.js';\nimport {\n deleteAgentAvatarFile,\n finalizeCreateAgentDirs,\n getGatewayAgentEffectiveManifest,\n listAgentProfileFiles,\n listGatewayAgents,\n prepareCreateAgent,\n prepareDeleteAgent,\n prepareUpdateAgent,\n readAgentAvatarFile,\n readAgentProfileFile,\n runAfterDeletePurge,\n writeAgentAvatarFromBase64,\n writeAgentProfileFile,\n type CreateAgentBody,\n} from '../../agents-admin.js';\nimport {\n resolveImageGenerationCapabilities,\n resolveImageUnderstandingCapabilities,\n} from '../../image-capabilities.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseProfileFiles(raw: unknown): Record<string, string> | undefined | { error: string } {\n if (raw === undefined) {\n return undefined;\n }\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'profileFiles must be an object' };\n }\n const profileFiles: Record<string, string> = {};\n for (const [name, content] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof content !== 'string') {\n return { error: `profileFiles[\"${name}\"] must be a string` };\n }\n profileFiles[name] = content;\n }\n return profileFiles;\n}\n\nfunction isParseError(value: unknown): value is { error: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: string }).error === 'string'\n );\n}\n\nfunction parseCreateAgentBody(raw: unknown): CreateAgentBody | { error: string } {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'each agent must be an object' };\n }\n const body = raw as Record<string, unknown>;\n if (Object.hasOwn(body, 'model')) {\n return { error: 'model is not supported; use models.defaultRole and models.roles' };\n }\n if (Object.hasOwn(body, 'toolsDisable')) {\n return { error: 'toolsDisable was removed; use tools.builtin policies' };\n }\n if (Object.hasOwn(body, 'typedModels')) {\n return { error: 'typedModels is not supported; use models.roles' };\n }\n if (Object.hasOwn(body, 'agentDir')) {\n return { error: 'agentDir was removed from agent manifests' };\n }\n if (Object.hasOwn(body, 'name')) {\n return { error: 'name is not supported; write IDENTITY.md in profileFiles' };\n }\n if (Object.hasOwn(body, 'description')) {\n return { error: 'description is not supported; write IDENTITY.md in profileFiles' };\n }\n const workspace = typeof body.workspace === 'string' ? body.workspace : '';\n const models = Object.hasOwn(body, 'models')\n ? AgentModelsSchema.safeParse(body.models)\n : undefined;\n if (models && !models.success) {\n return { error: `models ${models.error.issues[0]?.message ?? 'is invalid'}` };\n }\n const id = typeof body.id === 'string' ? body.id : undefined;\n const skills = Object.hasOwn(body, 'skills')\n ? Array.isArray(body.skills)\n ? body.skills.map((x: unknown) => String(x).trim()).filter(Boolean)\n : null\n : undefined;\n if (skills === null) {\n return { error: 'skills must be an array' };\n }\n const toolsRaw = Object.hasOwn(body, 'tools') ? body.tools : undefined;\n let tools: CreateAgentBody['tools'] | undefined;\n if (toolsRaw !== undefined) {\n if (toolsRaw === null || typeof toolsRaw !== 'object' || Array.isArray(toolsRaw)) {\n return { error: 'tools must be an object' };\n }\n const parsedTools = ToolPolicySetSchema.safeParse(toolsRaw);\n if (!parsedTools.success) {\n return { error: `tools ${parsedTools.error.issues[0]?.message ?? 'is invalid'}` };\n }\n tools = parsedTools.data;\n }\n let profileFiles: Record<string, string> | undefined;\n if (Object.hasOwn(body, 'profileFiles')) {\n const parsed = parseProfileFiles(body.profileFiles);\n if (isParseError(parsed)) {\n return parsed;\n }\n profileFiles = parsed;\n }\n if (!profileFiles?.['IDENTITY.md'] && typeof body.cloneFrom !== 'string') {\n return { error: 'profileFiles.IDENTITY.md is required' };\n }\n const cloneFrom = typeof body.cloneFrom === 'string' ? body.cloneFrom : undefined;\n return {\n workspace,\n ...(models && models.data !== undefined ? { models: models.data } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(skills !== undefined ? { skills } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(profileFiles !== undefined ? { profileFiles } : {}),\n ...(cloneFrom !== undefined ? { cloneFrom } : {}),\n };\n}\n\ntype PatchModels = {\n defaultRole?: string | null;\n roles?: Record<string, { model: string; description?: string }>;\n};\n\nfunction parsePatchModels(raw: unknown): PatchModels | null | undefined | { error: string } {\n if (raw === undefined) {\n return undefined;\n }\n if (raw === null) {\n return null;\n }\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'models must be an object or null' };\n }\n const body = raw as Record<string, unknown>;\n const out: PatchModels = {};\n if (Object.hasOwn(body, 'defaultRole')) {\n out.defaultRole = body.defaultRole === null ? null : String(body.defaultRole ?? '').trim();\n }\n if (Object.hasOwn(body, 'roles')) {\n if (body.roles === null) {\n return { error: 'models.roles must be an object' };\n } else {\n const parsed = AgentModelsSchema.safeParse({ roles: body.roles });\n if (!parsed.success) {\n return { error: `models.roles ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out.roles = parsed.data?.roles;\n }\n }\n return out;\n}\n\nexport function registerAgentsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/agents', async (c) => {\n const cfg = service.currentConfig as Config;\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const payload = await listGatewayAgents(cfg, { locale });\n return c.json({ ok: true, payload });\n });\n\n\n authenticated.post('/api/agents', strictRateLimitMiddleware, async (c) => {\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const parsed = parseCreateAgentBody(body);\n if ('error' in parsed) {\n return c.json({ ok: false, error: { message: parsed.error } }, 400);\n }\n const prep = prepareCreateAgent(service.currentConfig as Config, parsed);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, agentId } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const finalized = await finalizeCreateAgentDirs(service.currentConfig as Config, agentId, {\n ...(parsed.profileFiles !== undefined ? { profileFiles: parsed.profileFiles } : {}),\n ...(parsed.cloneFrom ? { cloneFrom: parsed.cloneFrom } : {}),\n });\n if (finalized.ok === false) {\n return c.json({ ok: false, error: { message: finalized.error } }, finalized.status ?? 400);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({\n ok: true,\n payload: {\n agentId,\n agents: agentsPayload,\n },\n });\n });\n\n authenticated.get('/api/agents/:id/effective-manifest', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = getGatewayAgentEffectiveManifest(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: res.data });\n });\n\n authenticated.patch('/api/agents/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n if (Object.hasOwn(body, 'model')) {\n return c.json({ ok: false, error: { message: 'model is not supported; use models.defaultRole and models.roles' } }, 400);\n }\n if (Object.hasOwn(body, 'typedModels')) {\n return c.json({ ok: false, error: { message: 'typedModels is not supported; use models.roles' } }, 400);\n }\n if (Object.hasOwn(body, 'toolsDisable')) {\n return c.json({ ok: false, error: { message: 'toolsDisable was removed; use tools.builtin policies' } }, 400);\n }\n if (Object.hasOwn(body, 'agentDir')) {\n return c.json({ ok: false, error: { message: 'agentDir was removed from agent manifests' } }, 400);\n }\n if (Object.hasOwn(body, 'name')) {\n return c.json({ ok: false, error: { message: 'name is not supported; edit IDENTITY.md' } }, 400);\n }\n if (Object.hasOwn(body, 'description')) {\n return c.json({ ok: false, error: { message: 'description is not supported; edit IDENTITY.md' } }, 400);\n }\n const skillsPatch =\n body.skills === null\n ? null\n : Array.isArray(body.skills)\n ? body.skills.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined;\n const extendsPatch = Object.hasOwn(body, 'extends')\n ? Array.isArray(body.extends)\n ? body.extends.map((x: unknown) => String(x).trim()).filter(Boolean)\n : undefined\n : undefined;\n if (Object.hasOwn(body, 'extends') && extendsPatch === undefined) {\n return c.json({ ok: false, error: { message: 'extends must be an array' } }, 400);\n }\n let toolsPatch: CreateAgentBody['tools'] | null | undefined;\n if (Object.hasOwn(body, 'tools')) {\n if (body.tools === null) {\n toolsPatch = null;\n } else if (typeof body.tools === 'object' && !Array.isArray(body.tools)) {\n const parsedTools = ToolPolicySetSchema.safeParse(body.tools);\n if (!parsedTools.success) {\n return c.json({ ok: false, error: { message: `tools ${parsedTools.error.issues[0]?.message ?? 'is invalid'}` } }, 400);\n }\n toolsPatch = parsedTools.data;\n } else {\n return c.json({ ok: false, error: { message: 'tools must be an object or null' } }, 400);\n }\n }\n const modelsPatch = Object.hasOwn(body, 'models') ? parsePatchModels(body.models) : undefined;\n if (isParseError(modelsPatch)) {\n return c.json({ ok: false, error: { message: modelsPatch.error } }, 400);\n }\n let memoryPatch: Config['agents']['list'][number]['memory'] | undefined;\n if (Object.hasOwn(body, 'memory')) {\n const parsedMemory = MemoryPolicySchema.safeParse(body.memory);\n if (!parsedMemory.success) {\n return c.json({ ok: false, error: { message: `memory ${parsedMemory.error.issues[0]?.message ?? 'is invalid'}` } }, 400);\n }\n memoryPatch = parsedMemory.data;\n }\n\n const prep = prepareUpdateAgent(service.currentConfig as Config, id, {\n workspace: typeof body.workspace === 'string' ? body.workspace : undefined,\n ...(extendsPatch !== undefined ? { extends: extendsPatch } : {}),\n ...(modelsPatch !== undefined ? { models: modelsPatch } : {}),\n setDefault: body.setDefault === true,\n ...(skillsPatch !== undefined ? { skills: skillsPatch } : {}),\n ...(toolsPatch !== undefined ? { tools: toolsPatch } : {}),\n ...(memoryPatch !== undefined ? { memory: memoryPatch } : {}),\n });\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({ ok: true, payload: agentsPayload });\n });\n\n authenticated.delete('/api/agents/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const purge = c.req.query('purge') === '1' || c.req.query('purge') === 'true';\n const prep = prepareDeleteAgent(service.currentConfig as Config, id);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const { nextConfig, agentId } = prep.data;\n const save = await service.saveConfig(nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n if (purge) {\n await runAfterDeletePurge(service.currentConfig as Config, agentId);\n }\n const locale = c.req.query('locale') || c.req.header('Accept-Language')?.split(',')[0]?.trim();\n const agentsPayload = await listGatewayAgents(service.currentConfig as Config, { locale });\n return c.json({\n ok: true,\n payload: { agentId, purged: purge, agents: agentsPayload },\n });\n });\n\n authenticated.get('/api/agents/:id/avatar', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await readAgentAvatarFile(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return new Response(res.data.buffer, {\n status: 200,\n headers: {\n 'Content-Type': res.data.contentType,\n 'Cache-Control': 'private, max-age=3600',\n },\n });\n });\n\n authenticated.put('/api/agents/:id/avatar', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let body: Record<string, unknown> = {};\n try {\n body = (await c.req.json()) as Record<string, unknown>;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const base64 = typeof body.base64 === 'string' ? body.base64 : '';\n const mimeType = typeof body.mimeType === 'string' ? body.mimeType : '';\n const res = await writeAgentAvatarFromBase64(service.currentConfig as Config, id, base64, mimeType);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId } });\n });\n\n authenticated.delete('/api/agents/:id/avatar', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await deleteAgentAvatarFile(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId } });\n });\n\n authenticated.get('/api/agents/:id/files', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const res = await listAgentProfileFiles(service.currentConfig as Config, id);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: res.data });\n });\n\n authenticated.get('/api/agents/:id/files/:name', async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const name = decodeURIComponent(c.req.param('name') ?? '');\n const res = await readAgentProfileFile(service.currentConfig as Config, id, name);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId, name, content: res.data.content } });\n });\n\n authenticated.put('/api/agents/:id/files/:name', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const name = decodeURIComponent(c.req.param('name') ?? '');\n let content = '';\n try {\n const body = (await c.req.json()) as { content?: unknown };\n content = typeof body.content === 'string' ? body.content : '';\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const res = await writeAgentProfileFile(service.currentConfig as Config, id, name, content);\n if (res.ok === false) {\n return c.json({ ok: false, error: { message: res.error } }, res.status ?? 400);\n }\n return c.json({ ok: true, payload: { agentId: res.data.agentId, name } });\n });\n\n // GET /api/voice/models - Get available STT/TTS models\n authenticated.get('/api/voice/models', (c) => {\n const models = getVoiceModelsConfig();\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 imageGenerationProviders = await resolveImageGenerationCapabilities(config);\n const imageUnderstandingProviders = await resolveImageUnderstandingCapabilities(config);\n return c.json({\n ok: true,\n payload: {\n current: {\n imageModel: null,\n imageModelFallbacks: [],\n imageGenerationModel: null,\n imageGenerationModelFallbacks: [],\n mediaMaxMb: null,\n },\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}\n"],"mappings":"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"}
@@ -7,8 +7,8 @@ import { createOAuthHandler } from "../oauth.js";
7
7
  import { createOAuthAsyncHandler } from "../oauth-async.js";
8
8
  import { extensionAssetMimeType } from "../lib/extension-assets.js";
9
9
  import { loadExtensionStore, saveExtensionStore } from "../lib/extension-store.js";
10
- import { existsSync, readFileSync, statSync } from "node:fs";
11
10
  import { relative, resolve } from "node:path";
11
+ import { existsSync, readFileSync, statSync } from "node:fs";
12
12
  //#region src/gateway/hono/routes/auth-registry-extensions.ts
13
13
  init_providers();
14
14
  const EXTENSION_ASSET_CSP = "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'none'; frame-ancestors 'self'; frame-src 'none'; base-uri 'none'; object-src 'none'; form-action 'none'";
@@ -79,8 +79,7 @@ function resolveExtensionStatusTarget(browser, query) {
79
79
  function registerBrowserRoutes(authenticated, deps) {
80
80
  const { service, strictRateLimitMiddleware } = deps;
81
81
  authenticated.get("/api/browser/extension-status", async (c) => {
82
- const browser = service.currentConfig?.agents?.defaults?.browser;
83
- const target = resolveExtensionStatusTarget(browser, {
82
+ const target = resolveExtensionStatusTarget(void 0, {
84
83
  probe: c.req.query("probe"),
85
84
  host: c.req.query("host"),
86
85
  port: c.req.query("port")
@@ -98,15 +97,12 @@ function registerBrowserRoutes(authenticated, deps) {
98
97
  needsChromeReload: doctor.needsChromeReload
99
98
  };
100
99
  } catch {}
101
- if (!target) {
102
- const backend = typeof browser?.backend === "string" ? browser.backend : "extension";
103
- return c.json({
104
- running: false,
105
- connected: false,
106
- backend,
107
- artifacts
108
- });
109
- }
100
+ if (!target) return c.json({
101
+ running: false,
102
+ connected: false,
103
+ backend: "extension",
104
+ artifacts
105
+ });
110
106
  const snapshot = await readExtensionBridgeSnapshot();
111
107
  let probeRunning = false;
112
108
  let probeConnected = false;
@@ -503,10 +499,7 @@ function registerBrowserRoutes(authenticated, deps) {
503
499
  const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
504
500
  const provider = input.provider;
505
501
  let apiKey = typeof input.apiKey === "string" ? input.apiKey.trim() : "";
506
- if (apiKey === "***" || apiKey === "••••••••••••") {
507
- const stored = service.currentConfig?.agents?.defaults?.browser?.cloud?.apiKey;
508
- apiKey = typeof stored === "string" ? stored.trim() : "";
509
- }
502
+ if (apiKey === "***" || apiKey === "••••••••••••") apiKey = "";
510
503
  if (!apiKey) {
511
504
  if (provider === "browserbase") apiKey = process.env.BROWSERBASE_API_KEY ?? "";
512
505
  else if (provider === "browser-use") apiKey = process.env.BROWSER_USE_API_KEY ?? "";
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","names":[],"sources":["../../../../../src/gateway/hono/routes/browser.ts"],"sourcesContent":["/**\n * Browser/extension settings routes: `/api/browser/*` except for the\n * long-running install streams under `/api/browser/{playwright,cloakbrowser}/install/stream`\n * (those live in `browser-install.ts` so the SSE pump doesn't have to load\n * with the rest of settings).\n *\n * Four backend families:\n * - **Extension WS bridge** — pair Chrome via the xopc browser extension.\n * Owns a module-scoped manual handle so the bridge can outlive a config\n * save (UI flow: Start → pair → Save).\n * - **CloakBrowser** — install / launch / probe runtime status.\n * - **Playwright Chromium** — doctor + on-demand install of bundled browser.\n * - **Local CDP** — launch / list / stop user-driven debug Chrome instances.\n * - **Cloud providers** (browserbase / browser-use) — connection test.\n *\n * Extracted from `config.ts` (which was 2237 lines and 80% browser routes).\n */\nimport type { Hono } from 'hono';\nimport net from 'node:net';\n\nimport type { Config } from '../../../config/schema.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst DEFAULT_EXTENSION_PORT = 19820;\nconst DEFAULT_EXTENSION_HOST = '127.0.0.1';\n\n/**\n * Optional manual hold on the extension WS server kept alive from the UI so\n * users can pair the extension before saving config / running a browser tool.\n * Module-scoped so repeat Start calls are idempotent and the bridge survives\n * config patches.\n */\ntype ManualHandle = { release: () => Promise<void>; host: string; port: number };\nlet manualExtensionHandle: ManualHandle | null = null;\n\nfunction loopbackHostnameFromUrl(input: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n return null;\n }\n const proto = parsed.protocol;\n if (proto !== 'ws:' && proto !== 'wss:' && proto !== 'http:' && proto !== 'https:') {\n return null;\n }\n const host = parsed.hostname.toLowerCase();\n if (host === '127.0.0.1' || host === 'localhost' || host === '::1') return host;\n return null;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n const h = host.trim().toLowerCase();\n return h === '127.0.0.1' || h === 'localhost' || h === '::1' || h === '[::1]';\n}\n\nfunction parseExtensionProbePort(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1024 || n > 65_535) return undefined;\n return n;\n}\n\nfunction isLoopbackPortOpen(host: string, port: number, timeoutMs = 500): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = net.connect({ host, port });\n const finish = (open: boolean) => {\n socket.removeAllListeners();\n try {\n socket.destroy();\n } catch {\n /* */\n }\n resolve(open);\n };\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', () => finish(false));\n });\n}\n\nasync function readExtensionBridgeSnapshot() {\n const { getExtensionBrowserServerSnapshot } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n return getExtensionBrowserServerSnapshot();\n}\n\nasync function stopExtensionBridgeFromSettings(service: AuthenticatedRouteDeps['service']): Promise<{\n forcedShutdown: boolean;\n}> {\n if (manualExtensionHandle) {\n try {\n await manualExtensionHandle.release();\n } catch {\n /* refcount underflow should not surface */\n }\n manualExtensionHandle = null;\n }\n await service.releaseBrowserExtensionBridge();\n const { forceShutdownExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const forcedShutdown = await forceShutdownExtensionBrowserServer();\n return { forcedShutdown };\n}\n\nfunction resolveExtensionStatusTarget(\n browser: Record<string, unknown> | undefined,\n query: { probe?: string; host?: string; port?: string },\n): { host: string; port: number; backend: string } | null {\n const backend = typeof browser?.backend === 'string' ? browser.backend : 'extension';\n const probe = query.probe === '1' || query.probe === 'true';\n if (!probe && backend !== 'extension') {\n return null;\n }\n\n const ext = browser?.extension as Record<string, unknown> | undefined;\n const configPort =\n typeof ext?.port === 'number' && ext.port >= 1024 && ext.port <= 65_535\n ? Math.floor(ext.port)\n : DEFAULT_EXTENSION_PORT;\n const configHost =\n typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : DEFAULT_EXTENSION_HOST;\n\n const port = parseExtensionProbePort(query.port) ?? configPort;\n const host =\n typeof query.host === 'string' && query.host.trim() ? query.host.trim() : configHost;\n if (!isLoopbackHost(host)) {\n return null;\n }\n\n return { host, port, backend: probe && backend !== 'extension' ? 'extension' : backend };\n}\n\nexport function registerBrowserRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n // Browser extension bridge status — gateway-side check so frontend doesn't cross-origin fetch.\n authenticated.get('/api/browser/extension-status', async (c) => {\n const config: Config = service.currentConfig as Config;\n const browser = config?.agents?.defaults?.browser as Record<string, unknown> | undefined;\n const target = resolveExtensionStatusTarget(browser, {\n probe: c.req.query('probe'),\n host: c.req.query('host'),\n port: c.req.query('port'),\n });\n\n let artifacts: Record<string, unknown> | undefined;\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const doctor = await browserExtDoctor();\n artifacts = {\n installed: doctor.installed,\n extensionDir: doctor.extensionDir,\n xopcVersion: doctor.xopcVersion,\n installedVersion: doctor.installedVersion,\n needsRefresh: doctor.needsRefresh,\n needsChromeReload: doctor.needsChromeReload,\n };\n } catch {\n /* optional */\n }\n\n if (!target) {\n const backend = typeof browser?.backend === 'string' ? browser.backend : 'extension';\n return c.json({ running: false, connected: false, backend, artifacts });\n }\n const snapshot = await readExtensionBridgeSnapshot();\n let probeRunning = false;\n let probeConnected = false;\n try {\n const res = await fetch(`http://${target.host}:${target.port}/`, { signal: AbortSignal.timeout(2000) });\n const data = (await res.json()) as { ok?: boolean; connected?: boolean };\n probeRunning = Boolean(data.ok);\n probeConnected = Boolean(data.connected);\n } catch {\n /* probe failed — fall through to snapshot / port check */\n }\n const running = probeRunning || snapshot.active;\n const portConflict =\n !running && !snapshot.active\n ? await isLoopbackPortOpen(target.host, target.port)\n : false;\n return c.json({\n running,\n connected: probeConnected,\n backend: target.backend,\n artifacts,\n bridgeHeld: snapshot.active,\n refCount: snapshot.refCount,\n manualBridge: manualExtensionHandle !== null,\n portConflict,\n });\n });\n\n authenticated.get('/api/browser/extension/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const status = await browserExtDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n authenticated.post('/api/browser/extension/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const force = input.force === true;\n\n try {\n const { ensureBrowserExtensionArtifacts, browserExtDoctor } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await ensureBrowserExtensionArtifacts({ cacheDir, force });\n const doctor = await browserExtDoctor({ cacheDir });\n return c.json({ ok: true, payload: { ...result, doctor } });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/open', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const actionRaw = typeof input.action === 'string' ? input.action.trim() : 'both';\n const action =\n actionRaw === 'chrome' || actionRaw === 'folder' || actionRaw === 'both' ? actionRaw : 'both';\n\n try {\n const { openBrowserExtensionInstallUi } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await openBrowserExtensionInstallUi({ action, cacheDir });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Start the extension WS bridge eagerly so the user can pair the extension\n // before saving config / running any tool. Idempotent (returns current state\n // if already running).\n authenticated.post('/api/browser/extension/start', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port =\n typeof input.port === 'number' && input.port >= 1024 && input.port <= 65535\n ? Math.floor(input.port)\n : DEFAULT_EXTENSION_PORT;\n const hostRaw = typeof input.host === 'string' && input.host.trim() ? input.host.trim() : DEFAULT_EXTENSION_HOST;\n if (!isLoopbackHost(hostRaw)) {\n return c.json({ ok: false, error: 'extension bridge host must be loopback' }, 400);\n }\n\n try {\n if (manualExtensionHandle && (manualExtensionHandle.host !== hostRaw || manualExtensionHandle.port !== port)) {\n await manualExtensionHandle.release();\n manualExtensionHandle = null;\n }\n if (!manualExtensionHandle) {\n const { acquireExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const { release } = await acquireExtensionBrowserServer({ host: hostRaw, port });\n manualExtensionHandle = { release, host: hostRaw, port };\n }\n return c.json({ ok: true, payload: { running: true, host: hostRaw, port } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/stop', strictRateLimitMiddleware, async (c) => {\n try {\n const { forcedShutdown } = await stopExtensionBridgeFromSettings(service);\n return c.json({\n ok: true,\n payload: { running: false, forcedShutdown },\n });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/disconnect', strictRateLimitMiddleware, async (c) => {\n try {\n const { getExtensionBrowserProvider } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const provider = getExtensionBrowserProvider();\n if (!provider?.isConnected()) {\n return c.json({\n ok: true,\n payload: { connected: false, alreadyDisconnected: true },\n });\n }\n provider.disconnectClient();\n return c.json({ ok: true, payload: { connected: false } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n // Doctor: does Playwright have a runnable Chromium on disk?\n authenticated.get('/api/browser/playwright/doctor', async (c) => {\n try {\n const { playwrightChromiumDoctor } = await import('../../../browser/providers/playwright-doctor.js');\n const payload = await playwrightChromiumDoctor();\n return c.json({ ok: true, payload });\n } catch (e) {\n return c.json(\n { ok: false, error: e instanceof Error ? e.message : String(e) },\n 500,\n );\n }\n });\n\n // Doctor: CloakBrowser installed?\n authenticated.get('/api/browser/cloakbrowser/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n const binaryPathRaw = c.req.query('binaryPath');\n try {\n const { cloakBrowserDoctor } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await cloakBrowserDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n binaryPath: binaryPathRaw && binaryPathRaw.trim() ? binaryPathRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n // Runtime status for CloakBrowser (CDP port + profile dir from saved agent defaults).\n authenticated.get('/api/browser/cloakbrowser/status', async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { probeCloakBrowserRuntime } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const status = await probeCloakBrowserRuntime(config);\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Open CloakBrowser with the same profile/settings agents use (saved config, headed).\n authenticated.post('/api/browser/cloakbrowser/launch', strictRateLimitMiddleware, async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { launchCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const result = await launchCloakBrowser({\n ...config,\n skipPlaywrightConnect: true,\n });\n return c.json({\n ok: true,\n payload: {\n running: true,\n reused: result.reused,\n port: result.cdpPort,\n pid: result.pid,\n userDataDir: result.userDataDir,\n temporaryProfile: config.temporaryProfile === true,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Ping a user-supplied CDP endpoint — loopback only (SSRF guard).\n authenticated.post('/api/browser/cdp/ping', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cdpUrl = typeof input.cdpUrl === 'string' ? input.cdpUrl.trim() : '';\n if (!cdpUrl) return c.json({ ok: false, error: 'cdpUrl is required' }, 400);\n\n const loopback = loopbackHostnameFromUrl(cdpUrl);\n if (!loopback) {\n return c.json(\n { ok: false, error: 'CDP ping only allowed for loopback hosts (127.0.0.1 / localhost / ::1)' },\n 403,\n );\n }\n let httpBase: URL;\n try {\n httpBase = new URL(cdpUrl);\n httpBase.protocol = httpBase.protocol === 'wss:' ? 'https:' : 'http:';\n httpBase.pathname = '/json/version';\n httpBase.search = '';\n httpBase.hash = '';\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : 'invalid cdpUrl' }, 400);\n }\n try {\n const res = await fetch(httpBase.toString(), { signal: AbortSignal.timeout(2000) });\n if (!res.ok) {\n return c.json({ ok: true, payload: { reachable: false, status: res.status } });\n }\n const data = (await res.json()) as { Browser?: string; 'Protocol-Version'?: string; webSocketDebuggerUrl?: string };\n return c.json({\n ok: true,\n payload: {\n reachable: true,\n browser: data.Browser ?? null,\n protocolVersion: data['Protocol-Version'] ?? null,\n webSocketDebuggerUrl: data.webSocketDebuggerUrl ?? null,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n // Spawn a local debuggable Chrome and return its WS endpoint.\n authenticated.post('/api/browser/cdp/launch', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const executablePath =\n typeof input.executablePath === 'string' && input.executablePath.trim()\n ? input.executablePath.trim()\n : undefined;\n try {\n const { launchLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const result = await launchLocalCdpChrome({ executablePath });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/cdp/stop', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port = typeof input.port === 'number' && Number.isInteger(input.port) ? input.port : NaN;\n if (!Number.isFinite(port) || port < 1024 || port > 65535) {\n return c.json({ ok: false, error: 'port must be an integer in [1024, 65535]' }, 400);\n }\n const { stopLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const stopped = await stopLocalCdpChrome(port);\n return c.json({ ok: true, payload: { stopped } });\n });\n\n authenticated.get('/api/browser/cdp/instances', async (c) => {\n const { listLocalCdpInstances } = await import('../../../browser/cdp-local-launcher.js');\n return c.json({ ok: true, payload: { instances: listLocalCdpInstances() } });\n });\n\n // Cloud provider connection test.\n authenticated.post('/api/browser/cloud/test-connection', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const provider = input.provider;\n const apiKeyRaw = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';\n\n // The masked sentinel means \"use the stored config key\".\n let apiKey = apiKeyRaw;\n if (apiKey === '***' || apiKey === '••••••••••••') {\n const stored =\n (service.currentConfig as Config)?.agents?.defaults?.browser?.cloud?.apiKey;\n apiKey = typeof stored === 'string' ? stored.trim() : '';\n }\n if (!apiKey) {\n if (provider === 'browserbase') apiKey = process.env.BROWSERBASE_API_KEY ?? '';\n else if (provider === 'browser-use') apiKey = process.env.BROWSER_USE_API_KEY ?? '';\n }\n if (!apiKey) {\n return c.json({ ok: true, payload: { reachable: false, error: 'No API key configured' } });\n }\n\n try {\n if (provider === 'browserbase') {\n const res = await fetch('https://api.browserbase.com/v1/projects', {\n headers: { 'x-bb-api-key': apiKey },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n const data = (await res.json().catch(() => null)) as unknown;\n const projects = Array.isArray(data) ? data : Array.isArray((data as { data?: unknown[] })?.data) ? (data as { data: unknown[] }).data : [];\n return c.json({ ok: true, payload: { reachable: true, projectCount: projects.length } });\n }\n if (provider === 'browser-use') {\n const res = await fetch('https://api.browser-use.com/api/v1/users/me', {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n return c.json({ ok: true, payload: { reachable: true } });\n }\n return c.json({ ok: false, error: 'provider must be browserbase or browser-use' }, 400);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n authenticated.post('/api/browser/playwright/install', strictRateLimitMiddleware, async (c) => {\n try {\n const { installPlaywrightChromium } = await import('../../../browser/providers/playwright-install.js');\n const payload = await installPlaywrightChromium();\n return c.json({ ok: true, payload });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message || 'Failed to install Playwright Chromium' }, 500);\n }\n });\n\n authenticated.post('/api/browser/cloakbrowser/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const binaryPath = typeof input.binaryPath === 'string' && input.binaryPath.trim()\n ? input.binaryPath.trim()\n : undefined;\n\n try {\n const { installCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await installCloakBrowser({ cacheDir, binaryPath });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","names":[],"sources":["../../../../../src/gateway/hono/routes/browser.ts"],"sourcesContent":["/**\n * Browser/extension settings routes: `/api/browser/*` except for the\n * long-running install streams under `/api/browser/{playwright,cloakbrowser}/install/stream`\n * (those live in `browser-install.ts` so the SSE pump doesn't have to load\n * with the rest of settings).\n *\n * Four backend families:\n * - **Extension WS bridge** — pair Chrome via the xopc browser extension.\n * Owns a module-scoped manual handle so the bridge can outlive a config\n * save (UI flow: Start → pair → Save).\n * - **CloakBrowser** — install / launch / probe runtime status.\n * - **Playwright Chromium** — doctor + on-demand install of bundled browser.\n * - **Local CDP** — launch / list / stop user-driven debug Chrome instances.\n * - **Cloud providers** (browserbase / browser-use) — connection test.\n *\n * Extracted from `config.ts` (which was 2237 lines and 80% browser routes).\n */\nimport type { Hono } from 'hono';\nimport net from 'node:net';\n\nimport type { Config } from '../../../config/schema.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst DEFAULT_EXTENSION_PORT = 19820;\nconst DEFAULT_EXTENSION_HOST = '127.0.0.1';\n\n/**\n * Optional manual hold on the extension WS server kept alive from the UI so\n * users can pair the extension before saving config / running a browser tool.\n * Module-scoped so repeat Start calls are idempotent and the bridge survives\n * config patches.\n */\ntype ManualHandle = { release: () => Promise<void>; host: string; port: number };\nlet manualExtensionHandle: ManualHandle | null = null;\n\nfunction loopbackHostnameFromUrl(input: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n return null;\n }\n const proto = parsed.protocol;\n if (proto !== 'ws:' && proto !== 'wss:' && proto !== 'http:' && proto !== 'https:') {\n return null;\n }\n const host = parsed.hostname.toLowerCase();\n if (host === '127.0.0.1' || host === 'localhost' || host === '::1') return host;\n return null;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n const h = host.trim().toLowerCase();\n return h === '127.0.0.1' || h === 'localhost' || h === '::1' || h === '[::1]';\n}\n\nfunction parseExtensionProbePort(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1024 || n > 65_535) return undefined;\n return n;\n}\n\nfunction isLoopbackPortOpen(host: string, port: number, timeoutMs = 500): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = net.connect({ host, port });\n const finish = (open: boolean) => {\n socket.removeAllListeners();\n try {\n socket.destroy();\n } catch {\n /* */\n }\n resolve(open);\n };\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', () => finish(false));\n });\n}\n\nasync function readExtensionBridgeSnapshot() {\n const { getExtensionBrowserServerSnapshot } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n return getExtensionBrowserServerSnapshot();\n}\n\nasync function stopExtensionBridgeFromSettings(service: AuthenticatedRouteDeps['service']): Promise<{\n forcedShutdown: boolean;\n}> {\n if (manualExtensionHandle) {\n try {\n await manualExtensionHandle.release();\n } catch {\n /* refcount underflow should not surface */\n }\n manualExtensionHandle = null;\n }\n await service.releaseBrowserExtensionBridge();\n const { forceShutdownExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const forcedShutdown = await forceShutdownExtensionBrowserServer();\n return { forcedShutdown };\n}\n\nfunction resolveExtensionStatusTarget(\n browser: Record<string, unknown> | undefined,\n query: { probe?: string; host?: string; port?: string },\n): { host: string; port: number; backend: string } | null {\n const backend = typeof browser?.backend === 'string' ? browser.backend : 'extension';\n const probe = query.probe === '1' || query.probe === 'true';\n if (!probe && backend !== 'extension') {\n return null;\n }\n\n const ext = browser?.extension as Record<string, unknown> | undefined;\n const configPort =\n typeof ext?.port === 'number' && ext.port >= 1024 && ext.port <= 65_535\n ? Math.floor(ext.port)\n : DEFAULT_EXTENSION_PORT;\n const configHost =\n typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : DEFAULT_EXTENSION_HOST;\n\n const port = parseExtensionProbePort(query.port) ?? configPort;\n const host =\n typeof query.host === 'string' && query.host.trim() ? query.host.trim() : configHost;\n if (!isLoopbackHost(host)) {\n return null;\n }\n\n return { host, port, backend: probe && backend !== 'extension' ? 'extension' : backend };\n}\n\nexport function registerBrowserRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n // Browser extension bridge status — gateway-side check so frontend doesn't cross-origin fetch.\n authenticated.get('/api/browser/extension-status', async (c) => {\n const target = resolveExtensionStatusTarget(undefined, {\n probe: c.req.query('probe'),\n host: c.req.query('host'),\n port: c.req.query('port'),\n });\n\n let artifacts: Record<string, unknown> | undefined;\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const doctor = await browserExtDoctor();\n artifacts = {\n installed: doctor.installed,\n extensionDir: doctor.extensionDir,\n xopcVersion: doctor.xopcVersion,\n installedVersion: doctor.installedVersion,\n needsRefresh: doctor.needsRefresh,\n needsChromeReload: doctor.needsChromeReload,\n };\n } catch {\n /* optional */\n }\n\n if (!target) {\n const backend = 'extension';\n return c.json({ running: false, connected: false, backend, artifacts });\n }\n const snapshot = await readExtensionBridgeSnapshot();\n let probeRunning = false;\n let probeConnected = false;\n try {\n const res = await fetch(`http://${target.host}:${target.port}/`, { signal: AbortSignal.timeout(2000) });\n const data = (await res.json()) as { ok?: boolean; connected?: boolean };\n probeRunning = Boolean(data.ok);\n probeConnected = Boolean(data.connected);\n } catch {\n /* probe failed — fall through to snapshot / port check */\n }\n const running = probeRunning || snapshot.active;\n const portConflict =\n !running && !snapshot.active\n ? await isLoopbackPortOpen(target.host, target.port)\n : false;\n return c.json({\n running,\n connected: probeConnected,\n backend: target.backend,\n artifacts,\n bridgeHeld: snapshot.active,\n refCount: snapshot.refCount,\n manualBridge: manualExtensionHandle !== null,\n portConflict,\n });\n });\n\n authenticated.get('/api/browser/extension/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const status = await browserExtDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n authenticated.post('/api/browser/extension/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const force = input.force === true;\n\n try {\n const { ensureBrowserExtensionArtifacts, browserExtDoctor } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await ensureBrowserExtensionArtifacts({ cacheDir, force });\n const doctor = await browserExtDoctor({ cacheDir });\n return c.json({ ok: true, payload: { ...result, doctor } });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/open', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const actionRaw = typeof input.action === 'string' ? input.action.trim() : 'both';\n const action =\n actionRaw === 'chrome' || actionRaw === 'folder' || actionRaw === 'both' ? actionRaw : 'both';\n\n try {\n const { openBrowserExtensionInstallUi } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await openBrowserExtensionInstallUi({ action, cacheDir });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Start the extension WS bridge eagerly so the user can pair the extension\n // before saving config / running any tool. Idempotent (returns current state\n // if already running).\n authenticated.post('/api/browser/extension/start', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port =\n typeof input.port === 'number' && input.port >= 1024 && input.port <= 65535\n ? Math.floor(input.port)\n : DEFAULT_EXTENSION_PORT;\n const hostRaw = typeof input.host === 'string' && input.host.trim() ? input.host.trim() : DEFAULT_EXTENSION_HOST;\n if (!isLoopbackHost(hostRaw)) {\n return c.json({ ok: false, error: 'extension bridge host must be loopback' }, 400);\n }\n\n try {\n if (manualExtensionHandle && (manualExtensionHandle.host !== hostRaw || manualExtensionHandle.port !== port)) {\n await manualExtensionHandle.release();\n manualExtensionHandle = null;\n }\n if (!manualExtensionHandle) {\n const { acquireExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const { release } = await acquireExtensionBrowserServer({ host: hostRaw, port });\n manualExtensionHandle = { release, host: hostRaw, port };\n }\n return c.json({ ok: true, payload: { running: true, host: hostRaw, port } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/stop', strictRateLimitMiddleware, async (c) => {\n try {\n const { forcedShutdown } = await stopExtensionBridgeFromSettings(service);\n return c.json({\n ok: true,\n payload: { running: false, forcedShutdown },\n });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/disconnect', strictRateLimitMiddleware, async (c) => {\n try {\n const { getExtensionBrowserProvider } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const provider = getExtensionBrowserProvider();\n if (!provider?.isConnected()) {\n return c.json({\n ok: true,\n payload: { connected: false, alreadyDisconnected: true },\n });\n }\n provider.disconnectClient();\n return c.json({ ok: true, payload: { connected: false } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n // Doctor: does Playwright have a runnable Chromium on disk?\n authenticated.get('/api/browser/playwright/doctor', async (c) => {\n try {\n const { playwrightChromiumDoctor } = await import('../../../browser/providers/playwright-doctor.js');\n const payload = await playwrightChromiumDoctor();\n return c.json({ ok: true, payload });\n } catch (e) {\n return c.json(\n { ok: false, error: e instanceof Error ? e.message : String(e) },\n 500,\n );\n }\n });\n\n // Doctor: CloakBrowser installed?\n authenticated.get('/api/browser/cloakbrowser/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n const binaryPathRaw = c.req.query('binaryPath');\n try {\n const { cloakBrowserDoctor } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await cloakBrowserDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n binaryPath: binaryPathRaw && binaryPathRaw.trim() ? binaryPathRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n // Runtime status for CloakBrowser (CDP port + profile dir from saved agent defaults).\n authenticated.get('/api/browser/cloakbrowser/status', async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { probeCloakBrowserRuntime } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const status = await probeCloakBrowserRuntime(config);\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Open CloakBrowser with the same profile/settings agents use (saved config, headed).\n authenticated.post('/api/browser/cloakbrowser/launch', strictRateLimitMiddleware, async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { launchCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const result = await launchCloakBrowser({\n ...config,\n skipPlaywrightConnect: true,\n });\n return c.json({\n ok: true,\n payload: {\n running: true,\n reused: result.reused,\n port: result.cdpPort,\n pid: result.pid,\n userDataDir: result.userDataDir,\n temporaryProfile: config.temporaryProfile === true,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Ping a user-supplied CDP endpoint — loopback only (SSRF guard).\n authenticated.post('/api/browser/cdp/ping', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cdpUrl = typeof input.cdpUrl === 'string' ? input.cdpUrl.trim() : '';\n if (!cdpUrl) return c.json({ ok: false, error: 'cdpUrl is required' }, 400);\n\n const loopback = loopbackHostnameFromUrl(cdpUrl);\n if (!loopback) {\n return c.json(\n { ok: false, error: 'CDP ping only allowed for loopback hosts (127.0.0.1 / localhost / ::1)' },\n 403,\n );\n }\n let httpBase: URL;\n try {\n httpBase = new URL(cdpUrl);\n httpBase.protocol = httpBase.protocol === 'wss:' ? 'https:' : 'http:';\n httpBase.pathname = '/json/version';\n httpBase.search = '';\n httpBase.hash = '';\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : 'invalid cdpUrl' }, 400);\n }\n try {\n const res = await fetch(httpBase.toString(), { signal: AbortSignal.timeout(2000) });\n if (!res.ok) {\n return c.json({ ok: true, payload: { reachable: false, status: res.status } });\n }\n const data = (await res.json()) as { Browser?: string; 'Protocol-Version'?: string; webSocketDebuggerUrl?: string };\n return c.json({\n ok: true,\n payload: {\n reachable: true,\n browser: data.Browser ?? null,\n protocolVersion: data['Protocol-Version'] ?? null,\n webSocketDebuggerUrl: data.webSocketDebuggerUrl ?? null,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n // Spawn a local debuggable Chrome and return its WS endpoint.\n authenticated.post('/api/browser/cdp/launch', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const executablePath =\n typeof input.executablePath === 'string' && input.executablePath.trim()\n ? input.executablePath.trim()\n : undefined;\n try {\n const { launchLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const result = await launchLocalCdpChrome({ executablePath });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/cdp/stop', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port = typeof input.port === 'number' && Number.isInteger(input.port) ? input.port : NaN;\n if (!Number.isFinite(port) || port < 1024 || port > 65535) {\n return c.json({ ok: false, error: 'port must be an integer in [1024, 65535]' }, 400);\n }\n const { stopLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const stopped = await stopLocalCdpChrome(port);\n return c.json({ ok: true, payload: { stopped } });\n });\n\n authenticated.get('/api/browser/cdp/instances', async (c) => {\n const { listLocalCdpInstances } = await import('../../../browser/cdp-local-launcher.js');\n return c.json({ ok: true, payload: { instances: listLocalCdpInstances() } });\n });\n\n // Cloud provider connection test.\n authenticated.post('/api/browser/cloud/test-connection', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const provider = input.provider;\n const apiKeyRaw = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';\n\n // The masked sentinel means \"use the stored config key\".\n let apiKey = apiKeyRaw;\n if (apiKey === '***' || apiKey === '••••••••••••') {\n apiKey = '';\n }\n if (!apiKey) {\n if (provider === 'browserbase') apiKey = process.env.BROWSERBASE_API_KEY ?? '';\n else if (provider === 'browser-use') apiKey = process.env.BROWSER_USE_API_KEY ?? '';\n }\n if (!apiKey) {\n return c.json({ ok: true, payload: { reachable: false, error: 'No API key configured' } });\n }\n\n try {\n if (provider === 'browserbase') {\n const res = await fetch('https://api.browserbase.com/v1/projects', {\n headers: { 'x-bb-api-key': apiKey },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n const data = (await res.json().catch(() => null)) as unknown;\n const projects = Array.isArray(data) ? data : Array.isArray((data as { data?: unknown[] })?.data) ? (data as { data: unknown[] }).data : [];\n return c.json({ ok: true, payload: { reachable: true, projectCount: projects.length } });\n }\n if (provider === 'browser-use') {\n const res = await fetch('https://api.browser-use.com/api/v1/users/me', {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n return c.json({ ok: true, payload: { reachable: true } });\n }\n return c.json({ ok: false, error: 'provider must be browserbase or browser-use' }, 400);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n authenticated.post('/api/browser/playwright/install', strictRateLimitMiddleware, async (c) => {\n try {\n const { installPlaywrightChromium } = await import('../../../browser/providers/playwright-install.js');\n const payload = await installPlaywrightChromium();\n return c.json({ ok: true, payload });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message || 'Failed to install Playwright Chromium' }, 500);\n }\n });\n\n authenticated.post('/api/browser/cloakbrowser/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const binaryPath = typeof input.binaryPath === 'string' && input.binaryPath.trim()\n ? input.binaryPath.trim()\n : undefined;\n\n try {\n const { installCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await installCloakBrowser({ cacheDir, binaryPath });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Hono } from 'hono';
2
+ import type { AuthenticatedRouteDeps } from './deps.js';
3
+ export declare function registerCapabilityPresetsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void;