@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.config.js","names":[],"sources":["../../../src/commands/agents.config.ts"],"sourcesContent":["/**\n * Mutate `agents.list` / bindings when adding or removing agents.\n */\n\nimport { rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\n\nimport type { Config } from '../config/schema.js';\nimport {\n listAgentEntries,\n normalizeAgentId,\n resolveAgentHomeDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n DEFAULT_AGENT_ID,\n} from '../agent/agent-scope.js';\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport { listAgentEntries };\n\nexport function findAgentEntryIndex(list: AgentEntry[], agentId: string): number {\n const id = normalizeAgentId(agentId);\n return list.findIndex((e) => normalizeAgentId(e.id) === id);\n}\n\nexport function applyAgentConfig(\n cfg: Config,\n params: {\n agentId: string;\n workspace?: string;\n agentDir?: string;\n model?: string;\n models?: AgentEntry['models'];\n skills?: string[];\n tools?: AgentEntry['tools'];\n },\n): Config {\n const agentId = normalizeAgentId(params.agentId);\n const list = listAgentEntries(cfg);\n const index = findAgentEntryIndex(list, agentId);\n const base = index >= 0 ? list[index] : { id: agentId, enabled: true as const };\n const nextEntry: AgentEntry = {\n ...base,\n enabled: base.enabled ?? true,\n ...(params.workspace ? { workspace: params.workspace } : {}),\n ...(params.agentDir ? { agentDir: params.agentDir } : {}),\n ...(params.models ? { models: params.models } : {}),\n ...(params.model ? { models: { ...base.models, chat: { primary: params.model } } } : {}),\n ...(params.skills ? { skills: params.skills } : {}),\n ...(params.tools ? { tools: params.tools } : {}),\n };\n const nextList = [...list];\n if (index >= 0) {\n nextList[index] = nextEntry;\n } else {\n if (nextList.length === 0 && agentId !== normalizeAgentId(resolveDefaultAgentId(cfg))) {\n nextList.push({ id: resolveDefaultAgentId(cfg), enabled: true });\n }\n nextList.push(nextEntry);\n }\n return {\n ...cfg,\n agents: {\n ...cfg.agents,\n list: nextList,\n },\n };\n}\n\nexport function pruneAgentConfig(\n cfg: Config,\n agentId: string,\n): { config: Config; removedBindings: number } {\n const id = normalizeAgentId(agentId);\n const agents = listAgentEntries(cfg);\n const nextAgentsList = agents.filter((e) => normalizeAgentId(e.id) !== id);\n const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : undefined;\n\n const bindings = cfg.bindings ?? [];\n const filteredBindings = bindings.filter((b) => normalizeAgentId(b.agentId) !== id);\n\n return {\n config: {\n ...cfg,\n agents: nextAgents ? { ...cfg.agents, list: nextAgents } : { ...cfg.agents, list: undefined },\n bindings: filteredBindings,\n },\n removedBindings: bindings.length - filteredBindings.length,\n };\n}\n\nexport async function removeAgentDirsFromDisk(cfg: Config, id: string): Promise<void> {\n const aid = normalizeAgentId(id);\n if (aid === DEFAULT_AGENT_ID) {\n throw new Error('Refusing to delete the main agent home on disk from this command.');\n }\n const home = resolveAgentHomeDir(cfg, aid);\n const ws = resolveAgentWorkspaceDir(cfg, aid);\n if (existsSync(home)) {\n await rm(home, { recursive: true, force: true });\n }\n if (existsSync(ws) && ws !== home) {\n await rm(ws, { recursive: true, force: true });\n }\n}\n"],"mappings":";;;;;;;kBAeiC;AAMjC,SAAgB,oBAAoB,MAAoB,SAAyB;CAC/E,MAAM,KAAK,iBAAiB,QAAQ;AACpC,QAAO,KAAK,WAAW,MAAM,iBAAiB,EAAE,GAAG,KAAK,GAAG;;AAG7D,SAAgB,iBACd,KACA,QASQ;CACR,MAAM,UAAU,iBAAiB,OAAO,QAAQ;CAChD,MAAM,OAAO,iBAAiB,IAAI;CAClC,MAAM,QAAQ,oBAAoB,MAAM,QAAQ;CAChD,MAAM,OAAO,SAAS,IAAI,KAAK,SAAS;EAAE,IAAI;EAAS,SAAS;EAAe;CAC/E,MAAM,YAAwB;EAC5B,GAAG;EACH,SAAS,KAAK,WAAW;EACzB,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,WAAW,GAAG,EAAE;EAC3D,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACxD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,QAAQ,EAAE,QAAQ;GAAE,GAAG,KAAK;GAAQ,MAAM,EAAE,SAAS,OAAO,OAAO;GAAE,EAAE,GAAG,EAAE;EACvF,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE;EAChD;CACD,MAAM,WAAW,CAAC,GAAG,KAAK;AAC1B,KAAI,SAAS,EACX,UAAS,SAAS;MACb;AACL,MAAI,SAAS,WAAW,KAAK,YAAY,iBAAiB,sBAAsB,IAAI,CAAC,CACnF,UAAS,KAAK;GAAE,IAAI,sBAAsB,IAAI;GAAE,SAAS;GAAM,CAAC;AAElE,WAAS,KAAK,UAAU;;AAE1B,QAAO;EACL,GAAG;EACH,QAAQ;GACN,GAAG,IAAI;GACP,MAAM;GACP;EACF;;AAGH,SAAgB,iBACd,KACA,SAC6C;CAC7C,MAAM,KAAK,iBAAiB,QAAQ;CAEpC,MAAM,iBADS,iBAAiB,IACH,CAAC,QAAQ,MAAM,iBAAiB,EAAE,GAAG,KAAK,GAAG;CAC1E,MAAM,aAAa,eAAe,SAAS,IAAI,iBAAiB,KAAA;CAEhE,MAAM,WAAW,IAAI,YAAY,EAAE;CACnC,MAAM,mBAAmB,SAAS,QAAQ,MAAM,iBAAiB,EAAE,QAAQ,KAAK,GAAG;AAEnF,QAAO;EACL,QAAQ;GACN,GAAG;GACH,QAAQ,aAAa;IAAE,GAAG,IAAI;IAAQ,MAAM;IAAY,GAAG;IAAE,GAAG,IAAI;IAAQ,MAAM,KAAA;IAAW;GAC7F,UAAU;GACX;EACD,iBAAiB,SAAS,SAAS,iBAAiB;EACrD;;AAGH,eAAsB,wBAAwB,KAAa,IAA2B;CACpF,MAAM,MAAM,iBAAiB,GAAG;AAChC,KAAI,QAAA,OACF,OAAM,IAAI,MAAM,oEAAoE;CAEtF,MAAM,OAAO,oBAAoB,KAAK,IAAI;CAC1C,MAAM,KAAK,yBAAyB,KAAK,IAAI;AAC7C,KAAI,WAAW,KAAK,CAClB,OAAM,GAAG,MAAM;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAElD,KAAI,WAAW,GAAG,IAAI,OAAO,KAC3B,OAAM,GAAG,IAAI;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC"}
1
+ {"version":3,"file":"agents.config.js","names":[],"sources":["../../../src/commands/agents.config.ts"],"sourcesContent":["/**\n * Mutate `agents.list` / bindings when adding or removing agents.\n */\n\nimport { rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\n\nimport type { Config } from '../config/schema.js';\nimport {\n listAgentEntries,\n normalizeAgentId,\n resolveAgentHomeDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n DEFAULT_AGENT_ID,\n} from '../agent/agent-scope.js';\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport { listAgentEntries };\n\nexport function findAgentEntryIndex(list: AgentEntry[], agentId: string): number {\n const id = normalizeAgentId(agentId);\n return list.findIndex((e) => normalizeAgentId(e.id) === id);\n}\n\nexport function applyAgentConfig(\n cfg: Config,\n params: {\n agentId: string;\n workspace?: string;\n model?: string;\n models?: AgentEntry['models'];\n skills?: string[];\n tools?: AgentEntry['tools'];\n },\n): Config {\n const agentId = normalizeAgentId(params.agentId);\n const list = listAgentEntries(cfg);\n const index = findAgentEntryIndex(list, agentId);\n const nextTools = params.tools;\n const base = index >= 0 ? list[index] : {\n id: agentId,\n enabled: true as const,\n identity: { name: agentId, role: 'Agent', language: 'en', tone: 'direct' },\n responsibilities: { primary: ['Help the user complete tasks'] },\n workspace: { root: `~/.xopc/workspace/${agentId}` },\n models: { defaultRole: 'deep', roles: { deep: { model: params.model ?? 'openai/gpt-4.1' } } },\n tools: { builtin: {} },\n skills: { mode: 'all' as const },\n memory: { mode: 'confirmWrite' as const, sources: ['session' as const, 'curated' as const], writePolicy: { curated: 'confirm' as const } },\n workflows: {},\n boundaries: { requiresConfirmation: [], forbidden: [], escalation: [] },\n };\n const nextEntry: AgentEntry = {\n ...base,\n enabled: base.enabled ?? true,\n ...(params.workspace ? { workspace: { root: params.workspace } } : {}),\n ...(params.models ? { models: params.models } : {}),\n ...(params.model ? { models: { ...base.models, defaultRole: 'deep', roles: { ...base.models.roles, deep: { model: params.model } } } } : {}),\n ...(params.skills ? { skills: { mode: 'allowlist' as const, allow: params.skills } } : {}),\n ...(nextTools ? { tools: nextTools } : {}),\n };\n const nextList = [...list];\n if (index >= 0) {\n nextList[index] = nextEntry;\n } else {\n if (nextList.length === 0 && agentId !== normalizeAgentId(resolveDefaultAgentId(cfg))) {\n nextList.push({\n id: resolveDefaultAgentId(cfg),\n enabled: true,\n identity: { name: resolveDefaultAgentId(cfg), role: 'Agent', language: 'en', tone: 'direct' },\n responsibilities: { primary: ['Help the user complete tasks'] },\n workspace: { root: `~/.xopc/workspace/${resolveDefaultAgentId(cfg)}` },\n models: { defaultRole: 'deep', roles: { deep: { model: 'openai/gpt-4.1' } } },\n tools: { builtin: {} },\n skills: { mode: 'all' },\n memory: { mode: 'confirmWrite', sources: ['session', 'curated'], writePolicy: { curated: 'confirm' } },\n workflows: {},\n boundaries: { requiresConfirmation: [], forbidden: [], escalation: [] },\n });\n }\n nextList.push(nextEntry);\n }\n return {\n ...cfg,\n agents: {\n ...cfg.agents,\n list: nextList,\n },\n };\n}\n\nexport function pruneAgentConfig(\n cfg: Config,\n agentId: string,\n): { config: Config; removedBindings: number } {\n const id = normalizeAgentId(agentId);\n const agents = listAgentEntries(cfg);\n const nextAgentsList = agents.filter((e) => normalizeAgentId(e.id) !== id);\n const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : [];\n\n const bindings = cfg.bindings ?? [];\n const filteredBindings = bindings.filter((b) => normalizeAgentId(b.agentId) !== id);\n\n return {\n config: {\n ...cfg,\n agents: { ...cfg.agents, list: nextAgents },\n bindings: filteredBindings,\n },\n removedBindings: bindings.length - filteredBindings.length,\n };\n}\n\nexport async function removeAgentDirsFromDisk(cfg: Config, id: string): Promise<void> {\n const aid = normalizeAgentId(id);\n if (aid === DEFAULT_AGENT_ID) {\n throw new Error('Refusing to delete the main agent home on disk from this command.');\n }\n const home = resolveAgentHomeDir(cfg, aid);\n const ws = resolveAgentWorkspaceDir(cfg, aid);\n if (existsSync(home)) {\n await rm(home, { recursive: true, force: true });\n }\n if (existsSync(ws) && ws !== home) {\n await rm(ws, { recursive: true, force: true });\n }\n}\n"],"mappings":"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"}
@@ -1,38 +1,26 @@
1
- /**
2
- * Effective agent profile: merges `agents.defaults` with `agents.list` entry.
3
- * Subagent session keys fall back to the configured default agent id for profile lookup.
4
- */
1
+ import { type EffectiveAgentManifest } from '../agent-manifest/index.js';
5
2
  import type { ThinkLevel, ReasoningLevel, VerboseLevel } from '../agent/transcript/thinking-types.js';
6
3
  import type { Config } from './schema.js';
7
- import type { AgentModelConfig } from './schema.js';
8
4
  export { resolveAgentWorkspaceDir } from '../agent/agent-scope.js';
9
- export type { AgentModelConfig };
10
5
  export interface EffectiveAgentTools {
11
- /** Tool names to exclude (merged: union of defaults + list entry disables). */
12
- disable: Set<string>;
6
+ denied: Set<string>;
13
7
  }
14
8
  export interface EffectiveAgentProfile {
15
9
  agentId: string;
16
- /** Resolved absolute Markdown workspace path (tool cwd, attachments, daily memory/, …). */
10
+ manifest: EffectiveAgentManifest;
17
11
  resolvedWorkspacePath: string;
18
- /** Primary model ref (provider/model); may be empty → runtime default. */
19
12
  primaryModelRef: string | undefined;
20
13
  fallbacks: string[];
21
14
  thinkingDefault?: ThinkLevel;
22
15
  reasoningDefault?: ReasoningLevel;
23
16
  verboseDefault?: VerboseLevel;
24
17
  systemPromptOverride?: string;
25
- /** Skill names visible in `<available_skills>`; undefined means all enabled skills, empty means none. */
26
18
  skillsAllowlist?: string[];
27
19
  tools: EffectiveAgentTools;
28
20
  params: Record<string, unknown>;
29
21
  }
30
- /**
31
- * Agent id used for config lookup from a session key (subagent keys → default agent).
32
- */
33
22
  export declare function extractProfileAgentId(sessionKey: string | undefined | null, config: Config): string;
34
- /**
35
- * Merge `agents.defaults` with the matching `agents.list` entry.
36
- */
23
+ export declare function resolveEffectiveAgentManifestForAgent(config: Config, agentId: string): EffectiveAgentManifest;
24
+ export declare function resolveEffectiveAgentManifestForSession(config: Config, sessionKey: string | undefined | null): EffectiveAgentManifest;
37
25
  export declare function resolveEffectiveAgentProfile(config: Config, agentId: string): EffectiveAgentProfile;
38
26
  export declare function resolveEffectiveAgentProfileForSession(config: Config, sessionKey: string | undefined | null): EffectiveAgentProfile;
@@ -1,47 +1,16 @@
1
- import { init_agent_scope, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
2
- import { getAgentDefaultModelRef, init_schema } from "./schema.js";
1
+ import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
2
+ import "../agent-manifest/index.js";
3
+ import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
3
4
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
4
5
  import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
6
  //#region src/config/agent-profile.ts
6
- init_schema();
7
7
  init_agent_scope();
8
8
  init_resolve_route();
9
9
  init_session_key();
10
- function mergeModelConfig(base, override) {
11
- if (override === void 0) return base;
12
- if (base === void 0) return override;
13
- return {
14
- primary: override.primary ?? base.primary,
15
- fallbacks: override.fallbacks ?? base.fallbacks
16
- };
17
- }
18
- function primaryAndFallbacksFromModelConfig(raw) {
19
- const primary = raw?.primary?.trim();
20
- const fallbacks = Array.isArray(raw?.fallbacks) ? raw.fallbacks.map((s) => s.trim()).filter(Boolean) : [];
21
- return {
22
- primary: primary || void 0,
23
- fallbacks
24
- };
10
+ function findAgentManifest(config, agentId) {
11
+ const id = normalizeAgentId(agentId);
12
+ return config.agents.list.find((agent) => agent.enabled !== false && normalizeAgentId(agent.id) === id);
25
13
  }
26
- function mergeDisableLists(a, b) {
27
- const out = /* @__PURE__ */ new Set();
28
- for (const x of a ?? []) {
29
- const s = String(x).trim();
30
- if (s) out.add(s);
31
- }
32
- for (const x of b ?? []) {
33
- const s = String(x).trim();
34
- if (s) out.add(s);
35
- }
36
- return out;
37
- }
38
- function resolveSkillsAllowlist(defaultsSkills, entrySkills) {
39
- if (entrySkills !== void 0) return [...entrySkills];
40
- if (defaultsSkills !== void 0) return [...defaultsSkills];
41
- }
42
- /**
43
- * Agent id used for config lookup from a session key (subagent keys → default agent).
44
- */
45
14
  function extractProfileAgentId(sessionKey, config) {
46
15
  const parsed = parseSessionKey(sessionKey ?? "");
47
16
  if (!parsed) return getDefaultAgentId(config);
@@ -50,40 +19,38 @@ function extractProfileAgentId(sessionKey, config) {
50
19
  if (!agentExists(aid, config)) return getDefaultAgentId(config);
51
20
  return aid.toLowerCase();
52
21
  }
53
- /**
54
- * Merge `agents.defaults` with the matching `agents.list` entry.
55
- */
22
+ function resolveEffectiveAgentManifestForAgent(config, agentId) {
23
+ const agent = findAgentManifest(config, agentId) ?? findAgentManifest(config, getDefaultAgentId(config));
24
+ if (!agent) throw new Error(`No enabled agent manifest found for "${agentId}"`);
25
+ return resolveEffectiveAgentManifest({
26
+ agent,
27
+ presets: config.agents.capabilityPresets
28
+ }).manifest;
29
+ }
30
+ function resolveEffectiveAgentManifestForSession(config, sessionKey) {
31
+ return resolveEffectiveAgentManifestForAgent(config, extractProfileAgentId(sessionKey, config));
32
+ }
56
33
  function resolveEffectiveAgentProfile(config, agentId) {
57
- const defaults = config.agents?.defaults;
58
- const list = config.agents?.list;
59
- const entry = Array.isArray(list) ? list.find((a) => a && a.enabled !== false && a.id.toLowerCase() === agentId.toLowerCase()) : void 0;
60
- const resolvedWorkspacePath = resolveAgentWorkspaceDir(config, agentId);
61
- const { primary: primaryFromMerged, fallbacks: fallbacksFromMerged } = primaryAndFallbacksFromModelConfig(mergeModelConfig(defaults?.models?.chat, entry?.models?.chat));
62
- const globalDefault = getAgentDefaultModelRef(config);
63
- const primaryModelRef = primaryFromMerged?.trim() || globalDefault;
64
- const disable = mergeDisableLists(defaults?.tools?.disable, entry?.tools?.disable);
65
- const params = {
66
- ...defaults?.params,
67
- ...entry?.params
68
- };
34
+ const manifest = resolveEffectiveAgentManifestForAgent(config, agentId);
35
+ const defaultModel = manifest.models.roles[manifest.models.defaultRole]?.model;
36
+ const deniedTools = Object.entries(manifest.tools.builtin).filter(([, policy]) => policy.mode === "deny").map(([name]) => name);
37
+ const skillsAllowlist = manifest.skills.mode === "allowlist" ? [...manifest.skills.allow ?? []] : void 0;
69
38
  return {
70
- agentId: agentId.toLowerCase(),
71
- resolvedWorkspacePath,
72
- primaryModelRef,
73
- fallbacks: fallbacksFromMerged,
74
- thinkingDefault: entry?.thinkingDefault ?? defaults?.thinkingDefault,
75
- reasoningDefault: entry?.reasoningDefault ?? defaults?.reasoningDefault,
76
- verboseDefault: entry?.verboseDefault ?? defaults?.verboseDefault,
77
- systemPromptOverride: entry?.systemPromptOverride?.trim() ? entry.systemPromptOverride : defaults?.systemPromptOverride?.trim() ? defaults.systemPromptOverride : void 0,
78
- skillsAllowlist: resolveSkillsAllowlist(defaults?.skills, entry?.skills),
79
- tools: { disable },
80
- params
39
+ agentId: manifest.id,
40
+ manifest,
41
+ resolvedWorkspacePath: resolveAgentWorkspaceDir(config, manifest.id),
42
+ primaryModelRef: defaultModel?.trim() || void 0,
43
+ fallbacks: [],
44
+ systemPromptOverride: manifest.prompt?.customInstructions,
45
+ skillsAllowlist,
46
+ tools: { denied: new Set(deniedTools) },
47
+ params: {}
81
48
  };
82
49
  }
83
50
  function resolveEffectiveAgentProfileForSession(config, sessionKey) {
84
51
  return resolveEffectiveAgentProfile(config, extractProfileAgentId(sessionKey, config));
85
52
  }
86
53
  //#endregion
87
- export { extractProfileAgentId, resolveAgentWorkspaceDir, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession };
54
+ export { extractProfileAgentId, resolveAgentWorkspaceDir, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession };
88
55
 
89
56
  //# sourceMappingURL=agent-profile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-profile.js","names":[],"sources":["../../../src/config/agent-profile.ts"],"sourcesContent":["/**\n * Effective agent profile: merges `agents.defaults` with `agents.list` entry.\n * Subagent session keys fall back to the configured default agent id for profile lookup.\n */\n\nimport type { ThinkLevel, ReasoningLevel, VerboseLevel } from '../agent/transcript/thinking-types.js';\nimport type { Config } from './schema.js';\nimport type { AgentModelConfig } from './schema.js';\nimport { getAgentDefaultModelRef } from './schema.js';\nimport { resolveAgentWorkspaceDir } from '../agent/agent-scope.js';\nimport { getDefaultAgentId, agentExists } from '../routing/resolve-route.js';\nimport { parseSessionKey } from '../routing/session-key.js';\n\nexport { resolveAgentWorkspaceDir } from '../agent/agent-scope.js';\n\nexport type { AgentModelConfig };\n\nexport interface EffectiveAgentTools {\n /** Tool names to exclude (merged: union of defaults + list entry disables). */\n disable: Set<string>;\n}\n\nexport interface EffectiveAgentProfile {\n agentId: string;\n /** Resolved absolute Markdown workspace path (tool cwd, attachments, daily memory/, …). */\n resolvedWorkspacePath: string;\n /** Primary model ref (provider/model); may be empty → runtime default. */\n primaryModelRef: string | undefined;\n fallbacks: string[];\n thinkingDefault?: ThinkLevel;\n reasoningDefault?: ReasoningLevel;\n verboseDefault?: VerboseLevel;\n systemPromptOverride?: string;\n /** Skill names visible in `<available_skills>`; undefined means all enabled skills, empty means none. */\n skillsAllowlist?: string[];\n tools: EffectiveAgentTools;\n params: Record<string, unknown>;\n}\n\nfunction mergeModelConfig(\n base: AgentModelConfig | undefined,\n override: AgentModelConfig | undefined,\n): AgentModelConfig | undefined {\n if (override === undefined) return base;\n if (base === undefined) return override;\n return {\n primary: override.primary ?? base.primary,\n fallbacks: override.fallbacks ?? base.fallbacks,\n };\n}\n\nfunction primaryAndFallbacksFromModelConfig(\n raw: AgentModelConfig | undefined,\n): { primary?: string; fallbacks: string[] } {\n const primary = raw?.primary?.trim();\n const fallbacks = Array.isArray(raw?.fallbacks)\n ? raw.fallbacks.map((s) => s.trim()).filter(Boolean)\n : [];\n return { primary: primary || undefined, fallbacks };\n}\n\nfunction mergeDisableLists(a?: string[], b?: string[]): Set<string> {\n const out = new Set<string>();\n for (const x of a ?? []) {\n const s = String(x).trim();\n if (s) {\n out.add(s);\n }\n }\n for (const x of b ?? []) {\n const s = String(x).trim();\n if (s) {\n out.add(s);\n }\n }\n return out;\n}\n\nfunction resolveSkillsAllowlist(defaultsSkills: string[] | undefined, entrySkills: string[] | undefined): string[] | undefined {\n if (entrySkills !== undefined) {\n return [...entrySkills];\n }\n if (defaultsSkills !== undefined) {\n return [...defaultsSkills];\n }\n return undefined;\n}\n\n/**\n * Agent id used for config lookup from a session key (subagent keys → default agent).\n */\nexport function extractProfileAgentId(sessionKey: string | undefined | null, config: Config): string {\n const parsed = parseSessionKey(sessionKey ?? '');\n if (!parsed) {\n return getDefaultAgentId(config);\n }\n const aid = parsed.agentId;\n if (aid === 'subagent' || aid.startsWith('subagent:')) {\n return getDefaultAgentId(config);\n }\n if (!agentExists(aid, config)) {\n return getDefaultAgentId(config);\n }\n return aid.toLowerCase();\n}\n\n/**\n * Merge `agents.defaults` with the matching `agents.list` entry.\n */\nexport function resolveEffectiveAgentProfile(config: Config, agentId: string): EffectiveAgentProfile {\n const defaults = config.agents?.defaults;\n const list = config.agents?.list;\n const entry = Array.isArray(list)\n ? list.find((a) => a && a.enabled !== false && a.id.toLowerCase() === agentId.toLowerCase())\n : undefined;\n\n const resolvedWorkspacePath = resolveAgentWorkspaceDir(config, agentId);\n\n const mergedModel = mergeModelConfig(defaults?.models?.chat, entry?.models?.chat);\n const { primary: primaryFromMerged, fallbacks: fallbacksFromMerged } = primaryAndFallbacksFromModelConfig(mergedModel);\n const globalDefault = getAgentDefaultModelRef(config);\n const primaryModelRef = primaryFromMerged?.trim() || globalDefault;\n\n const disable = mergeDisableLists(\n defaults?.tools?.disable as string[] | undefined,\n entry?.tools?.disable as string[] | undefined,\n );\n\n const params: Record<string, unknown> = {\n ...(defaults?.params as Record<string, unknown> | undefined),\n ...(entry?.params as Record<string, unknown> | undefined),\n };\n\n return {\n agentId: agentId.toLowerCase(),\n resolvedWorkspacePath,\n primaryModelRef,\n fallbacks: fallbacksFromMerged,\n thinkingDefault: entry?.thinkingDefault ?? defaults?.thinkingDefault,\n reasoningDefault: entry?.reasoningDefault ?? defaults?.reasoningDefault,\n verboseDefault: entry?.verboseDefault ?? defaults?.verboseDefault,\n systemPromptOverride: entry?.systemPromptOverride?.trim()\n ? entry.systemPromptOverride\n : defaults?.systemPromptOverride?.trim()\n ? defaults.systemPromptOverride\n : undefined,\n skillsAllowlist: resolveSkillsAllowlist(defaults?.skills, entry?.skills),\n tools: { disable },\n params,\n };\n}\n\nexport function resolveEffectiveAgentProfileForSession(\n config: Config,\n sessionKey: string | undefined | null,\n): EffectiveAgentProfile {\n const id = extractProfileAgentId(sessionKey, config);\n return resolveEffectiveAgentProfile(config, id);\n}\n"],"mappings":";;;;;aAQsD;kBACa;oBACU;kBACjB;AA4B5D,SAAS,iBACP,MACA,UAC8B;AAC9B,KAAI,aAAa,KAAA,EAAW,QAAO;AACnC,KAAI,SAAS,KAAA,EAAW,QAAO;AAC/B,QAAO;EACL,SAAS,SAAS,WAAW,KAAK;EAClC,WAAW,SAAS,aAAa,KAAK;EACvC;;AAGH,SAAS,mCACP,KAC2C;CAC3C,MAAM,UAAU,KAAK,SAAS,MAAM;CACpC,MAAM,YAAY,MAAM,QAAQ,KAAK,UAAU,GAC3C,IAAI,UAAU,KAAK,MAAM,EAAE,MAAM,CAAC,CAAC,OAAO,QAAQ,GAClD,EAAE;AACN,QAAO;EAAE,SAAS,WAAW,KAAA;EAAW;EAAW;;AAGrD,SAAS,kBAAkB,GAAc,GAA2B;CAClE,MAAM,sBAAM,IAAI,KAAa;AAC7B,MAAK,MAAM,KAAK,KAAK,EAAE,EAAE;EACvB,MAAM,IAAI,OAAO,EAAE,CAAC,MAAM;AAC1B,MAAI,EACF,KAAI,IAAI,EAAE;;AAGd,MAAK,MAAM,KAAK,KAAK,EAAE,EAAE;EACvB,MAAM,IAAI,OAAO,EAAE,CAAC,MAAM;AAC1B,MAAI,EACF,KAAI,IAAI,EAAE;;AAGd,QAAO;;AAGT,SAAS,uBAAuB,gBAAsC,aAAyD;AAC7H,KAAI,gBAAgB,KAAA,EAClB,QAAO,CAAC,GAAG,YAAY;AAEzB,KAAI,mBAAmB,KAAA,EACrB,QAAO,CAAC,GAAG,eAAe;;;;;AAQ9B,SAAgB,sBAAsB,YAAuC,QAAwB;CACnG,MAAM,SAAS,gBAAgB,cAAc,GAAG;AAChD,KAAI,CAAC,OACH,QAAO,kBAAkB,OAAO;CAElC,MAAM,MAAM,OAAO;AACnB,KAAI,QAAQ,cAAc,IAAI,WAAW,YAAY,CACnD,QAAO,kBAAkB,OAAO;AAElC,KAAI,CAAC,YAAY,KAAK,OAAO,CAC3B,QAAO,kBAAkB,OAAO;AAElC,QAAO,IAAI,aAAa;;;;;AAM1B,SAAgB,6BAA6B,QAAgB,SAAwC;CACnG,MAAM,WAAW,OAAO,QAAQ;CAChC,MAAM,OAAO,OAAO,QAAQ;CAC5B,MAAM,QAAQ,MAAM,QAAQ,KAAK,GAC7B,KAAK,MAAM,MAAM,KAAK,EAAE,YAAY,SAAS,EAAE,GAAG,aAAa,KAAK,QAAQ,aAAa,CAAC,GAC1F,KAAA;CAEJ,MAAM,wBAAwB,yBAAyB,QAAQ,QAAQ;CAGvE,MAAM,EAAE,SAAS,mBAAmB,WAAW,wBAAwB,mCADnD,iBAAiB,UAAU,QAAQ,MAAM,OAAO,QAAQ,KACyC,CAAC;CACtH,MAAM,gBAAgB,wBAAwB,OAAO;CACrD,MAAM,kBAAkB,mBAAmB,MAAM,IAAI;CAErD,MAAM,UAAU,kBACd,UAAU,OAAO,SACjB,OAAO,OAAO,QACf;CAED,MAAM,SAAkC;EACtC,GAAI,UAAU;EACd,GAAI,OAAO;EACZ;AAED,QAAO;EACL,SAAS,QAAQ,aAAa;EAC9B;EACA;EACA,WAAW;EACX,iBAAiB,OAAO,mBAAmB,UAAU;EACrD,kBAAkB,OAAO,oBAAoB,UAAU;EACvD,gBAAgB,OAAO,kBAAkB,UAAU;EACnD,sBAAsB,OAAO,sBAAsB,MAAM,GACrD,MAAM,uBACN,UAAU,sBAAsB,MAAM,GACpC,SAAS,uBACT,KAAA;EACN,iBAAiB,uBAAuB,UAAU,QAAQ,OAAO,OAAO;EACxE,OAAO,EAAE,SAAS;EAClB;EACD;;AAGH,SAAgB,uCACd,QACA,YACuB;AAEvB,QAAO,6BAA6B,QADzB,sBAAsB,YAAY,OACC,CAAC"}
1
+ {"version":3,"file":"agent-profile.js","names":[],"sources":["../../../src/config/agent-profile.ts"],"sourcesContent":["import { resolveEffectiveAgentManifest, type EffectiveAgentManifest } from '../agent-manifest/index.js';\nimport { normalizeAgentId, resolveAgentWorkspaceDir } from '../agent/agent-scope.js';\nimport type { ThinkLevel, ReasoningLevel, VerboseLevel } from '../agent/transcript/thinking-types.js';\nimport { agentExists, getDefaultAgentId } from '../routing/resolve-route.js';\nimport { parseSessionKey } from '../routing/session-key.js';\nimport type { Config } from './schema.js';\n\nexport { resolveAgentWorkspaceDir } from '../agent/agent-scope.js';\n\nexport interface EffectiveAgentTools {\n denied: Set<string>;\n}\n\nexport interface EffectiveAgentProfile {\n agentId: string;\n manifest: EffectiveAgentManifest;\n resolvedWorkspacePath: string;\n primaryModelRef: string | undefined;\n fallbacks: string[];\n thinkingDefault?: ThinkLevel;\n reasoningDefault?: ReasoningLevel;\n verboseDefault?: VerboseLevel;\n systemPromptOverride?: string;\n skillsAllowlist?: string[];\n tools: EffectiveAgentTools;\n params: Record<string, unknown>;\n}\n\nfunction findAgentManifest(config: Config, agentId: string) {\n const id = normalizeAgentId(agentId);\n return config.agents.list.find((agent) => agent.enabled !== false && normalizeAgentId(agent.id) === id);\n}\n\nexport function extractProfileAgentId(sessionKey: string | undefined | null, config: Config): string {\n const parsed = parseSessionKey(sessionKey ?? '');\n if (!parsed) {\n return getDefaultAgentId(config);\n }\n const aid = parsed.agentId;\n if (aid === 'subagent' || aid.startsWith('subagent:')) {\n return getDefaultAgentId(config);\n }\n if (!agentExists(aid, config)) {\n return getDefaultAgentId(config);\n }\n return aid.toLowerCase();\n}\n\nexport function resolveEffectiveAgentManifestForAgent(config: Config, agentId: string): EffectiveAgentManifest {\n const agent = findAgentManifest(config, agentId) ?? findAgentManifest(config, getDefaultAgentId(config));\n if (!agent) {\n throw new Error(`No enabled agent manifest found for \"${agentId}\"`);\n }\n return resolveEffectiveAgentManifest({\n agent,\n presets: config.agents.capabilityPresets,\n }).manifest;\n}\n\nexport function resolveEffectiveAgentManifestForSession(\n config: Config,\n sessionKey: string | undefined | null,\n): EffectiveAgentManifest {\n return resolveEffectiveAgentManifestForAgent(config, extractProfileAgentId(sessionKey, config));\n}\n\nexport function resolveEffectiveAgentProfile(config: Config, agentId: string): EffectiveAgentProfile {\n const manifest = resolveEffectiveAgentManifestForAgent(config, agentId);\n const defaultModel = manifest.models.roles[manifest.models.defaultRole]?.model;\n const deniedTools = Object.entries(manifest.tools.builtin)\n .filter(([, policy]) => policy.mode === 'deny')\n .map(([name]) => name);\n const skillsAllowlist = manifest.skills.mode === 'allowlist' ? [...(manifest.skills.allow ?? [])] : undefined;\n\n return {\n agentId: manifest.id,\n manifest,\n resolvedWorkspacePath: resolveAgentWorkspaceDir(config, manifest.id),\n primaryModelRef: defaultModel?.trim() || undefined,\n fallbacks: [],\n systemPromptOverride: manifest.prompt?.customInstructions,\n skillsAllowlist,\n tools: { denied: new Set(deniedTools) },\n params: {},\n };\n}\n\nexport function resolveEffectiveAgentProfileForSession(\n config: Config,\n sessionKey: string | undefined | null,\n): EffectiveAgentProfile {\n return resolveEffectiveAgentProfile(config, extractProfileAgentId(sessionKey, config));\n}\n"],"mappings":";;;;;;kBACqF;oBAER;kBACjB;AAwB5D,SAAS,kBAAkB,QAAgB,SAAiB;CAC1D,MAAM,KAAK,iBAAiB,QAAQ;AACpC,QAAO,OAAO,OAAO,KAAK,MAAM,UAAU,MAAM,YAAY,SAAS,iBAAiB,MAAM,GAAG,KAAK,GAAG;;AAGzG,SAAgB,sBAAsB,YAAuC,QAAwB;CACnG,MAAM,SAAS,gBAAgB,cAAc,GAAG;AAChD,KAAI,CAAC,OACH,QAAO,kBAAkB,OAAO;CAElC,MAAM,MAAM,OAAO;AACnB,KAAI,QAAQ,cAAc,IAAI,WAAW,YAAY,CACnD,QAAO,kBAAkB,OAAO;AAElC,KAAI,CAAC,YAAY,KAAK,OAAO,CAC3B,QAAO,kBAAkB,OAAO;AAElC,QAAO,IAAI,aAAa;;AAG1B,SAAgB,sCAAsC,QAAgB,SAAyC;CAC7G,MAAM,QAAQ,kBAAkB,QAAQ,QAAQ,IAAI,kBAAkB,QAAQ,kBAAkB,OAAO,CAAC;AACxG,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,wCAAwC,QAAQ,GAAG;AAErE,QAAO,8BAA8B;EACnC;EACA,SAAS,OAAO,OAAO;EACxB,CAAC,CAAC;;AAGL,SAAgB,wCACd,QACA,YACwB;AACxB,QAAO,sCAAsC,QAAQ,sBAAsB,YAAY,OAAO,CAAC;;AAGjG,SAAgB,6BAA6B,QAAgB,SAAwC;CACnG,MAAM,WAAW,sCAAsC,QAAQ,QAAQ;CACvE,MAAM,eAAe,SAAS,OAAO,MAAM,SAAS,OAAO,cAAc;CACzE,MAAM,cAAc,OAAO,QAAQ,SAAS,MAAM,QAAQ,CACvD,QAAQ,GAAG,YAAY,OAAO,SAAS,OAAO,CAC9C,KAAK,CAAC,UAAU,KAAK;CACxB,MAAM,kBAAkB,SAAS,OAAO,SAAS,cAAc,CAAC,GAAI,SAAS,OAAO,SAAS,EAAE,CAAE,GAAG,KAAA;AAEpG,QAAO;EACL,SAAS,SAAS;EAClB;EACA,uBAAuB,yBAAyB,QAAQ,SAAS,GAAG;EACpE,iBAAiB,cAAc,MAAM,IAAI,KAAA;EACzC,WAAW,EAAE;EACb,sBAAsB,SAAS,QAAQ;EACvC;EACA,OAAO,EAAE,QAAQ,IAAI,IAAI,YAAY,EAAE;EACvC,QAAQ,EAAE;EACX;;AAGH,SAAgB,uCACd,QACA,YACuB;AACvB,QAAO,6BAA6B,QAAQ,sBAAsB,YAAY,OAAO,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Named model roles from `agents.defaults.models.roles` plus per-agent overrides.
2
+ * Named model roles from the selected agent manifest.
3
3
  */
4
4
  import type { AgentTypedModel, Config } from './schema.js';
5
5
  export type { AgentTypedModel };
@@ -1,5 +1,5 @@
1
- import { init_agent_scope, listAgentEntries, normalizeAgentId } from "../agent/agent-scope.js";
2
1
  import { init_schema, parseModelRef } from "./schema.js";
2
+ import { init_agent_scope, listAgentEntries, normalizeAgentId } from "../agent/agent-scope.js";
3
3
  //#region src/config/agent-typed-models.ts
4
4
  init_schema();
5
5
  init_agent_scope();
@@ -11,7 +11,6 @@ function rolesToEntries(roles) {
11
11
  }
12
12
  function resolveEffectiveTypedModels(config, agentId) {
13
13
  const out = /* @__PURE__ */ new Map();
14
- for (const modelRole of rolesToEntries(config.agents?.defaults?.models?.roles)) out.set(modelRole.id, modelRole);
15
14
  const id = normalizeAgentId(agentId);
16
15
  const entry = listAgentEntries(config).find((candidate) => candidate.enabled !== false && normalizeAgentId(candidate.id) === id);
17
16
  for (const modelRole of rolesToEntries(entry?.models?.roles)) out.set(modelRole.id, modelRole);
@@ -1 +1 @@
1
- {"version":3,"file":"agent-typed-models.js","names":[],"sources":["../../../src/config/agent-typed-models.ts"],"sourcesContent":["/**\n * Named model roles from `agents.defaults.models.roles` plus per-agent overrides.\n */\n\nimport type { AgentTypedModel, Config } from './schema.js';\nimport { parseModelRef } from './schema.js';\nimport { listAgentEntries, normalizeAgentId } from '../agent/agent-scope.js';\n\nexport type { AgentTypedModel };\n\nfunction rolesToEntries(\n roles: Record<string, { model: string; description?: string }> | undefined,\n): AgentTypedModel[] {\n return Object.entries(roles ?? {}).map(([id, role]) => ({\n id,\n ...role,\n }));\n}\n\nexport function resolveEffectiveTypedModels(config: Config, agentId: string): Map<string, AgentTypedModel> {\n const out = new Map<string, AgentTypedModel>();\n for (const modelRole of rolesToEntries(config.agents?.defaults?.models?.roles)) {\n out.set(modelRole.id, modelRole);\n }\n const id = normalizeAgentId(agentId);\n const entry = listAgentEntries(config).find(\n (candidate) => candidate.enabled !== false && normalizeAgentId(candidate.id) === id,\n );\n for (const modelRole of rolesToEntries(entry?.models?.roles)) {\n out.set(modelRole.id, modelRole);\n }\n return out;\n}\n\n/** Resolve a typed model id to `provider/model`, or undefined when not configured. */\nexport function resolveTypedModelRef(\n config: Config,\n agentId: string,\n typeId: string,\n): string | undefined {\n const entry = resolveEffectiveTypedModels(config, agentId).get(typeId);\n const ref = entry?.model?.trim();\n return ref || undefined;\n}\n\nfunction parseModelRefInput(ref: string): { directRef?: string; typeId?: string } {\n const trimmed = ref.trim();\n if (!trimmed) {\n return {};\n }\n if (trimmed.includes('/')) {\n return { directRef: trimmed };\n }\n const typeId = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;\n return typeId ? { typeId } : {};\n}\n\n/**\n * Resolve a model reference: `provider/model`, typed id (`small`), or `@small`.\n * Throws when the ref is invalid or the typed id is unknown.\n */\nexport function resolveModelRef(config: Config, agentId: string, ref: string): string {\n const { directRef, typeId } = parseModelRefInput(ref);\n if (directRef) {\n if (!parseModelRef(directRef)) {\n throw new Error(`model ref must be provider/model format (got '${directRef}')`);\n }\n return directRef;\n }\n if (typeId) {\n const resolved = resolveTypedModelRef(config, agentId, typeId);\n if (resolved) {\n return resolved;\n }\n const available = [...resolveEffectiveTypedModels(config, agentId).keys()];\n const hint =\n available.length > 0 ? ` (available: ${available.join(', ')})` : ' (none configured)';\n throw new Error(`Unknown typed model id '${typeId}' for agent '${agentId}'${hint}`);\n }\n throw new Error('model ref must not be empty');\n}\n"],"mappings":";;;aAK4C;kBACiC;AAI7E,SAAS,eACP,OACmB;AACnB,QAAO,OAAO,QAAQ,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,WAAW;EACtD;EACA,GAAG;EACJ,EAAE;;AAGL,SAAgB,4BAA4B,QAAgB,SAA+C;CACzG,MAAM,sBAAM,IAAI,KAA8B;AAC9C,MAAK,MAAM,aAAa,eAAe,OAAO,QAAQ,UAAU,QAAQ,MAAM,CAC5E,KAAI,IAAI,UAAU,IAAI,UAAU;CAElC,MAAM,KAAK,iBAAiB,QAAQ;CACpC,MAAM,QAAQ,iBAAiB,OAAO,CAAC,MACpC,cAAc,UAAU,YAAY,SAAS,iBAAiB,UAAU,GAAG,KAAK,GAClF;AACD,MAAK,MAAM,aAAa,eAAe,OAAO,QAAQ,MAAM,CAC1D,KAAI,IAAI,UAAU,IAAI,UAAU;AAElC,QAAO;;;AAIT,SAAgB,qBACd,QACA,SACA,QACoB;AAGpB,QAFc,4BAA4B,QAAQ,QAAQ,CAAC,IAAI,OAC9C,EAAE,OAAO,MAAM,IAClB,KAAA;;AAGhB,SAAS,mBAAmB,KAAsD;CAChF,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,CAAC,QACH,QAAO,EAAE;AAEX,KAAI,QAAQ,SAAS,IAAI,CACvB,QAAO,EAAE,WAAW,SAAS;CAE/B,MAAM,SAAS,QAAQ,WAAW,IAAI,GAAG,QAAQ,MAAM,EAAE,CAAC,MAAM,GAAG;AACnE,QAAO,SAAS,EAAE,QAAQ,GAAG,EAAE;;;;;;AAOjC,SAAgB,gBAAgB,QAAgB,SAAiB,KAAqB;CACpF,MAAM,EAAE,WAAW,WAAW,mBAAmB,IAAI;AACrD,KAAI,WAAW;AACb,MAAI,CAAC,cAAc,UAAU,CAC3B,OAAM,IAAI,MAAM,iDAAiD,UAAU,IAAI;AAEjF,SAAO;;AAET,KAAI,QAAQ;EACV,MAAM,WAAW,qBAAqB,QAAQ,SAAS,OAAO;AAC9D,MAAI,SACF,QAAO;EAET,MAAM,YAAY,CAAC,GAAG,4BAA4B,QAAQ,QAAQ,CAAC,MAAM,CAAC;EAC1E,MAAM,OACJ,UAAU,SAAS,IAAI,gBAAgB,UAAU,KAAK,KAAK,CAAC,KAAK;AACnE,QAAM,IAAI,MAAM,2BAA2B,OAAO,eAAe,QAAQ,GAAG,OAAO;;AAErF,OAAM,IAAI,MAAM,8BAA8B"}
1
+ {"version":3,"file":"agent-typed-models.js","names":[],"sources":["../../../src/config/agent-typed-models.ts"],"sourcesContent":["/**\n * Named model roles from the selected agent manifest.\n */\n\nimport type { AgentTypedModel, Config } from './schema.js';\nimport { parseModelRef } from './schema.js';\nimport { listAgentEntries, normalizeAgentId } from '../agent/agent-scope.js';\n\nexport type { AgentTypedModel };\n\nfunction rolesToEntries(\n roles: Record<string, { model: string; description?: string }> | undefined,\n): AgentTypedModel[] {\n return Object.entries(roles ?? {}).map(([id, role]) => ({\n id,\n ...role,\n }));\n}\n\nexport function resolveEffectiveTypedModels(config: Config, agentId: string): Map<string, AgentTypedModel> {\n const out = new Map<string, AgentTypedModel>();\n const id = normalizeAgentId(agentId);\n const entry = listAgentEntries(config).find(\n (candidate) => candidate.enabled !== false && normalizeAgentId(candidate.id) === id,\n );\n for (const modelRole of rolesToEntries(entry?.models?.roles)) {\n out.set(modelRole.id, modelRole);\n }\n return out;\n}\n\n/** Resolve a typed model id to `provider/model`, or undefined when not configured. */\nexport function resolveTypedModelRef(\n config: Config,\n agentId: string,\n typeId: string,\n): string | undefined {\n const entry = resolveEffectiveTypedModels(config, agentId).get(typeId);\n const ref = entry?.model?.trim();\n return ref || undefined;\n}\n\nfunction parseModelRefInput(ref: string): { directRef?: string; typeId?: string } {\n const trimmed = ref.trim();\n if (!trimmed) {\n return {};\n }\n if (trimmed.includes('/')) {\n return { directRef: trimmed };\n }\n const typeId = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;\n return typeId ? { typeId } : {};\n}\n\n/**\n * Resolve a model reference: `provider/model`, typed id (`small`), or `@small`.\n * Throws when the ref is invalid or the typed id is unknown.\n */\nexport function resolveModelRef(config: Config, agentId: string, ref: string): string {\n const { directRef, typeId } = parseModelRefInput(ref);\n if (directRef) {\n if (!parseModelRef(directRef)) {\n throw new Error(`model ref must be provider/model format (got '${directRef}')`);\n }\n return directRef;\n }\n if (typeId) {\n const resolved = resolveTypedModelRef(config, agentId, typeId);\n if (resolved) {\n return resolved;\n }\n const available = [...resolveEffectiveTypedModels(config, agentId).keys()];\n const hint =\n available.length > 0 ? ` (available: ${available.join(', ')})` : ' (none configured)';\n throw new Error(`Unknown typed model id '${typeId}' for agent '${agentId}'${hint}`);\n }\n throw new Error('model ref must not be empty');\n}\n"],"mappings":";;;aAK4C;kBACiC;AAI7E,SAAS,eACP,OACmB;AACnB,QAAO,OAAO,QAAQ,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,WAAW;EACtD;EACA,GAAG;EACJ,EAAE;;AAGL,SAAgB,4BAA4B,QAAgB,SAA+C;CACzG,MAAM,sBAAM,IAAI,KAA8B;CAC9C,MAAM,KAAK,iBAAiB,QAAQ;CACpC,MAAM,QAAQ,iBAAiB,OAAO,CAAC,MACpC,cAAc,UAAU,YAAY,SAAS,iBAAiB,UAAU,GAAG,KAAK,GAClF;AACD,MAAK,MAAM,aAAa,eAAe,OAAO,QAAQ,MAAM,CAC1D,KAAI,IAAI,UAAU,IAAI,UAAU;AAElC,QAAO;;;AAIT,SAAgB,qBACd,QACA,SACA,QACoB;AAGpB,QAFc,4BAA4B,QAAQ,QAAQ,CAAC,IAAI,OAC9C,EAAE,OAAO,MAAM,IAClB,KAAA;;AAGhB,SAAS,mBAAmB,KAAsD;CAChF,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,CAAC,QACH,QAAO,EAAE;AAEX,KAAI,QAAQ,SAAS,IAAI,CACvB,QAAO,EAAE,WAAW,SAAS;CAE/B,MAAM,SAAS,QAAQ,WAAW,IAAI,GAAG,QAAQ,MAAM,EAAE,CAAC,MAAM,GAAG;AACnE,QAAO,SAAS,EAAE,QAAQ,GAAG,EAAE;;;;;;AAOjC,SAAgB,gBAAgB,QAAgB,SAAiB,KAAqB;CACpF,MAAM,EAAE,WAAW,WAAW,mBAAmB,IAAI;AACrD,KAAI,WAAW;AACb,MAAI,CAAC,cAAc,UAAU,CAC3B,OAAM,IAAI,MAAM,iDAAiD,UAAU,IAAI;AAEjF,SAAO;;AAET,KAAI,QAAQ;EACV,MAAM,WAAW,qBAAqB,QAAQ,SAAS,OAAO;AAC9D,MAAI,SACF,QAAO;EAET,MAAM,YAAY,CAAC,GAAG,4BAA4B,QAAQ,QAAQ,CAAC,MAAM,CAAC;EAC1E,MAAM,OACJ,UAAU,SAAS,IAAI,gBAAgB,UAAU,KAAK,KAAK,CAAC,KAAK;AACnE,QAAM,IAAI,MAAM,2BAA2B,OAAO,eAAe,QAAQ,GAAG,OAAO;;AAErF,OAAM,IAAI,MAAM,8BAA8B"}
@@ -1,7 +1,7 @@
1
1
  import { getTailnetIPv4Sync } from "../infra/tailscale.js";
2
2
  import { isLoopbackHost } from "../gateway/host.js";
3
- import { existsSync } from "node:fs";
4
3
  import net from "node:net";
4
+ import { existsSync } from "node:fs";
5
5
  //#region src/config/gateway-bind.ts
6
6
  function resolveGatewayBindMode(cfg, bindOverride) {
7
7
  if (bindOverride) return bindOverride;
@@ -1,16 +1,16 @@
1
- import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
1
+ import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
2
+ import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
3
+ import { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalNotificationEventSchema, GoalNotificationTargetSchema, GoalNotificationsConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
4
+ import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
2
5
  import { ENV_VARS, XOPC_DB_FILENAME, resolveHomeDir, resolveStateDir, resolveXopcDatabasePath } from "./paths-state.js";
3
6
  import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
4
7
  import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
5
8
  import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
9
+ import { extractProfileAgentId, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
6
10
  import { FILENAMES, WORKSPACE_FILES, existsSync, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
7
- import { CustomModelSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
8
- import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
9
- import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
10
- import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalNotificationEventSchema, GoalNotificationTargetSchema, GoalNotificationsConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
11
11
  import { init_loader, loadConfig, saveConfig } from "./loader.js";
12
- import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
13
- import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
12
+ import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
13
+ import { CustomModelSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
14
14
  import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
15
15
  import { formatThinkingLevels, listThinkingLevels, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, thinkLevelToNumber } from "../agent/transcript/thinking-types.js";
16
16
  import { getWorkspacePath } from "./workspace-path-helpers.js";
@@ -27,6 +27,6 @@ init_workspace_path();
27
27
  init_models_json();
28
28
  init_resolve_config_value();
29
29
  //#endregion
30
- export { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BASE_RELOAD_RULES, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigHotReloader, ConfigSchema, ConnectorsConfigSchema, CronConfigSchema, CustomModelSchema, ENV_VARS, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, FILENAMES, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalNotificationEventSchema, GoalNotificationTargetSchema, GoalNotificationsConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelOverrideSchema, ModelsDevConfigSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProfileManager, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VercelGatewayRoutingSchema, WORKSPACE_FILES, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WeixinAccountConfigSchema, WeixinConfigSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, XOPC_DB_FILENAME, applyConfigOverrides, buildReloadPlan, canonicalizeConfiguredMcpServer, clearConfigValueCache, createProfile, deleteProfile, diffConfigPaths, existsSync, expandWorkspacePathString, extractProfileAgentId, formatThinkingLevels, getAgentDefaultModelRef, getAllowedCommands, getCacheStats, getConfigOverrides, getCurrentProfile, getDefaultModelValues, resolveModelsJsonPath as getModelsJsonPath, getProfileManager, getProfileNameFromDir, getSwitchCommand, getWorkspacePath, isKnownCliMcpTypeAlias, listAgentProfileMarkdownDirs, listAgentWorkspaceDirs, listProfiles, listThinkingLevels, loadConfig, loadModelsJson, matchReloadRule, modelsJsonExists, normalizeConfiguredMcpServers, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, normalizeWorkspaceDir, parseModelRef, resetConfigOverrides, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentDir$1 as resolveAgentDirFromConfig, resolveAgentHomeDir, resolveAgentHomeDir$1 as resolveAgentHomeDirFromConfig, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAgentWorkspaceDir, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveConfigValue, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveDefaultAgentWorkspaceDir, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveHeaders, resolveHomeDir, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveProfileStateDir, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStateDir, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceRoot, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath, resolveXopcDatabasePath, resolveXopcMcpTransportAlias, saveConfig, saveModelsJson, setConfigOverride, testApiKeyResolution, thinkLevelToNumber, unsetConfigOverride, validateModelsConfig };
30
+ export { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BASE_RELOAD_RULES, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigHotReloader, ConfigSchema, ConnectorsConfigSchema, CronConfigSchema, CustomModelSchema, ENV_VARS, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, FILENAMES, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalNotificationEventSchema, GoalNotificationTargetSchema, GoalNotificationsConfigSchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelOverrideSchema, ModelsDevConfigSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProfileManager, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VercelGatewayRoutingSchema, WORKSPACE_FILES, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WeixinAccountConfigSchema, WeixinConfigSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, XOPC_DB_FILENAME, applyConfigOverrides, buildReloadPlan, canonicalizeConfiguredMcpServer, clearConfigValueCache, createProfile, deleteProfile, diffConfigPaths, existsSync, expandWorkspacePathString, extractProfileAgentId, formatThinkingLevels, getAgentDefaultModelRef, getAllowedCommands, getCacheStats, getConfigOverrides, getCurrentProfile, getDefaultModelValues, resolveModelsJsonPath as getModelsJsonPath, getProfileManager, getProfileNameFromDir, getSwitchCommand, getWorkspacePath, isKnownCliMcpTypeAlias, listAgentProfileMarkdownDirs, listAgentWorkspaceDirs, listProfiles, listThinkingLevels, loadConfig, loadModelsJson, matchReloadRule, modelsJsonExists, normalizeConfiguredMcpServers, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, normalizeWorkspaceDir, parseModelRef, resetConfigOverrides, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentDir$1 as resolveAgentDirFromConfig, resolveAgentHomeDir, resolveAgentHomeDir$1 as resolveAgentHomeDirFromConfig, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAgentWorkspaceDir, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveConfigValue, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveDefaultAgentWorkspaceDir, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveHeaders, resolveHomeDir, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveProfileStateDir, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStateDir, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceRoot, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath, resolveXopcDatabasePath, resolveXopcMcpTransportAlias, saveConfig, saveModelsJson, setConfigOverride, testApiKeyResolution, thinkLevelToNumber, unsetConfigOverride, validateModelsConfig };
31
31
 
32
32
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Model-related configuration (documentation only):
3
3
  *
4
- * - Main config: `ConfigSchema` (agents.defaults.models, gateway, channels, etc.).
4
+ * - Main config: `ConfigSchema` (agent manifests, gateway, channels, etc.).
5
5
  * - LLM API keys: `CredentialResolver` / auth profiles (Gateway PATCH /api/config `providers`, CLI onboard).
6
6
  * - Overrides and custom providers: `~/.xopc/models.json`.
7
7
  */
@@ -1,12 +1,12 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
3
- import { init_paths, resolveConfigPath } from "./paths.js";
2
+ import { ConfigSchema, init_schema } from "./schema.js";
4
3
  import { createLogger } from "../utils/logger/index.js";
5
4
  import { init_logger } from "../utils/logger.js";
6
- import { ConfigSchema, init_schema } from "./schema.js";
5
+ import { init_paths, resolveConfigPath } from "./paths.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
7
7
  import { assertChannelPluginConfigs, init_validate_channel_configs } from "./validate-channel-configs.js";
8
- import { existsSync, mkdirSync, promises, readFileSync } from "fs";
9
8
  import { dirname } from "path";
9
+ import { existsSync, mkdirSync, promises, readFileSync } from "fs";
10
10
  import { config } from "dotenv";
11
11
  //#region src/config/loader.ts
12
12
  /**
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
3
2
  import { init_paths, resolveModelsJsonPath } from "./paths.js";
4
- import { existsSync, readFileSync } from "fs";
3
+ import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
5
4
  import { z } from "zod";
5
+ import { existsSync, readFileSync } from "fs";
6
6
  //#region src/config/models-json.ts
7
7
  /**
8
8
  * Models.json configuration types and schema
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { join } from "node:path";
3
2
  import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
4
  //#region src/config/paths-state.ts
5
5
  function resolveHomeDir(env = process.env) {
6
6
  return env[ENV_VARS.HOME] || homedir();
@@ -2,8 +2,8 @@ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { ENV_VARS, XOPC_DB_FILENAME, init_paths_state, resolveHomeDir, resolveStateDir, resolveXopcDatabasePath } from "./paths-state.js";
3
3
  import { init_workspace_defaults, resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
4
4
  import { init_agent_scope, resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentProfileDir as resolveAgentProfileDir$1, resolveAgentProfileMarkdownPath as resolveAgentProfileMarkdownPath$1, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
5
- import { existsSync } from "fs";
6
5
  import { dirname, join, sep } from "path";
6
+ import { existsSync } from "fs";
7
7
  import { fileURLToPath } from "url";
8
8
  //#region src/config/paths.ts
9
9
  /**
@@ -1,8 +1,8 @@
1
1
  import { ENV_VARS, init_paths_state, resolveHomeDir } from "./paths-state.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
- import { existsSync } from "fs";
5
4
  import { join } from "path";
5
+ import { existsSync } from "fs";
6
6
  import { mkdir, readdir, rm, stat } from "fs/promises";
7
7
  //#region src/config/profile.ts
8
8
  init_logger();
@@ -1,6 +1,6 @@
1
- import { init_paths, resolveModelsJsonPath } from "./paths.js";
2
1
  import { baseLogger as logger } from "../utils/logger/index.js";
3
2
  import { init_logger } from "../utils/logger.js";
3
+ import { init_paths, resolveModelsJsonPath } from "./paths.js";
4
4
  import { init_loader, loadConfig } from "./loader.js";
5
5
  import { diffConfigPaths } from "./diff.js";
6
6
  import { BASE_RELOAD_RULES, buildReloadPlan, matchReloadRule } from "./rules.js";
@@ -166,7 +166,7 @@ var ConfigHotReloader = class {
166
166
  if (this.callbacks.onModelsReload) await Promise.resolve(this.callbacks.onModelsReload(newConfig));
167
167
  return;
168
168
  }
169
- if (path.startsWith("agents.defaults.")) {
169
+ if (path.startsWith("agents.list") || path.startsWith("agents.capabilityPresets")) {
170
170
  if (this.callbacks.onAgentDefaultsReload) await Promise.resolve(this.callbacks.onAgentDefaultsReload(newConfig));
171
171
  return;
172
172
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reload.js","names":[],"sources":["../../../src/config/reload.ts"],"sourcesContent":["/**\n * Configuration hot reload manager\n */\n\nimport { watch, type FSWatcher } from 'fs';\nimport { loadConfig } from './loader.js';\nimport type { Config } from './schema.js';\nimport { diffConfigPaths } from './diff.js';\nimport { buildReloadPlan, type ReloadPlan } from './rules.js';\nimport { resolveModelsJsonPath } from './paths.js';\nimport { logger as log } from '../utils/logger.js';\n\nexport interface HotReloadConfig {\n debounceMs: number;\n enabled: boolean;\n}\n\nexport interface ReloadResult {\n success: boolean;\n plan?: ReloadPlan;\n error?: string;\n}\n\n/**\n * Callback types for different reload actions\n */\nexport type ReloadCallback = (newConfig: Config) => void | Promise<void>;\n\nexport interface ReloadCallbacks {\n onModelsReload?: ReloadCallback;\n onAgentDefaultsReload?: ReloadCallback;\n onChannelsReload?: ReloadCallback;\n onCronReload?: ReloadCallback;\n onHeartbeatReload?: ReloadCallback;\n onToolsReload?: ReloadCallback;\n onMcpReload?: ReloadCallback;\n onWebSearchReload?: ReloadCallback;\n /** All `extensions.*` hot paths in one batch (deduplicated in applyReload). */\n onExtensionsReload?: (\n newConfig: Config,\n changedPaths: string[],\n ) => void | Promise<void>;\n onFullRestart?: ReloadCallback;\n}\n\n/**\n * Configuration hot reload manager\n */\nexport class ConfigHotReloader {\n private configPath: string;\n private callbacks: ReloadCallbacks;\n private watcher: FSWatcher | null = null;\n private modelsJsonWatcher: FSWatcher | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private currentConfig: Config;\n private debounceMs: number;\n private enabled: boolean;\n\n constructor(\n configPath: string,\n initialConfig: Config,\n callbacks: ReloadCallbacks,\n options: HotReloadConfig = { debounceMs: 300, enabled: true }\n ) {\n this.configPath = configPath;\n this.currentConfig = initialConfig;\n this.callbacks = callbacks;\n this.debounceMs = options.debounceMs;\n this.enabled = options.enabled;\n }\n\n /**\n * Start watching config file for changes\n */\n start(): void {\n if (!this.enabled) {\n log.info('Config hot reload disabled');\n return;\n }\n\n try {\n this.watcher = watch(this.configPath, (eventType) => {\n if (eventType === 'change') {\n this.scheduleReload();\n }\n });\n log.info({ path: this.configPath }, 'Config hot reload enabled');\n } catch (err) {\n log.error({ err }, 'Failed to setup config watcher');\n }\n\n this.startModelsJsonWatcher();\n }\n\n /**\n * Stop watching config file\n */\n async stop(): Promise<void> {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n if (this.modelsJsonWatcher) {\n this.modelsJsonWatcher.close();\n this.modelsJsonWatcher = null;\n }\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n log.info('Config hot reload stopped');\n }\n\n /**\n * Schedule a reload with debounce\n */\n private scheduleReload(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n void this.reload();\n }, this.debounceMs);\n }\n\n /**\n * Watch models.json independently so direct file edits are picked up without restarting.\n * The watcher is best-effort: if the file does not exist yet, it will not be watched.\n */\n private startModelsJsonWatcher(): void {\n const modelsJsonPath = resolveModelsJsonPath();\n try {\n this.modelsJsonWatcher = watch(modelsJsonPath, (eventType) => {\n if (eventType === 'change') {\n this.scheduleModelsJsonReload();\n }\n });\n log.info({ path: modelsJsonPath }, 'models.json hot reload enabled');\n } catch {\n log.debug({ path: modelsJsonPath }, 'models.json not found, skipping watcher');\n }\n }\n\n /**\n * Debounced handler for models.json changes.\n * Calls onModelsReload with the current config so the registry is refreshed.\n */\n private scheduleModelsJsonReload(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n log.info('models.json changed on disk — refreshing ModelRegistry');\n if (this.callbacks.onModelsReload) {\n void Promise.resolve(this.callbacks.onModelsReload(this.currentConfig));\n }\n }, this.debounceMs);\n }\n\n /**\n * Reload configuration and apply changes\n */\n async reload(): Promise<ReloadResult> {\n try {\n log.info('Reloading configuration...');\n \n // Load new config\n const newConfig = loadConfig(this.configPath);\n \n // Diff with current config\n const changedPaths = diffConfigPaths(this.currentConfig, newConfig);\n \n if (changedPaths.length === 0) {\n log.debug('No config changes detected');\n return { success: true };\n }\n \n log.info({ changedPaths }, 'Config changes detected');\n \n // Build reload plan\n const plan = buildReloadPlan(changedPaths);\n \n // Apply changes based on plan\n await this.applyReload(plan, newConfig);\n \n // Update current config\n this.currentConfig = newConfig;\n \n return { success: true, plan };\n \n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n log.error({ err, configPath: this.configPath, errorMessage: error }, `Config hot reload failed: ${error}`);\n return { success: false, error };\n }\n }\n\n /**\n * Apply reload based on plan\n */\n private async applyReload(plan: ReloadPlan, newConfig: Config): Promise<void> {\n // Handle restart-required changes first\n if (plan.requiresRestart) {\n log.info(\n { restartPaths: plan.restartPaths },\n 'Config changes require gateway restart'\n );\n \n if (this.callbacks.onFullRestart) {\n this.callbacks.onFullRestart(newConfig);\n }\n return;\n }\n\n if (!plan.requiresHotReload) {\n log.info({ plan }, 'Config hot reload completed');\n return;\n }\n\n const isExtensionPath = (p: string) => p === 'extensions' || p.startsWith('extensions.');\n const extensionPaths = plan.hotPaths.filter(isExtensionPath);\n const otherPaths = plan.hotPaths.filter((p) => !isExtensionPath(p));\n\n for (const path of otherPaths) {\n await this.applyHotPath(path, newConfig);\n }\n\n if (extensionPaths.length > 0 && this.callbacks.onExtensionsReload) {\n await Promise.resolve(this.callbacks.onExtensionsReload(newConfig, extensionPaths));\n }\n\n log.info({ plan }, 'Config hot reload completed');\n }\n\n /**\n * Apply a single hot-reloadable path\n */\n private async applyHotPath(path: string, newConfig: Config): Promise<void> {\n if (path.startsWith('models.')) {\n if (this.callbacks.onModelsReload) {\n await Promise.resolve(this.callbacks.onModelsReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('agents.defaults.')) {\n if (this.callbacks.onAgentDefaultsReload) {\n await Promise.resolve(this.callbacks.onAgentDefaultsReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('channels.')) {\n if (this.callbacks.onChannelsReload) {\n await Promise.resolve(this.callbacks.onChannelsReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('cron.')) {\n if (this.callbacks.onCronReload) {\n await Promise.resolve(this.callbacks.onCronReload(newConfig));\n }\n return;\n }\n\n if (path === 'gateway.heartbeat' || path.startsWith('gateway.heartbeat.')) {\n if (this.callbacks.onHeartbeatReload) {\n await Promise.resolve(this.callbacks.onHeartbeatReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('tools.')) {\n if (this.callbacks.onToolsReload) {\n await Promise.resolve(this.callbacks.onToolsReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('mcp.') || path === 'mcp') {\n if (this.callbacks.onMcpReload) {\n await Promise.resolve(this.callbacks.onMcpReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('webSearch.') || path.startsWith('webTools.')) {\n if (this.callbacks.onWebSearchReload) {\n await Promise.resolve(this.callbacks.onWebSearchReload(newConfig));\n }\n return;\n }\n\n log.debug({ path }, 'No handler for hot reload path');\n }\n\n /**\n * Manually trigger a reload\n */\n async triggerReload(): Promise<ReloadResult> {\n return this.reload();\n }\n\n /**\n * Align diff baseline with a freshly loaded config (e.g. Weixin QR wrote token files but JSON unchanged).\n */\n syncCurrentConfig(config: Config): void {\n this.currentConfig = config;\n }\n\n /**\n * Get current config\n */\n getConfig(): Config {\n return this.currentConfig;\n }\n\n /**\n * Check if hot reload is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n}\n\nexport { diffConfigPaths } from './diff.js';\nexport { buildReloadPlan, matchReloadRule, BASE_RELOAD_RULES } from './rules.js';\n"],"mappings":"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"}
1
+ {"version":3,"file":"reload.js","names":[],"sources":["../../../src/config/reload.ts"],"sourcesContent":["/**\n * Configuration hot reload manager\n */\n\nimport { watch, type FSWatcher } from 'fs';\nimport { loadConfig } from './loader.js';\nimport type { Config } from './schema.js';\nimport { diffConfigPaths } from './diff.js';\nimport { buildReloadPlan, type ReloadPlan } from './rules.js';\nimport { resolveModelsJsonPath } from './paths.js';\nimport { logger as log } from '../utils/logger.js';\n\nexport interface HotReloadConfig {\n debounceMs: number;\n enabled: boolean;\n}\n\nexport interface ReloadResult {\n success: boolean;\n plan?: ReloadPlan;\n error?: string;\n}\n\n/**\n * Callback types for different reload actions\n */\nexport type ReloadCallback = (newConfig: Config) => void | Promise<void>;\n\nexport interface ReloadCallbacks {\n onModelsReload?: ReloadCallback;\n onAgentDefaultsReload?: ReloadCallback;\n onChannelsReload?: ReloadCallback;\n onCronReload?: ReloadCallback;\n onHeartbeatReload?: ReloadCallback;\n onToolsReload?: ReloadCallback;\n onMcpReload?: ReloadCallback;\n onWebSearchReload?: ReloadCallback;\n /** All `extensions.*` hot paths in one batch (deduplicated in applyReload). */\n onExtensionsReload?: (\n newConfig: Config,\n changedPaths: string[],\n ) => void | Promise<void>;\n onFullRestart?: ReloadCallback;\n}\n\n/**\n * Configuration hot reload manager\n */\nexport class ConfigHotReloader {\n private configPath: string;\n private callbacks: ReloadCallbacks;\n private watcher: FSWatcher | null = null;\n private modelsJsonWatcher: FSWatcher | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private currentConfig: Config;\n private debounceMs: number;\n private enabled: boolean;\n\n constructor(\n configPath: string,\n initialConfig: Config,\n callbacks: ReloadCallbacks,\n options: HotReloadConfig = { debounceMs: 300, enabled: true }\n ) {\n this.configPath = configPath;\n this.currentConfig = initialConfig;\n this.callbacks = callbacks;\n this.debounceMs = options.debounceMs;\n this.enabled = options.enabled;\n }\n\n /**\n * Start watching config file for changes\n */\n start(): void {\n if (!this.enabled) {\n log.info('Config hot reload disabled');\n return;\n }\n\n try {\n this.watcher = watch(this.configPath, (eventType) => {\n if (eventType === 'change') {\n this.scheduleReload();\n }\n });\n log.info({ path: this.configPath }, 'Config hot reload enabled');\n } catch (err) {\n log.error({ err }, 'Failed to setup config watcher');\n }\n\n this.startModelsJsonWatcher();\n }\n\n /**\n * Stop watching config file\n */\n async stop(): Promise<void> {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n if (this.modelsJsonWatcher) {\n this.modelsJsonWatcher.close();\n this.modelsJsonWatcher = null;\n }\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n log.info('Config hot reload stopped');\n }\n\n /**\n * Schedule a reload with debounce\n */\n private scheduleReload(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n void this.reload();\n }, this.debounceMs);\n }\n\n /**\n * Watch models.json independently so direct file edits are picked up without restarting.\n * The watcher is best-effort: if the file does not exist yet, it will not be watched.\n */\n private startModelsJsonWatcher(): void {\n const modelsJsonPath = resolveModelsJsonPath();\n try {\n this.modelsJsonWatcher = watch(modelsJsonPath, (eventType) => {\n if (eventType === 'change') {\n this.scheduleModelsJsonReload();\n }\n });\n log.info({ path: modelsJsonPath }, 'models.json hot reload enabled');\n } catch {\n log.debug({ path: modelsJsonPath }, 'models.json not found, skipping watcher');\n }\n }\n\n /**\n * Debounced handler for models.json changes.\n * Calls onModelsReload with the current config so the registry is refreshed.\n */\n private scheduleModelsJsonReload(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n log.info('models.json changed on disk — refreshing ModelRegistry');\n if (this.callbacks.onModelsReload) {\n void Promise.resolve(this.callbacks.onModelsReload(this.currentConfig));\n }\n }, this.debounceMs);\n }\n\n /**\n * Reload configuration and apply changes\n */\n async reload(): Promise<ReloadResult> {\n try {\n log.info('Reloading configuration...');\n \n // Load new config\n const newConfig = loadConfig(this.configPath);\n \n // Diff with current config\n const changedPaths = diffConfigPaths(this.currentConfig, newConfig);\n \n if (changedPaths.length === 0) {\n log.debug('No config changes detected');\n return { success: true };\n }\n \n log.info({ changedPaths }, 'Config changes detected');\n \n // Build reload plan\n const plan = buildReloadPlan(changedPaths);\n \n // Apply changes based on plan\n await this.applyReload(plan, newConfig);\n \n // Update current config\n this.currentConfig = newConfig;\n \n return { success: true, plan };\n \n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n log.error({ err, configPath: this.configPath, errorMessage: error }, `Config hot reload failed: ${error}`);\n return { success: false, error };\n }\n }\n\n /**\n * Apply reload based on plan\n */\n private async applyReload(plan: ReloadPlan, newConfig: Config): Promise<void> {\n // Handle restart-required changes first\n if (plan.requiresRestart) {\n log.info(\n { restartPaths: plan.restartPaths },\n 'Config changes require gateway restart'\n );\n \n if (this.callbacks.onFullRestart) {\n this.callbacks.onFullRestart(newConfig);\n }\n return;\n }\n\n if (!plan.requiresHotReload) {\n log.info({ plan }, 'Config hot reload completed');\n return;\n }\n\n const isExtensionPath = (p: string) => p === 'extensions' || p.startsWith('extensions.');\n const extensionPaths = plan.hotPaths.filter(isExtensionPath);\n const otherPaths = plan.hotPaths.filter((p) => !isExtensionPath(p));\n\n for (const path of otherPaths) {\n await this.applyHotPath(path, newConfig);\n }\n\n if (extensionPaths.length > 0 && this.callbacks.onExtensionsReload) {\n await Promise.resolve(this.callbacks.onExtensionsReload(newConfig, extensionPaths));\n }\n\n log.info({ plan }, 'Config hot reload completed');\n }\n\n /**\n * Apply a single hot-reloadable path\n */\n private async applyHotPath(path: string, newConfig: Config): Promise<void> {\n if (path.startsWith('models.')) {\n if (this.callbacks.onModelsReload) {\n await Promise.resolve(this.callbacks.onModelsReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('agents.list') || path.startsWith('agents.capabilityPresets')) {\n if (this.callbacks.onAgentDefaultsReload) {\n await Promise.resolve(this.callbacks.onAgentDefaultsReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('channels.')) {\n if (this.callbacks.onChannelsReload) {\n await Promise.resolve(this.callbacks.onChannelsReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('cron.')) {\n if (this.callbacks.onCronReload) {\n await Promise.resolve(this.callbacks.onCronReload(newConfig));\n }\n return;\n }\n\n if (path === 'gateway.heartbeat' || path.startsWith('gateway.heartbeat.')) {\n if (this.callbacks.onHeartbeatReload) {\n await Promise.resolve(this.callbacks.onHeartbeatReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('tools.')) {\n if (this.callbacks.onToolsReload) {\n await Promise.resolve(this.callbacks.onToolsReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('mcp.') || path === 'mcp') {\n if (this.callbacks.onMcpReload) {\n await Promise.resolve(this.callbacks.onMcpReload(newConfig));\n }\n return;\n }\n\n if (path.startsWith('webSearch.') || path.startsWith('webTools.')) {\n if (this.callbacks.onWebSearchReload) {\n await Promise.resolve(this.callbacks.onWebSearchReload(newConfig));\n }\n return;\n }\n\n log.debug({ path }, 'No handler for hot reload path');\n }\n\n /**\n * Manually trigger a reload\n */\n async triggerReload(): Promise<ReloadResult> {\n return this.reload();\n }\n\n /**\n * Align diff baseline with a freshly loaded config (e.g. Weixin QR wrote token files but JSON unchanged).\n */\n syncCurrentConfig(config: Config): void {\n this.currentConfig = config;\n }\n\n /**\n * Get current config\n */\n getConfig(): Config {\n return this.currentConfig;\n }\n\n /**\n * Check if hot reload is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n}\n\nexport { diffConfigPaths } from './diff.js';\nexport { buildReloadPlan, matchReloadRule, BASE_RELOAD_RULES } from './rules.js';\n"],"mappings":"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"}
@@ -14,69 +14,19 @@ const BASE_RELOAD_RULES = [
14
14
  description: "Model merge mode"
15
15
  },
16
16
  {
17
- prefix: "agents.defaults.models",
17
+ prefix: "agents.list",
18
18
  kind: "hot",
19
- description: "Model configuration"
19
+ description: "Agent manifests"
20
20
  },
21
21
  {
22
- prefix: "agents.defaults.maxTaskDurationMs",
22
+ prefix: "agents.capabilityPresets",
23
23
  kind: "hot",
24
- description: "Per-turn wall-clock timeout (ms)"
24
+ description: "Agent capability presets"
25
25
  },
26
26
  {
27
- prefix: "agents.defaults.maxTokens",
27
+ prefix: "agents.default",
28
28
  kind: "hot",
29
- description: "Max tokens"
30
- },
31
- {
32
- prefix: "agents.defaults.temperature",
33
- kind: "hot",
34
- description: "Temperature"
35
- },
36
- {
37
- prefix: "agents.defaults.maxToolIterations",
38
- kind: "hot",
39
- description: "Max tool iterations"
40
- },
41
- {
42
- prefix: "agents.defaults.compaction",
43
- kind: "hot",
44
- description: "Compaction settings"
45
- },
46
- {
47
- prefix: "agents.defaults.pruning",
48
- kind: "hot",
49
- description: "Pruning settings"
50
- },
51
- {
52
- prefix: "agents.defaults.webExtract",
53
- kind: "hot",
54
- description: "Web extract model and limits"
55
- },
56
- {
57
- prefix: "agents.defaults.browser",
58
- kind: "hot",
59
- description: "Browser automation (Playwright) tools"
60
- },
61
- {
62
- prefix: "agents.defaults.delegate",
63
- kind: "hot",
64
- description: "delegate_task sub-agent tool"
65
- },
66
- {
67
- prefix: "agents.defaults.executeCode",
68
- kind: "hot",
69
- description: "execute_code sandbox tool"
70
- },
71
- {
72
- prefix: "agents.defaults.backgroundReview",
73
- kind: "hot",
74
- description: "Post-turn memory/skill nudge + background review"
75
- },
76
- {
77
- prefix: "agents.defaults.workspace",
78
- kind: "none",
79
- description: "Workspace path - no runtime effect"
29
+ description: "Default agent id"
80
30
  },
81
31
  {
82
32
  prefix: "gateway.bind",