@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 +1 @@
1
- {"version":3,"file":"agents.js","names":[],"sources":["../../../../../../src/gateway/hono/routes/config-patch/agents.ts"],"sourcesContent":["/**\n * `PATCH /api/config` — `body.agents.defaults.*` section.\n *\n * Mutates `config.agents.defaults` in place to match the patch body. All\n * branches are field-by-field \"if undefined skip, if null delete, else\n * coerce/validate then assign\" so the web UI can clear individual settings\n * with `{ field: null }` without rewriting the rest.\n *\n * Was 660 lines inlined in `config.ts` (40% of the route handler) — extracted\n * so the dispatcher can chain section patchers instead of being a single 1600\n * -line if-else cascade.\n *\n * **No early returns / errors.** This section never rejects the patch; out-of\n * -range numbers and unrecognized strings are silently dropped (preserves\n * pre-extraction behavior so the route stays a \"best-effort merge\").\n */\nimport type { Config } from '../../../../config/schema.js';\nimport { isMaskedSecretPatchValue } from '../../lib/mask-secret-length.js';\nimport {\n normalizePatchAgentImageGenerationModel,\n normalizePatchAgentModel,\n normalizePatchTypedModels,\n} from '../../lib/agent-model.js';\n\nexport function applyAgentsPatch(config: Config, body: any): void {\n if (!body.agents?.defaults) return;\n\n if (!config.agents) config.agents = { defaults: { workspace: '~/.xopc/workspace', maxTokens: 8192, temperature: 0.7, maxToolIterations: 20, maxRequestsPerTurn: 50, maxToolFailuresPerTurn: 3, thinkingDefault: 'medium', reasoningDefault: 'stream', verboseDefault: 'full' } };\n if (!config.agents.defaults) config.agents.defaults = {} as any;\n\n if (body.agents.defaults.maxTokens !== undefined) {\n config.agents.defaults.maxTokens = body.agents.defaults.maxTokens;\n }\n if (body.agents.defaults.temperature !== undefined) {\n config.agents.defaults.temperature = body.agents.defaults.temperature;\n }\n if (body.agents.defaults.maxToolIterations !== undefined) {\n config.agents.defaults.maxToolIterations = body.agents.defaults.maxToolIterations;\n }\n if (body.agents.defaults.workspace !== undefined) {\n config.agents.defaults.workspace = body.agents.defaults.workspace;\n }\n if (body.agents.defaults.thinkingDefault !== undefined) {\n config.agents.defaults.thinkingDefault = body.agents.defaults.thinkingDefault;\n }\n if (body.agents.defaults.reasoningDefault !== undefined) {\n config.agents.defaults.reasoningDefault = body.agents.defaults.reasoningDefault;\n }\n if (body.agents.defaults.verboseDefault !== undefined) {\n config.agents.defaults.verboseDefault = body.agents.defaults.verboseDefault;\n }\n if (body.agents.defaults.imageModel !== undefined) {\n const v = body.agents.defaults.imageModel;\n if (v === null) {\n delete (config.agents.defaults as Record<string, unknown>).imageModel;\n } else {\n const normalized = normalizePatchAgentModel(v);\n if (normalized === undefined) {\n delete (config.agents.defaults as Record<string, unknown>).imageModel;\n } else {\n config.agents.defaults.imageModel = normalized as Config['agents']['defaults']['imageModel'];\n }\n }\n }\n if (body.agents.defaults.imageGenerationModel !== undefined) {\n const v = body.agents.defaults.imageGenerationModel;\n if (v === null) {\n delete (config.agents.defaults as Record<string, unknown>).imageGenerationModel;\n } else {\n const normalized = normalizePatchAgentImageGenerationModel(v);\n if (normalized === undefined) {\n delete (config.agents.defaults as Record<string, unknown>).imageGenerationModel;\n } else {\n config.agents.defaults.imageGenerationModel =\n normalized as Config['agents']['defaults']['imageGenerationModel'];\n }\n }\n }\n if (body.agents.defaults.mediaMaxMb !== undefined) {\n const v = body.agents.defaults.mediaMaxMb;\n if (v === null) {\n delete (config.agents.defaults as Record<string, unknown>).mediaMaxMb;\n } else {\n const n = typeof v === 'number' ? v : Number(v);\n if (!Number.isNaN(n) && n > 0) {\n config.agents.defaults.mediaMaxMb = n;\n }\n }\n }\n if (body.agents.defaults.browser !== undefined) {\n const b = body.agents.defaults.browser;\n if (b === null) {\n delete (config.agents.defaults as Record<string, unknown>).browser;\n } else if (typeof b === 'object' && !Array.isArray(b)) {\n const br = b as Record<string, unknown>;\n if (!config.agents.defaults.browser) {\n config.agents.defaults.browser = { enabled: false, headless: false };\n }\n const target = config.agents.defaults.browser as Record<string, unknown>;\n if (br.enabled !== undefined) {\n if (br.enabled === null) delete target.enabled;\n else target.enabled = Boolean(br.enabled);\n }\n if (br.headless !== undefined) {\n if (br.headless === null) delete target.headless;\n else target.headless = Boolean(br.headless);\n }\n if (br.allowPrivateUrls !== undefined) {\n if (br.allowPrivateUrls === null) delete target.allowPrivateUrls;\n else target.allowPrivateUrls = Boolean(br.allowPrivateUrls);\n }\n if (br.commandTimeout !== undefined) {\n if (br.commandTimeout === null) {\n delete target.commandTimeout;\n } else if (typeof br.commandTimeout === 'number' && Number.isFinite(br.commandTimeout)) {\n const n = Math.floor(br.commandTimeout);\n if (n >= 5 && n <= 900) {\n target.commandTimeout = n;\n }\n }\n }\n if (br.backend !== undefined) {\n if (br.backend === null || br.backend === '' || br.backend === 'extension') {\n delete target.backend;\n } else if (\n br.backend === 'local' ||\n br.backend === 'cdp' ||\n br.backend === 'cloud' ||\n br.backend === 'cloakbrowser'\n ) {\n target.backend = br.backend;\n }\n }\n if (br.cloudProvider !== undefined) {\n if (br.cloudProvider === null || br.cloudProvider === '') {\n delete target.cloudProvider;\n } else if (br.cloudProvider === 'browserbase' || br.cloudProvider === 'browser-use') {\n target.cloudProvider = br.cloudProvider;\n }\n }\n if (br.cloud !== undefined) {\n if (br.cloud === null) {\n delete target.cloud;\n } else if (typeof br.cloud === 'object' && !Array.isArray(br.cloud)) {\n const cloudPatch = br.cloud as Record<string, unknown>;\n const existingCloud =\n target.cloud && typeof target.cloud === 'object' && !Array.isArray(target.cloud)\n ? (target.cloud as Record<string, unknown>)\n : {};\n const cloudTarget: Record<string, unknown> = { ...existingCloud };\n if (cloudPatch.apiKey !== undefined) {\n if (cloudPatch.apiKey === null || cloudPatch.apiKey === '') {\n delete cloudTarget.apiKey;\n } else if (isMaskedSecretPatchValue(String(cloudPatch.apiKey))) {\n // Keep the existing stored key when the web UI sends the masked sentinel.\n } else if (typeof cloudPatch.apiKey === 'string') {\n cloudTarget.apiKey = cloudPatch.apiKey.trim();\n }\n }\n for (const key of ['projectId', 'region']) {\n const value = cloudPatch[key];\n if (value === null || value === '') {\n delete cloudTarget[key];\n } else if (typeof value === 'string' && value.trim()) {\n cloudTarget[key] = value.trim();\n }\n }\n if (Object.keys(cloudTarget).length > 0) {\n target.cloud = cloudTarget;\n } else {\n delete target.cloud;\n }\n }\n }\n if (br.cdpUrl !== undefined) {\n if (br.cdpUrl === null || br.cdpUrl === '') {\n delete target.cdpUrl;\n } else if (typeof br.cdpUrl === 'string') {\n target.cdpUrl = br.cdpUrl.trim();\n }\n }\n if (br.extension !== undefined) {\n if (br.extension === null) {\n delete target.extension;\n } else if (typeof br.extension === 'object' && !Array.isArray(br.extension)) {\n const ext = br.extension as Record<string, unknown>;\n const extTarget: Record<string, unknown> = {};\n if (ext.port === null || ext.port === '') {\n // explicit clear: leave unset (consumers fall back to default)\n } else if (typeof ext.port === 'number' && ext.port >= 1024 && ext.port <= 65535) {\n extTarget.port = Math.floor(ext.port);\n }\n if (ext.host === null || ext.host === '') {\n // explicit clear\n } else if (typeof ext.host === 'string' && ext.host.trim()) {\n extTarget.host = ext.host.trim();\n }\n if (\n ext.connectionTimeout === null ||\n ext.connectionTimeout === ''\n ) {\n // explicit clear\n } else if (\n typeof ext.connectionTimeout === 'number' &&\n Number.isFinite(ext.connectionTimeout) &&\n ext.connectionTimeout >= 1000\n ) {\n extTarget.connectionTimeout = Math.floor(ext.connectionTimeout);\n }\n if (Object.keys(extTarget).length > 0) {\n target.extension = extTarget;\n } else {\n delete target.extension;\n }\n }\n }\n if (br.cloakbrowser !== undefined) {\n if (br.cloakbrowser === null) {\n delete target.cloakbrowser;\n } else if (typeof br.cloakbrowser === 'object' && !Array.isArray(br.cloakbrowser)) {\n const cloakbrowserPatch = br.cloakbrowser as Record<string, unknown>;\n const cloakbrowserTarget: Record<string, unknown> = {};\n if (typeof cloakbrowserPatch.keepOpen === 'boolean') {\n cloakbrowserTarget.keepOpen = cloakbrowserPatch.keepOpen;\n }\n if (typeof cloakbrowserPatch.temporaryProfile === 'boolean') {\n cloakbrowserTarget.temporaryProfile = cloakbrowserPatch.temporaryProfile;\n }\n for (const key of ['cacheDir', 'binaryPath', 'timezone', 'locale', 'webrtcIp', 'fingerprintPlatform']) {\n const value = cloakbrowserPatch[key];\n if (typeof value === 'string' && value.trim()) {\n cloakbrowserTarget[key] = value.trim();\n }\n }\n if (\n Array.isArray(cloakbrowserPatch.extraArgs) &&\n cloakbrowserPatch.extraArgs.every((value) => typeof value === 'string')\n ) {\n cloakbrowserTarget.extraArgs = cloakbrowserPatch.extraArgs;\n }\n if (Object.keys(cloakbrowserTarget).length > 0) {\n target.cloakbrowser = cloakbrowserTarget;\n } else {\n delete target.cloakbrowser;\n }\n }\n }\n if (br.humanize !== undefined) {\n if (br.humanize === null) {\n delete target.humanize;\n } else {\n target.humanize = Boolean(br.humanize);\n }\n }\n if (br.humanPreset !== undefined) {\n if (br.humanPreset === null) {\n delete target.humanPreset;\n } else if (br.humanPreset === 'default' || br.humanPreset === 'careful') {\n target.humanPreset = br.humanPreset;\n }\n }\n if (br.dialogPolicy !== undefined) {\n if (br.dialogPolicy === null) {\n delete target.dialogPolicy;\n } else if (\n br.dialogPolicy === 'must_respond' ||\n br.dialogPolicy === 'auto_dismiss' ||\n br.dialogPolicy === 'auto_accept'\n ) {\n target.dialogPolicy = br.dialogPolicy;\n }\n }\n if (br.dialogTimeoutSeconds !== undefined) {\n if (br.dialogTimeoutSeconds === null) {\n delete target.dialogTimeoutSeconds;\n } else if (typeof br.dialogTimeoutSeconds === 'number' && Number.isFinite(br.dialogTimeoutSeconds)) {\n const n = Math.floor(br.dialogTimeoutSeconds);\n if (n >= 1 && n <= 86_400) {\n target.dialogTimeoutSeconds = n;\n }\n }\n }\n }\n }\n\n const dPatch = body.agents.defaults as Record<string, unknown>;\n const def = config.agents.defaults as Record<string, unknown>;\n\n if (dPatch.maxTaskDurationMs !== undefined) {\n const v = dPatch.maxTaskDurationMs;\n if (v === null) {\n delete def.maxTaskDurationMs;\n } else if (typeof v === 'number' && Number.isFinite(v)) {\n const ms = Math.floor(v);\n if (ms >= 60_000 && ms <= 14_400_000) {\n def.maxTaskDurationMs = ms;\n }\n }\n }\n if (dPatch.maxRequestsPerTurn !== undefined) {\n const v = dPatch.maxRequestsPerTurn;\n if (v === null) {\n delete def.maxRequestsPerTurn;\n } else if (typeof v === 'number' && Number.isFinite(v)) {\n const n = Math.floor(v);\n if (n >= 10 && n <= 200) {\n def.maxRequestsPerTurn = n;\n }\n }\n }\n if (dPatch.maxToolFailuresPerTurn !== undefined) {\n const v = dPatch.maxToolFailuresPerTurn;\n if (v === null) {\n delete def.maxToolFailuresPerTurn;\n } else if (typeof v === 'number' && Number.isFinite(v)) {\n const n = Math.floor(v);\n if (n >= 1 && n <= 20) {\n def.maxToolFailuresPerTurn = n;\n }\n }\n }\n\n if (dPatch.compaction !== undefined) {\n const c = dPatch.compaction;\n if (c === null) {\n delete def.compaction;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.compaction || typeof def.compaction !== 'object') {\n def.compaction = {};\n }\n const t = def.compaction as Record<string, unknown>;\n if (p.enabled !== undefined) t.enabled = Boolean(p.enabled);\n if (p.mode === 'default' || p.mode === 'safeguard') t.mode = p.mode;\n if (typeof p.reserveTokens === 'number' && Number.isFinite(p.reserveTokens)) {\n t.reserveTokens = Math.floor(p.reserveTokens);\n }\n if (typeof p.triggerThreshold === 'number' && Number.isFinite(p.triggerThreshold)) {\n const x = p.triggerThreshold;\n if (x >= 0.5 && x <= 0.95) t.triggerThreshold = x;\n }\n if (typeof p.minMessagesBeforeCompact === 'number' && Number.isFinite(p.minMessagesBeforeCompact)) {\n t.minMessagesBeforeCompact = Math.floor(p.minMessagesBeforeCompact);\n }\n if (typeof p.keepRecentMessages === 'number' && Number.isFinite(p.keepRecentMessages)) {\n t.keepRecentMessages = Math.floor(p.keepRecentMessages);\n }\n if (typeof p.evictionWindow === 'number' && Number.isFinite(p.evictionWindow)) {\n const x = p.evictionWindow;\n if (x >= 0.1 && x <= 0.5) t.evictionWindow = x;\n }\n if (typeof p.retentionWindow === 'number' && Number.isFinite(p.retentionWindow)) {\n const n = Math.floor(p.retentionWindow);\n if (n >= 3 && n <= 20) t.retentionWindow = n;\n }\n }\n }\n\n if (dPatch.pruning !== undefined) {\n const c = dPatch.pruning;\n if (c === null) {\n delete def.pruning;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.pruning || typeof def.pruning !== 'object') {\n def.pruning = {};\n }\n const t = def.pruning as Record<string, unknown>;\n if (p.enabled !== undefined) t.enabled = Boolean(p.enabled);\n if (typeof p.maxToolResultChars === 'number' && Number.isFinite(p.maxToolResultChars)) {\n t.maxToolResultChars = Math.floor(p.maxToolResultChars);\n }\n if (typeof p.headKeepRatio === 'number' && Number.isFinite(p.headKeepRatio)) {\n t.headKeepRatio = p.headKeepRatio;\n }\n if (typeof p.tailKeepRatio === 'number' && Number.isFinite(p.tailKeepRatio)) {\n t.tailKeepRatio = p.tailKeepRatio;\n }\n }\n }\n\n if (dPatch.memory !== undefined) {\n const c = dPatch.memory;\n if (c === null) {\n delete def.memory;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.memory || typeof def.memory !== 'object') {\n def.memory = {};\n }\n const t = def.memory as Record<string, unknown>;\n if (p.enabled !== undefined) {\n if (p.enabled === null) delete t.enabled;\n else t.enabled = Boolean(p.enabled);\n }\n if (p.useEnhancedSystem !== undefined) {\n if (p.useEnhancedSystem === null) delete t.useEnhancedSystem;\n else t.useEnhancedSystem = Boolean(p.useEnhancedSystem);\n }\n if (p.userProfileEnabled !== undefined) {\n if (p.userProfileEnabled === null) delete t.userProfileEnabled;\n else t.userProfileEnabled = Boolean(p.userProfileEnabled);\n }\n if (p.memoryCharLimit !== undefined) {\n if (p.memoryCharLimit === null) delete t.memoryCharLimit;\n else if (typeof p.memoryCharLimit === 'number' && p.memoryCharLimit > 0) {\n t.memoryCharLimit = Math.floor(p.memoryCharLimit);\n }\n }\n if (p.userCharLimit !== undefined) {\n if (p.userCharLimit === null) delete t.userCharLimit;\n else if (typeof p.userCharLimit === 'number' && p.userCharLimit > 0) {\n t.userCharLimit = Math.floor(p.userCharLimit);\n }\n }\n if (p.provider === 'none' || p.provider === 'stub') {\n t.provider = p.provider;\n } else if (p.provider === null) {\n delete t.provider;\n }\n if (p.injectionFrequency === 'every-turn' || p.injectionFrequency === 'first-turn') {\n t.injectionFrequency = p.injectionFrequency;\n } else if (p.injectionFrequency === null) {\n delete t.injectionFrequency;\n }\n if (p.contextCadence !== undefined) {\n if (p.contextCadence === null) delete t.contextCadence;\n else if (typeof p.contextCadence === 'number' && p.contextCadence >= 1) {\n t.contextCadence = Math.floor(p.contextCadence);\n }\n }\n if (p.dialecticCadence !== undefined) {\n if (p.dialecticCadence === null) delete t.dialecticCadence;\n else if (typeof p.dialecticCadence === 'number' && p.dialecticCadence >= 1) {\n t.dialecticCadence = Math.floor(p.dialecticCadence);\n }\n }\n\n // Dreaming (schemaless patch): agents.defaults.memory.dreaming\n if (p.dreaming !== undefined) {\n const d0 = p.dreaming;\n if (d0 === null) {\n delete (t as { dreaming?: unknown }).dreaming;\n } else if (typeof d0 === 'object' && d0 !== null && !Array.isArray(d0)) {\n if (!('dreaming' in t) || typeof (t as { dreaming?: unknown }).dreaming !== 'object') {\n (t as { dreaming?: Record<string, unknown> }).dreaming = {};\n }\n const dt = (t as { dreaming: Record<string, unknown> }).dreaming;\n const dp = d0 as Record<string, unknown>;\n\n if (dp.enabled !== undefined) {\n if (dp.enabled === null) delete dt.enabled;\n else dt.enabled = Boolean(dp.enabled);\n }\n if (dp.frequency !== undefined) {\n const v = dp.frequency;\n if (v === null || v === '') delete dt.frequency;\n else if (typeof v === 'string') dt.frequency = v;\n }\n if (dp.timezone !== undefined) {\n const v = dp.timezone;\n if (v === null || v === '') delete dt.timezone;\n else if (typeof v === 'string') dt.timezone = v;\n }\n\n // Accept either `phases.deep` or `deep`.\n if (dp.phases !== undefined || dp.deep !== undefined) {\n if (!('phases' in dt) || typeof (dt as { phases?: unknown }).phases !== 'object' || (dt as { phases?: unknown }).phases === null) {\n dt.phases = {};\n }\n const phases = (dt as { phases: Record<string, unknown> }).phases;\n if (!('deep' in phases) || typeof phases.deep !== 'object' || phases.deep === null) {\n phases.deep = {};\n }\n const deep = phases.deep as Record<string, unknown>;\n\n const deepPatchRaw =\n typeof dp.phases === 'object' && dp.phases !== null && !Array.isArray(dp.phases)\n ? (dp.phases as Record<string, unknown>).deep\n : dp.deep;\n const deepPatch =\n typeof deepPatchRaw === 'object' && deepPatchRaw !== null && !Array.isArray(deepPatchRaw)\n ? (deepPatchRaw as Record<string, unknown>)\n : null;\n\n if (deepPatch) {\n if (deepPatch.enabled !== undefined) {\n if (deepPatch.enabled === null) delete deep.enabled;\n else deep.enabled = Boolean(deepPatch.enabled);\n }\n if (deepPatch.minScore !== undefined) {\n const v = deepPatch.minScore;\n if (v === null) delete deep.minScore;\n else if (typeof v === 'number' && Number.isFinite(v)) deep.minScore = v;\n }\n if (deepPatch.minRecallCount !== undefined) {\n const v = deepPatch.minRecallCount;\n if (v === null) delete deep.minRecallCount;\n else if (typeof v === 'number' && Number.isFinite(v)) deep.minRecallCount = Math.floor(v);\n }\n if (deepPatch.limit !== undefined) {\n const v = deepPatch.limit;\n if (v === null) delete deep.limit;\n else if (typeof v === 'number' && Number.isFinite(v)) deep.limit = Math.floor(v);\n }\n }\n }\n }\n }\n }\n }\n\n if (dPatch.sessionSearch !== undefined) {\n const c = dPatch.sessionSearch;\n if (c === null) {\n delete def.sessionSearch;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.sessionSearch || typeof def.sessionSearch !== 'object') {\n def.sessionSearch = {};\n }\n const t = def.sessionSearch as Record<string, unknown>;\n if (p.summaryModel !== undefined) {\n if (p.summaryModel === null || p.summaryModel === '') {\n delete t.summaryModel;\n } else if (typeof p.summaryModel === 'string') {\n t.summaryModel = p.summaryModel;\n }\n }\n }\n }\n\n if (dPatch.backgroundReview !== undefined) {\n const c = dPatch.backgroundReview;\n if (c === null) {\n delete def.backgroundReview;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.backgroundReview || typeof def.backgroundReview !== 'object') {\n def.backgroundReview = {};\n }\n const t = def.backgroundReview as Record<string, unknown>;\n if (p.enabled !== undefined) {\n if (p.enabled === null) delete t.enabled;\n else t.enabled = Boolean(p.enabled);\n }\n if (p.memoryNudgeInterval !== undefined) {\n if (p.memoryNudgeInterval === null) delete t.memoryNudgeInterval;\n else if (typeof p.memoryNudgeInterval === 'number' && p.memoryNudgeInterval >= 0) {\n t.memoryNudgeInterval = Math.floor(p.memoryNudgeInterval);\n }\n }\n if (p.skillNudgeInterval !== undefined) {\n if (p.skillNudgeInterval === null) delete t.skillNudgeInterval;\n else if (typeof p.skillNudgeInterval === 'number' && p.skillNudgeInterval >= 0) {\n t.skillNudgeInterval = Math.floor(p.skillNudgeInterval);\n }\n }\n if (p.maxToolRounds !== undefined) {\n if (p.maxToolRounds === null) delete t.maxToolRounds;\n else if (typeof p.maxToolRounds === 'number' && p.maxToolRounds >= 1 && p.maxToolRounds <= 32) {\n t.maxToolRounds = Math.floor(p.maxToolRounds);\n }\n }\n if (p.maxHistoryMessages !== undefined) {\n if (p.maxHistoryMessages === null) delete t.maxHistoryMessages;\n else if (typeof p.maxHistoryMessages === 'number' && p.maxHistoryMessages >= 10 && p.maxHistoryMessages <= 200) {\n t.maxHistoryMessages = Math.floor(p.maxHistoryMessages);\n }\n }\n if (p.maxDurationMs !== undefined) {\n if (p.maxDurationMs === null) delete t.maxDurationMs;\n else if (typeof p.maxDurationMs === 'number' && p.maxDurationMs >= 30_000 && p.maxDurationMs <= 600_000) {\n t.maxDurationMs = Math.floor(p.maxDurationMs);\n }\n }\n }\n }\n\n if (dPatch.webExtract !== undefined) {\n const c = dPatch.webExtract;\n if (c === null) {\n delete def.webExtract;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.webExtract || typeof def.webExtract !== 'object') {\n def.webExtract = {};\n }\n const t = def.webExtract as Record<string, unknown>;\n if (p.model !== undefined) {\n if (p.model === null || p.model === '') {\n delete t.model;\n } else if (typeof p.model === 'string') {\n t.model = p.model;\n }\n }\n if (p.maxLength !== undefined) {\n if (p.maxLength === null) delete t.maxLength;\n else if (typeof p.maxLength === 'number' && p.maxLength > 0) {\n t.maxLength = p.maxLength;\n }\n }\n }\n }\n\n if (dPatch.delegate !== undefined) {\n const c = dPatch.delegate;\n if (c === null) {\n delete def.delegate;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.delegate || typeof def.delegate !== 'object') {\n def.delegate = {};\n }\n const t = def.delegate as Record<string, unknown>;\n if (p.enabled !== undefined) {\n if (p.enabled === null) delete t.enabled;\n else t.enabled = Boolean(p.enabled);\n }\n }\n }\n\n if (dPatch.executeCode !== undefined) {\n const c = dPatch.executeCode;\n if (c === null) {\n delete def.executeCode;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.executeCode || typeof def.executeCode !== 'object') {\n def.executeCode = {};\n }\n const t = def.executeCode as Record<string, unknown>;\n if (p.enabled !== undefined) {\n if (p.enabled === null) delete t.enabled;\n else t.enabled = Boolean(p.enabled);\n }\n }\n }\n\n if (dPatch.systemPromptOverride !== undefined) {\n const v = dPatch.systemPromptOverride;\n if (v === null || v === '') {\n delete def.systemPromptOverride;\n } else if (typeof v === 'string') {\n def.systemPromptOverride = v;\n }\n }\n\n if (dPatch.skills !== undefined) {\n const v = dPatch.skills;\n if (v === null) {\n delete def.skills;\n } else if (Array.isArray(v) && v.every((x) => typeof x === 'string')) {\n def.skills = v;\n }\n }\n\n if (dPatch.models !== undefined) {\n if (!def.models || typeof def.models !== 'object') {\n def.models = {};\n }\n const modelsTarget = def.models as NonNullable<Config['agents']['defaults']['models']>;\n const modelPatch = dPatch.models;\n if (modelPatch === null) {\n delete def.models;\n } else if (typeof modelPatch === 'object' && !Array.isArray(modelPatch)) {\n const p = modelPatch as Record<string, unknown>;\n if (Object.hasOwn(p, 'chat')) {\n const chat = p.chat;\n if (chat === null) {\n delete modelsTarget.chat;\n } else {\n const normalizedChat = normalizePatchAgentModel(chat);\n if (normalizedChat === undefined) {\n delete modelsTarget.chat;\n } else {\n modelsTarget.chat = normalizedChat;\n }\n }\n }\n if (Object.hasOwn(p, 'roles')) {\n const normalized = normalizePatchTypedModels({ roles: p.roles });\n if (normalized === undefined) {\n // skip invalid shape\n } else if (normalized === null) {\n delete modelsTarget.roles;\n } else {\n modelsTarget.roles = normalized;\n }\n }\n } else {\n const normalized = normalizePatchTypedModels(modelPatch);\n if (normalized === undefined) {\n // skip invalid shape\n } else if (normalized === null) {\n delete modelsTarget.roles;\n } else {\n modelsTarget.roles = normalized;\n }\n }\n if (def.models && Object.keys(def.models).length === 0) {\n delete def.models;\n }\n }\n\n if (dPatch.tools !== undefined) {\n const t0 = dPatch.tools;\n if (t0 === null) {\n delete def.tools;\n } else if (typeof t0 === 'object' && !Array.isArray(t0)) {\n const p = t0 as { disable?: unknown };\n if (!def.tools || typeof def.tools !== 'object') {\n def.tools = {};\n }\n const t = def.tools as { disable?: string[] };\n if (p.disable !== undefined) {\n if (p.disable === null || (Array.isArray(p.disable) && p.disable.length === 0)) {\n delete t.disable;\n } else if (Array.isArray(p.disable) && p.disable.every((x) => typeof x === 'string')) {\n t.disable = p.disable;\n }\n }\n }\n }\n\n if (dPatch.params !== undefined) {\n const v = dPatch.params;\n if (v === null) {\n delete def.params;\n } else if (typeof v === 'object' && !Array.isArray(v) && v !== null) {\n def.params = v as Record<string, unknown>;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","names":[],"sources":["../../../../../../src/gateway/hono/routes/config-patch/agents.ts"],"sourcesContent":["import type { Config } from '../../../../config/schema.js';\n\nexport function applyAgentsPatch(_config: Config, body: any): void {\n if (body.agents !== undefined) {\n throw new Error('agents config patching was removed; use manifest-specific agent APIs');\n }\n}\n"],"mappings":";AAEA,SAAgB,iBAAiB,SAAiB,MAAiB;AACjE,KAAI,KAAK,WAAW,KAAA,EAClB,OAAM,IAAI,MAAM,uEAAuE"}
@@ -1,5 +1,5 @@
1
+ import { BindingsConfigSchema, BrowserConfigSchema, McpConfigSchema, init_schema } from "../../../../config/schema.js";
1
2
  import { CredentialResolver, init_credentials } from "../../../../auth/credentials.js";
2
- import { BindingsConfigSchema, McpConfigSchema, init_schema } from "../../../../config/schema.js";
3
3
  import { canonicalizeConfiguredMcpServer } from "../../../../config/mcp-config-normalize.js";
4
4
  import { mergeCronConfigPatch, mergeGatewaySkillsMarketplacePatch, mergeGoalsConfigPatch, mergeSessionConfigPatch, mergeUpdateConfigPatch } from "../../../../config/web-patch.js";
5
5
  import { assertGatewayAuthConfigured, resolveGatewayAuth } from "../../../auth.js";
@@ -32,6 +32,12 @@ async function applyMiscPatch(config, body) {
32
32
  const sessionResult = mergeSessionConfigPatch(config, body.session);
33
33
  if (sessionResult.ok === false) return patchError(sessionResult.message);
34
34
  }
35
+ if (body.browser !== void 0) {
36
+ if (typeof body.browser !== "object" || body.browser === null || Array.isArray(body.browser)) return patchError("browser must be an object");
37
+ const parsed = BrowserConfigSchema.safeParse(body.browser);
38
+ if (!parsed.success) return patchError(parsed.error.issues.map((i) => i.message).join("; "));
39
+ config.browser = parsed.data;
40
+ }
35
41
  if (body.gateway !== void 0 && typeof body.gateway === "object" && body.gateway !== null && !Array.isArray(body.gateway)) {
36
42
  const gwPatch = body.gateway;
37
43
  if (gwPatch.skillsMarketplaceProvider !== void 0 || gwPatch.skillsStoreBaseUrl !== void 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"misc.js","names":[],"sources":["../../../../../../src/gateway/hono/routes/config-patch/misc.ts"],"sourcesContent":["/**\n * `PATCH /api/config` — tail sections that are each <50 lines:\n * update / cron / goals / session / gateway.{skillsMarketplaceProvider,\n * skillsStoreBaseUrl} / providers / providersConfig / stt / tts / tools /\n * tunnel / bindings / mcp.\n *\n * Most of these delegate to a `mergeXxxConfigPatch(config, body) → { ok,\n * message? }` helper that lives next to the schema, so this file is mostly\n * \"validate object shape, call helper, surface 400 on failure\". The async\n * `providers` branch saves into the credential resolver rather than config.\n *\n * Final validation (resolveGatewayAuth + assertGatewayRuntimeConfig) runs\n * after every gateway-touching patch lands, so it sees the merged shape.\n */\nimport type { Config } from '../../../../config/schema.js';\nimport { BindingsConfigSchema, McpConfigSchema } from '../../../../config/schema.js';\nimport { CredentialResolver } from '../../../../auth/credentials.js';\nimport { isMaskedSecretPatchValue } from '../../lib/mask-secret-length.js';\nimport { applyToolsWebPatch } from '../../../config-tools-web.js';\nimport { mergeTunnelConfigPatch } from '../../../../tunnel/tunnel-config.js';\nimport { canonicalizeConfiguredMcpServer } from '../../../../config/mcp-config-normalize.js';\nimport {\n mergeCronConfigPatch,\n mergeGatewaySkillsMarketplacePatch,\n mergeGoalsConfigPatch,\n mergeSessionConfigPatch,\n mergeUpdateConfigPatch,\n} from '../../../../config/web-patch.js';\nimport { mergeSttConfigPatch, mergeTtsConfigPatch } from '../../lib/safe-voice-config.js';\nimport { assertGatewayRuntimeConfig } from '../../../runtime-config.js';\nimport { resolveGatewayAuth, assertGatewayAuthConfigured } from '../../../auth.js';\nimport { type PatchResult, PATCH_OK, patchError } from './result.js';\n\nexport async function applyMiscPatch(config: Config, body: any): Promise<PatchResult> {\n if (body.update !== undefined && typeof body.update === 'object' && body.update !== null) {\n const updateResult = mergeUpdateConfigPatch(config, body.update as Record<string, unknown>);\n if (updateResult.ok === false) {\n return patchError(updateResult.message);\n }\n }\n\n if (body.cron !== undefined) {\n if (typeof body.cron !== 'object' || body.cron === null || Array.isArray(body.cron)) {\n return patchError('cron must be an object');\n }\n const cronResult = mergeCronConfigPatch(config, body.cron as Record<string, unknown>);\n if (cronResult.ok === false) {\n return patchError(cronResult.message);\n }\n }\n\n if (body.goals !== undefined) {\n if (typeof body.goals !== 'object' || body.goals === null || Array.isArray(body.goals)) {\n return patchError('goals must be an object');\n }\n const goalsResult = mergeGoalsConfigPatch(config, body.goals as Record<string, unknown>);\n if (goalsResult.ok === false) {\n return patchError(goalsResult.message);\n }\n }\n\n if (body.session !== undefined) {\n if (typeof body.session !== 'object' || body.session === null || Array.isArray(body.session)) {\n return patchError('session must be an object');\n }\n const sessionResult = mergeSessionConfigPatch(config, body.session as Record<string, unknown>);\n if (sessionResult.ok === false) {\n return patchError(sessionResult.message);\n }\n }\n\n if (\n body.gateway !== undefined &&\n typeof body.gateway === 'object' &&\n body.gateway !== null &&\n !Array.isArray(body.gateway)\n ) {\n const gwPatch = body.gateway as Record<string, unknown>;\n if (gwPatch.skillsMarketplaceProvider !== undefined || gwPatch.skillsStoreBaseUrl !== undefined) {\n const skillsResult = mergeGatewaySkillsMarketplacePatch(config, {\n ...(gwPatch.skillsMarketplaceProvider !== undefined\n ? { skillsMarketplaceProvider: gwPatch.skillsMarketplaceProvider }\n : {}),\n ...(gwPatch.skillsStoreBaseUrl !== undefined\n ? { skillsStoreBaseUrl: gwPatch.skillsStoreBaseUrl }\n : {}),\n });\n if (skillsResult.ok === false) {\n return patchError(skillsResult.message);\n }\n }\n }\n\n // LLM provider credentials — saved into the credential system (not config).\n if (body.providers) {\n const resolver = new CredentialResolver();\n for (const [key, apiKey] of Object.entries(body.providers)) {\n if (\n apiKey !== undefined &&\n typeof apiKey === 'string' &&\n apiKey.trim() &&\n !isMaskedSecretPatchValue(apiKey)\n ) {\n await resolver.saveApiKey(key, apiKey, { profileName: 'default' });\n }\n }\n }\n\n // Structured per-vendor provider config (cfg.providers.<id>) for capability\n // providers (image / audio / video). Distinct from `body.providers` above\n // which targets the LLM-side credential resolver.\n if (body.providersConfig && typeof body.providersConfig === 'object' && !Array.isArray(body.providersConfig)) {\n const cfgProviders = (config as { providers?: Record<string, Record<string, unknown>> }).providers ?? {};\n for (const [vendorId, raw] of Object.entries(body.providersConfig as Record<string, unknown>)) {\n if (!vendorId || typeof vendorId !== 'string') continue;\n if (raw === null) {\n delete cfgProviders[vendorId];\n continue;\n }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;\n const next = (cfgProviders[vendorId] ?? {}) as Record<string, unknown>;\n const patch = raw as Record<string, unknown>;\n for (const field of ['apiKey', 'baseUrl', 'region', 'imageBaseUrl'] as const) {\n if (patch[field] === null || patch[field] === '') {\n delete next[field];\n } else if (typeof patch[field] === 'string') {\n const trimmed = (patch[field] as string).trim();\n if (field === 'apiKey' && isMaskedSecretPatchValue(trimmed)) {\n continue;\n }\n next[field] = trimmed;\n }\n }\n if (patch.azure === null) {\n delete next.azure;\n } else if (patch.azure && typeof patch.azure === 'object' && !Array.isArray(patch.azure)) {\n next.azure = { ...(next.azure as Record<string, unknown> ?? {}), ...(patch.azure as Record<string, unknown>) };\n }\n if (patch.request === null) {\n delete next.request;\n } else if (patch.request && typeof patch.request === 'object' && !Array.isArray(patch.request)) {\n next.request = { ...(next.request as Record<string, unknown> ?? {}), ...(patch.request as Record<string, unknown>) };\n }\n cfgProviders[vendorId] = next;\n }\n (config as { providers?: Record<string, Record<string, unknown>> }).providers = cfgProviders;\n }\n\n // PATCH `stt` writes to tools.media.audio; PATCH `tts` writes to messages.tts.\n if (body.stt !== undefined) {\n config.tools = config.tools ?? {};\n config.tools.media = config.tools.media ?? {};\n (config.tools.media as Record<string, unknown>).audio = mergeSttConfigPatch(\n config.tools.media.audio,\n body.stt,\n );\n }\n if (body.tts !== undefined) {\n config.messages = config.messages ?? {};\n (config.messages as Record<string, unknown>).tts = mergeTtsConfigPatch(\n config.messages.tts,\n body.tts,\n );\n }\n\n const toolsPatchErr = applyToolsWebPatch(config, body as Record<string, unknown>);\n if (toolsPatchErr) {\n return patchError(toolsPatchErr);\n }\n\n if (body.tunnel !== undefined) {\n if (!body.tunnel || typeof body.tunnel !== 'object' || Array.isArray(body.tunnel)) {\n return patchError('tunnel must be an object');\n }\n const tunnelResult = mergeTunnelConfigPatch(config, body.tunnel as Record<string, unknown>);\n if (tunnelResult.ok === false) {\n return patchError(tunnelResult.message);\n }\n }\n\n if (body.bindings !== undefined) {\n if (!Array.isArray(body.bindings)) {\n return patchError('bindings must be an array');\n }\n const parsed = BindingsConfigSchema.safeParse(body.bindings);\n if (!parsed.success) {\n return patchError(parsed.error.issues.map((i) => i.message).join('; '));\n }\n config.bindings = parsed.data;\n }\n\n if (body.mcp !== undefined) {\n if (body.mcp === null) {\n delete config.mcp;\n } else if (typeof body.mcp !== 'object' || Array.isArray(body.mcp)) {\n return patchError('mcp must be an object');\n } else {\n const parsed = McpConfigSchema.safeParse(body.mcp);\n if (!parsed.success) {\n return patchError(parsed.error.issues.map((i) => i.message).join('; '));\n }\n if (parsed.data === undefined) {\n delete config.mcp;\n } else {\n const next = { ...parsed.data };\n if (next.servers) {\n next.servers = Object.fromEntries(\n Object.entries(next.servers).map(([name, server]) => [\n name,\n canonicalizeConfiguredMcpServer(server as Record<string, unknown>),\n ]),\n );\n }\n config.mcp = next;\n }\n }\n }\n\n return PATCH_OK;\n}\n\n/**\n * Re-validate gateway runtime config when `body.gateway` touched anything that\n * could break the bind/auth contract. Runs *after* all per-section patches\n * land so it sees the fully merged shape.\n */\nexport function validateGatewayAfterPatch(config: Config, body: any): PatchResult {\n if (body.gateway === undefined) return PATCH_OK;\n try {\n const auth = resolveGatewayAuth({ authConfig: config.gateway?.auth });\n assertGatewayAuthConfigured(auth);\n assertGatewayRuntimeConfig({\n cfg: config,\n auth,\n port: config.gateway?.port ?? 18790,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return patchError(message);\n }\n return PATCH_OK;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"misc.js","names":[],"sources":["../../../../../../src/gateway/hono/routes/config-patch/misc.ts"],"sourcesContent":["/**\n * `PATCH /api/config` — tail sections that are each <50 lines:\n * update / cron / goals / session / gateway.{skillsMarketplaceProvider,\n * skillsStoreBaseUrl} / providers / providersConfig / stt / tts / tools /\n * tunnel / bindings / mcp.\n *\n * Most of these delegate to a `mergeXxxConfigPatch(config, body) → { ok,\n * message? }` helper that lives next to the schema, so this file is mostly\n * \"validate object shape, call helper, surface 400 on failure\". The async\n * `providers` branch saves into the credential resolver rather than config.\n *\n * Final validation (resolveGatewayAuth + assertGatewayRuntimeConfig) runs\n * after every gateway-touching patch lands, so it sees the merged shape.\n */\nimport type { Config } from '../../../../config/schema.js';\nimport { BindingsConfigSchema, BrowserConfigSchema, McpConfigSchema } from '../../../../config/schema.js';\nimport { CredentialResolver } from '../../../../auth/credentials.js';\nimport { isMaskedSecretPatchValue } from '../../lib/mask-secret-length.js';\nimport { applyToolsWebPatch } from '../../../config-tools-web.js';\nimport { mergeTunnelConfigPatch } from '../../../../tunnel/tunnel-config.js';\nimport { canonicalizeConfiguredMcpServer } from '../../../../config/mcp-config-normalize.js';\nimport {\n mergeCronConfigPatch,\n mergeGatewaySkillsMarketplacePatch,\n mergeGoalsConfigPatch,\n mergeSessionConfigPatch,\n mergeUpdateConfigPatch,\n} from '../../../../config/web-patch.js';\nimport { mergeSttConfigPatch, mergeTtsConfigPatch } from '../../lib/safe-voice-config.js';\nimport { assertGatewayRuntimeConfig } from '../../../runtime-config.js';\nimport { resolveGatewayAuth, assertGatewayAuthConfigured } from '../../../auth.js';\nimport { type PatchResult, PATCH_OK, patchError } from './result.js';\n\nexport async function applyMiscPatch(config: Config, body: any): Promise<PatchResult> {\n if (body.update !== undefined && typeof body.update === 'object' && body.update !== null) {\n const updateResult = mergeUpdateConfigPatch(config, body.update as Record<string, unknown>);\n if (updateResult.ok === false) {\n return patchError(updateResult.message);\n }\n }\n\n if (body.cron !== undefined) {\n if (typeof body.cron !== 'object' || body.cron === null || Array.isArray(body.cron)) {\n return patchError('cron must be an object');\n }\n const cronResult = mergeCronConfigPatch(config, body.cron as Record<string, unknown>);\n if (cronResult.ok === false) {\n return patchError(cronResult.message);\n }\n }\n\n if (body.goals !== undefined) {\n if (typeof body.goals !== 'object' || body.goals === null || Array.isArray(body.goals)) {\n return patchError('goals must be an object');\n }\n const goalsResult = mergeGoalsConfigPatch(config, body.goals as Record<string, unknown>);\n if (goalsResult.ok === false) {\n return patchError(goalsResult.message);\n }\n }\n\n if (body.session !== undefined) {\n if (typeof body.session !== 'object' || body.session === null || Array.isArray(body.session)) {\n return patchError('session must be an object');\n }\n const sessionResult = mergeSessionConfigPatch(config, body.session as Record<string, unknown>);\n if (sessionResult.ok === false) {\n return patchError(sessionResult.message);\n }\n }\n\n if (body.browser !== undefined) {\n if (typeof body.browser !== 'object' || body.browser === null || Array.isArray(body.browser)) {\n return patchError('browser must be an object');\n }\n const parsed = BrowserConfigSchema.safeParse(body.browser);\n if (!parsed.success) {\n return patchError(parsed.error.issues.map((i) => i.message).join('; '));\n }\n config.browser = parsed.data;\n }\n\n if (\n body.gateway !== undefined &&\n typeof body.gateway === 'object' &&\n body.gateway !== null &&\n !Array.isArray(body.gateway)\n ) {\n const gwPatch = body.gateway as Record<string, unknown>;\n if (gwPatch.skillsMarketplaceProvider !== undefined || gwPatch.skillsStoreBaseUrl !== undefined) {\n const skillsResult = mergeGatewaySkillsMarketplacePatch(config, {\n ...(gwPatch.skillsMarketplaceProvider !== undefined\n ? { skillsMarketplaceProvider: gwPatch.skillsMarketplaceProvider }\n : {}),\n ...(gwPatch.skillsStoreBaseUrl !== undefined\n ? { skillsStoreBaseUrl: gwPatch.skillsStoreBaseUrl }\n : {}),\n });\n if (skillsResult.ok === false) {\n return patchError(skillsResult.message);\n }\n }\n }\n\n // LLM provider credentials — saved into the credential system (not config).\n if (body.providers) {\n const resolver = new CredentialResolver();\n for (const [key, apiKey] of Object.entries(body.providers)) {\n if (\n apiKey !== undefined &&\n typeof apiKey === 'string' &&\n apiKey.trim() &&\n !isMaskedSecretPatchValue(apiKey)\n ) {\n await resolver.saveApiKey(key, apiKey, { profileName: 'default' });\n }\n }\n }\n\n // Structured per-vendor provider config (cfg.providers.<id>) for capability\n // providers (image / audio / video). Distinct from `body.providers` above\n // which targets the LLM-side credential resolver.\n if (body.providersConfig && typeof body.providersConfig === 'object' && !Array.isArray(body.providersConfig)) {\n const cfgProviders = (config as { providers?: Record<string, Record<string, unknown>> }).providers ?? {};\n for (const [vendorId, raw] of Object.entries(body.providersConfig as Record<string, unknown>)) {\n if (!vendorId || typeof vendorId !== 'string') continue;\n if (raw === null) {\n delete cfgProviders[vendorId];\n continue;\n }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;\n const next = (cfgProviders[vendorId] ?? {}) as Record<string, unknown>;\n const patch = raw as Record<string, unknown>;\n for (const field of ['apiKey', 'baseUrl', 'region', 'imageBaseUrl'] as const) {\n if (patch[field] === null || patch[field] === '') {\n delete next[field];\n } else if (typeof patch[field] === 'string') {\n const trimmed = (patch[field] as string).trim();\n if (field === 'apiKey' && isMaskedSecretPatchValue(trimmed)) {\n continue;\n }\n next[field] = trimmed;\n }\n }\n if (patch.azure === null) {\n delete next.azure;\n } else if (patch.azure && typeof patch.azure === 'object' && !Array.isArray(patch.azure)) {\n next.azure = { ...(next.azure as Record<string, unknown> ?? {}), ...(patch.azure as Record<string, unknown>) };\n }\n if (patch.request === null) {\n delete next.request;\n } else if (patch.request && typeof patch.request === 'object' && !Array.isArray(patch.request)) {\n next.request = { ...(next.request as Record<string, unknown> ?? {}), ...(patch.request as Record<string, unknown>) };\n }\n cfgProviders[vendorId] = next;\n }\n (config as { providers?: Record<string, Record<string, unknown>> }).providers = cfgProviders;\n }\n\n // PATCH `stt` writes to tools.media.audio; PATCH `tts` writes to messages.tts.\n if (body.stt !== undefined) {\n config.tools = config.tools ?? {};\n config.tools.media = config.tools.media ?? {};\n (config.tools.media as Record<string, unknown>).audio = mergeSttConfigPatch(\n config.tools.media.audio,\n body.stt,\n );\n }\n if (body.tts !== undefined) {\n config.messages = config.messages ?? {};\n (config.messages as Record<string, unknown>).tts = mergeTtsConfigPatch(\n config.messages.tts,\n body.tts,\n );\n }\n\n const toolsPatchErr = applyToolsWebPatch(config, body as Record<string, unknown>);\n if (toolsPatchErr) {\n return patchError(toolsPatchErr);\n }\n\n if (body.tunnel !== undefined) {\n if (!body.tunnel || typeof body.tunnel !== 'object' || Array.isArray(body.tunnel)) {\n return patchError('tunnel must be an object');\n }\n const tunnelResult = mergeTunnelConfigPatch(config, body.tunnel as Record<string, unknown>);\n if (tunnelResult.ok === false) {\n return patchError(tunnelResult.message);\n }\n }\n\n if (body.bindings !== undefined) {\n if (!Array.isArray(body.bindings)) {\n return patchError('bindings must be an array');\n }\n const parsed = BindingsConfigSchema.safeParse(body.bindings);\n if (!parsed.success) {\n return patchError(parsed.error.issues.map((i) => i.message).join('; '));\n }\n config.bindings = parsed.data;\n }\n\n if (body.mcp !== undefined) {\n if (body.mcp === null) {\n delete config.mcp;\n } else if (typeof body.mcp !== 'object' || Array.isArray(body.mcp)) {\n return patchError('mcp must be an object');\n } else {\n const parsed = McpConfigSchema.safeParse(body.mcp);\n if (!parsed.success) {\n return patchError(parsed.error.issues.map((i) => i.message).join('; '));\n }\n if (parsed.data === undefined) {\n delete config.mcp;\n } else {\n const next = { ...parsed.data };\n if (next.servers) {\n next.servers = Object.fromEntries(\n Object.entries(next.servers).map(([name, server]) => [\n name,\n canonicalizeConfiguredMcpServer(server as Record<string, unknown>),\n ]),\n );\n }\n config.mcp = next;\n }\n }\n }\n\n return PATCH_OK;\n}\n\n/**\n * Re-validate gateway runtime config when `body.gateway` touched anything that\n * could break the bind/auth contract. Runs *after* all per-section patches\n * land so it sees the fully merged shape.\n */\nexport function validateGatewayAfterPatch(config: Config, body: any): PatchResult {\n if (body.gateway === undefined) return PATCH_OK;\n try {\n const auth = resolveGatewayAuth({ authConfig: config.gateway?.auth });\n assertGatewayAuthConfigured(auth);\n assertGatewayRuntimeConfig({\n cfg: config,\n auth,\n port: config.gateway?.port ?? 18790,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return patchError(message);\n }\n return PATCH_OK;\n}\n"],"mappings":"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"}
@@ -96,7 +96,7 @@ function registerConfigRoutes(authenticated, deps) {
96
96
  authenticated.post("/api/gateway/reveal-auth-secret", strictRateLimitMiddleware, revealGatewayAuthSecretHandler);
97
97
  /** POST /api/agents/browser/reveal-cloud-api-key — plaintext browser cloud apiKey from config only. */
98
98
  authenticated.post("/api/agents/browser/reveal-cloud-api-key", strictRateLimitMiddleware, async (c) => {
99
- const apiKey = service.currentConfig.agents?.defaults?.browser?.cloud?.apiKey?.trim() || null;
99
+ const apiKey = service.currentConfig.browser?.cloud?.apiKey?.trim() || null;
100
100
  return c.json({
101
101
  ok: true,
102
102
  payload: {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":[],"sources":["../../../../../src/gateway/hono/routes/config.ts"],"sourcesContent":["import type { Context, Hono } from 'hono';\n\nimport type { Config } from '../../../config/schema.js';\nimport { buildSafeWebConfigPayload } from '../lib/config-payload.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n applyAgentsPatch,\n applyChannelsPatch,\n applyGatewayPatch,\n applyMiscPatch,\n validateGatewayAfterPatch,\n} from './config-patch/index.js';\n\nfunction localeFromRequest(c: { req: { query(name: string): string | undefined; header(name: string): string | undefined } }): string | undefined {\n return c.req.query('locale') ?? c.req.header('X-XOPC-Locale') ?? c.req.header('Accept-Language')?.split(',')[0];\n}\n\nexport function registerConfigRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.post('/api/config/reload', strictRateLimitMiddleware, async (c) => {\n const result = await service.reloadConfig();\n return c.json({ ok: true, payload: result });\n });\n\n authenticated.post('/api/heartbeat/trigger', strictRateLimitMiddleware, async (c) => {\n let reason = 'manual';\n try {\n const body = await c.req.json();\n if (body && typeof body === 'object' && typeof (body as { reason?: unknown }).reason === 'string') {\n const r = (body as { reason: string }).reason.trim();\n if (r) reason = r.slice(0, 120);\n }\n } catch {\n /* empty or invalid body */\n }\n service.requestHeartbeatNow({ reason });\n return c.json({ ok: true, payload: { scheduled: true } });\n });\n\n authenticated.get('/api/config', async (c) => {\n const safeConfig = await buildSafeWebConfigPayload(service, { locale: localeFromRequest(c) });\n return c.json({ ok: true, payload: { config: safeConfig } });\n });\n\n // PATCH /api/config — section patchers run sequentially against the live\n // config object (mutate-in-place is intentional: the route handler reads\n // `service.currentConfig` and rewrites it through `saveConfig`). Each\n // patcher only touches the keys it owns and returns `{ ok: false }` with a\n // 400 body when validation fails; we surface the first failure verbatim.\n authenticated.patch('/api/config', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json();\n const config: Config = service.currentConfig as Config;\n\n applyAgentsPatch(config, body);\n applyChannelsPatch(config, body);\n\n const gatewayResult = applyGatewayPatch(config, body);\n if (gatewayResult.ok === false) {\n return c.json({ ok: false, error: gatewayResult.error }, gatewayResult.status as 400 | 500);\n }\n\n const miscResult = await applyMiscPatch(config, body);\n if (miscResult.ok === false) {\n return c.json({ ok: false, error: miscResult.error }, miscResult.status as 400 | 500);\n }\n\n const finalGwCheck = validateGatewayAfterPatch(config, body);\n if (finalGwCheck.ok === false) {\n return c.json({ ok: false, error: finalGwCheck.error }, finalGwCheck.status as 400 | 500);\n }\n\n const result = await service.saveConfig(config);\n if (!result.saved) {\n return c.json({ ok: false, error: result.error }, 500);\n }\n\n if (body.gateway?.heartbeat !== undefined && typeof body.gateway.heartbeat === 'object') {\n service.reloadHeartbeatFromCurrentConfig();\n }\n\n const safeConfig = await buildSafeWebConfigPayload(service, { locale: localeFromRequest(c) });\n return c.json({ ok: true, payload: { config: safeConfig } });\n });\n\n const revealGatewayAuthSecretHandler = async (c: Context) => {\n const field = await resolveRevealGatewayAuthField(c);\n if (!field) {\n return c.json({ ok: false, error: { message: 'field must be token or password' } }, 400);\n }\n const config = service.currentConfig as Config;\n const secret =\n field === 'token'\n ? config.gateway?.auth?.token?.trim() || null\n : config.gateway?.auth?.password?.trim() || null;\n return c.json({\n ok: true,\n payload: { field, secret, source: secret ? ('config' as const) : ('none' as const) },\n });\n };\n\n /**\n * POST /api/gateway/reveal-auth-secret/:field — preferred; no JSON body required.\n * POST /api/gateway/reveal-auth-secret — legacy JSON body `{ field: \"token\" | \"password\" }`.\n */\n authenticated.post(\n '/api/gateway/reveal-auth-secret/:field',\n strictRateLimitMiddleware,\n revealGatewayAuthSecretHandler,\n );\n authenticated.post('/api/gateway/reveal-auth-secret', strictRateLimitMiddleware, revealGatewayAuthSecretHandler);\n\n /** POST /api/agents/browser/reveal-cloud-api-key — plaintext browser cloud apiKey from config only. */\n authenticated.post('/api/agents/browser/reveal-cloud-api-key', strictRateLimitMiddleware, async (c) => {\n const config = service.currentConfig as Config;\n const apiKey = config.agents?.defaults?.browser?.cloud?.apiKey?.trim() || null;\n return c.json({\n ok: true,\n payload: { apiKey, source: apiKey ? ('config' as const) : ('none' as const) },\n });\n });\n\n /** POST /api/tools/web/reveal-search-api-key — plaintext search provider apiKey by index. */\n authenticated.post('/api/tools/web/reveal-search-api-key', strictRateLimitMiddleware, async (c) => {\n let index = -1;\n try {\n const body = await c.req.json();\n if (body && typeof body === 'object' && typeof (body as { index?: unknown }).index === 'number') {\n index = Math.floor((body as { index: number }).index);\n }\n } catch {\n index = -1;\n }\n const providers = service.currentConfig.tools?.web?.search?.providers ?? [];\n if (index < 0 || index >= providers.length) {\n return c.json({ ok: false, error: { message: 'Invalid provider index' } }, 400);\n }\n const apiKey = providers[index]?.apiKey?.trim() || null;\n return c.json({\n ok: true,\n payload: { index, apiKey, source: apiKey ? ('config' as const) : ('none' as const) },\n });\n });\n}\n\nfunction normalizeRevealGatewayAuthField(raw: unknown): 'token' | 'password' | null {\n return raw === 'token' || raw === 'password' ? raw : null;\n}\n\nasync function resolveRevealGatewayAuthField(c: Context): Promise<'token' | 'password' | null> {\n const fromPath = normalizeRevealGatewayAuthField(c.req.param('field'));\n if (fromPath) return fromPath;\n\n const fromQuery = normalizeRevealGatewayAuthField(c.req.query('field'));\n if (fromQuery) return fromQuery;\n\n try {\n const body = await c.req.json();\n return normalizeRevealGatewayAuthField(\n body && typeof body === 'object' && !Array.isArray(body)\n ? (body as { field?: unknown }).field\n : undefined,\n );\n } catch {\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../../../../src/gateway/hono/routes/config.ts"],"sourcesContent":["import type { Context, Hono } from 'hono';\n\nimport type { Config } from '../../../config/schema.js';\nimport { buildSafeWebConfigPayload } from '../lib/config-payload.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n applyAgentsPatch,\n applyChannelsPatch,\n applyGatewayPatch,\n applyMiscPatch,\n validateGatewayAfterPatch,\n} from './config-patch/index.js';\n\nfunction localeFromRequest(c: { req: { query(name: string): string | undefined; header(name: string): string | undefined } }): string | undefined {\n return c.req.query('locale') ?? c.req.header('X-XOPC-Locale') ?? c.req.header('Accept-Language')?.split(',')[0];\n}\n\nexport function registerConfigRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.post('/api/config/reload', strictRateLimitMiddleware, async (c) => {\n const result = await service.reloadConfig();\n return c.json({ ok: true, payload: result });\n });\n\n authenticated.post('/api/heartbeat/trigger', strictRateLimitMiddleware, async (c) => {\n let reason = 'manual';\n try {\n const body = await c.req.json();\n if (body && typeof body === 'object' && typeof (body as { reason?: unknown }).reason === 'string') {\n const r = (body as { reason: string }).reason.trim();\n if (r) reason = r.slice(0, 120);\n }\n } catch {\n /* empty or invalid body */\n }\n service.requestHeartbeatNow({ reason });\n return c.json({ ok: true, payload: { scheduled: true } });\n });\n\n authenticated.get('/api/config', async (c) => {\n const safeConfig = await buildSafeWebConfigPayload(service, { locale: localeFromRequest(c) });\n return c.json({ ok: true, payload: { config: safeConfig } });\n });\n\n // PATCH /api/config — section patchers run sequentially against the live\n // config object (mutate-in-place is intentional: the route handler reads\n // `service.currentConfig` and rewrites it through `saveConfig`). Each\n // patcher only touches the keys it owns and returns `{ ok: false }` with a\n // 400 body when validation fails; we surface the first failure verbatim.\n authenticated.patch('/api/config', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json();\n const config: Config = service.currentConfig as Config;\n\n applyAgentsPatch(config, body);\n applyChannelsPatch(config, body);\n\n const gatewayResult = applyGatewayPatch(config, body);\n if (gatewayResult.ok === false) {\n return c.json({ ok: false, error: gatewayResult.error }, gatewayResult.status as 400 | 500);\n }\n\n const miscResult = await applyMiscPatch(config, body);\n if (miscResult.ok === false) {\n return c.json({ ok: false, error: miscResult.error }, miscResult.status as 400 | 500);\n }\n\n const finalGwCheck = validateGatewayAfterPatch(config, body);\n if (finalGwCheck.ok === false) {\n return c.json({ ok: false, error: finalGwCheck.error }, finalGwCheck.status as 400 | 500);\n }\n\n const result = await service.saveConfig(config);\n if (!result.saved) {\n return c.json({ ok: false, error: result.error }, 500);\n }\n\n if (body.gateway?.heartbeat !== undefined && typeof body.gateway.heartbeat === 'object') {\n service.reloadHeartbeatFromCurrentConfig();\n }\n\n const safeConfig = await buildSafeWebConfigPayload(service, { locale: localeFromRequest(c) });\n return c.json({ ok: true, payload: { config: safeConfig } });\n });\n\n const revealGatewayAuthSecretHandler = async (c: Context) => {\n const field = await resolveRevealGatewayAuthField(c);\n if (!field) {\n return c.json({ ok: false, error: { message: 'field must be token or password' } }, 400);\n }\n const config = service.currentConfig as Config;\n const secret =\n field === 'token'\n ? config.gateway?.auth?.token?.trim() || null\n : config.gateway?.auth?.password?.trim() || null;\n return c.json({\n ok: true,\n payload: { field, secret, source: secret ? ('config' as const) : ('none' as const) },\n });\n };\n\n /**\n * POST /api/gateway/reveal-auth-secret/:field — preferred; no JSON body required.\n * POST /api/gateway/reveal-auth-secret — legacy JSON body `{ field: \"token\" | \"password\" }`.\n */\n authenticated.post(\n '/api/gateway/reveal-auth-secret/:field',\n strictRateLimitMiddleware,\n revealGatewayAuthSecretHandler,\n );\n authenticated.post('/api/gateway/reveal-auth-secret', strictRateLimitMiddleware, revealGatewayAuthSecretHandler);\n\n /** POST /api/agents/browser/reveal-cloud-api-key — plaintext browser cloud apiKey from config only. */\n authenticated.post('/api/agents/browser/reveal-cloud-api-key', strictRateLimitMiddleware, async (c) => {\n const config = service.currentConfig as Config;\n const apiKey = config.browser?.cloud?.apiKey?.trim() || null;\n return c.json({\n ok: true,\n payload: { apiKey, source: apiKey ? ('config' as const) : ('none' as const) },\n });\n });\n\n /** POST /api/tools/web/reveal-search-api-key — plaintext search provider apiKey by index. */\n authenticated.post('/api/tools/web/reveal-search-api-key', strictRateLimitMiddleware, async (c) => {\n let index = -1;\n try {\n const body = await c.req.json();\n if (body && typeof body === 'object' && typeof (body as { index?: unknown }).index === 'number') {\n index = Math.floor((body as { index: number }).index);\n }\n } catch {\n index = -1;\n }\n const providers = service.currentConfig.tools?.web?.search?.providers ?? [];\n if (index < 0 || index >= providers.length) {\n return c.json({ ok: false, error: { message: 'Invalid provider index' } }, 400);\n }\n const apiKey = providers[index]?.apiKey?.trim() || null;\n return c.json({\n ok: true,\n payload: { index, apiKey, source: apiKey ? ('config' as const) : ('none' as const) },\n });\n });\n}\n\nfunction normalizeRevealGatewayAuthField(raw: unknown): 'token' | 'password' | null {\n return raw === 'token' || raw === 'password' ? raw : null;\n}\n\nasync function resolveRevealGatewayAuthField(c: Context): Promise<'token' | 'password' | null> {\n const fromPath = normalizeRevealGatewayAuthField(c.req.param('field'));\n if (fromPath) return fromPath;\n\n const fromQuery = normalizeRevealGatewayAuthField(c.req.query('field'));\n if (fromQuery) return fromQuery;\n\n try {\n const body = await c.req.json();\n return normalizeRevealGatewayAuthField(\n body && typeof body === 'object' && !Array.isArray(body)\n ? (body as { field?: unknown }).field\n : undefined,\n );\n } catch {\n return null;\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
2
+ import { resolveEffectiveAgentManifestForAgent } from "../../../config/agent-profile.js";
1
3
  import { DREAMING_CRON_NAME, DREAMING_DIR_RELATIVE, DREAMING_LAST_RUN_RELATIVE, DREAMING_LIGHT_CRON_NAME, DREAMING_LIGHT_SWEEP_TOKEN, DREAMING_REM_CRON_NAME, DREAMING_REM_SWEEP_TOKEN, DREAMING_SWEEP_TOKEN, SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../../../agent/memory/dreaming/constants.js";
2
4
  import { loadDreamingStore, saveDreamingStore } from "../../../agent/memory/dreaming/short-term-store.js";
3
5
  import { resolveDreamingConfig } from "../../../agent/memory/dreaming/config.js";
@@ -5,9 +7,10 @@ import { parseDreamingLastRunFile } from "../../../agent/memory/dreaming/last-ru
5
7
  import { readDreamingEvents } from "../../../agent/memory/dreaming/events.js";
6
8
  import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
7
9
  import { previewDreamingDeepPromotion } from "../../../agent/memory/dreaming/preview.js";
8
- import fs from "node:fs/promises";
9
10
  import path from "node:path";
11
+ import fs from "node:fs/promises";
10
12
  //#region src/gateway/hono/routes/dreaming.ts
13
+ init_agent_scope();
11
14
  function isRecord(v) {
12
15
  return v !== null && typeof v === "object" && !Array.isArray(v);
13
16
  }
@@ -110,6 +113,8 @@ function registerDreamingRoutes(authenticated, deps) {
110
113
  ok: false,
111
114
  error: { message: "Workspace not configured" }
112
115
  }, 400);
116
+ const agentId = resolveDefaultAgentId(cfg);
117
+ const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);
113
118
  const resolved = resolveDreamingConfig(cfg);
114
119
  const { store } = await loadDreamingStore({ workspaceDir });
115
120
  const lock = await readLockInfo(workspaceDir);
@@ -121,6 +126,8 @@ function registerDreamingRoutes(authenticated, deps) {
121
126
  return c.json({
122
127
  ok: true,
123
128
  payload: {
129
+ agentId,
130
+ memory: manifest.memory,
124
131
  workspaceDir,
125
132
  config: resolved,
126
133
  storePath: SHORT_TERM_RECALL_STORE_RELATIVE,
@@ -1 +1 @@
1
- {"version":3,"file":"dreaming.js","names":[],"sources":["../../../../../src/gateway/hono/routes/dreaming.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type Config } from '../../../config/schema.js';\nimport { getWorkspacePath } from '../../../config/workspace-path-helpers.js';\nimport { resolveDreamingConfig } from '../../../agent/memory/dreaming/config.js';\nimport {\n DREAMING_CRON_NAME,\n DREAMING_CRON_TAG,\n DREAMING_DIR_RELATIVE,\n DREAMING_LAST_RUN_RELATIVE,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n DREAMING_SWEEP_TOKEN,\n SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n SHORT_TERM_RECALL_STORE_RELATIVE,\n type DreamingPhaseId,\n} from '../../../agent/memory/dreaming/constants.js';\nimport { readDreamingEvents } from '../../../agent/memory/dreaming/events.js';\nimport { previewDreamingDeepPromotion } from '../../../agent/memory/dreaming/preview.js';\nimport { parseDreamingLastRunFile, type DreamingDeepLastRun } from '../../../agent/memory/dreaming/last-run.js';\nimport {\n loadDreamingStore,\n saveDreamingStore,\n type DreamingStore,\n} from '../../../agent/memory/dreaming/short-term-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nasync function readLockInfo(workspaceDir: string): Promise<\n | { locked: false }\n | { locked: true; path: string; content: string; mtimeMs?: number }\n> {\n const lockPath = path.join(workspaceDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const [content, st] = await Promise.all([fs.readFile(lockPath, 'utf-8'), fs.stat(lockPath)]);\n return {\n locked: true,\n path: SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n content: content.trim(),\n mtimeMs: st.mtimeMs,\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { locked: false };\n return { locked: true, path: SHORT_TERM_PROMOTION_LOCK_RELATIVE, content: 'unknown', mtimeMs: undefined };\n }\n}\n\nasync function readLastRun(\n workspaceDir: string,\n): Promise<\n | { exists: false }\n | {\n exists: true;\n path: string;\n raw: unknown;\n record: DreamingDeepLastRun | null;\n parseError: string | null;\n }\n> {\n const fullPath = path.join(workspaceDir, DREAMING_LAST_RUN_RELATIVE);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n let raw: unknown;\n try {\n raw = JSON.parse(text) as unknown;\n } catch (parseErr) {\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n };\n }\n const record = parseDreamingLastRunFile(raw);\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw,\n record,\n parseError: record ? null : 'Invalid or unsupported last-run.json (expected v2 deep record).',\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nasync function readPhaseLastRun(\n workspaceDir: string,\n filename: string,\n): Promise<{ exists: false } | { exists: true; path: string; raw: unknown }> {\n const relPath = path.join(DREAMING_DIR_RELATIVE, filename);\n const fullPath = path.join(workspaceDir, relPath);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n const raw = JSON.parse(text) as unknown;\n return { exists: true, path: relPath, raw };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return { exists: false };\n }\n}\n\nfunction storeStats(store: DreamingStore): {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n} {\n const entries = Object.values(store.entries ?? {});\n const promoted = entries.filter((e) => typeof e.promotedAt === 'string' && e.promotedAt.trim());\n const lastPromotedAt = promoted\n .map((e) => e.promotedAt!)\n .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))[0];\n return {\n version: store.version,\n updatedAt: store.updatedAt,\n entryCount: entries.length,\n promotedCount: promoted.length,\n lastPromotedAt: lastPromotedAt ?? null,\n };\n}\n\nfunction payloadMessageFromJob(job: any): string {\n const p = job?.payload;\n if (!p) return '';\n if (p.kind === 'agentTurn' && typeof p.message === 'string') return p.message;\n if (typeof p.text === 'string') return p.text;\n if (typeof p.message === 'string') return p.message;\n return '';\n}\n\nexport function registerDreamingRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/dreaming', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const resolved = resolveDreamingConfig(cfg);\n const { store } = await loadDreamingStore({ workspaceDir });\n const lock = await readLockInfo(workspaceDir);\n\n // Read all three phase last-run files in parallel.\n const [lastRun, lightLastRun, remLastRun] = await Promise.all([\n readLastRun(workspaceDir),\n readPhaseLastRun(workspaceDir, 'last-run-light.json'),\n readPhaseLastRun(workspaceDir, 'last-run-rem.json'),\n ]);\n\n return c.json({\n ok: true,\n payload: {\n workspaceDir,\n config: resolved,\n storePath: SHORT_TERM_RECALL_STORE_RELATIVE,\n store: storeStats(store),\n lock,\n lastRun,\n lightLastRun,\n remLastRun,\n },\n });\n });\n\n authenticated.get('/api/dreaming/preview', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const resolved = resolveDreamingConfig(cfg);\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number(rawLimit) : 20;\n\n const preview = await previewDreamingDeepPromotion({\n workspaceDir,\n config: resolved.deep,\n limit: Number.isFinite(limit) ? limit : 20,\n });\n\n return c.json({ ok: true, payload: preview });\n });\n\n authenticated.post('/api/dreaming/run', async (c) => {\n let body: unknown;\n try { body = await c.req.json(); } catch { body = {}; }\n const requestedPhase: DreamingPhaseId =\n isRecord(body) && typeof body.phase === 'string' && ['light', 'deep', 'rem'].includes(body.phase)\n ? (body.phase as DreamingPhaseId)\n : 'deep';\n\n // Map phase → token + cron name for job lookup.\n const phaseTokenMap: Record<DreamingPhaseId, { token: string; cronName: string }> = {\n light: { token: DREAMING_LIGHT_SWEEP_TOKEN, cronName: DREAMING_LIGHT_CRON_NAME },\n deep: { token: DREAMING_SWEEP_TOKEN, cronName: DREAMING_CRON_NAME },\n rem: { token: DREAMING_REM_SWEEP_TOKEN, cronName: DREAMING_REM_CRON_NAME },\n };\n const { token, cronName } = phaseTokenMap[requestedPhase];\n\n const jobs = await service.cronServiceInstance.listJobs();\n const primary =\n jobs.find((job) => payloadMessageFromJob(job) === token) ??\n jobs.find((job) => job.name === cronName) ??\n (requestedPhase === 'deep'\n ? jobs.find((job) => (job.name?.includes?.(DREAMING_CRON_TAG) ?? false))\n : undefined);\n\n if (!primary) {\n const dreaming = resolveDreamingConfig(service.currentConfig as Config);\n const phaseEnabled = dreaming.enabled && dreaming.phases[requestedPhase].enabled;\n const hint = phaseEnabled\n ? `Dreaming ${requestedPhase} phase is enabled, but no cron job was found yet. Restart the gateway/agent process so it can reconcile managed cron jobs.`\n : `Dreaming ${requestedPhase} phase is disabled in config. Enable it first.`;\n return c.json({ ok: false, error: { message: `Dreaming ${requestedPhase} cron job not found. ${hint}` } }, 404);\n }\n\n try {\n // Broadcast phase start to all SSE subscribers (drives dreaming animation overlay).\n service.emit('dreaming.phase.start', { phase: requestedPhase, timestamp: new Date().toISOString() });\n\n await service.cronServiceInstance.runJobNow(primary.id);\n\n // Broadcast phase end (the cron job runs async, so this only marks \"triggered\").\n service.emit('dreaming.phase.end', { phase: requestedPhase, ok: true, timestamp: new Date().toISOString() });\n\n return c.json({ ok: true, payload: { triggered: true, jobId: primary.id, phase: requestedPhase } });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n service.emit('dreaming.phase.end', { phase: requestedPhase, ok: false, error: em, timestamp: new Date().toISOString() });\n return c.json({ ok: false, error: { message: em || 'Failed to trigger job' } }, 400);\n }\n });\n\n authenticated.post('/api/dreaming/action', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const action = isRecord(body) && typeof body.action === 'string' ? body.action.trim() : '';\n\n if (action !== 'reset_store' && action !== 'clear_lock') {\n return c.json({ ok: false, error: { message: 'Invalid action' } }, 400);\n }\n\n if (action === 'reset_store') {\n const nowIso = new Date().toISOString();\n const next: DreamingStore = { version: 1, updatedAt: nowIso, entries: {} };\n await saveDreamingStore({ workspaceDir, store: next });\n return c.json({ ok: true, payload: { reset: true, storePath: SHORT_TERM_RECALL_STORE_RELATIVE } });\n }\n\n const lockPath = path.join(workspaceDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n await fs.unlink(lockPath).catch(() => undefined);\n return c.json({ ok: true, payload: { cleared: true, lockPath: SHORT_TERM_PROMOTION_LOCK_RELATIVE } });\n });\n\n authenticated.get('/api/dreaming/events', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Math.min(Math.max(Number(rawLimit) || 50, 1), 200) : 50;\n\n const events = await readDreamingEvents(workspaceDir, limit);\n return c.json({ ok: true, payload: { events } });\n });\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"dreaming.js","names":[],"sources":["../../../../../src/gateway/hono/routes/dreaming.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type Config } from '../../../config/schema.js';\nimport { getWorkspacePath } from '../../../config/workspace-path-helpers.js';\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';\nimport { resolveDreamingConfig } from '../../../agent/memory/dreaming/config.js';\nimport {\n DREAMING_CRON_NAME,\n DREAMING_CRON_TAG,\n DREAMING_DIR_RELATIVE,\n DREAMING_LAST_RUN_RELATIVE,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n DREAMING_SWEEP_TOKEN,\n SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n SHORT_TERM_RECALL_STORE_RELATIVE,\n type DreamingPhaseId,\n} from '../../../agent/memory/dreaming/constants.js';\nimport { readDreamingEvents } from '../../../agent/memory/dreaming/events.js';\nimport { previewDreamingDeepPromotion } from '../../../agent/memory/dreaming/preview.js';\nimport { parseDreamingLastRunFile, type DreamingDeepLastRun } from '../../../agent/memory/dreaming/last-run.js';\nimport {\n loadDreamingStore,\n saveDreamingStore,\n type DreamingStore,\n} from '../../../agent/memory/dreaming/short-term-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nasync function readLockInfo(workspaceDir: string): Promise<\n | { locked: false }\n | { locked: true; path: string; content: string; mtimeMs?: number }\n> {\n const lockPath = path.join(workspaceDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const [content, st] = await Promise.all([fs.readFile(lockPath, 'utf-8'), fs.stat(lockPath)]);\n return {\n locked: true,\n path: SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n content: content.trim(),\n mtimeMs: st.mtimeMs,\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { locked: false };\n return { locked: true, path: SHORT_TERM_PROMOTION_LOCK_RELATIVE, content: 'unknown', mtimeMs: undefined };\n }\n}\n\nasync function readLastRun(\n workspaceDir: string,\n): Promise<\n | { exists: false }\n | {\n exists: true;\n path: string;\n raw: unknown;\n record: DreamingDeepLastRun | null;\n parseError: string | null;\n }\n> {\n const fullPath = path.join(workspaceDir, DREAMING_LAST_RUN_RELATIVE);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n let raw: unknown;\n try {\n raw = JSON.parse(text) as unknown;\n } catch (parseErr) {\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n };\n }\n const record = parseDreamingLastRunFile(raw);\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw,\n record,\n parseError: record ? null : 'Invalid or unsupported last-run.json (expected v2 deep record).',\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nasync function readPhaseLastRun(\n workspaceDir: string,\n filename: string,\n): Promise<{ exists: false } | { exists: true; path: string; raw: unknown }> {\n const relPath = path.join(DREAMING_DIR_RELATIVE, filename);\n const fullPath = path.join(workspaceDir, relPath);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n const raw = JSON.parse(text) as unknown;\n return { exists: true, path: relPath, raw };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return { exists: false };\n }\n}\n\nfunction storeStats(store: DreamingStore): {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n} {\n const entries = Object.values(store.entries ?? {});\n const promoted = entries.filter((e) => typeof e.promotedAt === 'string' && e.promotedAt.trim());\n const lastPromotedAt = promoted\n .map((e) => e.promotedAt!)\n .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))[0];\n return {\n version: store.version,\n updatedAt: store.updatedAt,\n entryCount: entries.length,\n promotedCount: promoted.length,\n lastPromotedAt: lastPromotedAt ?? null,\n };\n}\n\nfunction payloadMessageFromJob(job: any): string {\n const p = job?.payload;\n if (!p) return '';\n if (p.kind === 'agentTurn' && typeof p.message === 'string') return p.message;\n if (typeof p.text === 'string') return p.text;\n if (typeof p.message === 'string') return p.message;\n return '';\n}\n\nexport function registerDreamingRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/dreaming', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const agentId = resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n const resolved = resolveDreamingConfig(cfg);\n const { store } = await loadDreamingStore({ workspaceDir });\n const lock = await readLockInfo(workspaceDir);\n\n // Read all three phase last-run files in parallel.\n const [lastRun, lightLastRun, remLastRun] = await Promise.all([\n readLastRun(workspaceDir),\n readPhaseLastRun(workspaceDir, 'last-run-light.json'),\n readPhaseLastRun(workspaceDir, 'last-run-rem.json'),\n ]);\n\n return c.json({\n ok: true,\n payload: {\n agentId,\n memory: manifest.memory,\n workspaceDir,\n config: resolved,\n storePath: SHORT_TERM_RECALL_STORE_RELATIVE,\n store: storeStats(store),\n lock,\n lastRun,\n lightLastRun,\n remLastRun,\n },\n });\n });\n\n authenticated.get('/api/dreaming/preview', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const resolved = resolveDreamingConfig(cfg);\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number(rawLimit) : 20;\n\n const preview = await previewDreamingDeepPromotion({\n workspaceDir,\n config: resolved.deep,\n limit: Number.isFinite(limit) ? limit : 20,\n });\n\n return c.json({ ok: true, payload: preview });\n });\n\n authenticated.post('/api/dreaming/run', async (c) => {\n let body: unknown;\n try { body = await c.req.json(); } catch { body = {}; }\n const requestedPhase: DreamingPhaseId =\n isRecord(body) && typeof body.phase === 'string' && ['light', 'deep', 'rem'].includes(body.phase)\n ? (body.phase as DreamingPhaseId)\n : 'deep';\n\n // Map phase → token + cron name for job lookup.\n const phaseTokenMap: Record<DreamingPhaseId, { token: string; cronName: string }> = {\n light: { token: DREAMING_LIGHT_SWEEP_TOKEN, cronName: DREAMING_LIGHT_CRON_NAME },\n deep: { token: DREAMING_SWEEP_TOKEN, cronName: DREAMING_CRON_NAME },\n rem: { token: DREAMING_REM_SWEEP_TOKEN, cronName: DREAMING_REM_CRON_NAME },\n };\n const { token, cronName } = phaseTokenMap[requestedPhase];\n\n const jobs = await service.cronServiceInstance.listJobs();\n const primary =\n jobs.find((job) => payloadMessageFromJob(job) === token) ??\n jobs.find((job) => job.name === cronName) ??\n (requestedPhase === 'deep'\n ? jobs.find((job) => (job.name?.includes?.(DREAMING_CRON_TAG) ?? false))\n : undefined);\n\n if (!primary) {\n const dreaming = resolveDreamingConfig(service.currentConfig as Config);\n const phaseEnabled = dreaming.enabled && dreaming.phases[requestedPhase].enabled;\n const hint = phaseEnabled\n ? `Dreaming ${requestedPhase} phase is enabled, but no cron job was found yet. Restart the gateway/agent process so it can reconcile managed cron jobs.`\n : `Dreaming ${requestedPhase} phase is disabled in config. Enable it first.`;\n return c.json({ ok: false, error: { message: `Dreaming ${requestedPhase} cron job not found. ${hint}` } }, 404);\n }\n\n try {\n // Broadcast phase start to all SSE subscribers (drives dreaming animation overlay).\n service.emit('dreaming.phase.start', { phase: requestedPhase, timestamp: new Date().toISOString() });\n\n await service.cronServiceInstance.runJobNow(primary.id);\n\n // Broadcast phase end (the cron job runs async, so this only marks \"triggered\").\n service.emit('dreaming.phase.end', { phase: requestedPhase, ok: true, timestamp: new Date().toISOString() });\n\n return c.json({ ok: true, payload: { triggered: true, jobId: primary.id, phase: requestedPhase } });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n service.emit('dreaming.phase.end', { phase: requestedPhase, ok: false, error: em, timestamp: new Date().toISOString() });\n return c.json({ ok: false, error: { message: em || 'Failed to trigger job' } }, 400);\n }\n });\n\n authenticated.post('/api/dreaming/action', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const action = isRecord(body) && typeof body.action === 'string' ? body.action.trim() : '';\n\n if (action !== 'reset_store' && action !== 'clear_lock') {\n return c.json({ ok: false, error: { message: 'Invalid action' } }, 400);\n }\n\n if (action === 'reset_store') {\n const nowIso = new Date().toISOString();\n const next: DreamingStore = { version: 1, updatedAt: nowIso, entries: {} };\n await saveDreamingStore({ workspaceDir, store: next });\n return c.json({ ok: true, payload: { reset: true, storePath: SHORT_TERM_RECALL_STORE_RELATIVE } });\n }\n\n const lockPath = path.join(workspaceDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n await fs.unlink(lockPath).catch(() => undefined);\n return c.json({ ok: true, payload: { cleared: true, lockPath: SHORT_TERM_PROMOTION_LOCK_RELATIVE } });\n });\n\n authenticated.get('/api/dreaming/events', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Math.min(Math.max(Number(rawLimit) || 50, 1), 200) : 50;\n\n const events = await readDreamingEvents(workspaceDir, limit);\n return c.json({ ok: true, payload: { events } });\n });\n}\n"],"mappings":";;;;;;;;;;;;kBAMsE;AA2BtE,SAAS,SAAS,GAA0C;AAC1D,QAAO,MAAM,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,EAAE;;AAGjE,eAAe,aAAa,cAG1B;CACA,MAAM,WAAW,KAAK,KAAK,cAAc,mCAAmC;AAC5E,KAAI;EACF,MAAM,CAAC,SAAS,MAAM,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,UAAU,QAAQ,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;AAC5F,SAAO;GACL,QAAQ;GACR,MAAM;GACN,SAAS,QAAQ,MAAM;GACvB,SAAS,GAAG;GACb;UACM,KAAK;AAEZ,MADc,KAA2C,SAC5C,SAAU,QAAO,EAAE,QAAQ,OAAO;AAC/C,SAAO;GAAE,QAAQ;GAAM,MAAM;GAAoC,SAAS;GAAW,SAAS,KAAA;GAAW;;;AAI7G,eAAe,YACb,cAUA;CACA,MAAM,WAAW,KAAK,KAAK,cAAc,2BAA2B;AACpE,KAAI;EACF,MAAM,OAAO,MAAM,GAAG,SAAS,UAAU,QAAQ;EACjD,IAAI;AACJ,MAAI;AACF,SAAM,KAAK,MAAM,KAAK;WACf,UAAU;AACjB,UAAO;IACL,QAAQ;IACR,MAAM;IACN,KAAK;IACL,QAAQ;IACR,YAAY,oBAAoB,QAAQ,SAAS,UAAU,OAAO,SAAS;IAC5E;;EAEH,MAAM,SAAS,yBAAyB,IAAI;AAC5C,SAAO;GACL,QAAQ;GACR,MAAM;GACN;GACA;GACA,YAAY,SAAS,OAAO;GAC7B;UACM,KAAK;AAEZ,MADc,KAA2C,SAC5C,SAAU,QAAO,EAAE,QAAQ,OAAO;AAC/C,SAAO;GACL,QAAQ;GACR,MAAM;GACN,KAAK;GACL,QAAQ;GACR,YAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GAC7D;;;AAIL,eAAe,iBACb,cACA,UAC2E;CAC3E,MAAM,UAAU,KAAK,KAAK,uBAAuB,SAAS;CAC1D,MAAM,WAAW,KAAK,KAAK,cAAc,QAAQ;AACjD,KAAI;EACF,MAAM,OAAO,MAAM,GAAG,SAAS,UAAU,QAAQ;AAEjD,SAAO;GAAE,QAAQ;GAAM,MAAM;GAAS,KAD1B,KAAK,MAAM,KACkB;GAAE;UACpC,KAAK;AAEZ,MADc,KAA2C,SAC5C,SAAU,QAAO,EAAE,QAAQ,OAAO;AAC/C,SAAO,EAAE,QAAQ,OAAO;;;AAI5B,SAAS,WAAW,OAMlB;CACA,MAAM,UAAU,OAAO,OAAO,MAAM,WAAW,EAAE,CAAC;CAClD,MAAM,WAAW,QAAQ,QAAQ,MAAM,OAAO,EAAE,eAAe,YAAY,EAAE,WAAW,MAAM,CAAC;CAC/F,MAAM,iBAAiB,SACpB,KAAK,MAAM,EAAE,WAAY,CACzB,MAAM,GAAG,MAAO,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAG,CAAC;AAChD,QAAO;EACL,SAAS,MAAM;EACf,WAAW,MAAM;EACjB,YAAY,QAAQ;EACpB,eAAe,SAAS;EACxB,gBAAgB,kBAAkB;EACnC;;AAGH,SAAS,sBAAsB,KAAkB;CAC/C,MAAM,IAAI,KAAK;AACf,KAAI,CAAC,EAAG,QAAO;AACf,KAAI,EAAE,SAAS,eAAe,OAAO,EAAE,YAAY,SAAU,QAAO,EAAE;AACtE,KAAI,OAAO,EAAE,SAAS,SAAU,QAAO,EAAE;AACzC,KAAI,OAAO,EAAE,YAAY,SAAU,QAAO,EAAE;AAC5C,QAAO;;AAGT,SAAgB,uBAAuB,eAAqB,MAAoC;CAC9F,MAAM,EAAE,YAAY;AAEpB,eAAc,IAAI,iBAAiB,OAAO,MAAM;EAC9C,MAAM,MAAM,QAAQ;EACpB,MAAM,eAAe,iBAAiB,IAAI;AAC1C,MAAI,CAAC,aACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,4BAA4B;GAAE,EAAE,IAAI;EAGnF,MAAM,UAAU,sBAAsB,IAAI;EAC1C,MAAM,WAAW,sCAAsC,KAAK,QAAQ;EACpE,MAAM,WAAW,sBAAsB,IAAI;EAC3C,MAAM,EAAE,UAAU,MAAM,kBAAkB,EAAE,cAAc,CAAC;EAC3D,MAAM,OAAO,MAAM,aAAa,aAAa;EAG7C,MAAM,CAAC,SAAS,cAAc,cAAc,MAAM,QAAQ,IAAI;GAC5D,YAAY,aAAa;GACzB,iBAAiB,cAAc,sBAAsB;GACrD,iBAAiB,cAAc,oBAAoB;GACpD,CAAC;AAEF,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP;IACA,QAAQ,SAAS;IACjB;IACA,QAAQ;IACR,WAAW;IACX,OAAO,WAAW,MAAM;IACxB;IACA;IACA;IACA;IACD;GACF,CAAC;GACF;AAEF,eAAc,IAAI,yBAAyB,OAAO,MAAM;EACtD,MAAM,MAAM,QAAQ;EACpB,MAAM,eAAe,iBAAiB,IAAI;AAC1C,MAAI,CAAC,aACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,4BAA4B;GAAE,EAAE,IAAI;EAGnF,MAAM,WAAW,sBAAsB,IAAI;EAC3C,MAAM,WAAW,EAAE,IAAI,MAAM,QAAQ;EACrC,MAAM,QAAQ,WAAW,OAAO,SAAS,GAAG;EAE5C,MAAM,UAAU,MAAM,6BAA6B;GACjD;GACA,QAAQ,SAAS;GACjB,OAAO,OAAO,SAAS,MAAM,GAAG,QAAQ;GACzC,CAAC;AAEF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;GAAS,CAAC;GAC7C;AAEF,eAAc,KAAK,qBAAqB,OAAO,MAAM;EACnD,IAAI;AACJ,MAAI;AAAE,UAAO,MAAM,EAAE,IAAI,MAAM;UAAU;AAAE,UAAO,EAAE;;EACpD,MAAM,iBACJ,SAAS,KAAK,IAAI,OAAO,KAAK,UAAU,YAAY;GAAC;GAAS;GAAQ;GAAM,CAAC,SAAS,KAAK,MAAM,GAC5F,KAAK,QACN;EAQN,MAAM,EAAE,OAAO,aAAa;GAJ1B,OAAO;IAAE,OAAO;IAA4B,UAAU;IAA0B;GAChF,MAAM;IAAE,OAAO;IAAsB,UAAU;IAAoB;GACnE,KAAK;IAAE,OAAO;IAA0B,UAAU;IAAwB;GAEnC,CAAC;EAE1C,MAAM,OAAO,MAAM,QAAQ,oBAAoB,UAAU;EACzD,MAAM,UACJ,KAAK,MAAM,QAAQ,sBAAsB,IAAI,KAAK,MAAM,IACxD,KAAK,MAAM,QAAQ,IAAI,SAAS,SAAS,KACxC,mBAAmB,SAChB,KAAK,MAAM,QAAS,IAAI,MAAM,WAAA,oCAA6B,IAAI,MAAO,GACtE,KAAA;AAEN,MAAI,CAAC,SAAS;GACZ,MAAM,WAAW,sBAAsB,QAAQ,cAAwB;GAEvE,MAAM,OADe,SAAS,WAAW,SAAS,OAAO,gBAAgB,UAErE,YAAY,eAAe,8HAC3B,YAAY,eAAe;AAC/B,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,YAAY,eAAe,uBAAuB,QAAQ;IAAE,EAAE,IAAI;;AAGjH,MAAI;AAEF,WAAQ,KAAK,wBAAwB;IAAE,OAAO;IAAgB,4BAAW,IAAI,MAAM,EAAC,aAAa;IAAE,CAAC;AAEpG,SAAM,QAAQ,oBAAoB,UAAU,QAAQ,GAAG;AAGvD,WAAQ,KAAK,sBAAsB;IAAE,OAAO;IAAgB,IAAI;IAAM,4BAAW,IAAI,MAAM,EAAC,aAAa;IAAE,CAAC;AAE5G,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;KAAE,WAAW;KAAM,OAAO,QAAQ;KAAI,OAAO;KAAgB;IAAE,CAAC;WAC5F,KAAK;GACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,WAAQ,KAAK,sBAAsB;IAAE,OAAO;IAAgB,IAAI;IAAO,OAAO;IAAI,4BAAW,IAAI,MAAM,EAAC,aAAa;IAAE,CAAC;AACxH,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,MAAM,yBAAyB;IAAE,EAAE,IAAI;;GAEtF;AAEF,eAAc,KAAK,wBAAwB,OAAO,MAAM;EACtD,MAAM,MAAM,QAAQ;EACpB,MAAM,eAAe,iBAAiB,IAAI;AAC1C,MAAI,CAAC,aACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,4BAA4B;GAAE,EAAE,IAAI;EAGnF,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE;;EAEX,MAAM,SAAS,SAAS,KAAK,IAAI,OAAO,KAAK,WAAW,WAAW,KAAK,OAAO,MAAM,GAAG;AAExF,MAAI,WAAW,iBAAiB,WAAW,aACzC,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,kBAAkB;GAAE,EAAE,IAAI;AAGzE,MAAI,WAAW,eAAe;AAG5B,SAAM,kBAAkB;IAAE;IAAc,OAAO;KADjB,SAAS;KAAG,4BAD3B,IAAI,MAAM,EAAC,aACiC;KAAE,SAAS,EAAE;KACrB;IAAE,CAAC;AACtD,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;KAAE,OAAO;KAAM,WAAW;KAAkC;IAAE,CAAC;;EAGpG,MAAM,WAAW,KAAK,KAAK,cAAc,mCAAmC;AAC5E,QAAM,GAAG,OAAO,SAAS,CAAC,YAAY,KAAA,EAAU;AAChD,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;IAAE,SAAS;IAAM,UAAU;IAAoC;GAAE,CAAC;GACrG;AAEF,eAAc,IAAI,wBAAwB,OAAO,MAAM;EACrD,MAAM,MAAM,QAAQ;EACpB,MAAM,eAAe,iBAAiB,IAAI;AAC1C,MAAI,CAAC,aACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,4BAA4B;GAAE,EAAE,IAAI;EAGnF,MAAM,WAAW,EAAE,IAAI,MAAM,QAAQ;EAGrC,MAAM,SAAS,MAAM,mBAAmB,cAF1B,WAAW,KAAK,IAAI,KAAK,IAAI,OAAO,SAAS,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,GAElB;AAC5D,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,QAAQ;GAAE,CAAC;GAChD"}
@@ -1,7 +1,7 @@
1
1
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
2
- import { readdir, realpath, stat } from "node:fs/promises";
3
- import * as path$1 from "node:path";
4
2
  import * as os$1 from "node:os";
3
+ import * as path$1 from "node:path";
4
+ import { readdir, realpath, stat } from "node:fs/promises";
5
5
  //#region src/gateway/hono/routes/host-fs.ts
6
6
  const log = createGatewayRouteLogger("HostFs");
7
7
  function jsonError(status, message) {
@@ -1,12 +1,14 @@
1
1
  import { registerAgentStreamRoutes } from "./agent-stream.js";
2
2
  import { registerSessionsRoutes } from "./sessions.js";
3
3
  import { registerStatusRoutes } from "./status.js";
4
+ import { registerMemoryRoutes } from "./memory.js";
4
5
  import { mountAppLazyRoutePrefixes, registerAuthenticatedLazyRouteFallback } from "./lazy-fallback.js";
5
6
  //#region src/gateway/hono/routes/index.ts
6
7
  function registerCoreAuthenticatedRoutes(authenticated, deps) {
7
8
  registerStatusRoutes(authenticated, deps);
8
9
  registerAgentStreamRoutes(authenticated, deps);
9
10
  registerSessionsRoutes(authenticated, deps);
11
+ registerMemoryRoutes(authenticated, deps);
10
12
  }
11
13
  function registerAuthenticatedRoutes(app, authenticated, deps) {
12
14
  registerCoreAuthenticatedRoutes(authenticated, deps);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":";;;;;AAWA,SAAgB,gCACd,eACA,MACM;AACN,sBAAqB,eAAe,KAAK;AACzC,2BAA0B,eAAe,KAAK;AAC9C,wBAAuB,eAAe,KAAK;;AAG7C,SAAgB,4BAA4B,KAAW,eAAqB,MAAoC;AAC9G,iCAAgC,eAAe,KAAK;AACpD,wCAAuC,eAAe,KAAK;AAC3D,2BAA0B,KAAK;EAAE,SAAS,KAAK;EAAS;EAAM,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":";;;;;;AAYA,SAAgB,gCACd,eACA,MACM;AACN,sBAAqB,eAAe,KAAK;AACzC,2BAA0B,eAAe,KAAK;AAC9C,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;;AAG3C,SAAgB,4BAA4B,KAAW,eAAqB,MAAoC;AAC9G,iCAAgC,eAAe,KAAK;AACpD,wCAAuC,eAAe,KAAK;AAC3D,2BAA0B,KAAK;EAAE,SAAS,KAAK;EAAS;EAAM,CAAC"}
@@ -88,6 +88,14 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
88
88
  return { register: registerAgentsRoutes };
89
89
  }
90
90
  },
91
+ {
92
+ id: "capability-presets",
93
+ match: (path) => startsWithAny(path, ["/api/capability-presets"]),
94
+ load: async () => {
95
+ const { registerCapabilityPresetsRoutes } = await import("./capability-presets.js");
96
+ return { register: registerCapabilityPresetsRoutes };
97
+ }
98
+ },
91
99
  {
92
100
  id: "auth-registry-extensions",
93
101
  match: (path) => startsWithAny(path, [
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-bundles.js","names":[],"sources":["../../../../../src/gateway/hono/routes/lazy-bundles.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport type { GatewayService } from '../../service.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nexport type AuthenticatedLazyRouteBundle = {\n id: string;\n match: (path: string) => boolean;\n load: () => Promise<{ register: (authenticated: Hono, deps: AuthenticatedRouteDeps) => void }>;\n};\n\nexport type AppLazyRouteBundle = {\n id: string;\n prefixes: readonly string[];\n match: (path: string) => boolean;\n load: () => Promise<{\n registerOnApp: (app: Hono, service: GatewayService) => void;\n }>;\n};\n\nfunction startsWithAny(path: string, prefixes: readonly string[]): boolean {\n return prefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`));\n}\n\nexport const AUTHENTICATED_LAZY_ROUTE_BUNDLES: readonly AuthenticatedLazyRouteBundle[] = [\n {\n id: 'media',\n match: (path) => startsWithAny(path, ['/api/media']),\n load: async () => {\n const { registerMediaRoutes } = await import('./media.js');\n return { register: registerMediaRoutes };\n },\n },\n {\n id: 'workspace',\n match: (path) => startsWithAny(path, ['/api/workspace']),\n load: async () => {\n const { registerWorkspaceRoutes } = await import('./workspace.js');\n return { register: registerWorkspaceRoutes };\n },\n },\n {\n id: 'host-fs',\n match: (path) => startsWithAny(path, ['/api/host/fs']),\n load: async () => {\n const { registerHostFsRoutes } = await import('./host-fs.js');\n return { register: registerHostFsRoutes };\n },\n },\n {\n id: 'channels',\n match: (path) => startsWithAny(path, ['/api/channels']),\n load: async () => {\n const { registerChannelRoutes } = await import('./channels.js');\n return { register: registerChannelRoutes };\n },\n },\n {\n id: 'browser-install',\n match: (path) =>\n path === '/api/browser/playwright/install/stream' ||\n path === '/api/browser/cloakbrowser/install/stream',\n load: async () => {\n const { registerBrowserInstallRoutes } = await import('./browser-install.js');\n return { register: registerBrowserInstallRoutes };\n },\n },\n {\n id: 'browser',\n // `browser-install` above already matched the SSE install streams; this\n // catches the remaining /api/browser/* handlers (extension, cdp,\n // cloakbrowser doctor/launch/install, playwright doctor/install, cloud).\n match: (path) => startsWithAny(path, ['/api/browser']),\n load: async () => {\n const { registerBrowserRoutes } = await import('./browser.js');\n return { register: registerBrowserRoutes };\n },\n },\n {\n id: 'config',\n match: (path) =>\n startsWithAny(path, [\n '/api/config',\n '/api/heartbeat/trigger',\n // Secret reveal handlers live in config routes but use /api/gateway and\n // /api/tools paths; without these prefixes the extension-gateway bundle\n // matches first and returns 404 (no handler for multi-segment paths).\n '/api/gateway/reveal-auth-secret',\n '/api/tools/web/reveal-search-api-key',\n ]),\n load: async () => {\n const { registerConfigRoutes } = await import('./config.js');\n return { register: registerConfigRoutes };\n },\n },\n {\n id: 'doctor',\n match: (path) => startsWithAny(path, ['/api/doctor']),\n load: async () => {\n const { registerDoctorRoutes } = await import('./doctor.js');\n return { register: registerDoctorRoutes };\n },\n },\n {\n id: 'dreaming',\n match: (path) => startsWithAny(path, ['/api/dreaming']),\n load: async () => {\n const { registerDreamingRoutes } = await import('./dreaming.js');\n return { register: registerDreamingRoutes };\n },\n },\n {\n id: 'agents',\n match: (path) => startsWithAny(path, ['/api/agents', '/api/voice/models']),\n load: async () => {\n const { registerAgentsRoutes } = await import('./agents.js');\n return { register: registerAgentsRoutes };\n },\n },\n {\n id: 'auth-registry-extensions',\n match: (path) =>\n startsWithAny(path, [\n '/api/auth',\n '/api/registry',\n '/api/extensions',\n '/api/context',\n '/api/marketplace',\n ]),\n load: async () => {\n const { registerAuthRegistryExtensionsRoutes } = await import('./auth-registry-extensions.js');\n return { register: registerAuthRegistryExtensionsRoutes };\n },\n },\n {\n id: 'models',\n match: (path) =>\n startsWithAny(path, ['/api/models', '/api/models-json', '/api/providers', '/api/image']),\n load: async () => {\n const { registerModelsRoutes } = await import('./models.js');\n return { register: registerModelsRoutes };\n },\n },\n {\n id: 'ai-assist',\n match: (path) => startsWithAny(path, ['/api/ai']),\n load: async () => {\n const { registerAiAssistRoutes } = await import('./ai-assist.js');\n return { register: registerAiAssistRoutes };\n },\n },\n {\n id: 'commands-skills',\n match: (path) => startsWithAny(path, ['/api/commands', '/api/skills', '/api/chat/skills']),\n load: async () => {\n const { registerCommandsSkillsRoutes } = await import('./commands-skills.js');\n return { register: registerCommandsSkillsRoutes };\n },\n },\n {\n id: 'cron',\n match: (path) => startsWithAny(path, ['/api/cron']),\n load: async () => {\n const { registerCronRoutes } = await import('./cron.js');\n return { register: registerCronRoutes };\n },\n },\n {\n id: 'goals',\n match: (path) => startsWithAny(path, ['/api/goals']),\n load: async () => {\n const { registerGoalsRoutes } = await import('./goals.js');\n return { register: registerGoalsRoutes };\n },\n },\n {\n id: 'notes',\n match: (path) => startsWithAny(path, ['/api/notes']),\n load: async () => {\n const { registerNotesRoutes } = await import('./notes.js');\n return { register: registerNotesRoutes };\n },\n },\n {\n id: 'home',\n match: (path) => startsWithAny(path, ['/api/home']),\n load: async () => {\n const { registerHomeRoutes } = await import('./home.js');\n return { register: registerHomeRoutes };\n },\n },\n {\n id: 'workflows',\n match: (path) => startsWithAny(path, ['/api/workflows']),\n load: async () => {\n const { registerWorkflowRoutes } = await import('./workflows.js');\n return { register: registerWorkflowRoutes };\n },\n },\n {\n id: 'logs',\n match: (path) => startsWithAny(path, ['/api/logs']),\n load: async () => {\n const { registerLogsRoutes } = await import('./logs.js');\n return { register: registerLogsRoutes };\n },\n },\n {\n id: 'shares',\n match: (path) => startsWithAny(path, ['/api/shares']),\n load: async () => {\n const { registerShareRoutes } = await import('./shares.js');\n return { register: registerShareRoutes };\n },\n },\n {\n id: 'site-shares',\n match: (path) => startsWithAny(path, ['/api/site-shares']),\n load: async () => {\n const { registerSiteShareRoutes } = await import('./site-shares.js');\n return { register: registerSiteShareRoutes };\n },\n },\n {\n id: 'tunnel',\n match: (path) => startsWithAny(path, ['/api/tunnel']),\n load: async () => {\n const { registerTunnelRoutes } = await import('./tunnel.js');\n return { register: registerTunnelRoutes };\n },\n },\n {\n id: 'exposure',\n match: (path) => startsWithAny(path, ['/api/exposure']),\n load: async () => {\n const { registerExposureRoutes } = await import('./exposure.js');\n return { register: registerExposureRoutes };\n },\n },\n {\n id: 'extension-gateway',\n match: (path) => startsWithAny(path, ['/api/gateway']),\n load: async () => {\n const { registerExtensionGatewayRoutes } = await import('./extension-gateway.js');\n return { register: registerExtensionGatewayRoutes };\n },\n },\n {\n id: 'update',\n match: (path) => startsWithAny(path, ['/api/update']),\n load: async () => {\n const { registerUpdateRoutes } = await import('./update.js');\n return { register: registerUpdateRoutes };\n },\n },\n {\n id: 'voice',\n match: (path) => startsWithAny(path, ['/api/voice']) && path !== '/api/voice/models',\n load: async () => {\n const { registerVoiceRoutes } = await import('./voice.js');\n return { register: registerVoiceRoutes };\n },\n },\n {\n id: 'connectors',\n match: (path) => startsWithAny(path, ['/api/connectors']),\n load: async () => {\n const { registerConnectorRoutes } = await import('./connectors.js');\n return { register: registerConnectorRoutes };\n },\n },\n {\n id: 'tui',\n match: (path) => startsWithAny(path, ['/api/tui']),\n load: async () => {\n const { registerTuiRoutes } = await import('./tui.js');\n return { register: registerTuiRoutes };\n },\n },\n {\n id: 'mcp',\n match: (path) => startsWithAny(path, ['/api/mcp']),\n load: async () => {\n const { registerMcpRoutes } = await import('./mcp.js');\n return { register: registerMcpRoutes };\n },\n },\n];\n\nexport const APP_LAZY_ROUTE_BUNDLES: readonly AppLazyRouteBundle[] = [\n {\n id: 'shares-public',\n prefixes: ['/s'],\n match: (path) => startsWithAny(path, ['/s']),\n load: async () => {\n const { registerSharePublicRoutes } = await import('./shares.js');\n return { registerOnApp: registerSharePublicRoutes };\n },\n },\n {\n id: 'tunnel-public',\n prefixes: [\n '/api/tunnel/pair/ping',\n '/api/tunnel/pair/validate-url',\n '/api/tunnel/exchange-token',\n ],\n match: (path) =>\n path === '/api/tunnel/exchange-token' ||\n path === '/api/tunnel/pair/ping' ||\n path === '/api/tunnel/pair/validate-url',\n load: async () => {\n const { registerTunnelPublicRoutes } = await import('./tunnel.js');\n return { registerOnApp: registerTunnelPublicRoutes };\n },\n },\n];\n\nexport function findAuthenticatedLazyRouteBundle(path: string): AuthenticatedLazyRouteBundle | undefined {\n return AUTHENTICATED_LAZY_ROUTE_BUNDLES.find((bundle) => bundle.match(path));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"lazy-bundles.js","names":[],"sources":["../../../../../src/gateway/hono/routes/lazy-bundles.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport type { GatewayService } from '../../service.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nexport type AuthenticatedLazyRouteBundle = {\n id: string;\n match: (path: string) => boolean;\n load: () => Promise<{ register: (authenticated: Hono, deps: AuthenticatedRouteDeps) => void }>;\n};\n\nexport type AppLazyRouteBundle = {\n id: string;\n prefixes: readonly string[];\n match: (path: string) => boolean;\n load: () => Promise<{\n registerOnApp: (app: Hono, service: GatewayService) => void;\n }>;\n};\n\nfunction startsWithAny(path: string, prefixes: readonly string[]): boolean {\n return prefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`));\n}\n\nexport const AUTHENTICATED_LAZY_ROUTE_BUNDLES: readonly AuthenticatedLazyRouteBundle[] = [\n {\n id: 'media',\n match: (path) => startsWithAny(path, ['/api/media']),\n load: async () => {\n const { registerMediaRoutes } = await import('./media.js');\n return { register: registerMediaRoutes };\n },\n },\n {\n id: 'workspace',\n match: (path) => startsWithAny(path, ['/api/workspace']),\n load: async () => {\n const { registerWorkspaceRoutes } = await import('./workspace.js');\n return { register: registerWorkspaceRoutes };\n },\n },\n {\n id: 'host-fs',\n match: (path) => startsWithAny(path, ['/api/host/fs']),\n load: async () => {\n const { registerHostFsRoutes } = await import('./host-fs.js');\n return { register: registerHostFsRoutes };\n },\n },\n {\n id: 'channels',\n match: (path) => startsWithAny(path, ['/api/channels']),\n load: async () => {\n const { registerChannelRoutes } = await import('./channels.js');\n return { register: registerChannelRoutes };\n },\n },\n {\n id: 'browser-install',\n match: (path) =>\n path === '/api/browser/playwright/install/stream' ||\n path === '/api/browser/cloakbrowser/install/stream',\n load: async () => {\n const { registerBrowserInstallRoutes } = await import('./browser-install.js');\n return { register: registerBrowserInstallRoutes };\n },\n },\n {\n id: 'browser',\n // `browser-install` above already matched the SSE install streams; this\n // catches the remaining /api/browser/* handlers (extension, cdp,\n // cloakbrowser doctor/launch/install, playwright doctor/install, cloud).\n match: (path) => startsWithAny(path, ['/api/browser']),\n load: async () => {\n const { registerBrowserRoutes } = await import('./browser.js');\n return { register: registerBrowserRoutes };\n },\n },\n {\n id: 'config',\n match: (path) =>\n startsWithAny(path, [\n '/api/config',\n '/api/heartbeat/trigger',\n // Secret reveal handlers live in config routes but use /api/gateway and\n // /api/tools paths; without these prefixes the extension-gateway bundle\n // matches first and returns 404 (no handler for multi-segment paths).\n '/api/gateway/reveal-auth-secret',\n '/api/tools/web/reveal-search-api-key',\n ]),\n load: async () => {\n const { registerConfigRoutes } = await import('./config.js');\n return { register: registerConfigRoutes };\n },\n },\n {\n id: 'doctor',\n match: (path) => startsWithAny(path, ['/api/doctor']),\n load: async () => {\n const { registerDoctorRoutes } = await import('./doctor.js');\n return { register: registerDoctorRoutes };\n },\n },\n {\n id: 'dreaming',\n match: (path) => startsWithAny(path, ['/api/dreaming']),\n load: async () => {\n const { registerDreamingRoutes } = await import('./dreaming.js');\n return { register: registerDreamingRoutes };\n },\n },\n {\n id: 'agents',\n match: (path) => startsWithAny(path, ['/api/agents', '/api/voice/models']),\n load: async () => {\n const { registerAgentsRoutes } = await import('./agents.js');\n return { register: registerAgentsRoutes };\n },\n },\n {\n id: 'capability-presets',\n match: (path) => startsWithAny(path, ['/api/capability-presets']),\n load: async () => {\n const { registerCapabilityPresetsRoutes } = await import('./capability-presets.js');\n return { register: registerCapabilityPresetsRoutes };\n },\n },\n {\n id: 'auth-registry-extensions',\n match: (path) =>\n startsWithAny(path, [\n '/api/auth',\n '/api/registry',\n '/api/extensions',\n '/api/context',\n '/api/marketplace',\n ]),\n load: async () => {\n const { registerAuthRegistryExtensionsRoutes } = await import('./auth-registry-extensions.js');\n return { register: registerAuthRegistryExtensionsRoutes };\n },\n },\n {\n id: 'models',\n match: (path) =>\n startsWithAny(path, ['/api/models', '/api/models-json', '/api/providers', '/api/image']),\n load: async () => {\n const { registerModelsRoutes } = await import('./models.js');\n return { register: registerModelsRoutes };\n },\n },\n {\n id: 'ai-assist',\n match: (path) => startsWithAny(path, ['/api/ai']),\n load: async () => {\n const { registerAiAssistRoutes } = await import('./ai-assist.js');\n return { register: registerAiAssistRoutes };\n },\n },\n {\n id: 'commands-skills',\n match: (path) => startsWithAny(path, ['/api/commands', '/api/skills', '/api/chat/skills']),\n load: async () => {\n const { registerCommandsSkillsRoutes } = await import('./commands-skills.js');\n return { register: registerCommandsSkillsRoutes };\n },\n },\n {\n id: 'cron',\n match: (path) => startsWithAny(path, ['/api/cron']),\n load: async () => {\n const { registerCronRoutes } = await import('./cron.js');\n return { register: registerCronRoutes };\n },\n },\n {\n id: 'goals',\n match: (path) => startsWithAny(path, ['/api/goals']),\n load: async () => {\n const { registerGoalsRoutes } = await import('./goals.js');\n return { register: registerGoalsRoutes };\n },\n },\n {\n id: 'notes',\n match: (path) => startsWithAny(path, ['/api/notes']),\n load: async () => {\n const { registerNotesRoutes } = await import('./notes.js');\n return { register: registerNotesRoutes };\n },\n },\n {\n id: 'home',\n match: (path) => startsWithAny(path, ['/api/home']),\n load: async () => {\n const { registerHomeRoutes } = await import('./home.js');\n return { register: registerHomeRoutes };\n },\n },\n {\n id: 'workflows',\n match: (path) => startsWithAny(path, ['/api/workflows']),\n load: async () => {\n const { registerWorkflowRoutes } = await import('./workflows.js');\n return { register: registerWorkflowRoutes };\n },\n },\n {\n id: 'logs',\n match: (path) => startsWithAny(path, ['/api/logs']),\n load: async () => {\n const { registerLogsRoutes } = await import('./logs.js');\n return { register: registerLogsRoutes };\n },\n },\n {\n id: 'shares',\n match: (path) => startsWithAny(path, ['/api/shares']),\n load: async () => {\n const { registerShareRoutes } = await import('./shares.js');\n return { register: registerShareRoutes };\n },\n },\n {\n id: 'site-shares',\n match: (path) => startsWithAny(path, ['/api/site-shares']),\n load: async () => {\n const { registerSiteShareRoutes } = await import('./site-shares.js');\n return { register: registerSiteShareRoutes };\n },\n },\n {\n id: 'tunnel',\n match: (path) => startsWithAny(path, ['/api/tunnel']),\n load: async () => {\n const { registerTunnelRoutes } = await import('./tunnel.js');\n return { register: registerTunnelRoutes };\n },\n },\n {\n id: 'exposure',\n match: (path) => startsWithAny(path, ['/api/exposure']),\n load: async () => {\n const { registerExposureRoutes } = await import('./exposure.js');\n return { register: registerExposureRoutes };\n },\n },\n {\n id: 'extension-gateway',\n match: (path) => startsWithAny(path, ['/api/gateway']),\n load: async () => {\n const { registerExtensionGatewayRoutes } = await import('./extension-gateway.js');\n return { register: registerExtensionGatewayRoutes };\n },\n },\n {\n id: 'update',\n match: (path) => startsWithAny(path, ['/api/update']),\n load: async () => {\n const { registerUpdateRoutes } = await import('./update.js');\n return { register: registerUpdateRoutes };\n },\n },\n {\n id: 'voice',\n match: (path) => startsWithAny(path, ['/api/voice']) && path !== '/api/voice/models',\n load: async () => {\n const { registerVoiceRoutes } = await import('./voice.js');\n return { register: registerVoiceRoutes };\n },\n },\n {\n id: 'connectors',\n match: (path) => startsWithAny(path, ['/api/connectors']),\n load: async () => {\n const { registerConnectorRoutes } = await import('./connectors.js');\n return { register: registerConnectorRoutes };\n },\n },\n {\n id: 'tui',\n match: (path) => startsWithAny(path, ['/api/tui']),\n load: async () => {\n const { registerTuiRoutes } = await import('./tui.js');\n return { register: registerTuiRoutes };\n },\n },\n {\n id: 'mcp',\n match: (path) => startsWithAny(path, ['/api/mcp']),\n load: async () => {\n const { registerMcpRoutes } = await import('./mcp.js');\n return { register: registerMcpRoutes };\n },\n },\n];\n\nexport const APP_LAZY_ROUTE_BUNDLES: readonly AppLazyRouteBundle[] = [\n {\n id: 'shares-public',\n prefixes: ['/s'],\n match: (path) => startsWithAny(path, ['/s']),\n load: async () => {\n const { registerSharePublicRoutes } = await import('./shares.js');\n return { registerOnApp: registerSharePublicRoutes };\n },\n },\n {\n id: 'tunnel-public',\n prefixes: [\n '/api/tunnel/pair/ping',\n '/api/tunnel/pair/validate-url',\n '/api/tunnel/exchange-token',\n ],\n match: (path) =>\n path === '/api/tunnel/exchange-token' ||\n path === '/api/tunnel/pair/ping' ||\n path === '/api/tunnel/pair/validate-url',\n load: async () => {\n const { registerTunnelPublicRoutes } = await import('./tunnel.js');\n return { registerOnApp: registerTunnelPublicRoutes };\n },\n },\n];\n\nexport function findAuthenticatedLazyRouteBundle(path: string): AuthenticatedLazyRouteBundle | undefined {\n return AUTHENTICATED_LAZY_ROUTE_BUNDLES.find((bundle) => bundle.match(path));\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 registerMemoryRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void;