@xopcai/xopc 0.0.116 → 0.0.118

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 (677) hide show
  1. package/README.md +44 -28
  2. package/README.zh-CN.md +63 -45
  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-dzUrQoeZ.js} +1 -1
  33. package/dist/gateway/static/root/assets/agents-BCxZbkOw.js +2 -0
  34. package/dist/gateway/static/root/assets/{app-management-settings-panel-yXSXY_bu.js → app-management-settings-panel-bxYJVJpx.js} +1 -1
  35. package/dist/gateway/static/root/assets/{appearance-settings-DjY1P_ug.js → appearance-settings-BCIykXlI.js} +1 -1
  36. package/dist/gateway/static/root/assets/apps-page--wMEL00f.js +1 -0
  37. package/dist/gateway/static/root/assets/{archive-plugin-CytE5j-e.js → archive-plugin-Cki4SfU2.js} +1 -1
  38. package/dist/gateway/static/root/assets/{attachment-load-BvvrN6rF.js → attachment-load-D-KnS2Do.js} +1 -1
  39. package/dist/gateway/static/root/assets/{binary-plugins-IBWSitnj.js → binary-plugins-D2sgvJja.js} +1 -1
  40. package/dist/gateway/static/root/assets/{block-editor-C-wDpsf-.js → block-editor-DIq-4Gvb.js} +27 -27
  41. package/dist/gateway/static/root/assets/browser-settings-page-DRhKdn81.js +8 -0
  42. package/dist/gateway/static/root/assets/capability-presets-api-CorhiHlg.js +1 -0
  43. package/dist/gateway/static/root/assets/capability-presets-settings-panel-qFx9Jtce.js +1 -0
  44. package/dist/gateway/static/root/assets/channels-settings-BAwAkqIA.js +1 -0
  45. package/dist/gateway/static/root/assets/connectors-page-BQLcfitM.js +2 -0
  46. package/dist/gateway/static/root/assets/cron-api-qGwmL-24.js +1 -0
  47. package/dist/gateway/static/root/assets/cron-page-BBWMAj8-.js +3 -0
  48. package/dist/gateway/static/root/assets/dreaming-settings-Dw89Obml.js +1 -0
  49. package/dist/gateway/static/root/assets/{extension-debug-page-BAIyjDlq.js → extension-debug-page-DYu1KaFQ.js} +1 -1
  50. package/dist/gateway/static/root/assets/{extension-page-DEhv2GpC.js → extension-page-B3W6QwlZ.js} +1 -1
  51. package/dist/gateway/static/root/assets/{extension-settings-page-DOuAxTDW.js → extension-settings-page-D7VQ-cxE.js} +1 -1
  52. package/dist/gateway/static/root/assets/{fetch-CTsREQIe.js → fetch-B7xDPu-R.js} +1 -1
  53. package/dist/gateway/static/root/assets/{format-interval-label-D35Bfhtx.js → format-interval-label-BzxafKxR.js} +1 -1
  54. package/dist/gateway/static/root/assets/gateway-config-api-BTBLSeUu.js +1 -0
  55. package/dist/gateway/static/root/assets/gateway-settings-Cmwy58rS.js +1 -0
  56. package/dist/gateway/static/root/assets/{gateway-startup-retry-C1KAHrd2.js → gateway-startup-retry-CYj9FWCp.js} +1 -1
  57. package/dist/gateway/static/root/assets/goal-detail-page-l7mu5GWX.js +1 -0
  58. package/dist/gateway/static/root/assets/{goals-config-api-KnLGpu6h.js → goals-config-api-CQQgzPr3.js} +1 -1
  59. package/dist/gateway/static/root/assets/goals-page-BHitvJAv.js +2 -0
  60. package/dist/gateway/static/root/assets/{goals-settings-DtPtqZi8.js → goals-settings-CYVY4NGp.js} +1 -1
  61. package/dist/gateway/static/root/assets/{heartbeat-config-api-uKw1f0IG.js → heartbeat-config-api-DriO_CN9.js} +1 -1
  62. package/dist/gateway/static/root/assets/heartbeat-settings-CUQTKxg7.js +1 -0
  63. package/dist/gateway/static/root/assets/index-C17Tsd_b.css +1 -0
  64. package/dist/gateway/static/root/assets/index-Cc41r16l.js +191 -0
  65. package/dist/gateway/static/root/assets/{interval-presets-Dq0FXJ65.js → interval-presets-DFPCKW_W.js} +1 -1
  66. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C9_t4m7t.js → keyboard-shortcuts-settings-CcVcqstx.js} +1 -1
  67. package/dist/gateway/static/root/assets/{logs-page-SNkWzidV.js → logs-page-C2Uqvae9.js} +2 -2
  68. package/dist/gateway/static/root/assets/{markdown-split-Ca87W8-h.js → markdown-split-BwOFrJ2E.js} +1 -1
  69. package/dist/gateway/static/root/assets/{media-plugins-BAcUjPRJ.js → media-plugins-Cnz6Q5G6.js} +1 -1
  70. package/dist/gateway/static/root/assets/messages-B1iSKjiw.js +3 -0
  71. package/dist/gateway/static/root/assets/models-hub-panel-BfLfcta8.js +2 -0
  72. package/dist/gateway/static/root/assets/note-detail-page-BjwOQBfT.js +2 -0
  73. package/dist/gateway/static/root/assets/{note-image-lightbox-hnSX5SSn.js → note-image-lightbox-B-Svpmza.js} +1 -1
  74. package/dist/gateway/static/root/assets/notes-page-DktdBiwB.js +1 -0
  75. package/dist/gateway/static/root/assets/{preview-open-alternatives-CNgM20H5.js → preview-open-alternatives-Bss4TiwP.js} +1 -1
  76. package/dist/gateway/static/root/assets/remote-access-hub-rfVx96fq.js +1 -0
  77. package/dist/gateway/static/root/assets/{save-bar-controls-CcdjGcfT.js → save-bar-controls-BRNjdgKq.js} +1 -1
  78. package/dist/gateway/static/root/assets/{schedule-field-CYr39z76.js → schedule-field-CUCKODde.js} +1 -1
  79. package/dist/gateway/static/root/assets/{schema-form-BRAJgZQ2.js → schema-form-Dub9sy8r.js} +1 -1
  80. package/dist/gateway/static/root/assets/sessions-page-DbtMFuuH.js +1 -0
  81. package/dist/gateway/static/root/assets/settings-advanced-gate-5re5gAnP.js +1 -0
  82. package/dist/gateway/static/root/assets/{settings-collapsible-section-BhzjeGWi.js → settings-collapsible-section-BeFLavGi.js} +1 -1
  83. package/dist/gateway/static/root/assets/{settings-form-section-Cz3Pcr9b.js → settings-form-section-dmyaPOTG.js} +1 -1
  84. package/dist/gateway/static/root/assets/settings-page-D-WMyLlj.js +1 -0
  85. package/dist/gateway/static/root/assets/setup-status-panel-Cl-DEJAU.js +1 -0
  86. package/dist/gateway/static/root/assets/{share-preview-page-DL4y9K5e.js → share-preview-page-C8glrdqe.js} +1 -1
  87. package/dist/gateway/static/root/assets/shares-settings-CyPVvbLt.js +1 -0
  88. package/dist/gateway/static/root/assets/skill-reload-api-CleTH1oz.js +1 -0
  89. package/dist/gateway/static/root/assets/skills-page-Ck8hdXqR.js +2 -0
  90. package/dist/gateway/static/root/assets/{system-settings-panel-FD2jxRZ3.js → system-settings-panel-DI-LN_8G.js} +1 -1
  91. package/dist/gateway/static/root/assets/typed-models-lib-kX9duch4.js +1 -0
  92. package/dist/gateway/static/root/assets/{use-channel-catalog-BInPrfR5.js → use-channel-catalog-DqlWTsDb.js} +1 -1
  93. package/dist/gateway/static/root/assets/user-profile-settings-panel-B-UFPMXy.js +1 -0
  94. package/dist/gateway/static/root/assets/utils-Dm0hKalR.js +1 -0
  95. package/dist/gateway/static/root/assets/voice-api-key-field-C73IVZeC.js +1 -0
  96. package/dist/gateway/static/root/assets/{voice-player-store-1U3vFppm.js → voice-player-store-C_ArLJPM.js} +1 -1
  97. package/dist/gateway/static/root/assets/workflows-page-BtFGp2y_.js +18 -0
  98. package/dist/gateway/static/root/index.html +5 -5
  99. package/dist/package.js +1 -1
  100. package/dist/src/agent/agent-manager.d.ts +1 -1
  101. package/dist/src/agent/agent-manager.js +14 -14
  102. package/dist/src/agent/agent-manager.js.map +1 -1
  103. package/dist/src/agent/agent-scope.js +5 -9
  104. package/dist/src/agent/agent-scope.js.map +1 -1
  105. package/dist/src/agent/background-review/coordinator.js +0 -1
  106. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  107. package/dist/src/agent/background-review/prompts.d.ts +2 -2
  108. package/dist/src/agent/background-review/prompts.js +2 -2
  109. package/dist/src/agent/background-review/prompts.js.map +1 -1
  110. package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
  111. package/dist/src/agent/background-review/run-background-review.js +2 -4
  112. package/dist/src/agent/background-review/run-background-review.js.map +1 -1
  113. package/dist/src/agent/background-review/settings.d.ts +1 -1
  114. package/dist/src/agent/background-review/settings.js +8 -8
  115. package/dist/src/agent/background-review/settings.js.map +1 -1
  116. package/dist/src/agent/bootstrap/bootstrap-cache.d.ts +1 -0
  117. package/dist/src/agent/bootstrap/bootstrap-cache.js +4 -3
  118. package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
  119. package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
  120. package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
  121. package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
  122. package/dist/src/agent/bootstrap/bootstrap-files.d.ts +4 -0
  123. package/dist/src/agent/bootstrap/bootstrap-files.js +4 -3
  124. package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
  125. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +4 -2
  126. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  127. package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +2 -1
  128. package/dist/src/agent/bootstrap/load-bootstrap-files.js +18 -17
  129. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  130. package/dist/src/agent/bootstrap/project-agents-context.js +1 -1
  131. package/dist/src/agent/bootstrap/types.d.ts +1 -1
  132. package/dist/src/agent/context/workspace-seed.js +3 -3
  133. package/dist/src/agent/context/workspace-state.js +1 -1
  134. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  135. package/dist/src/agent/context/workspace.d.ts +4 -2
  136. package/dist/src/agent/context/workspace.js +6 -5
  137. package/dist/src/agent/context/workspace.js.map +1 -1
  138. package/dist/src/agent/embedded/run-for-session.js +4 -1
  139. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  140. package/dist/src/agent/fallback/candidates.js +11 -9
  141. package/dist/src/agent/fallback/candidates.js.map +1 -1
  142. package/dist/src/agent/goals/goal-locale.js +2 -2
  143. package/dist/src/agent/goals/post-turn.js +3 -3
  144. package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
  145. package/dist/src/agent/image/generation/runtime.js +1 -1
  146. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  147. package/dist/src/agent/image/image-helpers.d.ts +1 -1
  148. package/dist/src/agent/image/image-helpers.js +4 -17
  149. package/dist/src/agent/image/image-helpers.js.map +1 -1
  150. package/dist/src/agent/image/image-model-fallback.js +1 -1
  151. package/dist/src/agent/image/image-model-fallback.js.map +1 -1
  152. package/dist/src/agent/image/inbound-image-handling.js +1 -1
  153. package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
  154. package/dist/src/agent/image/load-image-media.js +2 -2
  155. package/dist/src/agent/image/tool-model-config.d.ts +1 -1
  156. package/dist/src/agent/image/tool-model-config.js +2 -2
  157. package/dist/src/agent/image/tool-model-config.js.map +1 -1
  158. package/dist/src/agent/ipc/inbox.js +3 -3
  159. package/dist/src/agent/ipc/socket.js +1 -1
  160. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  161. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  162. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  163. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  164. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
  165. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
  166. package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
  167. package/dist/src/agent/media-generation/runtime-shared.js +1 -1
  168. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  169. package/dist/src/agent/memory/builtin-memory-store.d.ts +6 -2
  170. package/dist/src/agent/memory/builtin-memory-store.js +15 -6
  171. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  172. package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
  173. package/dist/src/agent/memory/builtin-provider.js +290 -11
  174. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  175. package/dist/src/agent/memory/candidate-extractor.d.ts +6 -0
  176. package/dist/src/agent/memory/candidate-extractor.js +60 -0
  177. package/dist/src/agent/memory/candidate-extractor.js.map +1 -0
  178. package/dist/src/agent/memory/context-assembler.d.ts +10 -0
  179. package/dist/src/agent/memory/context-assembler.js +26 -0
  180. package/dist/src/agent/memory/context-assembler.js.map +1 -0
  181. package/dist/src/agent/memory/create-memory-manager.js +25 -7
  182. package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
  183. package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
  184. package/dist/src/agent/memory/dreaming/config.js +8 -8
  185. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  186. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
  187. package/dist/src/agent/memory/dreaming/deep-promotion.js +25 -1
  188. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  189. package/dist/src/agent/memory/dreaming/events.js +1 -1
  190. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  191. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  192. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  193. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  194. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  195. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  196. package/dist/src/agent/memory/index.d.ts +1 -0
  197. package/dist/src/agent/memory/index.js +4 -3
  198. package/dist/src/agent/memory/inject-prefetch.js +6 -2
  199. package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
  200. package/dist/src/agent/memory/manager.d.ts +39 -2
  201. package/dist/src/agent/memory/manager.js +355 -39
  202. package/dist/src/agent/memory/manager.js.map +1 -1
  203. package/dist/src/agent/memory/memory-config.js +15 -15
  204. package/dist/src/agent/memory/memory-config.js.map +1 -1
  205. package/dist/src/agent/memory/memory-flush.js +1 -1
  206. package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
  207. package/dist/src/agent/memory/plugin-discovery.js +97 -31
  208. package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
  209. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -1
  210. package/dist/src/agent/memory/provider.d.ts +20 -15
  211. package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
  212. package/dist/src/agent/memory/stub-memory-provider.js +20 -3
  213. package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
  214. package/dist/src/agent/memory/types.d.ts +162 -3
  215. package/dist/src/agent/models/manager.d.ts +1 -1
  216. package/dist/src/agent/models/manager.js +2 -2
  217. package/dist/src/agent/models/manager.js.map +1 -1
  218. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
  219. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
  220. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  221. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
  222. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  223. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  224. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
  225. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
  226. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
  227. package/dist/src/agent/prompt/memory/index.d.ts +4 -2
  228. package/dist/src/agent/prompt/memory/index.js +19 -13
  229. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  230. package/dist/src/agent/prompt/sections/memory-skills.js +1 -1
  231. package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -1
  232. package/dist/src/agent/prompt/service-prompt-builder.js +5 -20
  233. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  234. package/dist/src/agent/reply/post-compaction-context.js +10 -7
  235. package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
  236. package/dist/src/agent/reply/startup-context.js +7 -12
  237. package/dist/src/agent/reply/startup-context.js.map +1 -1
  238. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  239. package/dist/src/agent/sandbox/path-policy.js +2 -2
  240. package/dist/src/agent/service/process-direct-streaming.js +1 -4
  241. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  242. package/dist/src/agent/service/session-context-report.js +1 -1
  243. package/dist/src/agent/service/session-context-report.js.map +1 -1
  244. package/dist/src/agent/service.d.ts +3 -3
  245. package/dist/src/agent/service.js +30 -35
  246. package/dist/src/agent/service.js.map +1 -1
  247. package/dist/src/agent/service.types.d.ts +1 -2
  248. package/dist/src/agent/session/session-hydrator.js +1 -2
  249. package/dist/src/agent/session/session-hydrator.js.map +1 -1
  250. package/dist/src/agent/session/session-inspector.d.ts +1 -1
  251. package/dist/src/agent/session/session-inspector.js +10 -15
  252. package/dist/src/agent/session/session-inspector.js.map +1 -1
  253. package/dist/src/agent/skills/config.js +2 -2
  254. package/dist/src/agent/skills/filesystem-watcher.js +1 -1
  255. package/dist/src/agent/skills/hub-hash.js +2 -2
  256. package/dist/src/agent/skills/hub-lock.js +1 -1
  257. package/dist/src/agent/skills/hub-pull.js +3 -3
  258. package/dist/src/agent/skills/index.js +2 -2
  259. package/dist/src/agent/skills/installer.js +2 -2
  260. package/dist/src/agent/skills/managed-store.js +1 -1
  261. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  262. package/dist/src/agent/skills/skill-manager.js +1 -1
  263. package/dist/src/agent/skills/skill-view-path.js +1 -1
  264. package/dist/src/agent/skills/test-framework.js +1 -1
  265. package/dist/src/agent/starter-agents.d.ts +1 -3
  266. package/dist/src/agent/starter-agents.js +14 -22
  267. package/dist/src/agent/starter-agents.js.map +1 -1
  268. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
  269. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  270. package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
  271. package/dist/src/agent/tools/curated-memory-tool.js +77 -18
  272. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  273. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  274. package/dist/src/agent/tools/factory.d.ts +0 -4
  275. package/dist/src/agent/tools/factory.js +19 -58
  276. package/dist/src/agent/tools/factory.js.map +1 -1
  277. package/dist/src/agent/tools/find.js +1 -1
  278. package/dist/src/agent/tools/grep.js +1 -1
  279. package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
  280. package/dist/src/agent/tools/image-generate-tool.js +20 -15
  281. package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
  282. package/dist/src/agent/tools/image-tool.js +1 -3
  283. package/dist/src/agent/tools/image-tool.js.map +1 -1
  284. package/dist/src/agent/tools/memory-tool.d.ts +2 -2
  285. package/dist/src/agent/tools/memory-tool.js +39 -14
  286. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  287. package/dist/src/agent/tools/session-search-tool.js +1 -3
  288. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  289. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  290. package/dist/src/agent/tools/web-extract.js +8 -9
  291. package/dist/src/agent/tools/web-extract.js.map +1 -1
  292. package/dist/src/agent/tools/workflow-tool.js +1 -1
  293. package/dist/src/agent/workflow/catalog.js +1 -1
  294. package/dist/src/agent/workflow/subagent-runner.js +1 -3
  295. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  296. package/dist/src/agent-manifest/index.d.ts +4 -0
  297. package/dist/src/agent-manifest/index.js +10 -0
  298. package/dist/src/agent-manifest/index.js.map +1 -0
  299. package/dist/src/agent-manifest/prompt.d.ts +2 -0
  300. package/dist/src/agent-manifest/prompt.js +57 -0
  301. package/dist/src/agent-manifest/prompt.js.map +1 -0
  302. package/dist/src/agent-manifest/resolver.d.ts +12 -0
  303. package/dist/src/agent-manifest/resolver.js +95 -0
  304. package/dist/src/agent-manifest/resolver.js.map +1 -0
  305. package/dist/src/agent-manifest/schema.d.ts +1010 -0
  306. package/dist/src/agent-manifest/schema.js +269 -0
  307. package/dist/src/agent-manifest/schema.js.map +1 -0
  308. package/dist/src/agent-manifest/validator.d.ts +25 -0
  309. package/dist/src/agent-manifest/validator.js +88 -0
  310. package/dist/src/agent-manifest/validator.js.map +1 -0
  311. package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
  312. package/dist/src/agent-runtime/boundary-guard.js +23 -0
  313. package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
  314. package/dist/src/agent-runtime/index.d.ts +7 -0
  315. package/dist/src/agent-runtime/index.js +8 -0
  316. package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
  317. package/dist/src/agent-runtime/memory-runtime.js +50 -0
  318. package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
  319. package/dist/src/agent-runtime/model-router.d.ts +11 -0
  320. package/dist/src/agent-runtime/model-router.js +16 -0
  321. package/dist/src/agent-runtime/model-router.js.map +1 -0
  322. package/dist/src/agent-runtime/run-trace.d.ts +27 -0
  323. package/dist/src/agent-runtime/run-trace.js +53 -0
  324. package/dist/src/agent-runtime/run-trace.js.map +1 -0
  325. package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
  326. package/dist/src/agent-runtime/runtime-profile.js +44 -0
  327. package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
  328. package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
  329. package/dist/src/agent-runtime/tool-registry.js +52 -0
  330. package/dist/src/agent-runtime/tool-registry.js.map +1 -0
  331. package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
  332. package/dist/src/agent-runtime/workflow-runtime.js +34 -0
  333. package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
  334. package/dist/src/ai-assist/text-assist.js +1 -1
  335. package/dist/src/auth/credentials.js +2 -2
  336. package/dist/src/auth/profiles/store.js +2 -2
  337. package/dist/src/auth/sync-provider-auth.js +1 -1
  338. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  339. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  340. package/dist/src/browser/actions/registry.js +5 -8
  341. package/dist/src/browser/actions/registry.js.map +1 -1
  342. package/dist/src/browser/backend-from-config.d.ts +1 -1
  343. package/dist/src/browser/backend-from-config.js +50 -71
  344. package/dist/src/browser/backend-from-config.js.map +1 -1
  345. package/dist/src/browser/browser-command-timeout.d.ts +0 -1
  346. package/dist/src/browser/browser-command-timeout.js +3 -7
  347. package/dist/src/browser/browser-command-timeout.js.map +1 -1
  348. package/dist/src/browser/cache-dir-policy.js +1 -1
  349. package/dist/src/browser/cdp-local-launcher.js +2 -2
  350. package/dist/src/browser/pipeline/source.js +1 -1
  351. package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
  352. package/dist/src/browser/providers/browser-ext-install.js +7 -12
  353. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  354. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  355. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  356. package/dist/src/browser/readiness.js +16 -16
  357. package/dist/src/browser/readiness.js.map +1 -1
  358. package/dist/src/browser/schemas.js +1 -1
  359. package/dist/src/browser/schemas.js.map +1 -1
  360. package/dist/src/browser/stealth.js +1 -1
  361. package/dist/src/channels/catalog/channel-catalog-service.js +1 -1
  362. package/dist/src/channels/outbound/persist-store.js +1 -1
  363. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  364. package/dist/src/channels/pairing/pairing-store.js +2 -2
  365. package/dist/src/channels/pipeline.d.ts +1 -1
  366. package/dist/src/channels/pipeline.js.map +1 -1
  367. package/dist/src/chat-commands/agent-edit.js +2 -3
  368. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  369. package/dist/src/chat-commands/builtins/config.js +6 -6
  370. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  371. package/dist/src/chat-commands/builtins/model.js +2 -2
  372. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  373. package/dist/src/chat-commands/builtins/thinking.js +16 -42
  374. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  375. package/dist/src/chat-commands/config-paths.js +1 -1
  376. package/dist/src/chat-commands/config-paths.js.map +1 -1
  377. package/dist/src/chat-commands/context.js +3 -4
  378. package/dist/src/chat-commands/context.js.map +1 -1
  379. package/dist/src/cli/command-manifest.d.ts +1 -1
  380. package/dist/src/cli/command-manifest.js +2 -2
  381. package/dist/src/cli/command-manifest.js.map +1 -1
  382. package/dist/src/cli/commands/agent.js +3 -1
  383. package/dist/src/cli/commands/agent.js.map +1 -1
  384. package/dist/src/cli/commands/agents.js +3 -6
  385. package/dist/src/cli/commands/agents.js.map +1 -1
  386. package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
  387. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  388. package/dist/src/cli/commands/config.js +6 -6
  389. package/dist/src/cli/commands/config.js.map +1 -1
  390. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  391. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  392. package/dist/src/cli/commands/doctor/checks/provider-auth.js +3 -18
  393. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  394. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  395. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -2
  396. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
  397. package/dist/src/cli/commands/extension-create.js +1 -1
  398. package/dist/src/cli/commands/extension-dev.js +2 -2
  399. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  400. package/dist/src/cli/commands/extension-pack.js +2 -2
  401. package/dist/src/cli/commands/extension.js +3 -3
  402. package/dist/src/cli/commands/gateway/logs.js +1 -1
  403. package/dist/src/cli/commands/goal.js +1 -1
  404. package/dist/src/cli/commands/image.js +13 -372
  405. package/dist/src/cli/commands/image.js.map +1 -1
  406. package/dist/src/cli/commands/init.js +7 -6
  407. package/dist/src/cli/commands/init.js.map +1 -1
  408. package/dist/src/cli/commands/models.js +14 -16
  409. package/dist/src/cli/commands/models.js.map +1 -1
  410. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  411. package/dist/src/cli/commands/onboard/model.js +28 -23
  412. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  413. package/dist/src/cli/commands/onboard.js +3 -3
  414. package/dist/src/cli/commands/onboard.js.map +1 -1
  415. package/dist/src/cli/commands/skills-test.js +1 -1
  416. package/dist/src/cli/commands/tui.js +2 -2
  417. package/dist/src/cli/commands/tui.js.map +1 -1
  418. package/dist/src/cli/index.d.ts +1 -0
  419. package/dist/src/cli/index.js +10 -5
  420. package/dist/src/cli/index.js.map +1 -1
  421. package/dist/src/cli/registry.js +1 -1
  422. package/dist/src/cli/registry.js.map +1 -1
  423. package/dist/src/cli/templates.d.ts +1 -1
  424. package/dist/src/cli/templates.js +2 -12
  425. package/dist/src/cli/templates.js.map +1 -1
  426. package/dist/src/cli/utils/gateway-client.js +1 -1
  427. package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
  428. package/dist/src/cli/utils/init-workspace-core.js +9 -8
  429. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  430. package/dist/src/commands/agents.config.d.ts +0 -1
  431. package/dist/src/commands/agents.config.js +59 -13
  432. package/dist/src/commands/agents.config.js.map +1 -1
  433. package/dist/src/config/agent-profile.d.ts +5 -17
  434. package/dist/src/config/agent-profile.js +32 -64
  435. package/dist/src/config/agent-profile.js.map +1 -1
  436. package/dist/src/config/agent-typed-models.d.ts +1 -1
  437. package/dist/src/config/agent-typed-models.js +3 -6
  438. package/dist/src/config/agent-typed-models.js.map +1 -1
  439. package/dist/src/config/gateway-bind.js +1 -1
  440. package/dist/src/config/index.js +9 -9
  441. package/dist/src/config/integration.d.ts +1 -1
  442. package/dist/src/config/loader.js +4 -4
  443. package/dist/src/config/models-json.js +2 -2
  444. package/dist/src/config/paths-state.js +1 -1
  445. package/dist/src/config/paths.d.ts +8 -1
  446. package/dist/src/config/paths.js +17 -4
  447. package/dist/src/config/paths.js.map +1 -1
  448. package/dist/src/config/profile.js +1 -1
  449. package/dist/src/config/reload.js +2 -2
  450. package/dist/src/config/reload.js.map +1 -1
  451. package/dist/src/config/rules.js +6 -56
  452. package/dist/src/config/rules.js.map +1 -1
  453. package/dist/src/config/schema.d.ts +916 -779
  454. package/dist/src/config/schema.js +174 -423
  455. package/dist/src/config/schema.js.map +1 -1
  456. package/dist/src/config/workspace-path.js +1 -1
  457. package/dist/src/connectors/composio-triggers.js +1 -1
  458. package/dist/src/cron/executor.js +1 -1
  459. package/dist/src/cron/index.js +1 -1
  460. package/dist/src/cron/service.js +2 -2
  461. package/dist/src/cron/validation.d.ts +3 -3
  462. package/dist/src/daemon/constants.js +1 -1
  463. package/dist/src/daemon/install-plan.js +2 -2
  464. package/dist/src/daemon/launchd.js +2 -2
  465. package/dist/src/daemon/schtasks.js +2 -2
  466. package/dist/src/daemon/systemd.js +2 -2
  467. package/dist/src/extensions/activation-context.js +13 -7
  468. package/dist/src/extensions/activation-context.js.map +1 -1
  469. package/dist/src/extensions/bundle-mcp.js +1 -1
  470. package/dist/src/extensions/discover-extensions.js +2 -2
  471. package/dist/src/extensions/health.js +1 -1
  472. package/dist/src/extensions/install.js +2 -2
  473. package/dist/src/extensions/loader.js +2 -2
  474. package/dist/src/extensions/lockfile.js +3 -3
  475. package/dist/src/extensions/security.js +1 -1
  476. package/dist/src/extensions/update.js +2 -2
  477. package/dist/src/gateway/agents-admin.d.ts +24 -18
  478. package/dist/src/gateway/agents-admin.js +158 -92
  479. package/dist/src/gateway/agents-admin.js.map +1 -1
  480. package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
  481. package/dist/src/gateway/capability-presets-admin.js +214 -0
  482. package/dist/src/gateway/capability-presets-admin.js.map +1 -0
  483. package/dist/src/gateway/chat-stream/mapper.js +9 -2
  484. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  485. package/dist/src/gateway/file-path-classifier.js +2 -2
  486. package/dist/src/gateway/global-defaults-admin.d.ts +36 -0
  487. package/dist/src/gateway/global-defaults-admin.js +146 -0
  488. package/dist/src/gateway/global-defaults-admin.js.map +1 -0
  489. package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
  490. package/dist/src/gateway/hono/lib/agent-model.js +1 -1
  491. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  492. package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
  493. package/dist/src/gateway/hono/lib/config-payload.js +14 -38
  494. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  495. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  496. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  497. package/dist/src/gateway/hono/routes/agents.js +88 -33
  498. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  499. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  500. package/dist/src/gateway/hono/routes/browser.js +8 -15
  501. package/dist/src/gateway/hono/routes/browser.js.map +1 -1
  502. package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
  503. package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
  504. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
  505. package/dist/src/gateway/hono/routes/commands-skills.js +4 -5
  506. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  507. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
  508. package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
  509. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  510. package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
  511. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  512. package/dist/src/gateway/hono/routes/config.js +1 -1
  513. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  514. package/dist/src/gateway/hono/routes/dreaming.js +8 -1
  515. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  516. package/dist/src/gateway/hono/routes/global-defaults.d.ts +3 -0
  517. package/dist/src/gateway/hono/routes/global-defaults.js +61 -0
  518. package/dist/src/gateway/hono/routes/global-defaults.js.map +1 -0
  519. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  520. package/dist/src/gateway/hono/routes/index.js +2 -0
  521. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  522. package/dist/src/gateway/hono/routes/lazy-bundles.js +17 -1
  523. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  524. package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
  525. package/dist/src/gateway/hono/routes/memory.js +361 -0
  526. package/dist/src/gateway/hono/routes/memory.js.map +1 -0
  527. package/dist/src/gateway/hono/routes/models.js +2 -2
  528. package/dist/src/gateway/hono/routes/shares.js +1 -1
  529. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  530. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  531. package/dist/src/gateway/lock.js +3 -3
  532. package/dist/src/gateway/ports.js +1 -1
  533. package/dist/src/gateway/service/config-coordinator.js +1 -1
  534. package/dist/src/gateway/service/marketplace-service.d.ts +4 -4
  535. package/dist/src/gateway/service/marketplace-service.js +13 -9
  536. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  537. package/dist/src/gateway/service.d.ts +1 -1
  538. package/dist/src/gateway/service.js +15 -16
  539. package/dist/src/gateway/service.js.map +1 -1
  540. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  541. package/dist/src/goals/goal-workflow-judge.js +2 -2
  542. package/dist/src/i18n/goals-bundle.js +1 -1
  543. package/dist/src/i18n/index.js +1 -1
  544. package/dist/src/i18n/share-tool-bundle.js +2 -2
  545. package/dist/src/infra/brew.js +1 -1
  546. package/dist/src/infra/package-json.js +1 -1
  547. package/dist/src/infra/package-update-steps.js +1 -1
  548. package/dist/src/infra/path-env.js +2 -2
  549. package/dist/src/infra/restart.js +1 -1
  550. package/dist/src/infra/stable-node-path.js +1 -1
  551. package/dist/src/infra/update-check.js +1 -1
  552. package/dist/src/infra/update-global.js +1 -1
  553. package/dist/src/infra/update-lock.js +2 -2
  554. package/dist/src/infra/update-restart.js +1 -1
  555. package/dist/src/infra/update-runner.js +1 -1
  556. package/dist/src/infra/update-startup.js +1 -1
  557. package/dist/src/infra/write-file-atomic.js +2 -2
  558. package/dist/src/media/store.js +1 -1
  559. package/dist/src/notes/agent-context.js +3 -3
  560. package/dist/src/notes/service.js +4 -2
  561. package/dist/src/notes/service.js.map +1 -1
  562. package/dist/src/notes/store.js +2 -2
  563. package/dist/src/project-trust/trust-store.js +2 -2
  564. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  565. package/dist/src/providers/index.d.ts +5 -6
  566. package/dist/src/providers/index.js +26 -30
  567. package/dist/src/providers/index.js.map +1 -1
  568. package/dist/src/providers/model-registry.js +4 -4
  569. package/dist/src/session/index.js +1 -1
  570. package/dist/src/session/init-session-turn.js +1 -1
  571. package/dist/src/session/resolve-session.js +1 -1
  572. package/dist/src/session/session-title.js +2 -2
  573. package/dist/src/session/store.js +1 -1
  574. package/dist/src/session/thinking-resolve.d.ts +1 -1
  575. package/dist/src/session/thinking-resolve.js +1 -1
  576. package/dist/src/session/thinking-resolve.js.map +1 -1
  577. package/dist/src/share/share-auto.js +2 -2
  578. package/dist/src/share/share-store.js +3 -3
  579. package/dist/src/share/share-thumbnail.js +2 -2
  580. package/dist/src/share/share-zip.js +1 -1
  581. package/dist/src/share/site-share-store.js +3 -3
  582. package/dist/src/share/site-static-serve.js +1 -1
  583. package/dist/src/storage/sqlite/connection.js +2 -2
  584. package/dist/src/storage/sqlite/index.d.ts +1 -0
  585. package/dist/src/storage/sqlite/index.js +2 -1
  586. package/dist/src/storage/sqlite/memory-index-repository.d.ts +1 -0
  587. package/dist/src/storage/sqlite/memory-index-repository.js +17 -16
  588. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
  589. package/dist/src/storage/sqlite/memory-records-repository.d.ts +144 -0
  590. package/dist/src/storage/sqlite/memory-records-repository.js +453 -0
  591. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
  592. package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
  593. package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
  594. package/dist/src/storage/sqlite/migrations/014_memory_record_governance.sql +10 -0
  595. package/dist/src/storage/sqlite/migrations/015_memory_trace_feedback.sql +4 -0
  596. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  597. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  598. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  599. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  600. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  601. package/dist/src/storage/sqlite/schema.js +2 -2
  602. package/dist/src/storage/sqlite/schema.sql +86 -0
  603. package/dist/src/tui/backends/embedded-backend.d.ts +3 -0
  604. package/dist/src/tui/backends/embedded-backend.js +43 -24
  605. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  606. package/dist/src/tui/backends/gateway-sse-backend.d.ts +1 -0
  607. package/dist/src/tui/backends/gateway-sse-backend.js +16 -3
  608. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  609. package/dist/src/tui/clipboard-image.js +3 -3
  610. package/dist/src/tui/components/tui-header.d.ts +0 -1
  611. package/dist/src/tui/components/tui-header.js +3 -8
  612. package/dist/src/tui/components/tui-header.js.map +1 -1
  613. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  614. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  615. package/dist/src/tui/theme-manager.js +1 -1
  616. package/dist/src/tui/tui-command-formatters.js +4 -4
  617. package/dist/src/tui/tui-commands.js +2 -2
  618. package/dist/src/tui/tui-keybindings-file.js +1 -1
  619. package/dist/src/tui/tui-scoped-models.js +2 -2
  620. package/dist/src/tui/tui-settings.js +1 -1
  621. package/dist/src/tui/tui-startup-resources.js +2 -1
  622. package/dist/src/tui/tui-startup-resources.js.map +1 -1
  623. package/dist/src/tui/tui-startup-text.js +12 -12
  624. package/dist/src/tui/tui-startup-text.js.map +1 -1
  625. package/dist/src/tui/tui.js +10 -7
  626. package/dist/src/tui/tui.js.map +1 -1
  627. package/dist/src/tunnel/frpc-binary.js +4 -4
  628. package/dist/src/tunnel/frpc-config.js +1 -1
  629. package/dist/src/tunnel/frpc-extract.js +1 -1
  630. package/dist/src/tunnel/tunnel-state.js +1 -1
  631. package/dist/src/utils/logger/audit.js +1 -1
  632. package/dist/src/utils/logger/log-store.js +1 -1
  633. package/dist/src/utils/logger/rotation.js +1 -1
  634. package/dist/src/utils/logger/streams.js +1 -1
  635. package/dist/src/voice/tts/audio.js +1 -1
  636. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  637. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  638. package/dist/src/workflows/service/workflow-run-service.js +4 -5
  639. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  640. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  641. package/dist/src/workflows/store/event-store.js +1 -1
  642. package/dist/src/workflows/store/run-store.js +1 -1
  643. package/package.json +3 -2
  644. package/dist/gateway/static/root/assets/agent-browser-settings-page-D1SyFYeh.js +0 -6
  645. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-C9YxgvuI.js +0 -1
  646. package/dist/gateway/static/root/assets/agents-CteVs3UO.js +0 -71
  647. package/dist/gateway/static/root/assets/apps-page-CVQ1M8Ax.js +0 -1
  648. package/dist/gateway/static/root/assets/channels-settings-Cd3JbeQ1.js +0 -1
  649. package/dist/gateway/static/root/assets/config-api-C4RAtTKW.js +0 -3
  650. package/dist/gateway/static/root/assets/connectors-page-MsMa5qBr.js +0 -2
  651. package/dist/gateway/static/root/assets/cron-api-sJNMqB6P.js +0 -1
  652. package/dist/gateway/static/root/assets/cron-page-D30CSwkn.js +0 -3
  653. package/dist/gateway/static/root/assets/dreaming-settings-6fCUWRQf.js +0 -1
  654. package/dist/gateway/static/root/assets/gateway-config-api-C6989a-W.js +0 -1
  655. package/dist/gateway/static/root/assets/gateway-settings-BpF26t91.js +0 -1
  656. package/dist/gateway/static/root/assets/goal-detail-page-DOjhmRyf.js +0 -1
  657. package/dist/gateway/static/root/assets/goals-page-Xl9_wrFc.js +0 -2
  658. package/dist/gateway/static/root/assets/heartbeat-settings-DN9vEj9P.js +0 -1
  659. package/dist/gateway/static/root/assets/index-C8ytlAF2.js +0 -122
  660. package/dist/gateway/static/root/assets/index-CVpJW2NS.css +0 -1
  661. package/dist/gateway/static/root/assets/messages-BqzIDrlr.js +0 -3
  662. package/dist/gateway/static/root/assets/models-hub-panel-BO4o-GmO.js +0 -2
  663. package/dist/gateway/static/root/assets/note-detail-page-DLV_XDmT.js +0 -2
  664. package/dist/gateway/static/root/assets/notes-page-ycsDlkFA.js +0 -1
  665. package/dist/gateway/static/root/assets/remote-access-hub-DQpnE8K9.js +0 -1
  666. package/dist/gateway/static/root/assets/sessions-page-BZui7iAY.js +0 -1
  667. package/dist/gateway/static/root/assets/settings-advanced-gate-DEfzZ1ax.js +0 -1
  668. package/dist/gateway/static/root/assets/settings-page-CLuSsu1-.js +0 -1
  669. package/dist/gateway/static/root/assets/setup-status-panel-Cq4qpXLi.js +0 -1
  670. package/dist/gateway/static/root/assets/shares-settings-B9F3HyYQ.js +0 -1
  671. package/dist/gateway/static/root/assets/skill-reload-api-Bp9UPPwm.js +0 -1
  672. package/dist/gateway/static/root/assets/skills-page-BIoBsfSV.js +0 -2
  673. package/dist/gateway/static/root/assets/use-agent-defaults-form-Cz2_pPzu.js +0 -1
  674. package/dist/gateway/static/root/assets/use-settings-tab-guard-nuHMmZQv.js +0 -1
  675. package/dist/gateway/static/root/assets/voice-api-key-field-BUIrKb8s.js +0 -1
  676. package/dist/gateway/static/root/assets/workflows-page-qE3SexnO.js +0 -18
  677. package/dist/src/agent/context/workspace-templates/USER.md +0 -24
@@ -5,7 +5,7 @@ init_paths();
5
5
  init_workspace_defaults();
6
6
  function createDefaultContext(argv = process.argv, opts) {
7
7
  return {
8
- configPath: opts?.config || process.env.XOPC_CONFIG || resolveConfigPath(),
8
+ configPath: opts?.config || process.env.XOPC_CONFIG || process.env.XOPC_CONFIG_PATH || resolveConfigPath(),
9
9
  workspacePath: opts?.workspace || process.env.XOPC_WORKSPACE || resolveDefaultAgentWorkspaceDir(),
10
10
  isVerbose: opts?.verbose ?? (argv.includes("--verbose") || argv.includes("-v")),
11
11
  argv
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../../../src/cli/registry.ts"],"sourcesContent":["import type { Command } from 'commander';\nimport { resolveConfigPath } from '../config/paths.js';\nimport { resolveDefaultAgentWorkspaceDir } from '../config/workspace-defaults.js';\n\nexport interface CLIContext {\n configPath: string;\n workspacePath: string;\n isVerbose: boolean;\n argv: string[];\n}\n\nexport function createDefaultContext(\n argv: string[] = process.argv,\n opts?: { config?: string; workspace?: string; verbose?: boolean }\n): CLIContext {\n return {\n configPath: opts?.config || process.env.XOPC_CONFIG || resolveConfigPath(),\n workspacePath: opts?.workspace || process.env.XOPC_WORKSPACE || resolveDefaultAgentWorkspaceDir(),\n isVerbose: (opts?.verbose ?? (argv.includes('--verbose') || argv.includes('-v'))),\n argv,\n };\n}\n\nexport interface CommandMetadata {\n category?: 'setup' | 'runtime' | 'maintenance' | 'utility';\n hidden?: boolean;\n unstable?: boolean;\n examples?: string[];\n}\n\nexport interface CommandDefinition {\n id: string;\n name: string;\n description: string;\n factory: (ctx: CLIContext, getCtx?: () => CLIContext) => Command;\n metadata?: CommandMetadata;\n}\n\nexport class CommandRegistry {\n private commands: CommandDefinition[] = [];\n private initialized = false;\n private suppressLateRegistrationWarnings = false;\n\n /**\n * Temporarily silence the \"registered after initialization\" warning. Used by\n * commands that need to bulk-load other command modules to harvest their\n * side effects during initialization.\n */\n setSuppressLateRegistrationWarnings(value: boolean): void {\n this.suppressLateRegistrationWarnings = value;\n }\n\n register(def: CommandDefinition): void {\n if (this.initialized && !this.suppressLateRegistrationWarnings) {\n console.warn(`Warning: Command \"${def.id}\" registered after initialization`);\n }\n\n const existing = this.commands.find(c => c.id === def.id);\n if (existing) {\n throw new Error(`Command with id \"${def.id}\" already registered (name: ${existing.name})`);\n }\n\n const existingName = this.commands.find(c => c.name === def.name);\n if (existingName) {\n throw new Error(`Command with name \"${def.name}\" already registered (id: ${existingName.id})`);\n }\n\n this.commands.push(def);\n }\n\n registerAll(defs: CommandDefinition[]): void {\n for (const def of defs) {\n this.register(def);\n }\n }\n\n getCommands(): ReadonlyArray<CommandDefinition> {\n return this.commands;\n }\n\n getCommandsByCategory(category: CommandMetadata['category']): ReadonlyArray<CommandDefinition> {\n return this.commands.filter(c => c.metadata?.category === category);\n }\n\n findById(id: string): CommandDefinition | undefined {\n return this.commands.find(c => c.id === id);\n }\n\n findByName(name: string): CommandDefinition | undefined {\n return this.commands.find(c => c.name === name);\n }\n\n install(program: Command, ctx: CLIContext, getCtx?: () => CLIContext): void {\n this.initialized = true;\n\n const categoryOrder = { setup: 0, runtime: 1, maintenance: 2, utility: 3 };\n const sorted = [...this.commands].sort((a, b) => {\n const orderA = categoryOrder[a.metadata?.category ?? 'utility'];\n const orderB = categoryOrder[b.metadata?.category ?? 'utility'];\n return orderA - orderB;\n });\n\n for (const def of sorted) {\n if (def.metadata?.hidden) continue;\n\n try {\n const cmd = def.factory(ctx, getCtx);\n program.addCommand(cmd);\n } catch (error) {\n console.error(`Failed to register command \"${def.id}\":`, error);\n }\n }\n }\n\n installOne(\n program: Command,\n name: string,\n ctx: CLIContext,\n getCtx?: () => CLIContext,\n ): boolean {\n this.initialized = true;\n const def = this.findByName(name);\n if (!def || def.metadata?.hidden) return false;\n try {\n const cmd = def.factory(ctx, getCtx);\n program.addCommand(cmd);\n return true;\n } catch (error) {\n console.error(`Failed to register command \"${def.id}\":`, error);\n return false;\n }\n }\n\n getStats(): { total: number; byCategory: Record<string, number> } {\n const byCategory: Record<string, number> = {};\n for (const cmd of this.commands) {\n const cat = cmd.metadata?.category ?? 'uncategorized';\n byCategory[cat] = (byCategory[cat] || 0) + 1;\n }\n return { total: this.commands.length, byCategory };\n }\n}\n\nexport const registry = new CommandRegistry();\n\nexport function register(def: CommandDefinition): void {\n registry.register(def);\n}\n\nexport function formatExamples(examples: string[]): string {\n if (examples.length === 0) return '';\n return '\\nExamples:\\n' + examples.map(e => ` $ ${e}`).join('\\n');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../../../src/cli/registry.ts"],"sourcesContent":["import type { Command } from 'commander';\nimport { resolveConfigPath } from '../config/paths.js';\nimport { resolveDefaultAgentWorkspaceDir } from '../config/workspace-defaults.js';\n\nexport interface CLIContext {\n configPath: string;\n workspacePath: string;\n isVerbose: boolean;\n argv: string[];\n}\n\nexport function createDefaultContext(\n argv: string[] = process.argv,\n opts?: { config?: string; workspace?: string; verbose?: boolean }\n): CLIContext {\n return {\n configPath: opts?.config || process.env.XOPC_CONFIG || process.env.XOPC_CONFIG_PATH || resolveConfigPath(),\n workspacePath: opts?.workspace || process.env.XOPC_WORKSPACE || resolveDefaultAgentWorkspaceDir(),\n isVerbose: (opts?.verbose ?? (argv.includes('--verbose') || argv.includes('-v'))),\n argv,\n };\n}\n\nexport interface CommandMetadata {\n category?: 'setup' | 'runtime' | 'maintenance' | 'utility';\n hidden?: boolean;\n unstable?: boolean;\n examples?: string[];\n}\n\nexport interface CommandDefinition {\n id: string;\n name: string;\n description: string;\n factory: (ctx: CLIContext, getCtx?: () => CLIContext) => Command;\n metadata?: CommandMetadata;\n}\n\nexport class CommandRegistry {\n private commands: CommandDefinition[] = [];\n private initialized = false;\n private suppressLateRegistrationWarnings = false;\n\n /**\n * Temporarily silence the \"registered after initialization\" warning. Used by\n * commands that need to bulk-load other command modules to harvest their\n * side effects during initialization.\n */\n setSuppressLateRegistrationWarnings(value: boolean): void {\n this.suppressLateRegistrationWarnings = value;\n }\n\n register(def: CommandDefinition): void {\n if (this.initialized && !this.suppressLateRegistrationWarnings) {\n console.warn(`Warning: Command \"${def.id}\" registered after initialization`);\n }\n\n const existing = this.commands.find(c => c.id === def.id);\n if (existing) {\n throw new Error(`Command with id \"${def.id}\" already registered (name: ${existing.name})`);\n }\n\n const existingName = this.commands.find(c => c.name === def.name);\n if (existingName) {\n throw new Error(`Command with name \"${def.name}\" already registered (id: ${existingName.id})`);\n }\n\n this.commands.push(def);\n }\n\n registerAll(defs: CommandDefinition[]): void {\n for (const def of defs) {\n this.register(def);\n }\n }\n\n getCommands(): ReadonlyArray<CommandDefinition> {\n return this.commands;\n }\n\n getCommandsByCategory(category: CommandMetadata['category']): ReadonlyArray<CommandDefinition> {\n return this.commands.filter(c => c.metadata?.category === category);\n }\n\n findById(id: string): CommandDefinition | undefined {\n return this.commands.find(c => c.id === id);\n }\n\n findByName(name: string): CommandDefinition | undefined {\n return this.commands.find(c => c.name === name);\n }\n\n install(program: Command, ctx: CLIContext, getCtx?: () => CLIContext): void {\n this.initialized = true;\n\n const categoryOrder = { setup: 0, runtime: 1, maintenance: 2, utility: 3 };\n const sorted = [...this.commands].sort((a, b) => {\n const orderA = categoryOrder[a.metadata?.category ?? 'utility'];\n const orderB = categoryOrder[b.metadata?.category ?? 'utility'];\n return orderA - orderB;\n });\n\n for (const def of sorted) {\n if (def.metadata?.hidden) continue;\n\n try {\n const cmd = def.factory(ctx, getCtx);\n program.addCommand(cmd);\n } catch (error) {\n console.error(`Failed to register command \"${def.id}\":`, error);\n }\n }\n }\n\n installOne(\n program: Command,\n name: string,\n ctx: CLIContext,\n getCtx?: () => CLIContext,\n ): boolean {\n this.initialized = true;\n const def = this.findByName(name);\n if (!def || def.metadata?.hidden) return false;\n try {\n const cmd = def.factory(ctx, getCtx);\n program.addCommand(cmd);\n return true;\n } catch (error) {\n console.error(`Failed to register command \"${def.id}\":`, error);\n return false;\n }\n }\n\n getStats(): { total: number; byCategory: Record<string, number> } {\n const byCategory: Record<string, number> = {};\n for (const cmd of this.commands) {\n const cat = cmd.metadata?.category ?? 'uncategorized';\n byCategory[cat] = (byCategory[cat] || 0) + 1;\n }\n return { total: this.commands.length, byCategory };\n }\n}\n\nexport const registry = new CommandRegistry();\n\nexport function register(def: CommandDefinition): void {\n registry.register(def);\n}\n\nexport function formatExamples(examples: string[]): string {\n if (examples.length === 0) return '';\n return '\\nExamples:\\n' + examples.map(e => ` $ ${e}`).join('\\n');\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * Templates are stored in docs/reference/templates/ and loaded at runtime.
4
4
  */
5
5
  /** Profile Markdown template file names (seeded into `agents/<id>/profile/`). */
6
- export declare const TEMPLATE_FILES: readonly ["SOUL.md", "IDENTITY.md", "USER.md", "TOOLS.md", "AGENTS.md", "HEARTBEAT.md", "MEMORY.md"];
6
+ export declare const TEMPLATE_FILES: readonly ["SOUL.md", "IDENTITY.md", "TOOLS.md", "AGENTS.md", "HEARTBEAT.md", "MEMORY.md"];
7
7
  export type TemplateFile = (typeof TEMPLATE_FILES)[number];
8
8
  /** Alias for profile Markdown templates used by seed helpers. */
9
9
  export declare const PROFILE_MARKDOWN_TEMPLATE_FILES: readonly TemplateFile[];
@@ -1,5 +1,5 @@
1
- import { existsSync, readFileSync } from "fs";
2
1
  import { dirname, join } from "path";
2
+ import { existsSync, readFileSync } from "fs";
3
3
  import { fileURLToPath } from "url";
4
4
  //#region src/cli/templates.ts
5
5
  /**
@@ -11,7 +11,6 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
11
11
  const TEMPLATE_FILES = [
12
12
  "SOUL.md",
13
13
  "IDENTITY.md",
14
- "USER.md",
15
14
  "TOOLS.md",
16
15
  "AGENTS.md",
17
16
  "HEARTBEAT.md",
@@ -71,7 +70,7 @@ This folder is home. Treat it that way.
71
70
 
72
71
  ## Session Startup
73
72
 
74
- Use runtime-provided startup context first. Bootstrap files (SOUL, USER, MEMORY, etc.) are injected by xopc on /new and /reset.
73
+ Use runtime-provided startup context first. Bootstrap files (global user profile, SOUL, MEMORY, etc.) are injected by xopc on /new and /reset.
75
74
 
76
75
  Do not manually reread startup files unless the user asks or the provided context is incomplete.
77
76
 
@@ -116,15 +115,6 @@ _Fill this in during your first conversation._
116
115
  - **Creature:**
117
116
  - **Vibe:**
118
117
  - **Emoji:**
119
- `,
120
- "USER.md": `# USER.md - About Your Human
121
-
122
- _Learn about the person you're helping._
123
-
124
- - **Name:**
125
- - **What to call them:**
126
- - **Timezone:**
127
- - **Notes:**
128
118
  `,
129
119
  "TOOLS.md": `# TOOLS.md - Local Notes
130
120
 
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","names":[],"sources":["../../../src/cli/templates.ts"],"sourcesContent":["/**\n * Workspace template files for onboarding.\n * Templates are stored in docs/reference/templates/ and loaded at runtime.\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/** Profile Markdown template file names (seeded into `agents/<id>/profile/`). */\nexport const TEMPLATE_FILES = [\n 'SOUL.md',\n 'IDENTITY.md',\n 'USER.md',\n 'TOOLS.md',\n 'AGENTS.md',\n 'HEARTBEAT.md',\n 'MEMORY.md',\n] as const;\n\nexport type TemplateFile = (typeof TEMPLATE_FILES)[number];\n\n/** Alias for profile Markdown templates used by seed helpers. */\nexport const PROFILE_MARKDOWN_TEMPLATE_FILES: readonly TemplateFile[] = [...TEMPLATE_FILES];\n\n/** Template content cache */\nconst templateCache = new Map<TemplateFile, string>();\n\n/**\n * Get the path to template files.\n * Uses environment or looks in project root.\n */\nfunction getTemplatePath(): string {\n // Use environment to determine path\n const envPath = process.env.XOPC_TEMPLATE_PATH;\n if (envPath && existsSync(envPath)) {\n return envPath;\n }\n\n // Default: look in project root docs/reference/templates\n // Works for both development (src/cli/) and production (dist/cli/)\n const projectRoot = join(__dirname, '../../..');\n const defaultPath = join(projectRoot, 'docs/reference/templates');\n \n if (existsSync(defaultPath)) {\n return defaultPath;\n }\n\n // Fallback: return default (will fail gracefully)\n return defaultPath;\n}\n\n/**\n * Load a template file. Caches results for repeated access.\n */\nexport function loadTemplate(name: TemplateFile): string {\n // Return cached version if available\n if (templateCache.has(name)) {\n return templateCache.get(name)!;\n }\n\n const templatePath = join(getTemplatePath(), name);\n \n try {\n if (existsSync(templatePath)) {\n const content = readFileSync(templatePath, 'utf-8');\n templateCache.set(name, content);\n return content;\n }\n } catch {\n // Fall through to fallback\n }\n\n // Fallback: return minimal default if template is missing\n console.warn(`Warning: Template ${name} not found, using fallback`);\n return getFallbackTemplate(name);\n}\n\n/**\n * Load all templates as a record.\n */\nexport function loadAllTemplates(): Record<TemplateFile, string> {\n const result = {} as Record<TemplateFile, string>;\n for (const name of TEMPLATE_FILES) {\n result[name] = loadTemplate(name);\n }\n return result;\n}\n\n/**\n * Clear the template cache (useful for testing).\n */\nexport function clearTemplateCache(): void {\n templateCache.clear();\n}\n\n/** Minimal fallback templates in case files are missing */\nexport function getFallbackTemplate(name: TemplateFile): string {\n const fallbacks: Record<TemplateFile, string> = {\n 'AGENTS.md': `# AGENTS.md - Your Workspace\n\nThis folder is home. Treat it that way.\n\n## Session Startup\n\nUse runtime-provided startup context first. Bootstrap files (SOUL, USER, MEMORY, etc.) are injected by xopc on /new and /reset.\n\nDo not manually reread startup files unless the user asks or the provided context is incomplete.\n\n## Red Lines\n\n- Don't exfiltrate private data\n- Don't run destructive commands without asking\n- When in doubt, ask\n\n## Memory\n\n- **Daily notes:** \\`memory/YYYY-MM-DD.md\\`\n- **Long-term:** profile \\`MEMORY.md\\`\n\nWrite what matters. Text > Brain.\n`,\n 'SOUL.md': `# SOUL.md - Who You Are\n\n_You're not a chatbot. You're becoming someone._\n\n## Core Truths\n\n- Be genuinely helpful, not performatively helpful\n- Have opinions\n- Be resourceful before asking\n- Earn trust through competence\n- Remember you're a guest\n\n## Boundaries\n\n- Private things stay private\n- When in doubt, ask before acting externally\n- Never send half-baked replies\n\nThis file is yours to evolve.\n`,\n 'IDENTITY.md': `# IDENTITY.md - Who Am I?\n\n_Fill this in during your first conversation._\n\n- **Name:**\n- **Creature:**\n- **Vibe:**\n- **Emoji:**\n`,\n 'USER.md': `# USER.md - About Your Human\n\n_Learn about the person you're helping._\n\n- **Name:**\n- **What to call them:**\n- **Timezone:**\n- **Notes:**\n`,\n 'TOOLS.md': `# TOOLS.md - Local Notes\n\nEnvironment-specific notes:\n\n- SSH hosts\n- API endpoints\n- Device nicknames\n`,\n 'HEARTBEAT.md': `# HEARTBEAT.md - Periodic Checks\n\nEdit this file to define what you check during heartbeat polls.\n\n## Example Checklist\n\n- [ ] Check email for urgent messages\n- [ ] Check calendar for upcoming events\n\n**Remember:** If nothing needs attention, reply \\`HEARTBEAT_OK\\`.\n`,\n 'MEMORY.md': `# MEMORY.md - Long-Term Memory\n\n_Your curated memories._\n\n## People\n\n## Projects\n\n## Preferences\n\n## Learned Lessons\n\n**Only load in main sessions.**\n`,\n };\n \n return fallbacks[name] || `# ${name}\\n\\n(Template content missing)\\n`;\n}\n"],"mappings":";;;;;;;;AAUA,MAAM,YAAY,QADC,cAAc,OAAO,KAAK,IACT,CAAC;;AAGrC,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;AAKD,MAAa,kCAA2D,CAAC,GAAG,eAAe;;AAG3F,MAAM,gCAAgB,IAAI,KAA2B;;;;;AAMrD,SAAS,kBAA0B;CAEjC,MAAM,UAAU,QAAQ,IAAI;AAC5B,KAAI,WAAW,WAAW,QAAQ,CAChC,QAAO;CAMT,MAAM,cAAc,KADA,KAAK,WAAW,WACA,EAAE,2BAA2B;AAEjE,KAAI,WAAW,YAAY,CACzB,QAAO;AAIT,QAAO;;;;;AAMT,SAAgB,aAAa,MAA4B;AAEvD,KAAI,cAAc,IAAI,KAAK,CACzB,QAAO,cAAc,IAAI,KAAK;CAGhC,MAAM,eAAe,KAAK,iBAAiB,EAAE,KAAK;AAElD,KAAI;AACF,MAAI,WAAW,aAAa,EAAE;GAC5B,MAAM,UAAU,aAAa,cAAc,QAAQ;AACnD,iBAAc,IAAI,MAAM,QAAQ;AAChC,UAAO;;SAEH;AAKR,SAAQ,KAAK,qBAAqB,KAAK,4BAA4B;AACnE,QAAO,oBAAoB,KAAK;;;;;AAMlC,SAAgB,mBAAiD;CAC/D,MAAM,SAAS,EAAE;AACjB,MAAK,MAAM,QAAQ,eACjB,QAAO,QAAQ,aAAa,KAAK;AAEnC,QAAO;;;;;AAMT,SAAgB,qBAA2B;AACzC,eAAc,OAAO;;;AAIvB,SAAgB,oBAAoB,MAA4B;AAkG9D,QAAO;EAhGL,aAAa;;;;;;;;;;;;;;;;;;;;;;;EAuBb,WAAW;;;;;;;;;;;;;;;;;;;;EAoBX,eAAe;;;;;;;;;EASf,WAAW;;;;;;;;;EASX,YAAY;;;;;;;;EAQZ,gBAAgB;;;;;;;;;;;EAWhB,aAAa;;;;;;;;;;;;;;EAgBC,CAAC,SAAS,KAAK,KAAK"}
1
+ {"version":3,"file":"templates.js","names":[],"sources":["../../../src/cli/templates.ts"],"sourcesContent":["/**\n * Workspace template files for onboarding.\n * Templates are stored in docs/reference/templates/ and loaded at runtime.\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/** Profile Markdown template file names (seeded into `agents/<id>/profile/`). */\nexport const TEMPLATE_FILES = [\n 'SOUL.md',\n 'IDENTITY.md',\n 'TOOLS.md',\n 'AGENTS.md',\n 'HEARTBEAT.md',\n 'MEMORY.md',\n] as const;\n\nexport type TemplateFile = (typeof TEMPLATE_FILES)[number];\n\n/** Alias for profile Markdown templates used by seed helpers. */\nexport const PROFILE_MARKDOWN_TEMPLATE_FILES: readonly TemplateFile[] = [...TEMPLATE_FILES];\n\n/** Template content cache */\nconst templateCache = new Map<TemplateFile, string>();\n\n/**\n * Get the path to template files.\n * Uses environment or looks in project root.\n */\nfunction getTemplatePath(): string {\n // Use environment to determine path\n const envPath = process.env.XOPC_TEMPLATE_PATH;\n if (envPath && existsSync(envPath)) {\n return envPath;\n }\n\n // Default: look in project root docs/reference/templates\n // Works for both development (src/cli/) and production (dist/cli/)\n const projectRoot = join(__dirname, '../../..');\n const defaultPath = join(projectRoot, 'docs/reference/templates');\n \n if (existsSync(defaultPath)) {\n return defaultPath;\n }\n\n // Fallback: return default (will fail gracefully)\n return defaultPath;\n}\n\n/**\n * Load a template file. Caches results for repeated access.\n */\nexport function loadTemplate(name: TemplateFile): string {\n // Return cached version if available\n if (templateCache.has(name)) {\n return templateCache.get(name)!;\n }\n\n const templatePath = join(getTemplatePath(), name);\n \n try {\n if (existsSync(templatePath)) {\n const content = readFileSync(templatePath, 'utf-8');\n templateCache.set(name, content);\n return content;\n }\n } catch {\n // Fall through to fallback\n }\n\n // Fallback: return minimal default if template is missing\n console.warn(`Warning: Template ${name} not found, using fallback`);\n return getFallbackTemplate(name);\n}\n\n/**\n * Load all templates as a record.\n */\nexport function loadAllTemplates(): Record<TemplateFile, string> {\n const result = {} as Record<TemplateFile, string>;\n for (const name of TEMPLATE_FILES) {\n result[name] = loadTemplate(name);\n }\n return result;\n}\n\n/**\n * Clear the template cache (useful for testing).\n */\nexport function clearTemplateCache(): void {\n templateCache.clear();\n}\n\n/** Minimal fallback templates in case files are missing */\nexport function getFallbackTemplate(name: TemplateFile): string {\n const fallbacks: Record<TemplateFile, string> = {\n 'AGENTS.md': `# AGENTS.md - Your Workspace\n\nThis folder is home. Treat it that way.\n\n## Session Startup\n\nUse runtime-provided startup context first. Bootstrap files (global user profile, SOUL, MEMORY, etc.) are injected by xopc on /new and /reset.\n\nDo not manually reread startup files unless the user asks or the provided context is incomplete.\n\n## Red Lines\n\n- Don't exfiltrate private data\n- Don't run destructive commands without asking\n- When in doubt, ask\n\n## Memory\n\n- **Daily notes:** \\`memory/YYYY-MM-DD.md\\`\n- **Long-term:** profile \\`MEMORY.md\\`\n\nWrite what matters. Text > Brain.\n`,\n 'SOUL.md': `# SOUL.md - Who You Are\n\n_You're not a chatbot. You're becoming someone._\n\n## Core Truths\n\n- Be genuinely helpful, not performatively helpful\n- Have opinions\n- Be resourceful before asking\n- Earn trust through competence\n- Remember you're a guest\n\n## Boundaries\n\n- Private things stay private\n- When in doubt, ask before acting externally\n- Never send half-baked replies\n\nThis file is yours to evolve.\n`,\n 'IDENTITY.md': `# IDENTITY.md - Who Am I?\n\n_Fill this in during your first conversation._\n\n- **Name:**\n- **Creature:**\n- **Vibe:**\n- **Emoji:**\n`,\n 'TOOLS.md': `# TOOLS.md - Local Notes\n\nEnvironment-specific notes:\n\n- SSH hosts\n- API endpoints\n- Device nicknames\n`,\n 'HEARTBEAT.md': `# HEARTBEAT.md - Periodic Checks\n\nEdit this file to define what you check during heartbeat polls.\n\n## Example Checklist\n\n- [ ] Check email for urgent messages\n- [ ] Check calendar for upcoming events\n\n**Remember:** If nothing needs attention, reply \\`HEARTBEAT_OK\\`.\n`,\n 'MEMORY.md': `# MEMORY.md - Long-Term Memory\n\n_Your curated memories._\n\n## People\n\n## Projects\n\n## Preferences\n\n## Learned Lessons\n\n**Only load in main sessions.**\n`,\n };\n \n return fallbacks[name] || `# ${name}\\n\\n(Template content missing)\\n`;\n}\n"],"mappings":";;;;;;;;AAUA,MAAM,YAAY,QADC,cAAc,OAAO,KAAK,IACT,CAAC;;AAGrC,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACD;;AAKD,MAAa,kCAA2D,CAAC,GAAG,eAAe;;AAG3F,MAAM,gCAAgB,IAAI,KAA2B;;;;;AAMrD,SAAS,kBAA0B;CAEjC,MAAM,UAAU,QAAQ,IAAI;AAC5B,KAAI,WAAW,WAAW,QAAQ,CAChC,QAAO;CAMT,MAAM,cAAc,KADA,KAAK,WAAW,WACA,EAAE,2BAA2B;AAEjE,KAAI,WAAW,YAAY,CACzB,QAAO;AAIT,QAAO;;;;;AAMT,SAAgB,aAAa,MAA4B;AAEvD,KAAI,cAAc,IAAI,KAAK,CACzB,QAAO,cAAc,IAAI,KAAK;CAGhC,MAAM,eAAe,KAAK,iBAAiB,EAAE,KAAK;AAElD,KAAI;AACF,MAAI,WAAW,aAAa,EAAE;GAC5B,MAAM,UAAU,aAAa,cAAc,QAAQ;AACnD,iBAAc,IAAI,MAAM,QAAQ;AAChC,UAAO;;SAEH;AAKR,SAAQ,KAAK,qBAAqB,KAAK,4BAA4B;AACnE,QAAO,oBAAoB,KAAK;;;;;AAMlC,SAAgB,mBAAiD;CAC/D,MAAM,SAAS,EAAE;AACjB,MAAK,MAAM,QAAQ,eACjB,QAAO,QAAQ,aAAa,KAAK;AAEnC,QAAO;;;;;AAMT,SAAgB,qBAA2B;AACzC,eAAc,OAAO;;;AAIvB,SAAgB,oBAAoB,MAA4B;AAyF9D,QAAO;EAvFL,aAAa;;;;;;;;;;;;;;;;;;;;;;;EAuBb,WAAW;;;;;;;;;;;;;;;;;;;;EAoBX,eAAe;;;;;;;;;EASf,YAAY;;;;;;;;EAQZ,gBAAgB;;;;;;;;;;;EAWhB,aAAa;;;;;;;;;;;;;;EAgBC,CAAC,SAAS,KAAK,KAAK"}
@@ -1,6 +1,6 @@
1
- import { init_paths, resolveConfigPath } from "../../config/paths.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_paths, resolveConfigPath } from "../../config/paths.js";
4
4
  import { loadConfig } from "../../config/loader.js";
5
5
  import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
6
6
  import "../../config/index.js";
@@ -4,10 +4,7 @@ export interface InitWorkspaceCoreOptions {
4
4
  workspacePath: string;
5
5
  /** When set with a new config file, overrides schema default port (e.g. Electron). */
6
6
  gatewayPort?: number;
7
- /**
8
- * When true, sets `agents.defaults.workspace` to `dirname(workspacePath)` (parent of the
9
- * Markdown root being initialised, e.g. `…/workspace` when `workspacePath` is `…/workspace/main`).
10
- */
7
+ /** When true, sets the default agent manifest workspace root to `workspacePath`. */
11
8
  persistWorkspacePath?: boolean;
12
9
  /** Optional channel plugin validator (CLI/gateway only; Electron omits). */
13
10
  assertChannelPlugins?: (cfg: Config) => void | Promise<void>;
@@ -1,9 +1,9 @@
1
1
  import { ConfigSchema, init_schema } from "../../config/schema.js";
2
2
  import { init_loader, saveConfig } from "../../config/loader.js";
3
3
  import { ensureStarterAgentsInitialized } from "../../agent/starter-agents.js";
4
- import { randomBytes } from "node:crypto";
5
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
4
  import { dirname } from "node:path";
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
+ import { randomBytes } from "node:crypto";
7
7
  //#region src/cli/utils/init-workspace-core.ts
8
8
  init_schema();
9
9
  init_loader();
@@ -33,7 +33,7 @@ async function initWorkspaceCore(options) {
33
33
  const gatewayPortDefaulted = options.gatewayPort ?? 18790;
34
34
  const persistWorkspacePath = options.persistWorkspacePath ?? false;
35
35
  const { configPath, workspacePath, assertChannelPlugins } = options;
36
- const persistedDefaultsWorkspace = persistWorkspacePath ? dirname(workspacePath) : void 0;
36
+ const persistedWorkspaceRoot = persistWorkspacePath ? workspacePath : void 0;
37
37
  mkdirSync(dirname(configPath), { recursive: true });
38
38
  const configExisted = existsSync(configPath);
39
39
  const workspaceExisted = existsSync(workspacePath);
@@ -48,15 +48,16 @@ async function initWorkspaceCore(options) {
48
48
  const workspaceCreated = !workspaceExisted;
49
49
  const token = config.gateway?.auth?.mode === "token" && typeof config.gateway?.auth?.token === "string" && config.gateway.auth.token.length > 0 ? config.gateway.auth.token : randomBytes(24).toString("hex");
50
50
  const port = configExisted ? config.gateway?.port ?? gatewayPortDefaulted : options.gatewayPort !== void 0 ? gatewayPortDefaulted : config.gateway?.port ?? 18790;
51
- const agentsDefaults = {
52
- ...config.agents.defaults,
53
- ...persistedDefaultsWorkspace !== void 0 ? { workspace: persistedDefaultsWorkspace } : {}
54
- };
51
+ const defaultAgentId = config.agents.default ?? config.agents.list[0]?.id ?? "main";
52
+ const agentsList = persistedWorkspaceRoot === void 0 ? config.agents.list : config.agents.list.map((agent) => agent.id === defaultAgentId ? {
53
+ ...agent,
54
+ workspace: { root: persistedWorkspaceRoot }
55
+ } : agent);
55
56
  const nextConfig = {
56
57
  ...config,
57
58
  agents: {
58
59
  ...config.agents,
59
- defaults: agentsDefaults
60
+ list: agentsList
60
61
  },
61
62
  gateway: {
62
63
  ...config.gateway,
@@ -1 +1 @@
1
- {"version":3,"file":"init-workspace-core.js","names":[],"sources":["../../../../src/cli/utils/init-workspace-core.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport { ConfigSchema } from '../../config/schema.js';\nimport { saveConfig } from '../../config/loader.js';\nimport { ensureStarterAgentsInitialized } from '../../agent/starter-agents.js';\n\nexport interface InitWorkspaceCoreOptions {\n configPath: string;\n workspacePath: string;\n /** When set with a new config file, overrides schema default port (e.g. Electron). */\n gatewayPort?: number;\n /**\n * When true, sets `agents.defaults.workspace` to `dirname(workspacePath)` (parent of the\n * Markdown root being initialised, e.g. `…/workspace` when `workspacePath` is `…/workspace/main`).\n */\n persistWorkspacePath?: boolean;\n /** Optional channel plugin validator (CLI/gateway only; Electron omits). */\n assertChannelPlugins?: (cfg: Config) => void | Promise<void>;\n}\n\nexport interface InitWorkspaceResult {\n /** Fully-initialised config (matches disk after any write). */\n config: Config;\n /** Gateway auth token (always present after init). */\n token: string;\n configCreated: boolean;\n workspaceCreated: boolean;\n}\n\nasync function assertChannelPluginsIfNeeded(\n cfg: Config,\n assert?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<void> {\n if (assert) await assert(cfg);\n}\n\nasync function serializeConfig(\n cfg: Config,\n assertChannelPlugins?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<string> {\n const validated = ConfigSchema.parse(cfg);\n await assertChannelPluginsIfNeeded(validated, assertChannelPlugins);\n return JSON.stringify(validated, null, 2);\n}\n\nasync function tryReadDiskConfig(\n configPath: string,\n assertChannelPlugins?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<Config | null> {\n try {\n const raw = readFileSync(configPath, 'utf-8');\n const cfg = ConfigSchema.parse(JSON.parse(raw) as unknown);\n await assertChannelPluginsIfNeeded(cfg, assertChannelPlugins);\n return cfg;\n } catch {\n return null;\n }\n}\n\n/**\n * Workspace + config initialisation without importing bundled channel plugins.\n * Used by Electron main; CLI/gateway should call {@link initWorkspace} instead.\n */\nexport async function initWorkspaceCore(options: InitWorkspaceCoreOptions): Promise<InitWorkspaceResult> {\n const gatewayPortDefaulted = options.gatewayPort ?? 18790;\n const persistWorkspacePath = options.persistWorkspacePath ?? false;\n const { configPath, workspacePath, assertChannelPlugins } = options;\n const persistedDefaultsWorkspace = persistWorkspacePath ? dirname(workspacePath) : undefined;\n\n mkdirSync(dirname(configPath), { recursive: true });\n\n const configExisted = existsSync(configPath);\n const workspaceExisted = existsSync(workspacePath);\n\n let config: Config;\n if (configExisted) {\n config = (await tryReadDiskConfig(configPath, assertChannelPlugins)) ?? ConfigSchema.parse(undefined);\n } else {\n config = ConfigSchema.parse(undefined);\n await assertChannelPluginsIfNeeded(config, assertChannelPlugins);\n }\n\n mkdirSync(workspacePath, { recursive: true });\n\n const configCreated = !configExisted;\n const workspaceCreated = !workspaceExisted;\n\n const hadToken =\n config.gateway?.auth?.mode === 'token' &&\n typeof config.gateway?.auth?.token === 'string' &&\n config.gateway.auth.token.length > 0;\n\n const token = hadToken ? (config.gateway!.auth!.token as string) : randomBytes(24).toString('hex');\n\n const port = configExisted\n ? (config.gateway?.port ?? gatewayPortDefaulted)\n : options.gatewayPort !== undefined\n ? gatewayPortDefaulted\n : (config.gateway?.port ?? 18790);\n\n const agentsDefaults = {\n ...config.agents.defaults,\n ...(persistedDefaultsWorkspace !== undefined ? { workspace: persistedDefaultsWorkspace } : {}),\n };\n\n const nextConfig: Config = {\n ...config,\n agents: {\n ...config.agents,\n defaults: agentsDefaults,\n },\n gateway: {\n ...config.gateway,\n port,\n auth: {\n ...config.gateway?.auth,\n mode: 'token' as const,\n token,\n },\n },\n };\n\n const starterResult = ensureStarterAgentsInitialized(ConfigSchema.parse(nextConfig));\n const nextFinal = ConfigSchema.parse(starterResult.config);\n await assertChannelPluginsIfNeeded(nextFinal, assertChannelPlugins);\n\n let needsWrite = configCreated || starterResult.changed;\n if (!needsWrite) {\n const disk = await tryReadDiskConfig(configPath, assertChannelPlugins);\n if (!disk) {\n needsWrite = true;\n } else {\n needsWrite =\n (await serializeConfig(disk, assertChannelPlugins)) !==\n (await serializeConfig(nextFinal, assertChannelPlugins));\n }\n }\n\n if (needsWrite) {\n if (assertChannelPlugins) {\n await saveConfig(nextFinal, configPath);\n } else {\n writeFileSync(configPath, `${JSON.stringify(nextFinal, null, 2)}\\n`, 'utf8');\n }\n }\n\n return {\n config: nextFinal,\n token,\n configCreated,\n workspaceCreated,\n };\n}\n"],"mappings":";;;;;;;aAKsD;aACF;AA0BpD,eAAe,6BACb,KACA,QACe;AACf,KAAI,OAAQ,OAAM,OAAO,IAAI;;AAG/B,eAAe,gBACb,KACA,sBACiB;CACjB,MAAM,YAAY,aAAa,MAAM,IAAI;AACzC,OAAM,6BAA6B,WAAW,qBAAqB;AACnE,QAAO,KAAK,UAAU,WAAW,MAAM,EAAE;;AAG3C,eAAe,kBACb,YACA,sBACwB;AACxB,KAAI;EACF,MAAM,MAAM,aAAa,YAAY,QAAQ;EAC7C,MAAM,MAAM,aAAa,MAAM,KAAK,MAAM,IAAI,CAAY;AAC1D,QAAM,6BAA6B,KAAK,qBAAqB;AAC7D,SAAO;SACD;AACN,SAAO;;;;;;;AAQX,eAAsB,kBAAkB,SAAiE;CACvG,MAAM,uBAAuB,QAAQ,eAAe;CACpD,MAAM,uBAAuB,QAAQ,wBAAwB;CAC7D,MAAM,EAAE,YAAY,eAAe,yBAAyB;CAC5D,MAAM,6BAA6B,uBAAuB,QAAQ,cAAc,GAAG,KAAA;AAEnF,WAAU,QAAQ,WAAW,EAAE,EAAE,WAAW,MAAM,CAAC;CAEnD,MAAM,gBAAgB,WAAW,WAAW;CAC5C,MAAM,mBAAmB,WAAW,cAAc;CAElD,IAAI;AACJ,KAAI,cACF,UAAU,MAAM,kBAAkB,YAAY,qBAAqB,IAAK,aAAa,MAAM,KAAA,EAAU;MAChG;AACL,WAAS,aAAa,MAAM,KAAA,EAAU;AACtC,QAAM,6BAA6B,QAAQ,qBAAqB;;AAGlE,WAAU,eAAe,EAAE,WAAW,MAAM,CAAC;CAE7C,MAAM,gBAAgB,CAAC;CACvB,MAAM,mBAAmB,CAAC;CAO1B,MAAM,QAJJ,OAAO,SAAS,MAAM,SAAS,WAC/B,OAAO,OAAO,SAAS,MAAM,UAAU,YACvC,OAAO,QAAQ,KAAK,MAAM,SAAS,IAEX,OAAO,QAAS,KAAM,QAAmB,YAAY,GAAG,CAAC,SAAS,MAAM;CAElG,MAAM,OAAO,gBACR,OAAO,SAAS,QAAQ,uBACzB,QAAQ,gBAAgB,KAAA,IACtB,uBACC,OAAO,SAAS,QAAQ;CAE/B,MAAM,iBAAiB;EACrB,GAAG,OAAO,OAAO;EACjB,GAAI,+BAA+B,KAAA,IAAY,EAAE,WAAW,4BAA4B,GAAG,EAAE;EAC9F;CAED,MAAM,aAAqB;EACzB,GAAG;EACH,QAAQ;GACN,GAAG,OAAO;GACV,UAAU;GACX;EACD,SAAS;GACP,GAAG,OAAO;GACV;GACA,MAAM;IACJ,GAAG,OAAO,SAAS;IACnB,MAAM;IACN;IACD;GACF;EACF;CAED,MAAM,gBAAgB,+BAA+B,aAAa,MAAM,WAAW,CAAC;CACpF,MAAM,YAAY,aAAa,MAAM,cAAc,OAAO;AAC1D,OAAM,6BAA6B,WAAW,qBAAqB;CAEnE,IAAI,aAAa,iBAAiB,cAAc;AAChD,KAAI,CAAC,YAAY;EACf,MAAM,OAAO,MAAM,kBAAkB,YAAY,qBAAqB;AACtE,MAAI,CAAC,KACH,cAAa;MAEb,cACG,MAAM,gBAAgB,MAAM,qBAAqB,KACjD,MAAM,gBAAgB,WAAW,qBAAqB;;AAI7D,KAAI,WACF,KAAI,qBACF,OAAM,WAAW,WAAW,WAAW;KAEvC,eAAc,YAAY,GAAG,KAAK,UAAU,WAAW,MAAM,EAAE,CAAC,KAAK,OAAO;AAIhF,QAAO;EACL,QAAQ;EACR;EACA;EACA;EACD"}
1
+ {"version":3,"file":"init-workspace-core.js","names":[],"sources":["../../../../src/cli/utils/init-workspace-core.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport { ConfigSchema } from '../../config/schema.js';\nimport { saveConfig } from '../../config/loader.js';\nimport { ensureStarterAgentsInitialized } from '../../agent/starter-agents.js';\n\nexport interface InitWorkspaceCoreOptions {\n configPath: string;\n workspacePath: string;\n /** When set with a new config file, overrides schema default port (e.g. Electron). */\n gatewayPort?: number;\n /** When true, sets the default agent manifest workspace root to `workspacePath`. */\n persistWorkspacePath?: boolean;\n /** Optional channel plugin validator (CLI/gateway only; Electron omits). */\n assertChannelPlugins?: (cfg: Config) => void | Promise<void>;\n}\n\nexport interface InitWorkspaceResult {\n /** Fully-initialised config (matches disk after any write). */\n config: Config;\n /** Gateway auth token (always present after init). */\n token: string;\n configCreated: boolean;\n workspaceCreated: boolean;\n}\n\nasync function assertChannelPluginsIfNeeded(\n cfg: Config,\n assert?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<void> {\n if (assert) await assert(cfg);\n}\n\nasync function serializeConfig(\n cfg: Config,\n assertChannelPlugins?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<string> {\n const validated = ConfigSchema.parse(cfg);\n await assertChannelPluginsIfNeeded(validated, assertChannelPlugins);\n return JSON.stringify(validated, null, 2);\n}\n\nasync function tryReadDiskConfig(\n configPath: string,\n assertChannelPlugins?: InitWorkspaceCoreOptions['assertChannelPlugins'],\n): Promise<Config | null> {\n try {\n const raw = readFileSync(configPath, 'utf-8');\n const cfg = ConfigSchema.parse(JSON.parse(raw) as unknown);\n await assertChannelPluginsIfNeeded(cfg, assertChannelPlugins);\n return cfg;\n } catch {\n return null;\n }\n}\n\n/**\n * Workspace + config initialisation without importing bundled channel plugins.\n * Used by Electron main; CLI/gateway should call {@link initWorkspace} instead.\n */\nexport async function initWorkspaceCore(options: InitWorkspaceCoreOptions): Promise<InitWorkspaceResult> {\n const gatewayPortDefaulted = options.gatewayPort ?? 18790;\n const persistWorkspacePath = options.persistWorkspacePath ?? false;\n const { configPath, workspacePath, assertChannelPlugins } = options;\n const persistedWorkspaceRoot = persistWorkspacePath ? workspacePath : undefined;\n\n mkdirSync(dirname(configPath), { recursive: true });\n\n const configExisted = existsSync(configPath);\n const workspaceExisted = existsSync(workspacePath);\n\n let config: Config;\n if (configExisted) {\n config = (await tryReadDiskConfig(configPath, assertChannelPlugins)) ?? ConfigSchema.parse(undefined);\n } else {\n config = ConfigSchema.parse(undefined);\n await assertChannelPluginsIfNeeded(config, assertChannelPlugins);\n }\n\n mkdirSync(workspacePath, { recursive: true });\n\n const configCreated = !configExisted;\n const workspaceCreated = !workspaceExisted;\n\n const hadToken =\n config.gateway?.auth?.mode === 'token' &&\n typeof config.gateway?.auth?.token === 'string' &&\n config.gateway.auth.token.length > 0;\n\n const token = hadToken ? (config.gateway!.auth!.token as string) : randomBytes(24).toString('hex');\n\n const port = configExisted\n ? (config.gateway?.port ?? gatewayPortDefaulted)\n : options.gatewayPort !== undefined\n ? gatewayPortDefaulted\n : (config.gateway?.port ?? 18790);\n\n const defaultAgentId = config.agents.default ?? config.agents.list[0]?.id ?? 'main';\n const agentsList =\n persistedWorkspaceRoot === undefined\n ? config.agents.list\n : config.agents.list.map((agent) =>\n agent.id === defaultAgentId ? { ...agent, workspace: { root: persistedWorkspaceRoot } } : agent,\n );\n\n const nextConfig: Config = {\n ...config,\n agents: {\n ...config.agents,\n list: agentsList,\n },\n gateway: {\n ...config.gateway,\n port,\n auth: {\n ...config.gateway?.auth,\n mode: 'token' as const,\n token,\n },\n },\n };\n\n const starterResult = ensureStarterAgentsInitialized(ConfigSchema.parse(nextConfig));\n const nextFinal = ConfigSchema.parse(starterResult.config);\n await assertChannelPluginsIfNeeded(nextFinal, assertChannelPlugins);\n\n let needsWrite = configCreated || starterResult.changed;\n if (!needsWrite) {\n const disk = await tryReadDiskConfig(configPath, assertChannelPlugins);\n if (!disk) {\n needsWrite = true;\n } else {\n needsWrite =\n (await serializeConfig(disk, assertChannelPlugins)) !==\n (await serializeConfig(nextFinal, assertChannelPlugins));\n }\n }\n\n if (needsWrite) {\n if (assertChannelPlugins) {\n await saveConfig(nextFinal, configPath);\n } else {\n writeFileSync(configPath, `${JSON.stringify(nextFinal, null, 2)}\\n`, 'utf8');\n }\n }\n\n return {\n config: nextFinal,\n token,\n configCreated,\n workspaceCreated,\n };\n}\n"],"mappings":";;;;;;;aAKsD;aACF;AAuBpD,eAAe,6BACb,KACA,QACe;AACf,KAAI,OAAQ,OAAM,OAAO,IAAI;;AAG/B,eAAe,gBACb,KACA,sBACiB;CACjB,MAAM,YAAY,aAAa,MAAM,IAAI;AACzC,OAAM,6BAA6B,WAAW,qBAAqB;AACnE,QAAO,KAAK,UAAU,WAAW,MAAM,EAAE;;AAG3C,eAAe,kBACb,YACA,sBACwB;AACxB,KAAI;EACF,MAAM,MAAM,aAAa,YAAY,QAAQ;EAC7C,MAAM,MAAM,aAAa,MAAM,KAAK,MAAM,IAAI,CAAY;AAC1D,QAAM,6BAA6B,KAAK,qBAAqB;AAC7D,SAAO;SACD;AACN,SAAO;;;;;;;AAQX,eAAsB,kBAAkB,SAAiE;CACvG,MAAM,uBAAuB,QAAQ,eAAe;CACpD,MAAM,uBAAuB,QAAQ,wBAAwB;CAC7D,MAAM,EAAE,YAAY,eAAe,yBAAyB;CAC5D,MAAM,yBAAyB,uBAAuB,gBAAgB,KAAA;AAEtE,WAAU,QAAQ,WAAW,EAAE,EAAE,WAAW,MAAM,CAAC;CAEnD,MAAM,gBAAgB,WAAW,WAAW;CAC5C,MAAM,mBAAmB,WAAW,cAAc;CAElD,IAAI;AACJ,KAAI,cACF,UAAU,MAAM,kBAAkB,YAAY,qBAAqB,IAAK,aAAa,MAAM,KAAA,EAAU;MAChG;AACL,WAAS,aAAa,MAAM,KAAA,EAAU;AACtC,QAAM,6BAA6B,QAAQ,qBAAqB;;AAGlE,WAAU,eAAe,EAAE,WAAW,MAAM,CAAC;CAE7C,MAAM,gBAAgB,CAAC;CACvB,MAAM,mBAAmB,CAAC;CAO1B,MAAM,QAJJ,OAAO,SAAS,MAAM,SAAS,WAC/B,OAAO,OAAO,SAAS,MAAM,UAAU,YACvC,OAAO,QAAQ,KAAK,MAAM,SAAS,IAEX,OAAO,QAAS,KAAM,QAAmB,YAAY,GAAG,CAAC,SAAS,MAAM;CAElG,MAAM,OAAO,gBACR,OAAO,SAAS,QAAQ,uBACzB,QAAQ,gBAAgB,KAAA,IACtB,uBACC,OAAO,SAAS,QAAQ;CAE/B,MAAM,iBAAiB,OAAO,OAAO,WAAW,OAAO,OAAO,KAAK,IAAI,MAAM;CAC7E,MAAM,aACJ,2BAA2B,KAAA,IACvB,OAAO,OAAO,OACd,OAAO,OAAO,KAAK,KAAK,UACtB,MAAM,OAAO,iBAAiB;EAAE,GAAG;EAAO,WAAW,EAAE,MAAM,wBAAwB;EAAE,GAAG,MAC3F;CAEP,MAAM,aAAqB;EACzB,GAAG;EACH,QAAQ;GACN,GAAG,OAAO;GACV,MAAM;GACP;EACD,SAAS;GACP,GAAG,OAAO;GACV;GACA,MAAM;IACJ,GAAG,OAAO,SAAS;IACnB,MAAM;IACN;IACD;GACF;EACF;CAED,MAAM,gBAAgB,+BAA+B,aAAa,MAAM,WAAW,CAAC;CACpF,MAAM,YAAY,aAAa,MAAM,cAAc,OAAO;AAC1D,OAAM,6BAA6B,WAAW,qBAAqB;CAEnE,IAAI,aAAa,iBAAiB,cAAc;AAChD,KAAI,CAAC,YAAY;EACf,MAAM,OAAO,MAAM,kBAAkB,YAAY,qBAAqB;AACtE,MAAI,CAAC,KACH,cAAa;MAEb,cACG,MAAM,gBAAgB,MAAM,qBAAqB,KACjD,MAAM,gBAAgB,WAAW,qBAAqB;;AAI7D,KAAI,WACF,KAAI,qBACF,OAAM,WAAW,WAAW,WAAW;KAEvC,eAAc,YAAY,GAAG,KAAK,UAAU,WAAW,MAAM,EAAE,CAAC,KAAK,OAAO;AAIhF,QAAO;EACL,QAAQ;EACR;EACA;EACA;EACD"}
@@ -9,7 +9,6 @@ export declare function findAgentEntryIndex(list: AgentEntry[], agentId: string)
9
9
  export declare function applyAgentConfig(cfg: Config, params: {
10
10
  agentId: string;
11
11
  workspace?: string;
12
- agentDir?: string;
13
12
  model?: string;
14
13
  models?: AgentEntry['models'];
15
14
  skills?: string[];
@@ -14,29 +14,78 @@ function applyAgentConfig(cfg, params) {
14
14
  const agentId = normalizeAgentId(params.agentId);
15
15
  const list = listAgentEntries(cfg);
16
16
  const index = findAgentEntryIndex(list, agentId);
17
+ const nextTools = params.tools;
17
18
  const base = index >= 0 ? list[index] : {
18
19
  id: agentId,
19
- enabled: true
20
+ enabled: true,
21
+ identity: {
22
+ name: agentId,
23
+ role: "Agent",
24
+ language: "en",
25
+ tone: "direct"
26
+ },
27
+ responsibilities: { primary: ["Help the user complete tasks"] },
28
+ workspace: { root: `~/.xopc/workspace/${agentId}` },
29
+ tools: { builtin: {} },
30
+ skills: { mode: "all" },
31
+ memory: {
32
+ mode: "confirmWrite",
33
+ sources: ["session", "curated"],
34
+ writePolicy: { curated: "confirm" }
35
+ },
36
+ workflows: {},
37
+ boundaries: {
38
+ requiresConfirmation: [],
39
+ forbidden: [],
40
+ escalation: []
41
+ }
20
42
  };
21
43
  const nextEntry = {
22
44
  ...base,
23
45
  enabled: base.enabled ?? true,
24
- ...params.workspace ? { workspace: params.workspace } : {},
25
- ...params.agentDir ? { agentDir: params.agentDir } : {},
46
+ ...params.workspace ? { workspace: { root: params.workspace } } : {},
26
47
  ...params.models ? { models: params.models } : {},
27
48
  ...params.model ? { models: {
28
- ...base.models,
29
- chat: { primary: params.model }
49
+ ...base.models ?? {},
50
+ defaultRole: "deep",
51
+ roles: {
52
+ ...base.models?.roles ?? {},
53
+ deep: { model: params.model }
54
+ }
55
+ } } : {},
56
+ ...params.skills ? { skills: {
57
+ mode: "allowlist",
58
+ allow: params.skills
30
59
  } } : {},
31
- ...params.skills ? { skills: params.skills } : {},
32
- ...params.tools ? { tools: params.tools } : {}
60
+ ...nextTools ? { tools: nextTools } : {}
33
61
  };
34
62
  const nextList = [...list];
35
63
  if (index >= 0) nextList[index] = nextEntry;
36
64
  else {
37
65
  if (nextList.length === 0 && agentId !== normalizeAgentId(resolveDefaultAgentId(cfg))) nextList.push({
38
66
  id: resolveDefaultAgentId(cfg),
39
- enabled: true
67
+ enabled: true,
68
+ identity: {
69
+ name: resolveDefaultAgentId(cfg),
70
+ role: "Agent",
71
+ language: "en",
72
+ tone: "direct"
73
+ },
74
+ responsibilities: { primary: ["Help the user complete tasks"] },
75
+ workspace: { root: `~/.xopc/workspace/${resolveDefaultAgentId(cfg)}` },
76
+ tools: { builtin: {} },
77
+ skills: { mode: "all" },
78
+ memory: {
79
+ mode: "confirmWrite",
80
+ sources: ["session", "curated"],
81
+ writePolicy: { curated: "confirm" }
82
+ },
83
+ workflows: {},
84
+ boundaries: {
85
+ requiresConfirmation: [],
86
+ forbidden: [],
87
+ escalation: []
88
+ }
40
89
  });
41
90
  nextList.push(nextEntry);
42
91
  }
@@ -51,18 +100,15 @@ function applyAgentConfig(cfg, params) {
51
100
  function pruneAgentConfig(cfg, agentId) {
52
101
  const id = normalizeAgentId(agentId);
53
102
  const nextAgentsList = listAgentEntries(cfg).filter((e) => normalizeAgentId(e.id) !== id);
54
- const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : void 0;
103
+ const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : [];
55
104
  const bindings = cfg.bindings ?? [];
56
105
  const filteredBindings = bindings.filter((b) => normalizeAgentId(b.agentId) !== id);
57
106
  return {
58
107
  config: {
59
108
  ...cfg,
60
- agents: nextAgents ? {
109
+ agents: {
61
110
  ...cfg.agents,
62
111
  list: nextAgents
63
- } : {
64
- ...cfg.agents,
65
- list: void 0
66
112
  },
67
113
  bindings: filteredBindings
68
114
  },
@@ -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 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\n ? {\n models: {\n ...(base.models ?? {}),\n defaultRole: 'deep',\n roles: { ...(base.models?.roles ?? {}), deep: { model: params.model } },\n },\n }\n : {}),\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 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 { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
2
+ import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
3
+ import "../agent-manifest/index.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,39 @@ 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
+ defaultPresetId: config.agents.defaultPreset
29
+ }).manifest;
30
+ }
31
+ function resolveEffectiveAgentManifestForSession(config, sessionKey) {
32
+ return resolveEffectiveAgentManifestForAgent(config, extractProfileAgentId(sessionKey, config));
33
+ }
56
34
  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
- };
35
+ const manifest = resolveEffectiveAgentManifestForAgent(config, agentId);
36
+ const defaultModel = manifest.models.roles[manifest.models.defaultRole]?.model;
37
+ const deniedTools = Object.entries(manifest.tools.builtin).filter(([, policy]) => policy.mode === "deny").map(([name]) => name);
38
+ const skillsAllowlist = manifest.skills.mode === "allowlist" ? [...manifest.skills.allow ?? []] : void 0;
69
39
  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
40
+ agentId: manifest.id,
41
+ manifest,
42
+ resolvedWorkspacePath: resolveAgentWorkspaceDir(config, manifest.id),
43
+ primaryModelRef: defaultModel?.trim() || void 0,
44
+ fallbacks: [],
45
+ systemPromptOverride: manifest.prompt?.customInstructions,
46
+ skillsAllowlist,
47
+ tools: { denied: new Set(deniedTools) },
48
+ params: {}
81
49
  };
82
50
  }
83
51
  function resolveEffectiveAgentProfileForSession(config, sessionKey) {
84
52
  return resolveEffectiveAgentProfile(config, extractProfileAgentId(sessionKey, config));
85
53
  }
86
54
  //#endregion
87
- export { extractProfileAgentId, resolveAgentWorkspaceDir, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession };
55
+ export { extractProfileAgentId, resolveAgentWorkspaceDir, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession };
88
56
 
89
57
  //# 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 defaultPresetId: config.agents.defaultPreset,\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;EACvB,iBAAiB,OAAO,OAAO;EAChC,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 };