@xopcai/xopc 0.0.118 → 0.0.119

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 (468) hide show
  1. package/README.md +2 -1
  2. package/README.zh-CN.md +2 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-dzUrQoeZ.js → agent-avatar-dicebear-CU8J6zou.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-B0hkpLhP.js +2 -0
  7. package/dist/gateway/static/root/assets/app-management-settings-panel-B9vfYoEr.js +1 -0
  8. package/dist/gateway/static/root/assets/appearance-settings-ClOzIO24.js +1 -0
  9. package/dist/gateway/static/root/assets/{apps-page--wMEL00f.js → apps-page-DU0dz9Zo.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-Cki4SfU2.js → archive-plugin-BkVIgZzA.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-D-KnS2Do.js → attachment-load-CaCMWh1D.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DhGDpKP3.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-CTedroVo.js +1 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-D2sgvJja.js → binary-plugins-B4TO_bsn.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-DIq-4Gvb.js → block-editor-DJRWwWNI.js} +28 -28
  16. package/dist/gateway/static/root/assets/browser-settings-page-FCDwOOBK.js +8 -0
  17. package/dist/gateway/static/root/assets/capability-presets-api-Befi89CL.js +1 -0
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-_G8eb2vJ.js +1 -0
  19. package/dist/gateway/static/root/assets/channel-recipient-api-BNSuJb5f.js +1 -0
  20. package/dist/gateway/static/root/assets/channels-settings-C3d5JBJX.js +1 -0
  21. package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +1 -0
  22. package/dist/gateway/static/root/assets/connectors-page-yaUNvt5u.js +2 -0
  23. package/dist/gateway/static/root/assets/cron-expression-B3B1eqnr.js +2 -0
  24. package/dist/gateway/static/root/assets/dreaming-settings-DNrdg1Ve.js +1 -0
  25. package/dist/gateway/static/root/assets/{extension-debug-page-DYu1KaFQ.js → extension-debug-page-DYh402XV.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-B3W6QwlZ.js → extension-page-Cr_TizrN.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-D7VQ-cxE.js → extension-settings-page-BU1KoKRj.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B7xDPu-R.js → fetch-Y7AEX4H3.js} +1 -1
  29. package/dist/gateway/static/root/assets/format-cron-label-arqgGlVV.js +1 -0
  30. package/dist/gateway/static/root/assets/{gateway-config-api-BTBLSeUu.js → gateway-config-api-RbMmAOpX.js} +1 -1
  31. package/dist/gateway/static/root/assets/gateway-settings-C79wkXef.js +1 -0
  32. package/dist/gateway/static/root/assets/{gateway-startup-retry-CYj9FWCp.js → gateway-startup-retry-DiD_Tx4N.js} +1 -1
  33. package/dist/gateway/static/root/assets/goal-detail-page-9paXuHdo.js +1 -0
  34. package/dist/gateway/static/root/assets/{goals-config-api-CQQgzPr3.js → goals-config-api-DqxVi0p5.js} +1 -1
  35. package/dist/gateway/static/root/assets/{goals-page-BHitvJAv.js → goals-page-CS0R-Af2.js} +2 -2
  36. package/dist/gateway/static/root/assets/goals-settings-CSuzZ8Ae.js +1 -0
  37. package/dist/gateway/static/root/assets/heartbeat-settings-DXPaYJm3.js +1 -0
  38. package/dist/gateway/static/root/assets/index-BoKafJIZ.js +191 -0
  39. package/dist/gateway/static/root/assets/index-CArhCcYn.css +1 -0
  40. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Dvg53qnd.js +1 -0
  41. package/dist/gateway/static/root/assets/{logs-page-C2Uqvae9.js → logs-page-DLXPcksQ.js} +2 -2
  42. package/dist/gateway/static/root/assets/{markdown-split-BwOFrJ2E.js → markdown-split-CpHxbtWJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{media-plugins-Cnz6Q5G6.js → media-plugins-SFPQRSxq.js} +1 -1
  44. package/dist/gateway/static/root/assets/messages-CrDHEbss.js +3 -0
  45. package/dist/gateway/static/root/assets/models-hub-panel-BDF2iyRk.js +2 -0
  46. package/dist/gateway/static/root/assets/note-detail-page-CSb_hwig.js +2 -0
  47. package/dist/gateway/static/root/assets/{note-image-lightbox-B-Svpmza.js → note-image-lightbox-BUYURRgn.js} +1 -1
  48. package/dist/gateway/static/root/assets/notes-page-BsIBSFyZ.js +1 -0
  49. package/dist/gateway/static/root/assets/{preview-open-alternatives-Bss4TiwP.js → preview-open-alternatives-BHz9iWYA.js} +1 -1
  50. package/dist/gateway/static/root/assets/remote-access-hub-CwzSovcS.js +1 -0
  51. package/dist/gateway/static/root/assets/{save-bar-controls-BRNjdgKq.js → save-bar-controls-CefkOlRg.js} +1 -1
  52. package/dist/gateway/static/root/assets/schedule-field-CmTRoOcE.js +1 -0
  53. package/dist/gateway/static/root/assets/{schema-form-Dub9sy8r.js → schema-form-FMKv1vGu.js} +1 -1
  54. package/dist/gateway/static/root/assets/sessions-page-PHmX-NmA.js +1 -0
  55. package/dist/gateway/static/root/assets/settings-advanced-gate-BRAeKJN4.js +1 -0
  56. package/dist/gateway/static/root/assets/{settings-collapsible-section-BeFLavGi.js → settings-collapsible-section-BouO6JTi.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-dmyaPOTG.js → settings-form-section-D-4lBl6X.js} +1 -1
  58. package/dist/gateway/static/root/assets/settings-page-KKrbFjy8.js +1 -0
  59. package/dist/gateway/static/root/assets/settings-page-layout-BJ4Gsef5.js +1 -0
  60. package/dist/gateway/static/root/assets/setup-status-panel-CrUjHPQo.js +1 -0
  61. package/dist/gateway/static/root/assets/{share-preview-page-C8glrdqe.js → share-preview-page-BDy2btRN.js} +1 -1
  62. package/dist/gateway/static/root/assets/shares-settings-B18OBmH5.js +1 -0
  63. package/dist/gateway/static/root/assets/skill-reload-api-C28-2uKQ.js +1 -0
  64. package/dist/gateway/static/root/assets/skills-page-Bm2ebkwl.js +2 -0
  65. package/dist/gateway/static/root/assets/system-settings-panel-CRngrlnZ.js +1 -0
  66. package/dist/gateway/static/root/assets/typed-models-lib-BltBc0b-.js +1 -0
  67. package/dist/gateway/static/root/assets/{use-channel-catalog-DqlWTsDb.js → use-channel-catalog-CjN-51e6.js} +1 -1
  68. package/dist/gateway/static/root/assets/user-profile-settings-panel-DJ1dKwZy.js +1 -0
  69. package/dist/gateway/static/root/assets/utils-B5M5-YvK.js +1 -0
  70. package/dist/gateway/static/root/assets/{voice-api-key-field-C73IVZeC.js → voice-api-key-field-CeEevm7z.js} +1 -1
  71. package/dist/gateway/static/root/assets/{voice-player-store-C_ArLJPM.js → voice-player-store-B7ykUlHM.js} +1 -1
  72. package/dist/gateway/static/root/assets/workflow-run-setup-panel-C4PzUQjB.js +3 -0
  73. package/dist/gateway/static/root/assets/workflows-page-BL84_-Ky.js +18 -0
  74. package/dist/gateway/static/root/index.html +6 -7
  75. package/dist/package.js +1 -1
  76. package/dist/src/agent/agent-manager.d.ts +4 -5
  77. package/dist/src/agent/agent-manager.js +4 -8
  78. package/dist/src/agent/agent-manager.js.map +1 -1
  79. package/dist/src/agent/embedded/run-for-session.js +102 -14
  80. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  81. package/dist/src/agent/fallback/candidates.d.ts +0 -8
  82. package/dist/src/agent/fallback/candidates.js.map +1 -1
  83. package/dist/src/agent/index.js +1 -1
  84. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
  85. package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
  86. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  87. package/dist/src/agent/lifecycle/progress.d.ts +0 -1
  88. package/dist/src/agent/lifecycle/progress.js +1 -6
  89. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  90. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
  91. package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
  92. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  93. package/dist/src/agent/middleware/self-verify.d.ts +0 -1
  94. package/dist/src/agent/middleware/self-verify.js +0 -2
  95. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  96. package/dist/src/agent/models/index.d.ts +1 -1
  97. package/dist/src/agent/models/manager.d.ts +4 -20
  98. package/dist/src/agent/models/manager.js +9 -126
  99. package/dist/src/agent/models/manager.js.map +1 -1
  100. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  101. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
  102. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  103. package/dist/src/agent/prompt/sections/tooling.js +2 -2
  104. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  105. package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
  106. package/dist/src/agent/prompt/service-prompt-builder.js +0 -12
  107. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  108. package/dist/src/agent/prompt/subagent-context.js +1 -1
  109. package/dist/src/agent/prompt/subagent-context.js.map +1 -1
  110. package/dist/src/agent/prompt/types.d.ts +1 -1
  111. package/dist/src/agent/service.d.ts +1 -9
  112. package/dist/src/agent/service.js +3 -40
  113. package/dist/src/agent/service.js.map +1 -1
  114. package/dist/src/agent/service.types.d.ts +2 -2
  115. package/dist/src/agent/session/session-config-service.d.ts +11 -11
  116. package/dist/src/agent/session/session-config-service.js +14 -14
  117. package/dist/src/agent/session/session-config-service.js.map +1 -1
  118. package/dist/src/agent/session/session-inspector.js +3 -2
  119. package/dist/src/agent/session/session-inspector.js.map +1 -1
  120. package/dist/src/agent/starter-agents.js +12 -12
  121. package/dist/src/agent/starter-agents.js.map +1 -1
  122. package/dist/src/agent/tools/automation-tool.d.ts +14 -0
  123. package/dist/src/agent/tools/automation-tool.js +102 -0
  124. package/dist/src/agent/tools/automation-tool.js.map +1 -0
  125. package/dist/src/agent/tools/delegate-tool.js +1 -1
  126. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  127. package/dist/src/agent/tools/factory.d.ts +3 -3
  128. package/dist/src/agent/tools/factory.js +2 -2
  129. package/dist/src/agent/tools/factory.js.map +1 -1
  130. package/dist/src/agent/tools/index.d.ts +1 -1
  131. package/dist/src/agent/tools/index.js +2 -2
  132. package/dist/src/agent-manifest/resolver.d.ts +1 -0
  133. package/dist/src/agent-manifest/resolver.js +1 -0
  134. package/dist/src/agent-manifest/resolver.js.map +1 -1
  135. package/dist/src/agent-manifest/schema.d.ts +6 -0
  136. package/dist/src/agent-manifest/schema.js +12 -3
  137. package/dist/src/agent-manifest/schema.js.map +1 -1
  138. package/dist/src/ai-assist/text-assist.d.ts +1 -1
  139. package/dist/src/ai-assist/text-assist.js +56 -0
  140. package/dist/src/ai-assist/text-assist.js.map +1 -1
  141. package/dist/src/auth/profiles/store.js.map +1 -1
  142. package/dist/src/automations/api/routes.d.ts +3 -0
  143. package/dist/src/automations/api/routes.js +193 -0
  144. package/dist/src/automations/api/routes.js.map +1 -0
  145. package/dist/src/automations/domain/index.d.ts +3 -0
  146. package/dist/src/automations/domain/index.js +3 -0
  147. package/dist/src/automations/domain/schedule.d.ts +4 -0
  148. package/dist/src/automations/domain/schedule.js +37 -0
  149. package/dist/src/automations/domain/schedule.js.map +1 -0
  150. package/dist/src/automations/domain/types.d.ts +160 -0
  151. package/dist/src/automations/domain/validation.d.ts +370 -0
  152. package/dist/src/automations/domain/validation.js +149 -0
  153. package/dist/src/automations/domain/validation.js.map +1 -0
  154. package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
  155. package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
  156. package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
  157. package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
  158. package/dist/src/automations/draft/automation-draft-service.js +135 -0
  159. package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
  160. package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
  161. package/dist/src/automations/draft/automation-draft-validator.js +105 -0
  162. package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
  163. package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
  164. package/dist/src/automations/draft/index.d.ts +3 -0
  165. package/dist/src/automations/draft/index.js +3 -0
  166. package/dist/src/automations/index.d.ts +3 -0
  167. package/dist/src/automations/index.js +8 -0
  168. package/dist/src/automations/product-events.d.ts +5 -0
  169. package/dist/src/automations/product-events.js +21 -0
  170. package/dist/src/automations/product-events.js.map +1 -0
  171. package/dist/src/automations/service/action-executor.d.ts +9 -0
  172. package/dist/src/automations/service/action-executor.js +157 -0
  173. package/dist/src/automations/service/action-executor.js.map +1 -0
  174. package/dist/src/automations/service/automation-service.d.ts +54 -0
  175. package/dist/src/automations/service/automation-service.js +404 -0
  176. package/dist/src/automations/service/automation-service.js.map +1 -0
  177. package/dist/src/automations/service/index.d.ts +2 -0
  178. package/dist/src/automations/service/index.js +3 -0
  179. package/dist/src/automations/storage/automation-repository.d.ts +6 -0
  180. package/dist/src/automations/storage/automation-repository.js +61 -0
  181. package/dist/src/automations/storage/automation-repository.js.map +1 -0
  182. package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
  183. package/dist/src/automations/storage/automation-run-repository.js +130 -0
  184. package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
  185. package/dist/src/automations/storage/index.d.ts +2 -0
  186. package/dist/src/automations/storage/index.js +3 -0
  187. package/dist/src/channels/plugin-types.d.ts +3 -0
  188. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  189. package/dist/src/cli/command-catalog.js +0 -39
  190. package/dist/src/cli/command-catalog.js.map +1 -1
  191. package/dist/src/cli/command-loaders.js +0 -1
  192. package/dist/src/cli/command-loaders.js.map +1 -1
  193. package/dist/src/cli/command-manifest.js +0 -4
  194. package/dist/src/cli/command-manifest.js.map +1 -1
  195. package/dist/src/cli/commands/agents.js +7 -6
  196. package/dist/src/cli/commands/agents.js.map +1 -1
  197. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  198. package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
  199. package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
  200. package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
  201. package/dist/src/cli/commands/doctor/flow.js +2 -2
  202. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  203. package/dist/src/cli/commands/gateway/call.js +2 -2
  204. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  205. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  206. package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
  207. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  208. package/dist/src/cli/commands/init.js +26 -8
  209. package/dist/src/cli/commands/init.js.map +1 -1
  210. package/dist/src/cli/commands/tui.js +24 -2
  211. package/dist/src/cli/commands/tui.js.map +1 -1
  212. package/dist/src/cli/utils/init-workspace-core.js +2 -0
  213. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  214. package/dist/src/commands/agents.config.d.ts +9 -0
  215. package/dist/src/commands/agents.config.js +40 -2
  216. package/dist/src/commands/agents.config.js.map +1 -1
  217. package/dist/src/config/agent-profile.js +4 -3
  218. package/dist/src/config/agent-profile.js.map +1 -1
  219. package/dist/src/config/agent-typed-models.js.map +1 -1
  220. package/dist/src/config/config-surface.d.ts +3 -0
  221. package/dist/src/config/index.d.ts +0 -1
  222. package/dist/src/config/index.js +3 -3
  223. package/dist/src/config/index.js.map +1 -1
  224. package/dist/src/config/paths.d.ts +0 -9
  225. package/dist/src/config/paths.js +1 -14
  226. package/dist/src/config/paths.js.map +1 -1
  227. package/dist/src/config/profile.js +0 -1
  228. package/dist/src/config/profile.js.map +1 -1
  229. package/dist/src/config/rules.js +0 -5
  230. package/dist/src/config/rules.js.map +1 -1
  231. package/dist/src/config/schema.d.ts +13 -12
  232. package/dist/src/config/schema.js +22 -26
  233. package/dist/src/config/schema.js.map +1 -1
  234. package/dist/src/config/web-patch.d.ts +0 -12
  235. package/dist/src/config/web-patch.js +2 -29
  236. package/dist/src/config/web-patch.js.map +1 -1
  237. package/dist/src/extensions/api.d.ts +2 -0
  238. package/dist/src/extensions/api.js +10 -0
  239. package/dist/src/extensions/api.js.map +1 -1
  240. package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
  241. package/dist/src/extensions/extension-registry-impl.js +8 -0
  242. package/dist/src/extensions/extension-registry-impl.js.map +1 -1
  243. package/dist/src/extensions/loader.d.ts +3 -3
  244. package/dist/src/extensions/loader.js +3 -3
  245. package/dist/src/extensions/loader.js.map +1 -1
  246. package/dist/src/extensions/sdk/testing.d.ts +2 -0
  247. package/dist/src/extensions/sdk/testing.js +7 -0
  248. package/dist/src/extensions/sdk/testing.js.map +1 -1
  249. package/dist/src/extensions/types/core.d.ts +10 -1
  250. package/dist/src/extensions/types/index.d.ts +1 -1
  251. package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
  252. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  253. package/dist/src/gateway/agent-builtin-tools.js +1 -1
  254. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  255. package/dist/src/gateway/agents-admin.d.ts +1 -0
  256. package/dist/src/gateway/agents-admin.js +13 -15
  257. package/dist/src/gateway/agents-admin.js.map +1 -1
  258. package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
  259. package/dist/src/gateway/capability-presets-admin.js +19 -10
  260. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  261. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
  262. package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
  263. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
  264. package/dist/src/gateway/heartbeat/service.d.ts +0 -2
  265. package/dist/src/gateway/heartbeat/service.js +0 -7
  266. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  267. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
  268. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  269. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  270. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  271. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  272. package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -6
  273. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  274. package/dist/src/gateway/hono/routes/dreaming.js +27 -37
  275. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  276. package/dist/src/gateway/hono/routes/home.d.ts +2 -2
  277. package/dist/src/gateway/hono/routes/home.js +34 -25
  278. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  279. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -6
  280. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  281. package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
  282. package/dist/src/gateway/hono/routes/migrations.js +35 -0
  283. package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
  284. package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
  285. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  286. package/dist/src/gateway/hono/routes/sessions.js +14 -0
  287. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  288. package/dist/src/gateway/run-loop.js +2 -0
  289. package/dist/src/gateway/run-loop.js.map +1 -1
  290. package/dist/src/gateway/security/operator-scopes.js +5 -1
  291. package/dist/src/gateway/security/operator-scopes.js.map +1 -1
  292. package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
  293. package/dist/src/gateway/service/config-coordinator.js +14 -8
  294. package/dist/src/gateway/service/config-coordinator.js.map +1 -1
  295. package/dist/src/gateway/service/sessions-api.d.ts +2 -1
  296. package/dist/src/gateway/service/sessions-api.js +6 -1
  297. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  298. package/dist/src/gateway/service.d.ts +7 -3
  299. package/dist/src/gateway/service.js +61 -27
  300. package/dist/src/gateway/service.js.map +1 -1
  301. package/dist/src/goals/goal-service.js +45 -4
  302. package/dist/src/goals/goal-service.js.map +1 -1
  303. package/dist/src/infra/update-restart.js +1 -1
  304. package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
  305. package/dist/src/migrations/config/default-capability-preset.js +135 -0
  306. package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
  307. package/dist/src/migrations/index.d.ts +4 -0
  308. package/dist/src/migrations/index.js +4 -0
  309. package/dist/src/migrations/registry.d.ts +8 -0
  310. package/dist/src/migrations/registry.js +18 -0
  311. package/dist/src/migrations/registry.js.map +1 -0
  312. package/dist/src/migrations/runner.d.ts +17 -0
  313. package/dist/src/migrations/runner.js +191 -0
  314. package/dist/src/migrations/runner.js.map +1 -0
  315. package/dist/src/migrations/types.d.ts +34 -0
  316. package/dist/src/notes/service.js +24 -1
  317. package/dist/src/notes/service.js.map +1 -1
  318. package/dist/src/providers/model-registry.d.ts +0 -1
  319. package/dist/src/providers/model-registry.js +0 -3
  320. package/dist/src/providers/model-registry.js.map +1 -1
  321. package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
  322. package/dist/src/routing/resolve-tui-session-key.js +14 -3
  323. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  324. package/dist/src/session/transcript-outline.d.ts +47 -0
  325. package/dist/src/session/transcript-outline.js +481 -0
  326. package/dist/src/session/transcript-outline.js.map +1 -0
  327. package/dist/src/storage/sqlite/index.d.ts +0 -2
  328. package/dist/src/storage/sqlite/index.js +1 -3
  329. package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
  330. package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
  331. package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
  332. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  333. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  334. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  335. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  336. package/dist/src/storage/sqlite/schema.js +1 -1
  337. package/dist/src/storage/sqlite/schema.sql +56 -46
  338. package/dist/src/tui/backends/embedded-backend.d.ts +6 -0
  339. package/dist/src/tui/backends/embedded-backend.js +18 -7
  340. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  341. package/dist/src/tui/backends/gateway-sse-backend.d.ts +3 -0
  342. package/dist/src/tui/backends/gateway-sse-backend.js +14 -0
  343. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  344. package/dist/src/tui/tui-backend.d.ts +4 -0
  345. package/dist/src/tui/tui-commands.d.ts +5 -0
  346. package/dist/src/tui/tui-commands.js +43 -0
  347. package/dist/src/tui/tui-commands.js.map +1 -1
  348. package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
  349. package/dist/src/tui/tui-transcript-tree.js +17 -257
  350. package/dist/src/tui/tui-transcript-tree.js.map +1 -1
  351. package/dist/src/tui/tui-types.d.ts +2 -0
  352. package/dist/src/tui/tui-types.js.map +1 -1
  353. package/dist/src/tui/tui.js +7 -2
  354. package/dist/src/tui/tui.js.map +1 -1
  355. package/dist/src/workflows/domain/index.js +1 -1
  356. package/dist/src/workflows/domain/run.d.ts +7 -7
  357. package/dist/src/workflows/domain/run.js.map +1 -1
  358. package/dist/src/workflows/index.js +2 -2
  359. package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
  360. package/dist/src/workflows/service/workflow-run-service.js +31 -9
  361. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  362. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  363. package/package.json +4 -2
  364. package/dist/gateway/static/root/assets/agents-BCxZbkOw.js +0 -2
  365. package/dist/gateway/static/root/assets/app-management-settings-panel-bxYJVJpx.js +0 -1
  366. package/dist/gateway/static/root/assets/appearance-settings-BCIykXlI.js +0 -1
  367. package/dist/gateway/static/root/assets/browser-settings-page-DRhKdn81.js +0 -8
  368. package/dist/gateway/static/root/assets/capability-presets-api-CorhiHlg.js +0 -1
  369. package/dist/gateway/static/root/assets/capability-presets-settings-panel-qFx9Jtce.js +0 -1
  370. package/dist/gateway/static/root/assets/channels-settings-BAwAkqIA.js +0 -1
  371. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
  372. package/dist/gateway/static/root/assets/connectors-page-BQLcfitM.js +0 -2
  373. package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
  374. package/dist/gateway/static/root/assets/cron-api-qGwmL-24.js +0 -1
  375. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
  376. package/dist/gateway/static/root/assets/cron-page-BBWMAj8-.js +0 -3
  377. package/dist/gateway/static/root/assets/dreaming-settings-Dw89Obml.js +0 -1
  378. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
  379. package/dist/gateway/static/root/assets/format-interval-label-BzxafKxR.js +0 -1
  380. package/dist/gateway/static/root/assets/gateway-settings-Cmwy58rS.js +0 -1
  381. package/dist/gateway/static/root/assets/goal-detail-page-l7mu5GWX.js +0 -1
  382. package/dist/gateway/static/root/assets/goals-settings-CYVY4NGp.js +0 -1
  383. package/dist/gateway/static/root/assets/heartbeat-config-api-DriO_CN9.js +0 -1
  384. package/dist/gateway/static/root/assets/heartbeat-settings-CUQTKxg7.js +0 -1
  385. package/dist/gateway/static/root/assets/index-C17Tsd_b.css +0 -1
  386. package/dist/gateway/static/root/assets/index-Cc41r16l.js +0 -191
  387. package/dist/gateway/static/root/assets/interval-presets-DFPCKW_W.js +0 -1
  388. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CcVcqstx.js +0 -1
  389. package/dist/gateway/static/root/assets/messages-B1iSKjiw.js +0 -3
  390. package/dist/gateway/static/root/assets/models-hub-panel-BfLfcta8.js +0 -2
  391. package/dist/gateway/static/root/assets/note-detail-page-BjwOQBfT.js +0 -2
  392. package/dist/gateway/static/root/assets/notes-page-DktdBiwB.js +0 -1
  393. package/dist/gateway/static/root/assets/remote-access-hub-rfVx96fq.js +0 -1
  394. package/dist/gateway/static/root/assets/schedule-field-CUCKODde.js +0 -1
  395. package/dist/gateway/static/root/assets/sessions-page-DbtMFuuH.js +0 -1
  396. package/dist/gateway/static/root/assets/settings-advanced-gate-5re5gAnP.js +0 -1
  397. package/dist/gateway/static/root/assets/settings-page-D-WMyLlj.js +0 -1
  398. package/dist/gateway/static/root/assets/setup-status-panel-Cl-DEJAU.js +0 -1
  399. package/dist/gateway/static/root/assets/shares-settings-CyPVvbLt.js +0 -1
  400. package/dist/gateway/static/root/assets/skill-reload-api-CleTH1oz.js +0 -1
  401. package/dist/gateway/static/root/assets/skills-page-Ck8hdXqR.js +0 -2
  402. package/dist/gateway/static/root/assets/system-settings-panel-DI-LN_8G.js +0 -1
  403. package/dist/gateway/static/root/assets/typed-models-lib-kX9duch4.js +0 -1
  404. package/dist/gateway/static/root/assets/user-profile-settings-panel-B-UFPMXy.js +0 -1
  405. package/dist/gateway/static/root/assets/utils-Dm0hKalR.js +0 -1
  406. package/dist/gateway/static/root/assets/workflows-page-BtFGp2y_.js +0 -18
  407. package/dist/src/agent/fallback/error.d.ts +0 -22
  408. package/dist/src/agent/fallback/error.js +0 -32
  409. package/dist/src/agent/fallback/error.js.map +0 -1
  410. package/dist/src/agent/fallback/index.d.ts +0 -5
  411. package/dist/src/agent/fallback/index.js +0 -9
  412. package/dist/src/agent/fallback/index.js.map +0 -1
  413. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
  414. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
  415. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
  416. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
  417. package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
  418. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
  419. package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
  420. package/dist/src/agent/tools/cronjob-tool.js +0 -274
  421. package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
  422. package/dist/src/cli/commands/cron-cli.d.ts +0 -2
  423. package/dist/src/cli/commands/cron-cli.js +0 -15
  424. package/dist/src/cli/commands/cron-cli.js.map +0 -1
  425. package/dist/src/cli/commands/cron.d.ts +0 -4
  426. package/dist/src/cli/commands/cron.js +0 -188
  427. package/dist/src/cli/commands/cron.js.map +0 -1
  428. package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
  429. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
  430. package/dist/src/cron/execution-types.d.ts +0 -42
  431. package/dist/src/cron/executor.d.ts +0 -67
  432. package/dist/src/cron/executor.js +0 -669
  433. package/dist/src/cron/executor.js.map +0 -1
  434. package/dist/src/cron/index.d.ts +0 -7
  435. package/dist/src/cron/index.js +0 -7
  436. package/dist/src/cron/job-content.d.ts +0 -5
  437. package/dist/src/cron/job-content.js +0 -15
  438. package/dist/src/cron/job-content.js.map +0 -1
  439. package/dist/src/cron/run-log-store.d.ts +0 -12
  440. package/dist/src/cron/run-log-store.js +0 -58
  441. package/dist/src/cron/run-log-store.js.map +0 -1
  442. package/dist/src/cron/schedule.d.ts +0 -10
  443. package/dist/src/cron/schedule.js +0 -85
  444. package/dist/src/cron/schedule.js.map +0 -1
  445. package/dist/src/cron/service.d.ts +0 -58
  446. package/dist/src/cron/service.js +0 -419
  447. package/dist/src/cron/service.js.map +0 -1
  448. package/dist/src/cron/types.d.ts +0 -183
  449. package/dist/src/cron/validation.d.ts +0 -500
  450. package/dist/src/cron/validation.js +0 -192
  451. package/dist/src/cron/validation.js.map +0 -1
  452. package/dist/src/cron/workflow-run-completion.d.ts +0 -23
  453. package/dist/src/cron/workflow-run-completion.js +0 -72
  454. package/dist/src/cron/workflow-run-completion.js.map +0 -1
  455. package/dist/src/extensions/types/phase4.js +0 -1
  456. package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
  457. package/dist/src/gateway/hono/routes/cron.js +0 -109
  458. package/dist/src/gateway/hono/routes/cron.js.map +0 -1
  459. package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
  460. package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
  461. package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
  462. package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
  463. package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
  464. package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
  465. /package/dist/src/{cron → automations/domain}/types.js +0 -0
  466. /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
  467. /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
  468. /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
@@ -39,7 +39,7 @@ const STARTER_AGENTS = [
39
39
  "image_generate",
40
40
  "send_message",
41
41
  "send_media",
42
- "cronjob"
42
+ "automation"
43
43
  ]),
44
44
  profileFiles: {
45
45
  [WORKSPACE_FILES.IDENTITY]: identity({
@@ -49,7 +49,7 @@ const STARTER_AGENTS = [
49
49
  emoji: "💻"
50
50
  }),
51
51
  [WORKSPACE_FILES.SOUL]: `# SOUL.md - Coder\n\nYou are a software engineering agent. Understand the codebase, make focused changes, and verify behavior.\n\n## Workflow\n\n1. Read relevant files before proposing or editing code.\n2. Follow existing architecture, naming, and test style.\n3. Keep changes scoped to the requested behavior.\n4. Run the smallest meaningful verification.\n5. Report changed files, tests, and remaining risk.\n\n## Boundaries\n\n- Ask before destructive filesystem or git operations.\n- Do not send messages or media on the user's behalf.\n- Do not generate images for coding tasks.\n`,
52
- [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Coder Tool Policy\n\n- Use grep, find, list_dir, and read_file to understand code first.\n- Use edit_file or write_file only after the target change is clear.\n- Use shell for tests, type checks, builds, and safe inspection commands.\n- Use web_search or web_fetch only for current external docs or APIs.\n- Do not use send_message, send_media, cronjob, or image_generate.\n`
52
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Coder Tool Policy\n\n- Use grep, find, list_dir, and read_file to understand code first.\n- Use edit_file or write_file only after the target change is clear.\n- Use shell for tests, type checks, builds, and safe inspection commands.\n- Use web_search or web_fetch only for current external docs or APIs.\n- Do not use send_message, send_media, automation, or image_generate.\n`
53
53
  }
54
54
  },
55
55
  {
@@ -62,7 +62,7 @@ const STARTER_AGENTS = [
62
62
  "browser_use",
63
63
  "send_message",
64
64
  "send_media",
65
- "cronjob",
65
+ "automation",
66
66
  "bundle-mcp"
67
67
  ]),
68
68
  profileFiles: {
@@ -73,7 +73,7 @@ const STARTER_AGENTS = [
73
73
  emoji: "✍️"
74
74
  }),
75
75
  [WORKSPACE_FILES.SOUL]: `# SOUL.md - Writer\n\nYou are a writing and editing agent. Improve clarity, structure, voice, and usefulness.\n\n## Workflow\n\n1. Identify audience, purpose, channel, and tone.\n2. Propose structure before long-form writing.\n3. Preserve the user's intent and voice unless asked to change it.\n4. Cut filler and vague claims.\n5. Mark assumptions, missing facts, and placeholders.\n\n## Boundaries\n\n- Do not run shell commands.\n- Do not control browsers.\n- Do not send drafts externally.\n`,
76
- [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Writer Tool Policy\n\n- Use read_file to inspect source material.\n- Use write_file or edit_file only when the user asks to save or revise a document.\n- Use web_search and web_fetch for fact checks and source-backed writing.\n- Do not use shell, browser_use, send_message, send_media, cronjob, or bundle-mcp.\n`
76
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Writer Tool Policy\n\n- Use read_file to inspect source material.\n- Use write_file or edit_file only when the user asks to save or revise a document.\n- Use web_search and web_fetch for fact checks and source-backed writing.\n- Do not use shell, browser_use, send_message, send_media, automation, or bundle-mcp.\n`
77
77
  }
78
78
  },
79
79
  {
@@ -87,7 +87,7 @@ const STARTER_AGENTS = [
87
87
  "edit_file",
88
88
  "send_message",
89
89
  "send_media",
90
- "cronjob"
90
+ "automation"
91
91
  ]),
92
92
  profileFiles: {
93
93
  [WORKSPACE_FILES.IDENTITY]: identity({
@@ -97,7 +97,7 @@ const STARTER_AGENTS = [
97
97
  emoji: "🔍"
98
98
  }),
99
99
  [WORKSPACE_FILES.SOUL]: `# SOUL.md - Researcher\n\nYou are a research agent. Find reliable evidence, compare sources, and produce careful synthesis.\n\n## Workflow\n\n1. Clarify the research question and decision context.\n2. Start broad, then move to primary sources.\n3. Prefer official docs, papers, filings, standards, datasets, and first-party statements.\n4. Cross-check important claims.\n5. Separate facts, source-backed claims, inference, and opinion.\n\n## Boundaries\n\n- Do not edit local files unless asked to save a report.\n- Do not run shell commands.\n- Do not send findings externally.\n`,
100
- [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Researcher Tool Policy\n\n- Use web_search to map the topic and find candidate sources.\n- Use web_fetch for primary sources and source excerpts.\n- Use browser_use only when a page requires interaction.\n- Use read_file when the user provides local source material.\n- Do not use shell, write_file, edit_file, send_message, send_media, or cronjob.\n`
100
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Researcher Tool Policy\n\n- Use web_search to map the topic and find candidate sources.\n- Use web_fetch for primary sources and source excerpts.\n- Use browser_use only when a page requires interaction.\n- Use read_file when the user provides local source material.\n- Do not use shell, write_file, edit_file, send_message, send_media, or automation.\n`
101
101
  }
102
102
  },
103
103
  {
@@ -109,7 +109,7 @@ const STARTER_AGENTS = [
109
109
  "browser_use",
110
110
  "send_message",
111
111
  "send_media",
112
- "cronjob"
112
+ "automation"
113
113
  ]),
114
114
  profileFiles: {
115
115
  [WORKSPACE_FILES.IDENTITY]: identity({
@@ -118,8 +118,8 @@ const STARTER_AGENTS = [
118
118
  creature: "data analyst",
119
119
  emoji: "📊"
120
120
  }),
121
- [WORKSPACE_FILES.SOUL]: `# SOUL.md - Data Analyst\n\nYou are a data analysis agent. Inspect data, explain assumptions, and produce reproducible analysis.\n\n## Workflow\n\n1. Inspect schema, sample rows, missing values, and units.\n2. State assumptions before drawing conclusions.\n3. Use reproducible commands or scripts for calculations.\n4. Prefer clear tables and charts over verbose prose.\n5. Highlight data quality issues and uncertainty.\n\n## Boundaries\n\n- Do not control browsers by default.\n- Do not send results externally.\n- Do not schedule cron jobs without explicit user intent.\n`,
122
- [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Data Analyst Tool Policy\n\n- Use read_file, list_dir, grep, and find to inspect datasets and notes.\n- Use shell for reproducible analysis commands and scripts.\n- Use write_file or edit_file for notebooks, scripts, cleaned data, and reports.\n- Use web_fetch or web_search only when external data or documentation is needed.\n- Do not use browser_use, send_message, send_media, or cronjob.\n`
121
+ [WORKSPACE_FILES.SOUL]: `# SOUL.md - Data Analyst\n\nYou are a data analysis agent. Inspect data, explain assumptions, and produce reproducible analysis.\n\n## Workflow\n\n1. Inspect schema, sample rows, missing values, and units.\n2. State assumptions before drawing conclusions.\n3. Use reproducible commands or scripts for calculations.\n4. Prefer clear tables and charts over verbose prose.\n5. Highlight data quality issues and uncertainty.\n\n## Boundaries\n\n- Do not control browsers by default.\n- Do not send results externally.\n- Do not create automations without explicit user intent.\n`,
122
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Data Analyst Tool Policy\n\n- Use read_file, list_dir, grep, and find to inspect datasets and notes.\n- Use shell for reproducible analysis commands and scripts.\n- Use write_file or edit_file for notebooks, scripts, cleaned data, and reports.\n- Use web_fetch or web_search only when external data or documentation is needed.\n- Do not use browser_use, send_message, send_media, or automation.\n`
123
123
  }
124
124
  },
125
125
  {
@@ -131,7 +131,7 @@ const STARTER_AGENTS = [
131
131
  "shell",
132
132
  "send_message",
133
133
  "send_media",
134
- "cronjob"
134
+ "automation"
135
135
  ]),
136
136
  profileFiles: {
137
137
  [WORKSPACE_FILES.IDENTITY]: identity({
@@ -140,8 +140,8 @@ const STARTER_AGENTS = [
140
140
  creature: "creative director",
141
141
  emoji: "🎨"
142
142
  }),
143
- [WORKSPACE_FILES.SOUL]: `# SOUL.md - Creative\n\nYou are a creative design agent. Explore visual directions, produce strong options, and explain design tradeoffs.\n\n## Workflow\n\n1. Identify audience, medium, constraints, and taste direction.\n2. Offer distinct creative directions when the brief is open.\n3. Explain why each direction works.\n4. Respect accessibility, brand constraints, and production limits.\n5. Iterate concretely from user feedback.\n\n## Boundaries\n\n- Do not run shell commands.\n- Do not send creative work externally.\n- Do not schedule cron jobs.\n`,
144
- [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Creative Tool Policy\n\n- Use image_generate when the user wants visual options or assets.\n- Use image to inspect user-provided images.\n- Use web_search and web_fetch for references, style research, or current product visuals.\n- Use write_file or edit_file to save prompts, design specs, or copy.\n- Do not use shell, send_message, send_media, or cronjob.\n`
143
+ [WORKSPACE_FILES.SOUL]: `# SOUL.md - Creative\n\nYou are a creative design agent. Explore visual directions, produce strong options, and explain design tradeoffs.\n\n## Workflow\n\n1. Identify audience, medium, constraints, and taste direction.\n2. Offer distinct creative directions when the brief is open.\n3. Explain why each direction works.\n4. Respect accessibility, brand constraints, and production limits.\n5. Iterate concretely from user feedback.\n\n## Boundaries\n\n- Do not run shell commands.\n- Do not send creative work externally.\n- Do not create automations.\n`,
144
+ [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Creative Tool Policy\n\n- Use image_generate when the user wants visual options or assets.\n- Use image to inspect user-provided images.\n- Use web_search and web_fetch for references, style research, or current product visuals.\n- Use write_file or edit_file to save prompts, design specs, or copy.\n- Do not use shell, send_message, send_media, or automation.\n`
145
145
  }
146
146
  }
147
147
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"starter-agents.js","names":[],"sources":["../../../src/agent/starter-agents.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { WORKSPACE_FILES } from '../config/paths.js';\nimport { applyAgentConfig, listAgentEntries } from '../commands/agents.config.js';\nimport {\n normalizeAgentId,\n resolveAgentProfileDir,\n resolveAgentWorkspaceDir,\n} from './agent-scope.js';\n\nexport const STARTER_AGENTS_INITIALIZED_VERSION = 1;\n\ntype StarterAgent = {\n id: string;\n displayName: string;\n description: string;\n emoji: string;\n tools?: NonNullable<Config['agents']['list']>[number]['tools'];\n profileFiles: Record<string, string>;\n};\n\nfunction denyTools(names: string[]): NonNullable<Config['agents']['list']>[number]['tools'] {\n return { builtin: Object.fromEntries(names.map((name) => [name, { mode: 'deny' as const }])) };\n}\n\nfunction identity(params: { name: string; description: string; creature: string; emoji: string }): string {\n return `# IDENTITY.md - Who Am I?\\n\\n- **Name:** ${params.name}\\n- **Description:** ${params.description}\\n- **Language:** en\\n- **Creature:** ${params.creature}\\n- **Emoji:** ${params.emoji}\\n- **Avatar:**\\n`;\n}\n\nexport const STARTER_AGENTS: readonly StarterAgent[] = [\n {\n id: 'main',\n displayName: 'Main',\n description: 'General-purpose personal assistant.',\n emoji: '✨',\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Main',\n description: 'General-purpose personal assistant.',\n creature: 'assistant',\n emoji: '✨',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Main\\n\\nYou are a helpful personal AI assistant. Adapt to the user's intent, keep responses practical, and use tools when they clearly help.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Main Tool Policy\\n\\n- Use tools when they materially improve the answer.\\n- Prefer safe inspection before changing files or external state.\\n- Ask before destructive actions.\\n`,\n },\n },\n {\n id: 'coder',\n displayName: 'Coder',\n description: 'Software development, debugging, refactoring, and tests.',\n emoji: '💻',\n tools: denyTools(['image_generate', 'send_message', 'send_media', 'cronjob']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Coder',\n description: 'Software development, debugging, refactoring, and tests.',\n creature: 'software engineer',\n emoji: '💻',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Coder\\n\\nYou are a software engineering agent. Understand the codebase, make focused changes, and verify behavior.\\n\\n## Workflow\\n\\n1. Read relevant files before proposing or editing code.\\n2. Follow existing architecture, naming, and test style.\\n3. Keep changes scoped to the requested behavior.\\n4. Run the smallest meaningful verification.\\n5. Report changed files, tests, and remaining risk.\\n\\n## Boundaries\\n\\n- Ask before destructive filesystem or git operations.\\n- Do not send messages or media on the user's behalf.\\n- Do not generate images for coding tasks.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Coder Tool Policy\\n\\n- Use grep, find, list_dir, and read_file to understand code first.\\n- Use edit_file or write_file only after the target change is clear.\\n- Use shell for tests, type checks, builds, and safe inspection commands.\\n- Use web_search or web_fetch only for current external docs or APIs.\\n- Do not use send_message, send_media, cronjob, or image_generate.\\n`,\n },\n },\n {\n id: 'writer',\n displayName: 'Writer',\n description: 'Drafting, editing, rewriting, and audience-aware content.',\n emoji: '✍️',\n tools: denyTools(['shell', 'browser_use', 'send_message', 'send_media', 'cronjob', 'bundle-mcp']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Writer',\n description: 'Drafting, editing, rewriting, and audience-aware content.',\n creature: 'editor',\n emoji: '✍️',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Writer\\n\\nYou are a writing and editing agent. Improve clarity, structure, voice, and usefulness.\\n\\n## Workflow\\n\\n1. Identify audience, purpose, channel, and tone.\\n2. Propose structure before long-form writing.\\n3. Preserve the user's intent and voice unless asked to change it.\\n4. Cut filler and vague claims.\\n5. Mark assumptions, missing facts, and placeholders.\\n\\n## Boundaries\\n\\n- Do not run shell commands.\\n- Do not control browsers.\\n- Do not send drafts externally.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Writer Tool Policy\\n\\n- Use read_file to inspect source material.\\n- Use write_file or edit_file only when the user asks to save or revise a document.\\n- Use web_search and web_fetch for fact checks and source-backed writing.\\n- Do not use shell, browser_use, send_message, send_media, cronjob, or bundle-mcp.\\n`,\n },\n },\n {\n id: 'researcher',\n displayName: 'Researcher',\n description: 'Deep research, source comparison, and fact synthesis.',\n emoji: '🔍',\n tools: denyTools(['shell', 'write_file', 'edit_file', 'send_message', 'send_media', 'cronjob']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Researcher',\n description: 'Deep research, source comparison, and fact synthesis.',\n creature: 'analyst',\n emoji: '🔍',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Researcher\\n\\nYou are a research agent. Find reliable evidence, compare sources, and produce careful synthesis.\\n\\n## Workflow\\n\\n1. Clarify the research question and decision context.\\n2. Start broad, then move to primary sources.\\n3. Prefer official docs, papers, filings, standards, datasets, and first-party statements.\\n4. Cross-check important claims.\\n5. Separate facts, source-backed claims, inference, and opinion.\\n\\n## Boundaries\\n\\n- Do not edit local files unless asked to save a report.\\n- Do not run shell commands.\\n- Do not send findings externally.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Researcher Tool Policy\\n\\n- Use web_search to map the topic and find candidate sources.\\n- Use web_fetch for primary sources and source excerpts.\\n- Use browser_use only when a page requires interaction.\\n- Use read_file when the user provides local source material.\\n- Do not use shell, write_file, edit_file, send_message, send_media, or cronjob.\\n`,\n },\n },\n {\n id: 'data-analyst',\n displayName: 'Data Analyst',\n description: 'Data cleaning, analysis, visualization, and reproducible reports.',\n emoji: '📊',\n tools: denyTools(['browser_use', 'send_message', 'send_media', 'cronjob']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Data Analyst',\n description: 'Data cleaning, analysis, visualization, and reproducible reports.',\n creature: 'data analyst',\n emoji: '📊',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Data Analyst\\n\\nYou are a data analysis agent. Inspect data, explain assumptions, and produce reproducible analysis.\\n\\n## Workflow\\n\\n1. Inspect schema, sample rows, missing values, and units.\\n2. State assumptions before drawing conclusions.\\n3. Use reproducible commands or scripts for calculations.\\n4. Prefer clear tables and charts over verbose prose.\\n5. Highlight data quality issues and uncertainty.\\n\\n## Boundaries\\n\\n- Do not control browsers by default.\\n- Do not send results externally.\\n- Do not schedule cron jobs without explicit user intent.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Data Analyst Tool Policy\\n\\n- Use read_file, list_dir, grep, and find to inspect datasets and notes.\\n- Use shell for reproducible analysis commands and scripts.\\n- Use write_file or edit_file for notebooks, scripts, cleaned data, and reports.\\n- Use web_fetch or web_search only when external data or documentation is needed.\\n- Do not use browser_use, send_message, send_media, or cronjob.\\n`,\n },\n },\n {\n id: 'creative',\n displayName: 'Creative',\n description: 'Visual direction, image prompts, design critique, and creative options.',\n emoji: '🎨',\n tools: denyTools(['shell', 'send_message', 'send_media', 'cronjob']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Creative',\n description: 'Visual direction, image prompts, design critique, and creative options.',\n creature: 'creative director',\n emoji: '🎨',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Creative\\n\\nYou are a creative design agent. Explore visual directions, produce strong options, and explain design tradeoffs.\\n\\n## Workflow\\n\\n1. Identify audience, medium, constraints, and taste direction.\\n2. Offer distinct creative directions when the brief is open.\\n3. Explain why each direction works.\\n4. Respect accessibility, brand constraints, and production limits.\\n5. Iterate concretely from user feedback.\\n\\n## Boundaries\\n\\n- Do not run shell commands.\\n- Do not send creative work externally.\\n- Do not schedule cron jobs.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Creative Tool Policy\\n\\n- Use image_generate when the user wants visual options or assets.\\n- Use image to inspect user-provided images.\\n- Use web_search and web_fetch for references, style research, or current product visuals.\\n- Use write_file or edit_file to save prompts, design specs, or copy.\\n- Do not use shell, send_message, send_media, or cronjob.\\n`,\n },\n },\n];\n\nfunction hasAgentEntry(cfg: Config, agentId: string): boolean {\n const id = normalizeAgentId(agentId);\n return listAgentEntries(cfg).some((entry) => normalizeAgentId(entry.id) === id);\n}\n\nfunction writeFileIfMissing(path: string, content: string): void {\n if (!existsSync(path)) {\n writeFileSync(path, content, 'utf-8');\n }\n}\n\nexport function materializeStarterAgentFiles(cfg: Config): void {\n for (const starter of STARTER_AGENTS) {\n const profileDir = resolveAgentProfileDir(cfg, starter.id);\n const workspaceDir = resolveAgentWorkspaceDir(cfg, starter.id);\n mkdirSync(profileDir, { recursive: true });\n mkdirSync(workspaceDir, { recursive: true });\n for (const [name, content] of Object.entries(starter.profileFiles)) {\n writeFileIfMissing(join(profileDir, name), content);\n }\n }\n}\n\nexport function ensureStarterAgentsInitialized(cfg: Config): { config: Config; changed: boolean } {\n let next = cfg;\n for (const starter of STARTER_AGENTS) {\n if (hasAgentEntry(next, starter.id)) continue;\n next = applyAgentConfig(next, {\n agentId: starter.id,\n ...(starter.tools ? { tools: starter.tools } : {}),\n });\n }\n\n materializeStarterAgentFiles(next);\n return { config: next, changed: next !== cfg };\n}\n"],"mappings":";;;;;;YAIqD;kBAM3B;AAE1B,MAAa,qCAAqC;AAWlD,SAAS,UAAU,OAAyE;AAC1F,QAAO,EAAE,SAAS,OAAO,YAAY,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,MAAM,QAAiB,CAAC,CAAC,CAAC,EAAE;;AAGhG,SAAS,SAAS,QAAwF;AACxG,QAAO,4CAA4C,OAAO,KAAK,uBAAuB,OAAO,YAAY,wCAAwC,OAAO,SAAS,iBAAiB,OAAO,MAAM;;AAGjM,MAAa,iBAA0C;CACrD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,UAAU;GAAC;GAAkB;GAAgB;GAAc;GAAU,CAAC;EAC7E,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,UAAU;GAAC;GAAS;GAAe;GAAgB;GAAc;GAAW;GAAa,CAAC;EACjG,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,UAAU;GAAC;GAAS;GAAc;GAAa;GAAgB;GAAc;GAAU,CAAC;EAC/F,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,UAAU;GAAC;GAAe;GAAgB;GAAc;GAAU,CAAC;EAC1E,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,OAAO;EACP,OAAO,UAAU;GAAC;GAAS;GAAgB;GAAc;GAAU,CAAC;EACpE,cAAc;IACX,gBAAgB,WAAW,SAAS;IACnC,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACR,CAAC;IACD,gBAAgB,OAAO;IACvB,gBAAgB,QAAQ;GAC1B;EACF;CACF;AAED,SAAS,cAAc,KAAa,SAA0B;CAC5D,MAAM,KAAK,iBAAiB,QAAQ;AACpC,QAAO,iBAAiB,IAAI,CAAC,MAAM,UAAU,iBAAiB,MAAM,GAAG,KAAK,GAAG;;AAGjF,SAAS,mBAAmB,MAAc,SAAuB;AAC/D,KAAI,CAAC,WAAW,KAAK,CACnB,eAAc,MAAM,SAAS,QAAQ;;AAIzC,SAAgB,6BAA6B,KAAmB;AAC9D,MAAK,MAAM,WAAW,gBAAgB;EACpC,MAAM,aAAa,uBAAuB,KAAK,QAAQ,GAAG;EAC1D,MAAM,eAAe,yBAAyB,KAAK,QAAQ,GAAG;AAC9D,YAAU,YAAY,EAAE,WAAW,MAAM,CAAC;AAC1C,YAAU,cAAc,EAAE,WAAW,MAAM,CAAC;AAC5C,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,QAAQ,aAAa,CAChE,oBAAmB,KAAK,YAAY,KAAK,EAAE,QAAQ;;;AAKzD,SAAgB,+BAA+B,KAAmD;CAChG,IAAI,OAAO;AACX,MAAK,MAAM,WAAW,gBAAgB;AACpC,MAAI,cAAc,MAAM,QAAQ,GAAG,CAAE;AACrC,SAAO,iBAAiB,MAAM;GAC5B,SAAS,QAAQ;GACjB,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAO,GAAG,EAAE;GAClD,CAAC;;AAGJ,8BAA6B,KAAK;AAClC,QAAO;EAAE,QAAQ;EAAM,SAAS,SAAS;EAAK"}
1
+ {"version":3,"file":"starter-agents.js","names":[],"sources":["../../../src/agent/starter-agents.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { WORKSPACE_FILES } from '../config/paths.js';\nimport { applyAgentConfig, listAgentEntries } from '../commands/agents.config.js';\nimport {\n normalizeAgentId,\n resolveAgentProfileDir,\n resolveAgentWorkspaceDir,\n} from './agent-scope.js';\n\nexport const STARTER_AGENTS_INITIALIZED_VERSION = 1;\n\ntype StarterAgent = {\n id: string;\n displayName: string;\n description: string;\n emoji: string;\n tools?: NonNullable<Config['agents']['list']>[number]['tools'];\n profileFiles: Record<string, string>;\n};\n\nfunction denyTools(names: string[]): NonNullable<Config['agents']['list']>[number]['tools'] {\n return { builtin: Object.fromEntries(names.map((name) => [name, { mode: 'deny' as const }])) };\n}\n\nfunction identity(params: { name: string; description: string; creature: string; emoji: string }): string {\n return `# IDENTITY.md - Who Am I?\\n\\n- **Name:** ${params.name}\\n- **Description:** ${params.description}\\n- **Language:** en\\n- **Creature:** ${params.creature}\\n- **Emoji:** ${params.emoji}\\n- **Avatar:**\\n`;\n}\n\nexport const STARTER_AGENTS: readonly StarterAgent[] = [\n {\n id: 'main',\n displayName: 'Main',\n description: 'General-purpose personal assistant.',\n emoji: '✨',\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Main',\n description: 'General-purpose personal assistant.',\n creature: 'assistant',\n emoji: '✨',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Main\\n\\nYou are a helpful personal AI assistant. Adapt to the user's intent, keep responses practical, and use tools when they clearly help.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Main Tool Policy\\n\\n- Use tools when they materially improve the answer.\\n- Prefer safe inspection before changing files or external state.\\n- Ask before destructive actions.\\n`,\n },\n },\n {\n id: 'coder',\n displayName: 'Coder',\n description: 'Software development, debugging, refactoring, and tests.',\n emoji: '💻',\n tools: denyTools(['image_generate', 'send_message', 'send_media', 'automation']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Coder',\n description: 'Software development, debugging, refactoring, and tests.',\n creature: 'software engineer',\n emoji: '💻',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Coder\\n\\nYou are a software engineering agent. Understand the codebase, make focused changes, and verify behavior.\\n\\n## Workflow\\n\\n1. Read relevant files before proposing or editing code.\\n2. Follow existing architecture, naming, and test style.\\n3. Keep changes scoped to the requested behavior.\\n4. Run the smallest meaningful verification.\\n5. Report changed files, tests, and remaining risk.\\n\\n## Boundaries\\n\\n- Ask before destructive filesystem or git operations.\\n- Do not send messages or media on the user's behalf.\\n- Do not generate images for coding tasks.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Coder Tool Policy\\n\\n- Use grep, find, list_dir, and read_file to understand code first.\\n- Use edit_file or write_file only after the target change is clear.\\n- Use shell for tests, type checks, builds, and safe inspection commands.\\n- Use web_search or web_fetch only for current external docs or APIs.\\n- Do not use send_message, send_media, automation, or image_generate.\\n`,\n },\n },\n {\n id: 'writer',\n displayName: 'Writer',\n description: 'Drafting, editing, rewriting, and audience-aware content.',\n emoji: '✍️',\n tools: denyTools(['shell', 'browser_use', 'send_message', 'send_media', 'automation', 'bundle-mcp']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Writer',\n description: 'Drafting, editing, rewriting, and audience-aware content.',\n creature: 'editor',\n emoji: '✍️',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Writer\\n\\nYou are a writing and editing agent. Improve clarity, structure, voice, and usefulness.\\n\\n## Workflow\\n\\n1. Identify audience, purpose, channel, and tone.\\n2. Propose structure before long-form writing.\\n3. Preserve the user's intent and voice unless asked to change it.\\n4. Cut filler and vague claims.\\n5. Mark assumptions, missing facts, and placeholders.\\n\\n## Boundaries\\n\\n- Do not run shell commands.\\n- Do not control browsers.\\n- Do not send drafts externally.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Writer Tool Policy\\n\\n- Use read_file to inspect source material.\\n- Use write_file or edit_file only when the user asks to save or revise a document.\\n- Use web_search and web_fetch for fact checks and source-backed writing.\\n- Do not use shell, browser_use, send_message, send_media, automation, or bundle-mcp.\\n`,\n },\n },\n {\n id: 'researcher',\n displayName: 'Researcher',\n description: 'Deep research, source comparison, and fact synthesis.',\n emoji: '🔍',\n tools: denyTools(['shell', 'write_file', 'edit_file', 'send_message', 'send_media', 'automation']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Researcher',\n description: 'Deep research, source comparison, and fact synthesis.',\n creature: 'analyst',\n emoji: '🔍',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Researcher\\n\\nYou are a research agent. Find reliable evidence, compare sources, and produce careful synthesis.\\n\\n## Workflow\\n\\n1. Clarify the research question and decision context.\\n2. Start broad, then move to primary sources.\\n3. Prefer official docs, papers, filings, standards, datasets, and first-party statements.\\n4. Cross-check important claims.\\n5. Separate facts, source-backed claims, inference, and opinion.\\n\\n## Boundaries\\n\\n- Do not edit local files unless asked to save a report.\\n- Do not run shell commands.\\n- Do not send findings externally.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Researcher Tool Policy\\n\\n- Use web_search to map the topic and find candidate sources.\\n- Use web_fetch for primary sources and source excerpts.\\n- Use browser_use only when a page requires interaction.\\n- Use read_file when the user provides local source material.\\n- Do not use shell, write_file, edit_file, send_message, send_media, or automation.\\n`,\n },\n },\n {\n id: 'data-analyst',\n displayName: 'Data Analyst',\n description: 'Data cleaning, analysis, visualization, and reproducible reports.',\n emoji: '📊',\n tools: denyTools(['browser_use', 'send_message', 'send_media', 'automation']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Data Analyst',\n description: 'Data cleaning, analysis, visualization, and reproducible reports.',\n creature: 'data analyst',\n emoji: '📊',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Data Analyst\\n\\nYou are a data analysis agent. Inspect data, explain assumptions, and produce reproducible analysis.\\n\\n## Workflow\\n\\n1. Inspect schema, sample rows, missing values, and units.\\n2. State assumptions before drawing conclusions.\\n3. Use reproducible commands or scripts for calculations.\\n4. Prefer clear tables and charts over verbose prose.\\n5. Highlight data quality issues and uncertainty.\\n\\n## Boundaries\\n\\n- Do not control browsers by default.\\n- Do not send results externally.\\n- Do not create automations without explicit user intent.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Data Analyst Tool Policy\\n\\n- Use read_file, list_dir, grep, and find to inspect datasets and notes.\\n- Use shell for reproducible analysis commands and scripts.\\n- Use write_file or edit_file for notebooks, scripts, cleaned data, and reports.\\n- Use web_fetch or web_search only when external data or documentation is needed.\\n- Do not use browser_use, send_message, send_media, or automation.\\n`,\n },\n },\n {\n id: 'creative',\n displayName: 'Creative',\n description: 'Visual direction, image prompts, design critique, and creative options.',\n emoji: '🎨',\n tools: denyTools(['shell', 'send_message', 'send_media', 'automation']),\n profileFiles: {\n [WORKSPACE_FILES.IDENTITY]: identity({\n name: 'Creative',\n description: 'Visual direction, image prompts, design critique, and creative options.',\n creature: 'creative director',\n emoji: '🎨',\n }),\n [WORKSPACE_FILES.SOUL]: `# SOUL.md - Creative\\n\\nYou are a creative design agent. Explore visual directions, produce strong options, and explain design tradeoffs.\\n\\n## Workflow\\n\\n1. Identify audience, medium, constraints, and taste direction.\\n2. Offer distinct creative directions when the brief is open.\\n3. Explain why each direction works.\\n4. Respect accessibility, brand constraints, and production limits.\\n5. Iterate concretely from user feedback.\\n\\n## Boundaries\\n\\n- Do not run shell commands.\\n- Do not send creative work externally.\\n- Do not create automations.\\n`,\n [WORKSPACE_FILES.TOOLS]: `# TOOLS.md - Creative Tool Policy\\n\\n- Use image_generate when the user wants visual options or assets.\\n- Use image to inspect user-provided images.\\n- Use web_search and web_fetch for references, style research, or current product visuals.\\n- Use write_file or edit_file to save prompts, design specs, or copy.\\n- Do not use shell, send_message, send_media, or automation.\\n`,\n },\n },\n];\n\nfunction hasAgentEntry(cfg: Config, agentId: string): boolean {\n const id = normalizeAgentId(agentId);\n return listAgentEntries(cfg).some((entry) => normalizeAgentId(entry.id) === id);\n}\n\nfunction writeFileIfMissing(path: string, content: string): void {\n if (!existsSync(path)) {\n writeFileSync(path, content, 'utf-8');\n }\n}\n\nexport function materializeStarterAgentFiles(cfg: Config): void {\n for (const starter of STARTER_AGENTS) {\n const profileDir = resolveAgentProfileDir(cfg, starter.id);\n const workspaceDir = resolveAgentWorkspaceDir(cfg, starter.id);\n mkdirSync(profileDir, { recursive: true });\n mkdirSync(workspaceDir, { recursive: true });\n for (const [name, content] of Object.entries(starter.profileFiles)) {\n writeFileIfMissing(join(profileDir, name), content);\n }\n }\n}\n\nexport function ensureStarterAgentsInitialized(cfg: Config): { config: Config; changed: boolean } {\n let next = cfg;\n for (const starter of STARTER_AGENTS) {\n if (hasAgentEntry(next, starter.id)) continue;\n next = applyAgentConfig(next, {\n agentId: starter.id,\n ...(starter.tools ? { tools: starter.tools } : {}),\n });\n }\n\n materializeStarterAgentFiles(next);\n return { config: next, changed: next !== cfg };\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { AgentTool } from '@earendil-works/pi-agent-core';
2
+ import type { AutomationService } from '../../automations/index.js';
3
+ declare const AutomationToolSchema: import("@sinclair/typebox/build/cjs/index.js").TObject<{
4
+ action: import("@sinclair/typebox/build/cjs/index.js").TUnion<[import("@sinclair/typebox/build/cjs/index.js").TLiteral<"list">, import("@sinclair/typebox/build/cjs/index.js").TLiteral<"create">, import("@sinclair/typebox/build/cjs/index.js").TLiteral<"update">, import("@sinclair/typebox/build/cjs/index.js").TLiteral<"delete">, import("@sinclair/typebox/build/cjs/index.js").TLiteral<"run">, import("@sinclair/typebox/build/cjs/index.js").TLiteral<"pause">, import("@sinclair/typebox/build/cjs/index.js").TLiteral<"resume">, import("@sinclair/typebox/build/cjs/index.js").TLiteral<"history">]>;
5
+ automationId: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TString>;
6
+ automation: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TAny>;
7
+ patch: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TAny>;
8
+ limit: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TNumber>;
9
+ }>;
10
+ export interface AutomationToolDeps {
11
+ getAutomationService: () => AutomationService | undefined;
12
+ }
13
+ export declare function createAutomationTool(deps: AutomationToolDeps): AgentTool<typeof AutomationToolSchema, Record<string, unknown>>;
14
+ export {};
@@ -0,0 +1,102 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ //#region src/agent/tools/automation-tool.ts
3
+ const AutomationToolSchema = Type.Object({
4
+ action: Type.Union([
5
+ Type.Literal("list"),
6
+ Type.Literal("create"),
7
+ Type.Literal("update"),
8
+ Type.Literal("delete"),
9
+ Type.Literal("run"),
10
+ Type.Literal("pause"),
11
+ Type.Literal("resume"),
12
+ Type.Literal("history")
13
+ ]),
14
+ automationId: Type.Optional(Type.String({ description: "Automation id for update/delete/run/pause/resume/history" })),
15
+ automation: Type.Optional(Type.Any({ description: "Automation create payload" })),
16
+ patch: Type.Optional(Type.Any({ description: "Automation update patch" })),
17
+ limit: Type.Optional(Type.Number({ description: "History limit, default 5" }))
18
+ });
19
+ function textResult(text, details = {}) {
20
+ return {
21
+ content: [{
22
+ type: "text",
23
+ text
24
+ }],
25
+ details
26
+ };
27
+ }
28
+ function formatAutomation(item) {
29
+ const trigger = item.trigger.kind === "schedule" ? `${item.trigger.schedule.kind}` : item.trigger.kind;
30
+ const status = item.enabled ? "enabled" : "paused";
31
+ const next = item.state.nextRunAtMs ? new Date(item.state.nextRunAtMs).toISOString() : "none";
32
+ return `- ${item.id} · ${item.name} · ${status} · trigger=${trigger} · next=${next}`;
33
+ }
34
+ function createAutomationTool(deps) {
35
+ return {
36
+ name: "automation",
37
+ label: "Automation",
38
+ description: "Manage product automations. Automations can be manual, scheduled, webhook-triggered, or product-event-triggered and can run an agent instruction or workflow.",
39
+ parameters: AutomationToolSchema,
40
+ async execute(_toolCallId, params) {
41
+ const service = deps.getAutomationService();
42
+ if (!service) return textResult("Automation service is not available.", { ok: false });
43
+ switch (params.action) {
44
+ case "list": {
45
+ const automations = await service.list();
46
+ return textResult(automations.length > 0 ? automations.map(formatAutomation).join("\n") : "No automations.", { automations });
47
+ }
48
+ case "create": {
49
+ if (!params.automation || typeof params.automation !== "object") return textResult("automation payload is required for create.", { ok: false });
50
+ const automation = await service.create(params.automation);
51
+ return textResult(`Created automation ${automation.id}: ${automation.name}`, { automation });
52
+ }
53
+ case "update": {
54
+ const id = params.automationId?.trim();
55
+ if (!id) return textResult("automationId is required for update.", { ok: false });
56
+ if (!params.patch || typeof params.patch !== "object") return textResult("patch payload is required for update.", { ok: false });
57
+ const automation = await service.update(id, params.patch);
58
+ if (!automation) return textResult(`Automation not found: ${id}`, { ok: false });
59
+ return textResult(`Updated automation ${automation.id}: ${automation.name}`, { automation });
60
+ }
61
+ case "delete": {
62
+ const id = params.automationId?.trim();
63
+ if (!id) return textResult("automationId is required for delete.", { ok: false });
64
+ const removed = await service.remove(id);
65
+ return textResult(removed ? `Deleted automation ${id}.` : `Automation not found: ${id}`, { removed });
66
+ }
67
+ case "run": {
68
+ const id = params.automationId?.trim();
69
+ if (!id) return textResult("automationId is required for run.", { ok: false });
70
+ const run = await service.runNow(id);
71
+ return textResult(`Started automation run ${run.id}.`, { run });
72
+ }
73
+ case "pause": {
74
+ const id = params.automationId?.trim();
75
+ if (!id) return textResult("automationId is required for pause.", { ok: false });
76
+ const automation = await service.pause(id);
77
+ if (!automation) return textResult(`Automation not found: ${id}`, { ok: false });
78
+ return textResult(`Paused automation ${id}.`, { automation });
79
+ }
80
+ case "resume": {
81
+ const id = params.automationId?.trim();
82
+ if (!id) return textResult("automationId is required for resume.", { ok: false });
83
+ const automation = await service.resume(id);
84
+ if (!automation) return textResult(`Automation not found: ${id}`, { ok: false });
85
+ return textResult(`Resumed automation ${id}.`, { automation });
86
+ }
87
+ case "history": {
88
+ const id = params.automationId?.trim();
89
+ const runs = await service.listRuns({
90
+ automationId: id || void 0,
91
+ limit: Math.max(1, Math.min(50, Math.floor(params.limit ?? 5)))
92
+ });
93
+ return textResult(runs.length > 0 ? runs.map((run) => `- ${run.id} · ${run.automationName} · ${run.status}`).join("\n") : "No automation runs.", { runs });
94
+ }
95
+ }
96
+ }
97
+ };
98
+ }
99
+ //#endregion
100
+ export { createAutomationTool };
101
+
102
+ //# sourceMappingURL=automation-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-tool.js","names":[],"sources":["../../../../src/agent/tools/automation-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\n\nimport type { AutomationService } from '../../automations/index.js';\nimport type { CreateAutomationInput, UpdateAutomationInput } from '../../automations/domain/validation.js';\n\nconst AutomationToolSchema = Type.Object({\n action: Type.Union([\n Type.Literal('list'),\n Type.Literal('create'),\n Type.Literal('update'),\n Type.Literal('delete'),\n Type.Literal('run'),\n Type.Literal('pause'),\n Type.Literal('resume'),\n Type.Literal('history'),\n ]),\n automationId: Type.Optional(Type.String({ description: 'Automation id for update/delete/run/pause/resume/history' })),\n automation: Type.Optional(Type.Any({ description: 'Automation create payload' })),\n patch: Type.Optional(Type.Any({ description: 'Automation update patch' })),\n limit: Type.Optional(Type.Number({ description: 'History limit, default 5' })),\n});\n\ntype AutomationToolInput = {\n action: 'list' | 'create' | 'update' | 'delete' | 'run' | 'pause' | 'resume' | 'history';\n automationId?: string;\n automation?: unknown;\n patch?: unknown;\n limit?: number;\n};\n\nexport interface AutomationToolDeps {\n getAutomationService: () => AutomationService | undefined;\n}\n\nfunction textResult(text: string, details: Record<string, unknown> = {}) {\n return { content: [{ type: 'text' as const, text }], details };\n}\n\nfunction formatAutomation(item: Awaited<ReturnType<AutomationService['list']>>[number]): string {\n const trigger =\n item.trigger.kind === 'schedule'\n ? `${item.trigger.schedule.kind}`\n : item.trigger.kind;\n const status = item.enabled ? 'enabled' : 'paused';\n const next = item.state.nextRunAtMs ? new Date(item.state.nextRunAtMs).toISOString() : 'none';\n return `- ${item.id} · ${item.name} · ${status} · trigger=${trigger} · next=${next}`;\n}\n\nexport function createAutomationTool(deps: AutomationToolDeps): AgentTool<typeof AutomationToolSchema, Record<string, unknown>> {\n return {\n name: 'automation',\n label: 'Automation',\n description:\n 'Manage product automations. Automations can be manual, scheduled, webhook-triggered, or product-event-triggered and can run an agent instruction or workflow.',\n parameters: AutomationToolSchema,\n async execute(_toolCallId, params: AutomationToolInput) {\n const service = deps.getAutomationService();\n if (!service) {\n return textResult('Automation service is not available.', { ok: false });\n }\n\n switch (params.action) {\n case 'list': {\n const automations = await service.list();\n const body = automations.length > 0\n ? automations.map(formatAutomation).join('\\n')\n : 'No automations.';\n return textResult(body, { automations });\n }\n case 'create': {\n if (!params.automation || typeof params.automation !== 'object') {\n return textResult('automation payload is required for create.', { ok: false });\n }\n const automation = await service.create(params.automation as CreateAutomationInput);\n return textResult(`Created automation ${automation.id}: ${automation.name}`, { automation });\n }\n case 'update': {\n const id = params.automationId?.trim();\n if (!id) return textResult('automationId is required for update.', { ok: false });\n if (!params.patch || typeof params.patch !== 'object') {\n return textResult('patch payload is required for update.', { ok: false });\n }\n const automation = await service.update(id, params.patch as UpdateAutomationInput);\n if (!automation) return textResult(`Automation not found: ${id}`, { ok: false });\n return textResult(`Updated automation ${automation.id}: ${automation.name}`, { automation });\n }\n case 'delete': {\n const id = params.automationId?.trim();\n if (!id) return textResult('automationId is required for delete.', { ok: false });\n const removed = await service.remove(id);\n return textResult(removed ? `Deleted automation ${id}.` : `Automation not found: ${id}`, { removed });\n }\n case 'run': {\n const id = params.automationId?.trim();\n if (!id) return textResult('automationId is required for run.', { ok: false });\n const run = await service.runNow(id);\n return textResult(`Started automation run ${run.id}.`, { run });\n }\n case 'pause': {\n const id = params.automationId?.trim();\n if (!id) return textResult('automationId is required for pause.', { ok: false });\n const automation = await service.pause(id);\n if (!automation) return textResult(`Automation not found: ${id}`, { ok: false });\n return textResult(`Paused automation ${id}.`, { automation });\n }\n case 'resume': {\n const id = params.automationId?.trim();\n if (!id) return textResult('automationId is required for resume.', { ok: false });\n const automation = await service.resume(id);\n if (!automation) return textResult(`Automation not found: ${id}`, { ok: false });\n return textResult(`Resumed automation ${id}.`, { automation });\n }\n case 'history': {\n const id = params.automationId?.trim();\n const runs = await service.listRuns({\n automationId: id || undefined,\n limit: Math.max(1, Math.min(50, Math.floor(params.limit ?? 5))),\n });\n const body = runs.length > 0\n ? runs.map((run) => `- ${run.id} · ${run.automationName} · ${run.status}`).join('\\n')\n : 'No automation runs.';\n return textResult(body, { runs });\n }\n }\n },\n };\n}\n"],"mappings":"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"}
@@ -24,7 +24,7 @@ const DELEGATE_BLOCKED_TOOLS = new Set([
24
24
  "session_search",
25
25
  "memory_search",
26
26
  "memory_get",
27
- "cronjob",
27
+ "automation",
28
28
  "skills_list",
29
29
  "skill_view",
30
30
  "skill_manage",
@@ -1 +1 @@
1
- {"version":3,"file":"delegate-tool.js","names":[],"sources":["../../../../src/agent/tools/delegate-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport {\n createDelegateChildHandle,\n type BuildChildToolsOptions,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport const DEFAULT_DELEGATE_TOOLS = [\n 'shell',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'grep',\n 'find',\n 'list_dir',\n 'web_search',\n 'web_fetch',\n] as const;\n\n/** Tools never passed to a delegated sub-agent (even if requested). */\nexport const DELEGATE_BLOCKED_TOOLS = new Set([\n 'delegate_task',\n 'clarify',\n 'curated_memory',\n 'send_message',\n 'send_media',\n 'todo',\n 'session_search',\n 'memory_search',\n 'memory_get',\n 'cronjob',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'bundle-mcp',\n]);\n\nconst DelegateTaskSchema = Type.Object({\n goal: Type.String({\n description: 'Clear description of what the sub-agent should accomplish',\n }),\n context: Type.Optional(\n Type.String({\n description: 'Additional context the sub-agent needs (file paths, constraints, etc.)',\n }),\n ),\n toolset: Type.Optional(\n Type.Array(Type.String(), {\n description:\n 'Tool names the sub-agent may use. Defaults to shell, read_file, write_file, edit_file, grep, find, list_dir, web_search, web_fetch. ' +\n 'Dangerous or interactive tools are always removed.',\n }),\n ),\n maxIterations: Type.Optional(\n Type.Number({\n description: 'Maximum tool executions in the sub-agent (default: 30)',\n default: DEFAULT_MAX_ITERATIONS,\n }),\n ),\n});\n\nexport interface DelegateToolDeps {\n workspace: string;\n getSubagentModel: () => import('@earendil-works/pi-ai').Model<import('@earendil-works/pi-ai').Api>;\n bus: import('../../infra/bus/index.js').MessageBus;\n getConfig: () => import('../../config/schema.js').Config | undefined;\n getCurrentContext?: () => { sessionKey?: string; channel?: string; accountId?: string; to?: string; threadId?: string | number } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n toolExecutorConfig?: Partial<import('./executor.js').ToolExecutorConfig>;\n /**\n * Construct the child agent's tool set. Injected by `AgentToolsFactory` so\n * the child-agent-factory module does not import `tools/factory.ts`\n * (which would form a factory ↔ delegate-tool ↔ child-agent-factory cycle).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\ntype DelegateTaskParams = {\n goal: string;\n context?: string;\n toolset?: string[];\n maxIterations?: number;\n};\n\nexport function createDelegateTool(deps: DelegateToolDeps): AgentTool {\n return {\n name: 'delegate_task',\n label: '🤖 Delegate',\n description:\n 'Spawn a sub-agent for an isolated subtask with a fresh conversation (no parent transcript).\\n\\n' +\n 'The sub-agent returns a text summary only — tool traces stay out of your context.\\n\\n' +\n 'WHEN TO USE:\\n' +\n '- Independent work (research, multi-file exploration) where you only need the outcome\\n' +\n '- Avoiding context bloat from long intermediate tool output\\n\\n' +\n 'WHEN NOT TO USE:\\n' +\n '- Tasks that need this chat history or user clarification\\n' +\n '- Single trivial steps\\n\\n' +\n 'Sub-agents cannot use clarify, messaging, memory tools, todo, or nested delegate_task.',\n parameters: DelegateTaskSchema,\n\n async execute(\n _toolCallId: string,\n params: any,\n signal?: AbortSignal,\n ): Promise<AgentToolResult<{ summary: string; iterations: number }>> {\n const p = params as DelegateTaskParams;\n const maxIterations = p.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n if (!Number.isFinite(maxIterations) || maxIterations < 1 || maxIterations > 200) {\n return {\n content: [{ type: 'text', text: 'Invalid maxIterations (use 1–200).' }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const requested = p.toolset ?? [...DEFAULT_DELEGATE_TOOLS];\n const allowedNames = [\n ...new Set(\n requested.map((t) => String(t).trim()).filter(Boolean).filter((t) => !DELEGATE_BLOCKED_TOOLS.has(t)),\n ),\n ];\n\n if (allowedNames.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No allowed tools remain after applying the delegation blocklist. Expand `toolset` with safe tools.',\n },\n ],\n details: { summary: '', iterations: 0 },\n };\n }\n\n let model: ReturnType<DelegateToolDeps['getSubagentModel']>;\n try {\n model = deps.getSubagentModel();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `delegate_task: ${msg}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: deps.workspace,\n goal: p.goal,\n context: p.context,\n allowedToolNames: allowedNames,\n maxIterations,\n model,\n bus: deps.bus,\n getConfig: deps.getConfig,\n toolExecutorConfig: deps.toolExecutorConfig,\n buildChildTools: deps.buildChildTools,\n };\n\n // Sub-agent lifecycle hook (parity surface for channel thread bindings).\n const ctx = deps.getCurrentContext?.() ?? null;\n const parentSessionKey = ctx?.sessionKey;\n let childSessionKey: string | undefined;\n try {\n if (deps.hookRunner && parentSessionKey) {\n const { parseSessionKey, buildSessionKey } = await import('../../routing/session-key.js');\n const parsed = parseSessionKey(parentSessionKey);\n if (parsed) {\n childSessionKey = buildSessionKey({\n agentId: 'subagent',\n source: parsed.agentId,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n threadId: parsed.threadId,\n scopeId: parsed.scopeId,\n });\n }\n if (childSessionKey) {\n const hookResult = await (deps.hookRunner as any).runHooksWithResult(\n 'subagent_spawning',\n {\n childSessionKey,\n requester: {\n channel: ctx?.channel,\n accountId: ctx?.accountId,\n to: (ctx as any)?.to,\n threadId: (ctx as any)?.threadId,\n },\n threadRequested: true,\n agentId: 'subagent',\n label: 'delegate_task',\n },\n { sessionKey: parentSessionKey, agentId: ctx?.channel },\n );\n const r = hookResult as any;\n if (r && r.status === 'error') {\n return {\n content: [{ type: 'text', text: `delegate_task: ${String(r.error || 'subagent spawn blocked')}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n }\n }\n } catch {\n // Hooks are best-effort.\n }\n\n const child = createDelegateChildHandle(childOptions);\n\n if (signal) {\n signal.addEventListener('abort', () => child.abort(), { once: true });\n }\n\n try {\n const { summary, toolIterations } = await child.run();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n return {\n content: [{ type: 'text', text: `Sub-agent completed:\\n\\n${summary}` }],\n details: { summary, iterations: toolIterations },\n };\n } catch (error) {\n child.abort();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: `Sub-agent failed: ${message}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n },\n } as any;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"delegate-tool.js","names":[],"sources":["../../../../src/agent/tools/delegate-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport {\n createDelegateChildHandle,\n type BuildChildToolsOptions,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport const DEFAULT_DELEGATE_TOOLS = [\n 'shell',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'grep',\n 'find',\n 'list_dir',\n 'web_search',\n 'web_fetch',\n] as const;\n\n/** Tools never passed to a delegated sub-agent (even if requested). */\nexport const DELEGATE_BLOCKED_TOOLS = new Set([\n 'delegate_task',\n 'clarify',\n 'curated_memory',\n 'send_message',\n 'send_media',\n 'todo',\n 'session_search',\n 'memory_search',\n 'memory_get',\n 'automation',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'bundle-mcp',\n]);\n\nconst DelegateTaskSchema = Type.Object({\n goal: Type.String({\n description: 'Clear description of what the sub-agent should accomplish',\n }),\n context: Type.Optional(\n Type.String({\n description: 'Additional context the sub-agent needs (file paths, constraints, etc.)',\n }),\n ),\n toolset: Type.Optional(\n Type.Array(Type.String(), {\n description:\n 'Tool names the sub-agent may use. Defaults to shell, read_file, write_file, edit_file, grep, find, list_dir, web_search, web_fetch. ' +\n 'Dangerous or interactive tools are always removed.',\n }),\n ),\n maxIterations: Type.Optional(\n Type.Number({\n description: 'Maximum tool executions in the sub-agent (default: 30)',\n default: DEFAULT_MAX_ITERATIONS,\n }),\n ),\n});\n\nexport interface DelegateToolDeps {\n workspace: string;\n getSubagentModel: () => import('@earendil-works/pi-ai').Model<import('@earendil-works/pi-ai').Api>;\n bus: import('../../infra/bus/index.js').MessageBus;\n getConfig: () => import('../../config/schema.js').Config | undefined;\n getCurrentContext?: () => { sessionKey?: string; channel?: string; accountId?: string; to?: string; threadId?: string | number } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n toolExecutorConfig?: Partial<import('./executor.js').ToolExecutorConfig>;\n /**\n * Construct the child agent's tool set. Injected by `AgentToolsFactory` so\n * the child-agent-factory module does not import `tools/factory.ts`\n * (which would form a factory ↔ delegate-tool ↔ child-agent-factory cycle).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\ntype DelegateTaskParams = {\n goal: string;\n context?: string;\n toolset?: string[];\n maxIterations?: number;\n};\n\nexport function createDelegateTool(deps: DelegateToolDeps): AgentTool {\n return {\n name: 'delegate_task',\n label: '🤖 Delegate',\n description:\n 'Spawn a sub-agent for an isolated subtask with a fresh conversation (no parent transcript).\\n\\n' +\n 'The sub-agent returns a text summary only — tool traces stay out of your context.\\n\\n' +\n 'WHEN TO USE:\\n' +\n '- Independent work (research, multi-file exploration) where you only need the outcome\\n' +\n '- Avoiding context bloat from long intermediate tool output\\n\\n' +\n 'WHEN NOT TO USE:\\n' +\n '- Tasks that need this chat history or user clarification\\n' +\n '- Single trivial steps\\n\\n' +\n 'Sub-agents cannot use clarify, messaging, memory tools, todo, or nested delegate_task.',\n parameters: DelegateTaskSchema,\n\n async execute(\n _toolCallId: string,\n params: any,\n signal?: AbortSignal,\n ): Promise<AgentToolResult<{ summary: string; iterations: number }>> {\n const p = params as DelegateTaskParams;\n const maxIterations = p.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n if (!Number.isFinite(maxIterations) || maxIterations < 1 || maxIterations > 200) {\n return {\n content: [{ type: 'text', text: 'Invalid maxIterations (use 1–200).' }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const requested = p.toolset ?? [...DEFAULT_DELEGATE_TOOLS];\n const allowedNames = [\n ...new Set(\n requested.map((t) => String(t).trim()).filter(Boolean).filter((t) => !DELEGATE_BLOCKED_TOOLS.has(t)),\n ),\n ];\n\n if (allowedNames.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No allowed tools remain after applying the delegation blocklist. Expand `toolset` with safe tools.',\n },\n ],\n details: { summary: '', iterations: 0 },\n };\n }\n\n let model: ReturnType<DelegateToolDeps['getSubagentModel']>;\n try {\n model = deps.getSubagentModel();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `delegate_task: ${msg}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: deps.workspace,\n goal: p.goal,\n context: p.context,\n allowedToolNames: allowedNames,\n maxIterations,\n model,\n bus: deps.bus,\n getConfig: deps.getConfig,\n toolExecutorConfig: deps.toolExecutorConfig,\n buildChildTools: deps.buildChildTools,\n };\n\n // Sub-agent lifecycle hook (parity surface for channel thread bindings).\n const ctx = deps.getCurrentContext?.() ?? null;\n const parentSessionKey = ctx?.sessionKey;\n let childSessionKey: string | undefined;\n try {\n if (deps.hookRunner && parentSessionKey) {\n const { parseSessionKey, buildSessionKey } = await import('../../routing/session-key.js');\n const parsed = parseSessionKey(parentSessionKey);\n if (parsed) {\n childSessionKey = buildSessionKey({\n agentId: 'subagent',\n source: parsed.agentId,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n threadId: parsed.threadId,\n scopeId: parsed.scopeId,\n });\n }\n if (childSessionKey) {\n const hookResult = await (deps.hookRunner as any).runHooksWithResult(\n 'subagent_spawning',\n {\n childSessionKey,\n requester: {\n channel: ctx?.channel,\n accountId: ctx?.accountId,\n to: (ctx as any)?.to,\n threadId: (ctx as any)?.threadId,\n },\n threadRequested: true,\n agentId: 'subagent',\n label: 'delegate_task',\n },\n { sessionKey: parentSessionKey, agentId: ctx?.channel },\n );\n const r = hookResult as any;\n if (r && r.status === 'error') {\n return {\n content: [{ type: 'text', text: `delegate_task: ${String(r.error || 'subagent spawn blocked')}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n }\n }\n } catch {\n // Hooks are best-effort.\n }\n\n const child = createDelegateChildHandle(childOptions);\n\n if (signal) {\n signal.addEventListener('abort', () => child.abort(), { once: true });\n }\n\n try {\n const { summary, toolIterations } = await child.run();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n return {\n content: [{ type: 'text', text: `Sub-agent completed:\\n\\n${summary}` }],\n details: { summary, iterations: toolIterations },\n };\n } catch (error) {\n child.abort();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: `Sub-agent failed: ${message}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n },\n } as any;\n}\n"],"mappings":"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"}
@@ -13,7 +13,7 @@ import type { MessageBus } from '../../infra/bus/index.js';
13
13
  import type { MemoryManager } from '../memory/manager.js';
14
14
  import type { SessionStore } from '../../session/store.js';
15
15
  import type { GatewayClarifyRequestFn } from './clarify-tool.js';
16
- import type { CronService } from '../../cron/index.js';
16
+ import type { AutomationService } from '../../automations/index.js';
17
17
  import type { WorkflowRunServiceLike } from '../../workflows/service/workflow-run-service.types.js';
18
18
  import type { SkillManager } from '../skills/skill-manager.js';
19
19
  import { type ToolExecutorConfig } from './executor.js';
@@ -40,8 +40,8 @@ export interface ToolFactoryDeps {
40
40
  gatewayClarify?: {
41
41
  requestClarification: GatewayClarifyRequestFn;
42
42
  };
43
- /** Gateway: enables the `cronjob` tool. */
44
- getCronService?: () => CronService | undefined;
43
+ /** Gateway: enables the `automation` tool. */
44
+ getAutomationService?: () => AutomationService | undefined;
45
45
  /** Gateway: starts persisted workflow runs (dedicated chat session per run). */
46
46
  getWorkflowRunService?: () => WorkflowRunServiceLike | undefined;
47
47
  /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */
@@ -30,7 +30,7 @@ import "./delegate-tool.js";
30
30
  import { createWorkflowCatalog } from "../workflow/catalog.js";
31
31
  import { createWorkflowTool } from "./workflow-tool.js";
32
32
  import "./execute-code-tool.js";
33
- import { createCronjobTool } from "./cronjob-tool.js";
33
+ import { createAutomationTool } from "./automation-tool.js";
34
34
  import { createGoalTool } from "./goal-tool.js";
35
35
  import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
36
36
  import { createSkillManageTool } from "./skill-manage-tool.js";
@@ -248,7 +248,7 @@ var AgentToolsFactory = class {
248
248
  getConfig: this.deps.getConfig,
249
249
  getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey
250
250
  })] : [],
251
- ...this.deps.getCronService ? [createCronjobTool({ getCronService: this.deps.getCronService })] : [],
251
+ ...this.deps.getAutomationService ? [createAutomationTool({ getAutomationService: this.deps.getAutomationService })] : [],
252
252
  createGoalTool(),
253
253
  ...browserEnabled ? [createBrowserUseTool({
254
254
  getManager: () => this.ensureBrowserManager(),
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","names":[],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createEditFileTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createShellTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createComposioExecuteTool,\n createSendMediaTool,\n createReadMediaTool,\n createCreateShareTool,\n isShareToolAvailable,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n createToolManualTool,\n createGoalTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n BrowserNotReadyError,\n CdpSupervisor,\n checkBrowserReadiness,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { createWorkflowTool } from './workflow-tool.js';\nimport { createWorkflowCatalog } from '../workflow/catalog.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport { createCronjobTool } from './cronjob-tool.js';\nimport type { CronService } from '../../cron/index.js';\nimport type { WorkflowRunServiceLike } from '../../workflows/service/workflow-run-service.types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { createGoalEvidenceRecorder } from './goal-evidence-recorder.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n /** Gateway: starts persisted workflow runs (dedicated chat session per run). */\n getWorkflowRunService?: () => WorkflowRunServiceLike | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for shell env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/shell tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `shell`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getMemoryManager?: () => MemoryManager;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n /** Cached readiness probe — keyed by backend mode + extension host:port. */\n private browserReadinessCache: {\n key: string;\n expiresAt: number;\n inflight?: Promise<BrowserNotReadyError | null>;\n result?: BrowserNotReadyError | null;\n } | null = null;\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserReadinessKey(): string {\n const cfg = this.deps.getConfig?.();\n const backend = resolveBrowserBackendFromConfig(cfg);\n const host = '127.0.0.1';\n const port = 19820;\n const cdpUrl = backend.mode === 'cdp' ? backend.config.wsEndpoint : '';\n const cloudKind = backend.mode === 'cloud' ? backend.config.type : '';\n return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;\n }\n\n private async checkBrowserReadinessCached(): Promise<BrowserNotReadyError | null> {\n const key = this.browserReadinessKey();\n const now = Date.now();\n const cached = this.browserReadinessCache;\n if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === undefined) {\n return cached.result ?? null;\n }\n if (cached && cached.key === key && cached.inflight) {\n return cached.inflight;\n }\n const inflight = checkBrowserReadiness(this.deps.getConfig?.());\n this.browserReadinessCache = { key, expiresAt: now + 30_000, inflight };\n try {\n const result = await inflight;\n this.browserReadinessCache = { key, expiresAt: Date.now() + 30_000, result };\n return result;\n } catch (e) {\n // Probe should never throw, but if it does we just bypass the cache.\n this.browserReadinessCache = null;\n log.warn({ err: e }, 'browserReadiness probe failed');\n return null;\n }\n }\n\n /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */\n invalidateBrowserReadinessCache(): void {\n this.browserReadinessCache = null;\n }\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n s = new CdpSupervisor({ dialogPolicy: 'auto_dismiss', dialogTimeoutSeconds: 300 });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => false,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n this.browserReadinessCache = null;\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const browserEnabled = cfg?.browser?.enabled !== false;\n const recordGoalEvidence = createGoalEvidenceRecorder({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n });\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const composioTool = createComposioExecuteTool(() => this.deps.getConfig?.());\n const optionalTools = [imageTool, imageGenerateTool, composioTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n recordGoalEvidence,\n });\n const editTool = createEditFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n recordGoalEvidence,\n });\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n createToolManualTool(),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n if (!CLARIFY_SUPPORTED_CHANNELS.has(ctx.channel)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n editTool,\n listDir,\n grep,\n find,\n createShellTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n recordGoalEvidence,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createReadMediaTool(),\n ...(isShareToolAvailable(cfg)\n ? [\n createCreateShareTool({\n workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n ...(getMemMgr\n ? [\n createMemorySearchTool({ workspaceDir: workspace, getMemoryManager: () => getMemMgr() }),\n createMemoryGetTool({ workspaceDir: workspace, getMemoryManager: () => getMemMgr() }),\n ]\n : []),\n ...(getMemMgr && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(() => getMemMgr()),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getCronService\n ? [\n createCronjobTool({\n getCronService: this.deps.getCronService,\n }),\n ]\n : []),\n createGoalTool(),\n ...(browserEnabled\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getReadiness: () => this.checkBrowserReadinessCached(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(primary\n ? [\n createWorkflowTool({\n catalog: createWorkflowCatalog(),\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n getConfig: () => this.deps.getConfig?.(),\n startWorkflowRun: this.deps.getWorkflowRunService\n ? (params) => this.deps.getWorkflowRunService!().startWorkflowRun(params)\n : undefined,\n }),\n ]\n : []),\n ...(false && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n // Injected so `child-agent-factory.ts` does not need to import\n // `AgentToolsFactory` directly (which would form a cycle).\n buildChildTools: (childOpts) => {\n const childFactory = new AgentToolsFactory({\n workspace: childOpts.workspace,\n bus: childOpts.bus,\n getCurrentContext: () => null,\n getConfig: childOpts.getConfig,\n getPrimaryModel: () => childOpts.model,\n toolExecutorConfig: childOpts.toolExecutorConfig,\n });\n return childFactory.createAllTools({\n workspace: childOpts.workspace,\n getPrimaryModel: () => childOpts.model,\n disabledTools: new Set(['extensions']),\n });\n },\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled = false && !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","names":[],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createEditFileTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createShellTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createComposioExecuteTool,\n createSendMediaTool,\n createReadMediaTool,\n createCreateShareTool,\n isShareToolAvailable,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n createToolManualTool,\n createGoalTool,\n createAutomationTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n BrowserNotReadyError,\n CdpSupervisor,\n checkBrowserReadiness,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { createWorkflowTool } from './workflow-tool.js';\nimport { createWorkflowCatalog } from '../workflow/catalog.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport type { AutomationService } from '../../automations/index.js';\nimport type { WorkflowRunServiceLike } from '../../workflows/service/workflow-run-service.types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { createGoalEvidenceRecorder } from './goal-evidence-recorder.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `automation` tool. */\n getAutomationService?: () => AutomationService | undefined;\n /** Gateway: starts persisted workflow runs (dedicated chat session per run). */\n getWorkflowRunService?: () => WorkflowRunServiceLike | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for shell env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/shell tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `shell`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getMemoryManager?: () => MemoryManager;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n /** Cached readiness probe — keyed by backend mode + extension host:port. */\n private browserReadinessCache: {\n key: string;\n expiresAt: number;\n inflight?: Promise<BrowserNotReadyError | null>;\n result?: BrowserNotReadyError | null;\n } | null = null;\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserReadinessKey(): string {\n const cfg = this.deps.getConfig?.();\n const backend = resolveBrowserBackendFromConfig(cfg);\n const host = '127.0.0.1';\n const port = 19820;\n const cdpUrl = backend.mode === 'cdp' ? backend.config.wsEndpoint : '';\n const cloudKind = backend.mode === 'cloud' ? backend.config.type : '';\n return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;\n }\n\n private async checkBrowserReadinessCached(): Promise<BrowserNotReadyError | null> {\n const key = this.browserReadinessKey();\n const now = Date.now();\n const cached = this.browserReadinessCache;\n if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === undefined) {\n return cached.result ?? null;\n }\n if (cached && cached.key === key && cached.inflight) {\n return cached.inflight;\n }\n const inflight = checkBrowserReadiness(this.deps.getConfig?.());\n this.browserReadinessCache = { key, expiresAt: now + 30_000, inflight };\n try {\n const result = await inflight;\n this.browserReadinessCache = { key, expiresAt: Date.now() + 30_000, result };\n return result;\n } catch (e) {\n // Probe should never throw, but if it does we just bypass the cache.\n this.browserReadinessCache = null;\n log.warn({ err: e }, 'browserReadiness probe failed');\n return null;\n }\n }\n\n /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */\n invalidateBrowserReadinessCache(): void {\n this.browserReadinessCache = null;\n }\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n s = new CdpSupervisor({ dialogPolicy: 'auto_dismiss', dialogTimeoutSeconds: 300 });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => false,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n this.browserReadinessCache = null;\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const browserEnabled = cfg?.browser?.enabled !== false;\n const recordGoalEvidence = createGoalEvidenceRecorder({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n });\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const composioTool = createComposioExecuteTool(() => this.deps.getConfig?.());\n const optionalTools = [imageTool, imageGenerateTool, composioTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n recordGoalEvidence,\n });\n const editTool = createEditFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n recordGoalEvidence,\n });\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n createToolManualTool(),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n if (!CLARIFY_SUPPORTED_CHANNELS.has(ctx.channel)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n editTool,\n listDir,\n grep,\n find,\n createShellTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n recordGoalEvidence,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createReadMediaTool(),\n ...(isShareToolAvailable(cfg)\n ? [\n createCreateShareTool({\n workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n ...(getMemMgr\n ? [\n createMemorySearchTool({ workspaceDir: workspace, getMemoryManager: () => getMemMgr() }),\n createMemoryGetTool({ workspaceDir: workspace, getMemoryManager: () => getMemMgr() }),\n ]\n : []),\n ...(getMemMgr && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(() => getMemMgr()),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getAutomationService\n ? [\n createAutomationTool({\n getAutomationService: this.deps.getAutomationService,\n }),\n ]\n : []),\n createGoalTool(),\n ...(browserEnabled\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getReadiness: () => this.checkBrowserReadinessCached(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(primary\n ? [\n createWorkflowTool({\n catalog: createWorkflowCatalog(),\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n getConfig: () => this.deps.getConfig?.(),\n startWorkflowRun: this.deps.getWorkflowRunService\n ? (params) => this.deps.getWorkflowRunService!().startWorkflowRun(params)\n : undefined,\n }),\n ]\n : []),\n ...(false && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n // Injected so `child-agent-factory.ts` does not need to import\n // `AgentToolsFactory` directly (which would form a cycle).\n buildChildTools: (childOpts) => {\n const childFactory = new AgentToolsFactory({\n workspace: childOpts.workspace,\n bus: childOpts.bus,\n getCurrentContext: () => null,\n getConfig: childOpts.getConfig,\n getPrimaryModel: () => childOpts.model,\n toolExecutorConfig: childOpts.toolExecutorConfig,\n });\n return childFactory.createAllTools({\n workspace: childOpts.workspace,\n getPrimaryModel: () => childOpts.model,\n disabledTools: new Set(['extensions']),\n });\n },\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled = false && !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":"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"}
@@ -23,7 +23,7 @@ export { BrowserManager, assertBrowserUrlAllowed } from '../../browser/index.js'
23
23
  export { createDelegateTool, DEFAULT_DELEGATE_TOOLS, DELEGATE_BLOCKED_TOOLS, } from './delegate-tool.js';
24
24
  export { createWorkflowTool, type WorkflowToolDeps, type WorkflowToolInput } from './workflow-tool.js';
25
25
  export { createExecuteCodeTool, buildSandboxToolMap, SANDBOX_ALLOWED_TOOLS, } from './execute-code-tool.js';
26
- export { createCronjobTool, scanCronPrompt } from './cronjob-tool.js';
26
+ export { createAutomationTool, type AutomationToolDeps } from './automation-tool.js';
27
27
  export { createGoalTool } from './goal-tool.js';
28
28
  export { createSkillsListTool, createSkillViewTool, type SkillsToolsDeps } from './skills-tools.js';
29
29
  export { createSkillManageTool, type SkillManageToolDeps } from './skill-manage-tool.js';
@@ -27,7 +27,7 @@ import "../../browser/index.js";
27
27
  import { DEFAULT_DELEGATE_TOOLS, DELEGATE_BLOCKED_TOOLS, createDelegateTool } from "./delegate-tool.js";
28
28
  import { createWorkflowTool } from "./workflow-tool.js";
29
29
  import { SANDBOX_ALLOWED_TOOLS, buildSandboxToolMap, createExecuteCodeTool } from "./execute-code-tool.js";
30
- import { createCronjobTool, scanCronPrompt } from "./cronjob-tool.js";
30
+ import { createAutomationTool } from "./automation-tool.js";
31
31
  import { createGoalTool } from "./goal-tool.js";
32
32
  import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
33
33
  import { createSkillManageTool } from "./skill-manage-tool.js";
@@ -35,4 +35,4 @@ import { createToolManualTool } from "./tool-manual-tool.js";
35
35
  import { resolveImageModelConfigForTool } from "../image/tool-model-config.js";
36
36
  import { createImageTool } from "./image-tool.js";
37
37
  import { createImageGenerateTool, resolveImageGenerationModelConfigForTool } from "./image-generate-tool.js";
38
- export { BrowserManager, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, SANDBOX_ALLOWED_TOOLS, TodoStore, assertBrowserUrlAllowed, buildSandboxToolMap, createClarifyTool, createComposioExecuteTool, createCreateShareTool, createCronjobTool, createCuratedMemoryTool, createDelegateTool, createDreamingTool, createEditFileTool, createExecuteCodeTool, createFindTool, createGoalTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionSearchTool, createSessionStatusTool, createShellTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createToolManualTool, createWebExtractTool, createWebFetchTool, createWebSearchTool, createWorkflowTool, createWriteFileTool, editFileTool, findTool, formatSize, fuzzyFindText, generateDiffString, grepTool, isShareToolAvailable, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, restoreLineEndings, scanCronPrompt, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, writeFileTool };
38
+ export { BrowserManager, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, SANDBOX_ALLOWED_TOOLS, TodoStore, assertBrowserUrlAllowed, buildSandboxToolMap, createAutomationTool, createClarifyTool, createComposioExecuteTool, createCreateShareTool, createCuratedMemoryTool, createDelegateTool, createDreamingTool, createEditFileTool, createExecuteCodeTool, createFindTool, createGoalTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionSearchTool, createSessionStatusTool, createShellTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createToolManualTool, createWebExtractTool, createWebFetchTool, createWebSearchTool, createWorkflowTool, createWriteFileTool, editFileTool, findTool, formatSize, fuzzyFindText, generateDiffString, grepTool, isShareToolAvailable, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, restoreLineEndings, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, writeFileTool };
@@ -1,6 +1,7 @@
1
1
  import { type AgentConfigEntry, type CapabilityPreset, type EffectiveAgentManifest } from './schema.js';
2
2
  export interface ResolveManifestResult {
3
3
  manifest: EffectiveAgentManifest;
4
+ presetChain: string[];
4
5
  sources: Record<string, string>;
5
6
  }
6
7
  export interface ResolveManifestParams {
@@ -83,6 +83,7 @@ function resolveEffectiveAgentManifest(params) {
83
83
  enabled: agent.enabled,
84
84
  extends: agent.extends
85
85
  }),
86
+ presetChain: chain.map((preset) => preset.id),
86
87
  sources
87
88
  };
88
89
  }