@xopcai/xopc 0.0.89 → 0.0.91

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 (267) hide show
  1. package/README.md +36 -12
  2. package/README.zh-CN.md +36 -12
  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/Combination-HAlzriaz.js +41 -0
  6. package/dist/gateway/static/root/assets/agents-bVWUlrlD.js +222 -0
  7. package/dist/gateway/static/root/assets/apps-page-CIC8bmvZ.js +1 -0
  8. package/dist/gateway/static/root/assets/{attachment-preview-renderer-CpyoFbs4.js → attachment-preview-renderer-DBAxQXb-.js} +2 -2
  9. package/dist/gateway/static/root/assets/{attachment-process-heavy-CqVriadb.js → attachment-process-heavy-Csq3TrrP.js} +4 -4
  10. package/dist/gateway/static/root/assets/channels-settings-C8G8RAAP.js +1 -0
  11. package/dist/gateway/static/root/assets/{channels-status-swr-DaHGkRF1.js → channels-status-swr-CYWL5DLD.js} +1 -1
  12. package/dist/gateway/static/root/assets/circle-check-C23XjkUj.js +1 -0
  13. package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +1 -0
  14. package/dist/gateway/static/root/assets/cron-api-TVqLlGAC.js +1 -0
  15. package/dist/gateway/static/root/assets/cron-dreaming-jobs-Ip703-qM.js +2 -0
  16. package/dist/gateway/static/root/assets/cron-page-BtcFYlvv.js +1 -0
  17. package/dist/gateway/static/root/assets/dist-CUV1uY5f.js +1 -0
  18. package/dist/gateway/static/root/assets/{extension-debug-page-CtuKJ9tE.js → extension-debug-page-mTLHRDp1.js} +1 -1
  19. package/dist/gateway/static/root/assets/{extension-page-ykzjOkR5.js → extension-page-iI8BI7WK.js} +1 -1
  20. package/dist/gateway/static/root/assets/{extension-settings-page-Ce2qrdpO.js → extension-settings-page-ByXcdubM.js} +1 -1
  21. package/dist/gateway/static/root/assets/{fetch-C9FFJjuH.js → fetch-BWtQq_Ys.js} +1 -1
  22. package/dist/gateway/static/root/assets/{field-primitives-BFcrNeTU.js → field-primitives-BsZ-4VT5.js} +1 -1
  23. package/dist/gateway/static/root/assets/{heartbeat-config-api-CEg4Vr9R.js → heartbeat-config-api-WjTsRLCU.js} +1 -1
  24. package/dist/gateway/static/root/assets/{index-CZfy9oxs.js → index-CKkR-v9U.js} +101 -97
  25. package/dist/gateway/static/root/assets/index-VlELBY99.css +1 -0
  26. package/dist/gateway/static/root/assets/logs-page-ClnIpxfd.js +1 -0
  27. package/dist/gateway/static/root/assets/note-detail-page-B91pLkEI.css +1 -0
  28. package/dist/gateway/static/root/assets/note-detail-page-DJ2Mb4x7.js +179 -0
  29. package/dist/gateway/static/root/assets/note-time-JLBPSLzK.js +1 -0
  30. package/dist/gateway/static/root/assets/notes-page-BE-75qz9.js +1 -0
  31. package/dist/gateway/static/root/assets/{pdf-BnEvgIXZ.js → pdf-epILhEOn.js} +1 -1
  32. package/dist/gateway/static/root/assets/preload-helper-zJ_50EbN.js +1 -0
  33. package/dist/gateway/static/root/assets/sessions-page-bJJkWtTl.js +1 -0
  34. package/dist/gateway/static/root/assets/{settings-form-section-BqdzA28u.js → settings-form-section-DSYCknxM.js} +1 -1
  35. package/dist/gateway/static/root/assets/settings-page-WcMXLq2U.js +3 -0
  36. package/dist/gateway/static/root/assets/share-preview-page-awRqs4hV.js +2 -0
  37. package/dist/gateway/static/root/assets/skills-page-Lu-i1JG7.js +2 -0
  38. package/dist/gateway/static/root/assets/{theme-store-CNqbmTNV.js → theme-store-BC-42BoZ.js} +1 -1
  39. package/dist/gateway/static/root/assets/toast-z0toXu32.js +1 -0
  40. package/dist/gateway/static/root/assets/url-CY1RQKTU.js +3 -0
  41. package/dist/gateway/static/root/assets/{utils-BWm2tG2w.js → utils-DX3TQuap.js} +1 -1
  42. package/dist/gateway/static/root/assets/vendor-codemirror-DYoKfS8f.js +45 -0
  43. package/dist/gateway/static/root/assets/voice-api-key-field-B5uKlDqA.js +1 -0
  44. package/dist/gateway/static/root/assets/workflow-page.utils-ClC37yEp.js +1 -0
  45. package/dist/gateway/static/root/assets/workflows-page-C7VhIXtR.js +27 -0
  46. package/dist/gateway/static/root/index.html +11 -7
  47. package/dist/package.js +1 -1
  48. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +20 -18
  49. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  50. package/dist/src/agent/tools/cronjob-tool.d.ts +6 -0
  51. package/dist/src/agent/tools/cronjob-tool.js +74 -9
  52. package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
  53. package/dist/src/agent/tools/edit.d.ts +5 -1
  54. package/dist/src/agent/tools/edit.js +7 -5
  55. package/dist/src/agent/tools/edit.js.map +1 -1
  56. package/dist/src/agent/tools/factory.js +2 -2
  57. package/dist/src/agent/tools/factory.js.map +1 -1
  58. package/dist/src/agent/tools/write.d.ts +5 -1
  59. package/dist/src/agent/tools/write.js +7 -5
  60. package/dist/src/agent/tools/write.js.map +1 -1
  61. package/dist/src/agent/workflow/agent-progress.js +2 -0
  62. package/dist/src/agent/workflow/agent-progress.js.map +1 -1
  63. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +12 -0
  64. package/dist/src/agent/workflow/builtins/client-proposal.js +155 -0
  65. package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -0
  66. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +12 -0
  67. package/dist/src/agent/workflow/builtins/competitor-scan.js +150 -0
  68. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -0
  69. package/dist/src/agent/workflow/builtins/content-draft.d.ts +13 -0
  70. package/dist/src/agent/workflow/builtins/content-draft.js +146 -0
  71. package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -0
  72. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +11 -0
  73. package/dist/src/agent/workflow/builtins/content-repurpose.js +137 -0
  74. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -0
  75. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +13 -0
  76. package/dist/src/agent/workflow/builtins/decision-compare.js +173 -0
  77. package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -0
  78. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +11 -0
  79. package/dist/src/agent/workflow/builtins/inbox-triage.js +148 -0
  80. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -0
  81. package/dist/src/agent/workflow/builtins/index.d.ts +10 -1
  82. package/dist/src/agent/workflow/builtins/index.js +46 -1
  83. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  84. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +12 -0
  85. package/dist/src/agent/workflow/builtins/meeting-prep.js +144 -0
  86. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -0
  87. package/dist/src/agent/workflow/builtins/offer-design.d.ts +12 -0
  88. package/dist/src/agent/workflow/builtins/offer-design.js +161 -0
  89. package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -0
  90. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +12 -0
  91. package/dist/src/agent/workflow/builtins/weekly-review.js +131 -0
  92. package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -0
  93. package/dist/src/agent/workflow/step-labels.js +2 -2
  94. package/dist/src/agent/workflow/step-labels.js.map +1 -1
  95. package/dist/src/agent/workflow/subagent-runner.js +3 -1
  96. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  97. package/dist/src/agent/workflow/types.d.ts +4 -0
  98. package/dist/src/chat-commands/agent-edit.d.ts +4 -0
  99. package/dist/src/chat-commands/agent-edit.js +136 -0
  100. package/dist/src/chat-commands/agent-edit.js.map +1 -0
  101. package/dist/src/chat-commands/index.d.ts +1 -0
  102. package/dist/src/chat-commands/index.js +3 -1
  103. package/dist/src/chat-commands/index.js.map +1 -1
  104. package/dist/src/cli/bin.js +2 -0
  105. package/dist/src/cli/bin.js.map +1 -1
  106. package/dist/src/cli/commands/cron.js +42 -3
  107. package/dist/src/cli/commands/cron.js.map +1 -1
  108. package/dist/src/cli/commands/doctor/checks/session-integrity.js +79 -56
  109. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  110. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  111. package/dist/src/cli/commands/update.js +86 -79
  112. package/dist/src/cli/commands/update.js.map +1 -1
  113. package/dist/src/commands/agents.config.d.ts +3 -2
  114. package/dist/src/commands/agents.config.js +5 -2
  115. package/dist/src/commands/agents.config.js.map +1 -1
  116. package/dist/src/config/agent-typed-models.d.ts +2 -7
  117. package/dist/src/config/agent-typed-models.js +3 -14
  118. package/dist/src/config/agent-typed-models.js.map +1 -1
  119. package/dist/src/config/localized-text.d.ts +6 -0
  120. package/dist/src/config/localized-text.js +42 -0
  121. package/dist/src/config/localized-text.js.map +1 -0
  122. package/dist/src/config/models-json.d.ts +6 -6
  123. package/dist/src/config/schema.d.ts +6 -21
  124. package/dist/src/config/schema.js +4 -4
  125. package/dist/src/config/schema.js.map +1 -1
  126. package/dist/src/cron/executor.d.ts +2 -0
  127. package/dist/src/cron/executor.js +111 -1
  128. package/dist/src/cron/executor.js.map +1 -1
  129. package/dist/src/cron/types.d.ts +8 -1
  130. package/dist/src/cron/validation.d.ts +4 -0
  131. package/dist/src/cron/validation.js +4 -3
  132. package/dist/src/cron/validation.js.map +1 -1
  133. package/dist/src/cron/workflow-run-completion.d.ts +23 -0
  134. package/dist/src/cron/workflow-run-completion.js +72 -0
  135. package/dist/src/cron/workflow-run-completion.js.map +1 -0
  136. package/dist/src/extensions/update.d.ts +51 -0
  137. package/dist/src/extensions/update.js +260 -0
  138. package/dist/src/extensions/update.js.map +1 -0
  139. package/dist/src/gateway/agents-admin.d.ts +15 -8
  140. package/dist/src/gateway/agents-admin.js +77 -28
  141. package/dist/src/gateway/agents-admin.js.map +1 -1
  142. package/dist/src/gateway/heartbeat/service.js +1 -1
  143. package/dist/src/gateway/hono/lib/config-payload.d.ts +6 -0
  144. package/dist/src/gateway/hono/lib/config-payload.js +3 -1
  145. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  146. package/dist/src/gateway/hono/middleware/auth.d.ts +2 -0
  147. package/dist/src/gateway/hono/middleware/auth.js +11 -7
  148. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  149. package/dist/src/gateway/hono/routes/agents.js +55 -12
  150. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  151. package/dist/src/gateway/hono/routes/config-patch/agents.js +1 -1
  152. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +2 -2
  153. package/dist/src/gateway/hono/routes/config-patch/gateway.js +12 -0
  154. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  155. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  156. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  157. package/dist/src/gateway/hono/routes/notes.d.ts +3 -0
  158. package/dist/src/gateway/hono/routes/notes.js +274 -0
  159. package/dist/src/gateway/hono/routes/notes.js.map +1 -0
  160. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  161. package/dist/src/gateway/hono/routes/update.js +55 -107
  162. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  163. package/dist/src/gateway/hono/routes/workflows.js +3 -1
  164. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  165. package/dist/src/gateway/server.js +2 -0
  166. package/dist/src/gateway/server.js.map +1 -1
  167. package/dist/src/gateway/service.d.ts +3 -0
  168. package/dist/src/gateway/service.js +12 -1
  169. package/dist/src/gateway/service.js.map +1 -1
  170. package/dist/src/gateway/workspace-ripgrep.d.ts +6 -0
  171. package/dist/src/gateway/workspace-ripgrep.js +62 -11
  172. package/dist/src/gateway/workspace-ripgrep.js.map +1 -1
  173. package/dist/src/heartbeat/index.js +1 -1
  174. package/dist/src/infra/brew.d.ts +4 -0
  175. package/dist/src/infra/brew.js +20 -0
  176. package/dist/src/infra/brew.js.map +1 -0
  177. package/dist/src/infra/package-json.d.ts +2 -0
  178. package/dist/src/infra/package-json.js +23 -0
  179. package/dist/src/infra/package-json.js.map +1 -0
  180. package/dist/src/infra/package-update-steps.d.ts +35 -0
  181. package/dist/src/infra/package-update-steps.js +304 -0
  182. package/dist/src/infra/package-update-steps.js.map +1 -0
  183. package/dist/src/infra/path-env.d.ts +11 -0
  184. package/dist/src/infra/path-env.js +90 -0
  185. package/dist/src/infra/path-env.js.map +1 -0
  186. package/dist/src/infra/path-prepend.d.ts +7 -0
  187. package/dist/src/infra/path-prepend.js +44 -0
  188. package/dist/src/infra/path-prepend.js.map +1 -0
  189. package/dist/src/infra/stable-node-path.d.ts +2 -0
  190. package/dist/src/infra/stable-node-path.js +28 -0
  191. package/dist/src/infra/stable-node-path.js.map +1 -0
  192. package/dist/src/infra/update-global.d.ts +30 -23
  193. package/dist/src/infra/update-global.js +113 -64
  194. package/dist/src/infra/update-global.js.map +1 -1
  195. package/dist/src/infra/update-log.d.ts +1 -0
  196. package/dist/src/infra/update-log.js +12 -0
  197. package/dist/src/infra/update-log.js.map +1 -0
  198. package/dist/src/infra/update-restart.d.ts +20 -0
  199. package/dist/src/infra/update-restart.js +165 -0
  200. package/dist/src/infra/update-restart.js.map +1 -0
  201. package/dist/src/infra/update-runner.d.ts +89 -1
  202. package/dist/src/infra/update-runner.js +604 -173
  203. package/dist/src/infra/update-runner.js.map +1 -1
  204. package/dist/src/infra/update-startup.d.ts +3 -0
  205. package/dist/src/infra/update-startup.js +8 -4
  206. package/dist/src/infra/update-startup.js.map +1 -1
  207. package/dist/src/notes/attachment-ref.d.ts +9 -0
  208. package/dist/src/notes/attachment-ref.js +27 -0
  209. package/dist/src/notes/attachment-ref.js.map +1 -0
  210. package/dist/src/notes/index.d.ts +4 -0
  211. package/dist/src/notes/index.js +4 -0
  212. package/dist/src/notes/note-attachment-sync.d.ts +7 -0
  213. package/dist/src/notes/note-attachment-sync.js +46 -0
  214. package/dist/src/notes/note-attachment-sync.js.map +1 -0
  215. package/dist/src/notes/note-index-meta.d.ts +14 -0
  216. package/dist/src/notes/note-index-meta.js +87 -0
  217. package/dist/src/notes/note-index-meta.js.map +1 -0
  218. package/dist/src/notes/paths.d.ts +5 -0
  219. package/dist/src/notes/paths.js +23 -0
  220. package/dist/src/notes/paths.js.map +1 -0
  221. package/dist/src/notes/service.d.ts +42 -0
  222. package/dist/src/notes/service.js +331 -0
  223. package/dist/src/notes/service.js.map +1 -0
  224. package/dist/src/notes/store.d.ts +33 -0
  225. package/dist/src/notes/store.js +317 -0
  226. package/dist/src/notes/store.js.map +1 -0
  227. package/dist/src/notes/types.d.ts +162 -0
  228. package/dist/src/notes/types.js +1 -0
  229. package/dist/src/routing/resolve-route.d.ts +3 -1
  230. package/dist/src/routing/resolve-route.js.map +1 -1
  231. package/dist/src/session/store.d.ts +5 -3
  232. package/dist/src/session/store.js +66 -20
  233. package/dist/src/session/store.js.map +1 -1
  234. package/dist/src/utils/logger/stats.d.ts +1 -1
  235. package/dist/src/workflows/domain/event.d.ts +3 -0
  236. package/dist/src/workflows/domain/run.d.ts +3 -0
  237. package/dist/src/workflows/domain/run.js.map +1 -1
  238. package/dist/src/workflows/engine/projector.js +17 -0
  239. package/dist/src/workflows/engine/projector.js.map +1 -1
  240. package/dist/src/workflows/engine/workflow-engine.js +127 -0
  241. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  242. package/dist/src/workflows/index.js +1 -1
  243. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -1
  244. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  245. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  246. package/dist/src/workflows/service/workflow-run-service.js +4 -1
  247. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  248. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  249. package/package.json +1 -1
  250. package/dist/gateway/static/root/assets/agents-B6PJB07W.js +0 -222
  251. package/dist/gateway/static/root/assets/apps-page-BOr0B1wv.js +0 -1
  252. package/dist/gateway/static/root/assets/channels-settings-BelUKggl.js +0 -1
  253. package/dist/gateway/static/root/assets/cron-api-CjOg-BIj.js +0 -1
  254. package/dist/gateway/static/root/assets/cron-dreaming-jobs-DueM3rBz.js +0 -2
  255. package/dist/gateway/static/root/assets/cron-page-DhoZmZXb.js +0 -1
  256. package/dist/gateway/static/root/assets/dist-6LecgDx5.js +0 -1
  257. package/dist/gateway/static/root/assets/dist-BTWC-BTN.js +0 -45
  258. package/dist/gateway/static/root/assets/index-CiN1cQiQ.css +0 -1
  259. package/dist/gateway/static/root/assets/logs-page-BwWLfqvd.js +0 -1
  260. package/dist/gateway/static/root/assets/sessions-page-DV5WN8uk.js +0 -1
  261. package/dist/gateway/static/root/assets/settings-page-CfOBRbPX.js +0 -3
  262. package/dist/gateway/static/root/assets/share-preview-page-Di5Bzh4g.js +0 -2
  263. package/dist/gateway/static/root/assets/skills-page-D0H5Kaxg.js +0 -2
  264. package/dist/gateway/static/root/assets/url-aYn-Rj1C.js +0 -7
  265. package/dist/gateway/static/root/assets/vendor-codemirror-D0yxdRpg.js +0 -58
  266. package/dist/gateway/static/root/assets/voice-api-key-field-X2UfnHeq.js +0 -1
  267. package/dist/gateway/static/root/assets/workflows-page-BOPpO3NG.js +0 -27
@@ -0,0 +1,144 @@
1
+ //#region src/agent/workflow/builtins/meeting-prep.ts
2
+ /**
3
+ * Built-in workflow: `meeting_prep`
4
+ *
5
+ * Prepares for a meeting by building context, an agenda, and talking points.
6
+ * Useful for 1:1s, client calls, interviews, or team syncs — no code required.
7
+ *
8
+ * Args:
9
+ * - meeting_topic: what the meeting is about
10
+ * - attendees: who is involved (optional)
11
+ * - goal: desired outcome (optional)
12
+ */
13
+ const MEETING_PREP_SCRIPT = `export const meta = {
14
+ name: 'meeting_prep',
15
+ description: 'Build meeting context, a tight agenda, and prioritized talking points.',
16
+ whenToUse: 'User has an upcoming meeting and wants prep — agenda, questions, and key messages.',
17
+ examplePrompts: [
18
+ { field: 'meeting_topic', text: 'Prep for a quarterly business review with leadership' },
19
+ { field: 'meeting_topic', text: 'Prepare talking points for a vendor negotiation call' },
20
+ ],
21
+ i18n: {
22
+ zh: {
23
+ description: '整理会议背景、紧凑议程与优先发言要点。',
24
+ whenToUse: '用户即将参加会议,需要议程、提问与关键信息准备时。',
25
+ examplePrompts: [
26
+ { field: 'meeting_topic', text: '准备与领导层的季度业务复盘会' },
27
+ { field: 'meeting_topic', text: '准备供应商谈判电话的发言要点' },
28
+ ],
29
+ },
30
+ },
31
+ tags: ['meeting', 'productivity'],
32
+ estimatedAgents: { min: 3, max: 5 },
33
+ phases: [
34
+ { title: 'Context' },
35
+ { title: 'Agenda' },
36
+ { title: 'Talking points' },
37
+ ],
38
+ }
39
+
40
+ const meetingTopic = args && typeof args === 'object' && args.meeting_topic
41
+ ? String(args.meeting_topic)
42
+ : 'Infer the meeting topic from the most recent user turn.'
43
+
44
+ const attendees = args && typeof args === 'object' && args.attendees
45
+ ? String(args.attendees)
46
+ : 'not specified'
47
+
48
+ const goal = args && typeof args === 'object' && args.goal
49
+ ? String(args.goal)
50
+ : 'achieve a clear outcome and aligned next steps'
51
+
52
+ phase('Context')
53
+ const context = await agent(
54
+ 'Summarize meeting context. Identify stakeholder interests, likely tensions, information gaps, and success criteria.\\n\\n' +
55
+ 'MEETING:\\n' + meetingTopic + '\\nATTENDEES:\\n' + attendees + '\\nGOAL:\\n' + goal,
56
+ {
57
+ label: 'context',
58
+ schema: {
59
+ type: 'object',
60
+ properties: {
61
+ summary: { type: 'string' },
62
+ stakeholderInterests: { type: 'array', items: { type: 'string' } },
63
+ tensions: { type: 'array', items: { type: 'string' } },
64
+ informationGaps: { type: 'array', items: { type: 'string' } },
65
+ successCriteria: { type: 'array', items: { type: 'string' } },
66
+ },
67
+ required: ['summary', 'successCriteria'],
68
+ },
69
+ },
70
+ )
71
+
72
+ phase('Agenda')
73
+ const agenda = await agent(
74
+ 'Draft a time-boxed agenda (30–60 min unless context suggests otherwise). Each item needs an owner hint and desired output. Prioritize decisions over status updates.\\n\\n' +
75
+ JSON.stringify({ meetingTopic, attendees, goal, context }, null, 2),
76
+ {
77
+ label: 'agenda',
78
+ schema: {
79
+ type: 'object',
80
+ properties: {
81
+ durationMin: { type: 'number' },
82
+ items: {
83
+ type: 'array',
84
+ items: {
85
+ type: 'object',
86
+ properties: {
87
+ title: { type: 'string' },
88
+ minutes: { type: 'number' },
89
+ owner: { type: 'string' },
90
+ output: { type: 'string' },
91
+ },
92
+ required: ['title', 'minutes', 'output'],
93
+ },
94
+ },
95
+ },
96
+ required: ['items'],
97
+ },
98
+ },
99
+ )
100
+
101
+ phase('Talking points')
102
+ const talkingPoints = await agent(
103
+ 'Produce prioritized talking points: opening line, 3–5 key messages, smart questions to ask, objections to anticipate with responses, and a crisp closing ask.\\n\\n' +
104
+ JSON.stringify({ meetingTopic, context, agenda }, null, 2),
105
+ {
106
+ label: 'talking points',
107
+ schema: {
108
+ type: 'object',
109
+ properties: {
110
+ openingLine: { type: 'string' },
111
+ keyMessages: { type: 'array', items: { type: 'string' } },
112
+ questionsToAsk: { type: 'array', items: { type: 'string' } },
113
+ objections: {
114
+ type: 'array',
115
+ items: {
116
+ type: 'object',
117
+ properties: {
118
+ objection: { type: 'string' },
119
+ response: { type: 'string' },
120
+ },
121
+ required: ['objection', 'response'],
122
+ },
123
+ },
124
+ closingAsk: { type: 'string' },
125
+ },
126
+ required: ['keyMessages', 'closingAsk'],
127
+ },
128
+ },
129
+ )
130
+
131
+ return {
132
+ ok: true,
133
+ meetingTopic,
134
+ attendees,
135
+ goal,
136
+ context,
137
+ agenda,
138
+ talkingPoints,
139
+ }
140
+ `;
141
+ //#endregion
142
+ export { MEETING_PREP_SCRIPT };
143
+
144
+ //# sourceMappingURL=meeting-prep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meeting-prep.js","names":[],"sources":["../../../../../src/agent/workflow/builtins/meeting-prep.ts"],"sourcesContent":["/**\n * Built-in workflow: `meeting_prep`\n *\n * Prepares for a meeting by building context, an agenda, and talking points.\n * Useful for 1:1s, client calls, interviews, or team syncs — no code required.\n *\n * Args:\n * - meeting_topic: what the meeting is about\n * - attendees: who is involved (optional)\n * - goal: desired outcome (optional)\n */\n\nexport const MEETING_PREP_SCRIPT = `export const meta = {\n name: 'meeting_prep',\n description: 'Build meeting context, a tight agenda, and prioritized talking points.',\n whenToUse: 'User has an upcoming meeting and wants prep — agenda, questions, and key messages.',\n examplePrompts: [\n { field: 'meeting_topic', text: 'Prep for a quarterly business review with leadership' },\n { field: 'meeting_topic', text: 'Prepare talking points for a vendor negotiation call' },\n ],\n i18n: {\n zh: {\n description: '整理会议背景、紧凑议程与优先发言要点。',\n whenToUse: '用户即将参加会议,需要议程、提问与关键信息准备时。',\n examplePrompts: [\n { field: 'meeting_topic', text: '准备与领导层的季度业务复盘会' },\n { field: 'meeting_topic', text: '准备供应商谈判电话的发言要点' },\n ],\n },\n },\n tags: ['meeting', 'productivity'],\n estimatedAgents: { min: 3, max: 5 },\n phases: [\n { title: 'Context' },\n { title: 'Agenda' },\n { title: 'Talking points' },\n ],\n}\n\nconst meetingTopic = args && typeof args === 'object' && args.meeting_topic\n ? String(args.meeting_topic)\n : 'Infer the meeting topic from the most recent user turn.'\n\nconst attendees = args && typeof args === 'object' && args.attendees\n ? String(args.attendees)\n : 'not specified'\n\nconst goal = args && typeof args === 'object' && args.goal\n ? String(args.goal)\n : 'achieve a clear outcome and aligned next steps'\n\nphase('Context')\nconst context = await agent(\n 'Summarize meeting context. Identify stakeholder interests, likely tensions, information gaps, and success criteria.\\\\n\\\\n' +\n 'MEETING:\\\\n' + meetingTopic + '\\\\nATTENDEES:\\\\n' + attendees + '\\\\nGOAL:\\\\n' + goal,\n {\n label: 'context',\n schema: {\n type: 'object',\n properties: {\n summary: { type: 'string' },\n stakeholderInterests: { type: 'array', items: { type: 'string' } },\n tensions: { type: 'array', items: { type: 'string' } },\n informationGaps: { type: 'array', items: { type: 'string' } },\n successCriteria: { type: 'array', items: { type: 'string' } },\n },\n required: ['summary', 'successCriteria'],\n },\n },\n)\n\nphase('Agenda')\nconst agenda = await agent(\n 'Draft a time-boxed agenda (30–60 min unless context suggests otherwise). Each item needs an owner hint and desired output. Prioritize decisions over status updates.\\\\n\\\\n' +\n JSON.stringify({ meetingTopic, attendees, goal, context }, null, 2),\n {\n label: 'agenda',\n schema: {\n type: 'object',\n properties: {\n durationMin: { type: 'number' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n minutes: { type: 'number' },\n owner: { type: 'string' },\n output: { type: 'string' },\n },\n required: ['title', 'minutes', 'output'],\n },\n },\n },\n required: ['items'],\n },\n },\n)\n\nphase('Talking points')\nconst talkingPoints = await agent(\n 'Produce prioritized talking points: opening line, 3–5 key messages, smart questions to ask, objections to anticipate with responses, and a crisp closing ask.\\\\n\\\\n' +\n JSON.stringify({ meetingTopic, context, agenda }, null, 2),\n {\n label: 'talking points',\n schema: {\n type: 'object',\n properties: {\n openingLine: { type: 'string' },\n keyMessages: { type: 'array', items: { type: 'string' } },\n questionsToAsk: { type: 'array', items: { type: 'string' } },\n objections: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n objection: { type: 'string' },\n response: { type: 'string' },\n },\n required: ['objection', 'response'],\n },\n },\n closingAsk: { type: 'string' },\n },\n required: ['keyMessages', 'closingAsk'],\n },\n },\n)\n\nreturn {\n ok: true,\n meetingTopic,\n attendees,\n goal,\n context,\n agenda,\n talkingPoints,\n}\n`\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,sBAAsB"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Built-in workflow: `offer_design`
3
+ *
4
+ * Package skills and time into sellable offers — tiers, pricing, delivery
5
+ * boundaries, and positioning for solopreneurs.
6
+ *
7
+ * Args:
8
+ * - skills: what you can do
9
+ * - audience: target customers
10
+ * - constraints: time or revenue goals (optional)
11
+ */
12
+ export declare const OFFER_DESIGN_SCRIPT = "export const meta = {\n name: 'offer_design',\n description: 'Package your skills into sellable offers with tiers, pricing, boundaries, and positioning.',\n whenToUse: 'Solo operator turning expertise into productized services or subscription offers.',\n examplePrompts: [\n { field: 'skills', text: 'Notion systems, light automations, async consulting for creators' },\n { field: 'audience', text: 'Solo creators doing $3k\u201315k/month' },\n ],\n i18n: {\n zh: {\n description: '\u5C06\u4E2A\u4EBA\u80FD\u529B\u6253\u5305\u4E3A\u53EF\u552E\u5356\u7684\u4EA7\u54C1/\u670D\u52A1\uFF1A\u5C42\u7EA7\u3001\u5B9A\u4EF7\u3001\u4EA4\u4ED8\u8FB9\u754C\u4E0E\u5B9A\u4F4D\u3002',\n whenToUse: '\u8D85\u7EA7\u4E2A\u4F53\u60F3\u628A\u4E13\u957F\u4EA7\u54C1\u5316\u3001\u8BBE\u8BA1\u62A5\u4EF7\u4E0E\u5957\u9910\u65F6\u3002',\n examplePrompts: [\n { field: 'skills', text: 'Notion \u7CFB\u7EDF\u642D\u5EFA\u3001\u8F7B\u91CF\u81EA\u52A8\u5316\u3001\u9762\u5411\u521B\u4F5C\u8005\u7684\u5F02\u6B65\u54A8\u8BE2' },\n { field: 'audience', text: '\u6708\u5165 2\u201310 \u4E07\u7684\u72EC\u7ACB\u521B\u4F5C\u8005' },\n ],\n },\n },\n tags: ['planning', 'architecture'],\n estimatedAgents: { min: 4, max: 5 },\n phases: [\n { title: 'Inventory' },\n { title: 'Package' },\n { title: 'Price' },\n { title: 'Position' },\n ],\n}\n\nconst skills = args && typeof args === 'object' && args.skills\n ? String(args.skills)\n : 'Infer your skills from the most recent user turn.'\n\nconst audience = args && typeof args === 'object' && args.audience\n ? String(args.audience)\n : 'Infer target audience from context.'\n\nconst constraints = args && typeof args === 'object' && args.constraints\n ? String(args.constraints)\n : ''\n\nphase('Inventory')\nconst inventory = await agent(\n 'Inventory sellable capabilities for a solo operator. Separate high-leverage repeatable work from custom work. Note time sinks to avoid.\\n\\n' +\n 'SKILLS:\\n' + skills + '\\nAUDIENCE:\\n' + audience +\n (constraints ? '\\nCONSTRAINTS:\\n' + constraints : ''),\n {\n label: 'inventory',\n schema: {\n type: 'object',\n properties: {\n coreCapabilities: { type: 'array', items: { type: 'string' } },\n repeatable: { type: 'array', items: { type: 'string' } },\n customOnly: { type: 'array', items: { type: 'string' } },\n avoid: { type: 'array', items: { type: 'string' } },\n },\n required: ['coreCapabilities', 'repeatable'],\n },\n },\n)\n\nphase('Package')\nconst packages = await agent(\n 'Design 2\u20133 offer tiers (e.g. starter / core / premium) with clear deliverables, boundaries, and who each tier is for. Fit solo capacity \u2014 no fake scale.\\n\\n' +\n JSON.stringify({ skills, audience, constraints, inventory }, null, 2),\n {\n label: 'package',\n schema: {\n type: 'object',\n properties: {\n tiers: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n forWho: { type: 'string' },\n deliverables: { type: 'array', items: { type: 'string' } },\n boundaries: { type: 'array', items: { type: 'string' } },\n timeCommitment: { type: 'string' },\n },\n required: ['name', 'deliverables', 'boundaries'],\n },\n },\n },\n required: ['tiers'],\n },\n },\n)\n\nphase('Price')\nconst pricing = await agent(\n 'Recommend pricing for each tier: price range, pricing model (fixed / retainer / subscription), rationale, and upsell path. Be realistic for solo operators.\\n\\n' +\n JSON.stringify({ audience, constraints, packages }, null, 2),\n {\n label: 'price',\n schema: {\n type: 'object',\n properties: {\n tiers: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n priceRange: { type: 'string' },\n model: { type: 'string' },\n rationale: { type: 'string' },\n },\n required: ['name', 'priceRange', 'model'],\n },\n },\n upsellPath: { type: 'string' },\n },\n required: ['tiers'],\n },\n },\n)\n\nphase('Position')\nconst positioning = await agent(\n 'Write positioning: one-line value prop, differentiation vs DIY and vs agencies, ideal customer profile, and launch checklist (first 3 steps).\\n\\n' +\n JSON.stringify({ inventory, packages, pricing }, null, 2),\n {\n label: 'position',\n schema: {\n type: 'object',\n properties: {\n valueProp: { type: 'string' },\n differentiation: { type: 'array', items: { type: 'string' } },\n idealCustomer: { type: 'string' },\n launchChecklist: { type: 'array', items: { type: 'string' } },\n },\n required: ['valueProp', 'idealCustomer', 'launchChecklist'],\n },\n },\n)\n\nreturn {\n ok: true,\n inventory,\n packages,\n pricing,\n ...(positioning ?? { valueProp: 'positioning failed', launchChecklist: [] }),\n}\n";
@@ -0,0 +1,161 @@
1
+ //#region src/agent/workflow/builtins/offer-design.ts
2
+ /**
3
+ * Built-in workflow: `offer_design`
4
+ *
5
+ * Package skills and time into sellable offers — tiers, pricing, delivery
6
+ * boundaries, and positioning for solopreneurs.
7
+ *
8
+ * Args:
9
+ * - skills: what you can do
10
+ * - audience: target customers
11
+ * - constraints: time or revenue goals (optional)
12
+ */
13
+ const OFFER_DESIGN_SCRIPT = `export const meta = {
14
+ name: 'offer_design',
15
+ description: 'Package your skills into sellable offers with tiers, pricing, boundaries, and positioning.',
16
+ whenToUse: 'Solo operator turning expertise into productized services or subscription offers.',
17
+ examplePrompts: [
18
+ { field: 'skills', text: 'Notion systems, light automations, async consulting for creators' },
19
+ { field: 'audience', text: 'Solo creators doing $3k–15k/month' },
20
+ ],
21
+ i18n: {
22
+ zh: {
23
+ description: '将个人能力打包为可售卖的产品/服务:层级、定价、交付边界与定位。',
24
+ whenToUse: '超级个体想把专长产品化、设计报价与套餐时。',
25
+ examplePrompts: [
26
+ { field: 'skills', text: 'Notion 系统搭建、轻量自动化、面向创作者的异步咨询' },
27
+ { field: 'audience', text: '月入 2–10 万的独立创作者' },
28
+ ],
29
+ },
30
+ },
31
+ tags: ['planning', 'architecture'],
32
+ estimatedAgents: { min: 4, max: 5 },
33
+ phases: [
34
+ { title: 'Inventory' },
35
+ { title: 'Package' },
36
+ { title: 'Price' },
37
+ { title: 'Position' },
38
+ ],
39
+ }
40
+
41
+ const skills = args && typeof args === 'object' && args.skills
42
+ ? String(args.skills)
43
+ : 'Infer your skills from the most recent user turn.'
44
+
45
+ const audience = args && typeof args === 'object' && args.audience
46
+ ? String(args.audience)
47
+ : 'Infer target audience from context.'
48
+
49
+ const constraints = args && typeof args === 'object' && args.constraints
50
+ ? String(args.constraints)
51
+ : ''
52
+
53
+ phase('Inventory')
54
+ const inventory = await agent(
55
+ 'Inventory sellable capabilities for a solo operator. Separate high-leverage repeatable work from custom work. Note time sinks to avoid.\\n\\n' +
56
+ 'SKILLS:\\n' + skills + '\\nAUDIENCE:\\n' + audience +
57
+ (constraints ? '\\nCONSTRAINTS:\\n' + constraints : ''),
58
+ {
59
+ label: 'inventory',
60
+ schema: {
61
+ type: 'object',
62
+ properties: {
63
+ coreCapabilities: { type: 'array', items: { type: 'string' } },
64
+ repeatable: { type: 'array', items: { type: 'string' } },
65
+ customOnly: { type: 'array', items: { type: 'string' } },
66
+ avoid: { type: 'array', items: { type: 'string' } },
67
+ },
68
+ required: ['coreCapabilities', 'repeatable'],
69
+ },
70
+ },
71
+ )
72
+
73
+ phase('Package')
74
+ const packages = await agent(
75
+ 'Design 2–3 offer tiers (e.g. starter / core / premium) with clear deliverables, boundaries, and who each tier is for. Fit solo capacity — no fake scale.\\n\\n' +
76
+ JSON.stringify({ skills, audience, constraints, inventory }, null, 2),
77
+ {
78
+ label: 'package',
79
+ schema: {
80
+ type: 'object',
81
+ properties: {
82
+ tiers: {
83
+ type: 'array',
84
+ items: {
85
+ type: 'object',
86
+ properties: {
87
+ name: { type: 'string' },
88
+ forWho: { type: 'string' },
89
+ deliverables: { type: 'array', items: { type: 'string' } },
90
+ boundaries: { type: 'array', items: { type: 'string' } },
91
+ timeCommitment: { type: 'string' },
92
+ },
93
+ required: ['name', 'deliverables', 'boundaries'],
94
+ },
95
+ },
96
+ },
97
+ required: ['tiers'],
98
+ },
99
+ },
100
+ )
101
+
102
+ phase('Price')
103
+ const pricing = await agent(
104
+ 'Recommend pricing for each tier: price range, pricing model (fixed / retainer / subscription), rationale, and upsell path. Be realistic for solo operators.\\n\\n' +
105
+ JSON.stringify({ audience, constraints, packages }, null, 2),
106
+ {
107
+ label: 'price',
108
+ schema: {
109
+ type: 'object',
110
+ properties: {
111
+ tiers: {
112
+ type: 'array',
113
+ items: {
114
+ type: 'object',
115
+ properties: {
116
+ name: { type: 'string' },
117
+ priceRange: { type: 'string' },
118
+ model: { type: 'string' },
119
+ rationale: { type: 'string' },
120
+ },
121
+ required: ['name', 'priceRange', 'model'],
122
+ },
123
+ },
124
+ upsellPath: { type: 'string' },
125
+ },
126
+ required: ['tiers'],
127
+ },
128
+ },
129
+ )
130
+
131
+ phase('Position')
132
+ const positioning = await agent(
133
+ 'Write positioning: one-line value prop, differentiation vs DIY and vs agencies, ideal customer profile, and launch checklist (first 3 steps).\\n\\n' +
134
+ JSON.stringify({ inventory, packages, pricing }, null, 2),
135
+ {
136
+ label: 'position',
137
+ schema: {
138
+ type: 'object',
139
+ properties: {
140
+ valueProp: { type: 'string' },
141
+ differentiation: { type: 'array', items: { type: 'string' } },
142
+ idealCustomer: { type: 'string' },
143
+ launchChecklist: { type: 'array', items: { type: 'string' } },
144
+ },
145
+ required: ['valueProp', 'idealCustomer', 'launchChecklist'],
146
+ },
147
+ },
148
+ )
149
+
150
+ return {
151
+ ok: true,
152
+ inventory,
153
+ packages,
154
+ pricing,
155
+ ...(positioning ?? { valueProp: 'positioning failed', launchChecklist: [] }),
156
+ }
157
+ `;
158
+ //#endregion
159
+ export { OFFER_DESIGN_SCRIPT };
160
+
161
+ //# sourceMappingURL=offer-design.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer-design.js","names":[],"sources":["../../../../../src/agent/workflow/builtins/offer-design.ts"],"sourcesContent":["/**\n * Built-in workflow: `offer_design`\n *\n * Package skills and time into sellable offers — tiers, pricing, delivery\n * boundaries, and positioning for solopreneurs.\n *\n * Args:\n * - skills: what you can do\n * - audience: target customers\n * - constraints: time or revenue goals (optional)\n */\n\nexport const OFFER_DESIGN_SCRIPT = `export const meta = {\n name: 'offer_design',\n description: 'Package your skills into sellable offers with tiers, pricing, boundaries, and positioning.',\n whenToUse: 'Solo operator turning expertise into productized services or subscription offers.',\n examplePrompts: [\n { field: 'skills', text: 'Notion systems, light automations, async consulting for creators' },\n { field: 'audience', text: 'Solo creators doing $3k–15k/month' },\n ],\n i18n: {\n zh: {\n description: '将个人能力打包为可售卖的产品/服务:层级、定价、交付边界与定位。',\n whenToUse: '超级个体想把专长产品化、设计报价与套餐时。',\n examplePrompts: [\n { field: 'skills', text: 'Notion 系统搭建、轻量自动化、面向创作者的异步咨询' },\n { field: 'audience', text: '月入 2–10 万的独立创作者' },\n ],\n },\n },\n tags: ['planning', 'architecture'],\n estimatedAgents: { min: 4, max: 5 },\n phases: [\n { title: 'Inventory' },\n { title: 'Package' },\n { title: 'Price' },\n { title: 'Position' },\n ],\n}\n\nconst skills = args && typeof args === 'object' && args.skills\n ? String(args.skills)\n : 'Infer your skills from the most recent user turn.'\n\nconst audience = args && typeof args === 'object' && args.audience\n ? String(args.audience)\n : 'Infer target audience from context.'\n\nconst constraints = args && typeof args === 'object' && args.constraints\n ? String(args.constraints)\n : ''\n\nphase('Inventory')\nconst inventory = await agent(\n 'Inventory sellable capabilities for a solo operator. Separate high-leverage repeatable work from custom work. Note time sinks to avoid.\\\\n\\\\n' +\n 'SKILLS:\\\\n' + skills + '\\\\nAUDIENCE:\\\\n' + audience +\n (constraints ? '\\\\nCONSTRAINTS:\\\\n' + constraints : ''),\n {\n label: 'inventory',\n schema: {\n type: 'object',\n properties: {\n coreCapabilities: { type: 'array', items: { type: 'string' } },\n repeatable: { type: 'array', items: { type: 'string' } },\n customOnly: { type: 'array', items: { type: 'string' } },\n avoid: { type: 'array', items: { type: 'string' } },\n },\n required: ['coreCapabilities', 'repeatable'],\n },\n },\n)\n\nphase('Package')\nconst packages = await agent(\n 'Design 2–3 offer tiers (e.g. starter / core / premium) with clear deliverables, boundaries, and who each tier is for. Fit solo capacity — no fake scale.\\\\n\\\\n' +\n JSON.stringify({ skills, audience, constraints, inventory }, null, 2),\n {\n label: 'package',\n schema: {\n type: 'object',\n properties: {\n tiers: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n forWho: { type: 'string' },\n deliverables: { type: 'array', items: { type: 'string' } },\n boundaries: { type: 'array', items: { type: 'string' } },\n timeCommitment: { type: 'string' },\n },\n required: ['name', 'deliverables', 'boundaries'],\n },\n },\n },\n required: ['tiers'],\n },\n },\n)\n\nphase('Price')\nconst pricing = await agent(\n 'Recommend pricing for each tier: price range, pricing model (fixed / retainer / subscription), rationale, and upsell path. Be realistic for solo operators.\\\\n\\\\n' +\n JSON.stringify({ audience, constraints, packages }, null, 2),\n {\n label: 'price',\n schema: {\n type: 'object',\n properties: {\n tiers: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n priceRange: { type: 'string' },\n model: { type: 'string' },\n rationale: { type: 'string' },\n },\n required: ['name', 'priceRange', 'model'],\n },\n },\n upsellPath: { type: 'string' },\n },\n required: ['tiers'],\n },\n },\n)\n\nphase('Position')\nconst positioning = await agent(\n 'Write positioning: one-line value prop, differentiation vs DIY and vs agencies, ideal customer profile, and launch checklist (first 3 steps).\\\\n\\\\n' +\n JSON.stringify({ inventory, packages, pricing }, null, 2),\n {\n label: 'position',\n schema: {\n type: 'object',\n properties: {\n valueProp: { type: 'string' },\n differentiation: { type: 'array', items: { type: 'string' } },\n idealCustomer: { type: 'string' },\n launchChecklist: { type: 'array', items: { type: 'string' } },\n },\n required: ['valueProp', 'idealCustomer', 'launchChecklist'],\n },\n },\n)\n\nreturn {\n ok: true,\n inventory,\n packages,\n pricing,\n ...(positioning ?? { valueProp: 'positioning failed', launchChecklist: [] }),\n}\n`\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,sBAAsB"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Built-in workflow: `weekly_review`
3
+ *
4
+ * Weekly retrospective for solopreneurs — collect wins, blockers, and carryover,
5
+ * then synthesize next-week priorities.
6
+ *
7
+ * Args:
8
+ * - wins: what went well this week
9
+ * - blockers: what stalled or frustrated progress
10
+ * - carryover: unfinished items (optional)
11
+ */
12
+ export declare const WEEKLY_REVIEW_SCRIPT = "export const meta = {\n name: 'weekly_review',\n description: 'Review the week and produce 3\u20135 prioritized actions for next week.',\n whenToUse: 'Solo founder or super-individual doing a weekly retrospective and planning session.',\n examplePrompts: [\n { field: 'wins', text: 'Shipped landing page, got 2 demo calls, published one newsletter' },\n { field: 'blockers', text: 'Pricing still unclear, one client ghosted, distracted by side tasks' },\n ],\n i18n: {\n zh: {\n description: '\u590D\u76D8\u672C\u5468\u5E76\u4EA7\u51FA\u4E0B\u5468 3\u20135 \u9879\u4F18\u5148\u884C\u52A8\u3002',\n whenToUse: '\u4E00\u4EBA\u516C\u53F8\u6216\u8D85\u7EA7\u4E2A\u4F53\u505A\u5468\u590D\u76D8\u4E0E\u4E0B\u5468\u89C4\u5212\u65F6\u3002',\n examplePrompts: [\n { field: 'wins', text: '\u4E0A\u7EBF\u4E86\u843D\u5730\u9875\u3001\u62FF\u5230 2 \u4E2A demo\u3001\u53D1\u4E86\u4E00\u671F newsletter' },\n { field: 'blockers', text: '\u5B9A\u4EF7\u8FD8\u4E0D\u6E05\u6670\u3001\u4E00\u4E2A\u5BA2\u6237\u5931\u8054\u3001\u88AB\u6742\u4E8B\u5206\u5FC3' },\n ],\n },\n },\n tags: ['productivity', 'brainstorm'],\n estimatedAgents: { min: 3, max: 4 },\n phases: [\n { title: 'Collect' },\n { title: 'Analyze' },\n { title: 'Plan' },\n ],\n}\n\nconst wins = args && typeof args === 'object' && args.wins\n ? String(args.wins)\n : 'Infer wins from the most recent user turn.'\n\nconst blockers = args && typeof args === 'object' && args.blockers\n ? String(args.blockers)\n : 'None specified \u2014 infer from context if possible.'\n\nconst carryover = args && typeof args === 'object' && args.carryover\n ? String(args.carryover)\n : ''\n\nphase('Collect')\nconst collected = await agent(\n 'Normalize this weekly input into structured facts: wins, blockers, carryover, energy level signals, and revenue/impact signals if mentioned. Be concise.\\n\\n' +\n 'WINS:\\n' + wins + '\\nBLOCKERS:\\n' + blockers + '\\nCARRYOVER:\\n' + (carryover || '(none)'),\n {\n label: 'collect',\n schema: {\n type: 'object',\n properties: {\n wins: { type: 'array', items: { type: 'string' } },\n blockers: { type: 'array', items: { type: 'string' } },\n carryover: { type: 'array', items: { type: 'string' } },\n themes: { type: 'array', items: { type: 'string' } },\n },\n required: ['wins', 'blockers'],\n },\n },\n)\n\nphase('Analyze')\nconst analysis = await agent(\n 'Analyze this week for a solo operator. Identify patterns, root causes of blockers, what to stop doing, what to double down on, and one honest lesson.\\n\\n' +\n JSON.stringify(collected, null, 2),\n {\n label: 'analyze',\n schema: {\n type: 'object',\n properties: {\n patterns: { type: 'array', items: { type: 'string' } },\n rootCauses: { type: 'array', items: { type: 'string' } },\n stopDoing: { type: 'array', items: { type: 'string' } },\n doubleDown: { type: 'array', items: { type: 'string' } },\n lesson: { type: 'string' },\n },\n required: ['patterns', 'lesson'],\n },\n },\n)\n\nphase('Plan')\nconst plan = await agent(\n 'Produce next week plan for a solo founder: exactly 3\u20135 prioritized actions (each with why, estimated effort, and success signal), plus one optional stretch goal. Be realistic for ~20\u201330 focused hours.\\n\\n' +\n JSON.stringify({ collected, analysis }, null, 2),\n {\n label: 'plan',\n schema: {\n type: 'object',\n properties: {\n priorities: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n action: { type: 'string' },\n why: { type: 'string' },\n effort: { type: 'string', enum: ['low', 'med', 'high'] },\n successSignal: { type: 'string' },\n },\n required: ['action', 'why', 'successSignal'],\n },\n },\n stretchGoal: { type: 'string' },\n weeklyTheme: { type: 'string' },\n },\n required: ['priorities', 'weeklyTheme'],\n },\n },\n)\n\nreturn {\n ok: true,\n collected,\n analysis,\n ...(plan ?? { priorities: [], weeklyTheme: 'planning failed' }),\n}\n";
@@ -0,0 +1,131 @@
1
+ //#region src/agent/workflow/builtins/weekly-review.ts
2
+ /**
3
+ * Built-in workflow: `weekly_review`
4
+ *
5
+ * Weekly retrospective for solopreneurs — collect wins, blockers, and carryover,
6
+ * then synthesize next-week priorities.
7
+ *
8
+ * Args:
9
+ * - wins: what went well this week
10
+ * - blockers: what stalled or frustrated progress
11
+ * - carryover: unfinished items (optional)
12
+ */
13
+ const WEEKLY_REVIEW_SCRIPT = `export const meta = {
14
+ name: 'weekly_review',
15
+ description: 'Review the week and produce 3–5 prioritized actions for next week.',
16
+ whenToUse: 'Solo founder or super-individual doing a weekly retrospective and planning session.',
17
+ examplePrompts: [
18
+ { field: 'wins', text: 'Shipped landing page, got 2 demo calls, published one newsletter' },
19
+ { field: 'blockers', text: 'Pricing still unclear, one client ghosted, distracted by side tasks' },
20
+ ],
21
+ i18n: {
22
+ zh: {
23
+ description: '复盘本周并产出下周 3–5 项优先行动。',
24
+ whenToUse: '一人公司或超级个体做周复盘与下周规划时。',
25
+ examplePrompts: [
26
+ { field: 'wins', text: '上线了落地页、拿到 2 个 demo、发了一期 newsletter' },
27
+ { field: 'blockers', text: '定价还不清晰、一个客户失联、被杂事分心' },
28
+ ],
29
+ },
30
+ },
31
+ tags: ['productivity', 'brainstorm'],
32
+ estimatedAgents: { min: 3, max: 4 },
33
+ phases: [
34
+ { title: 'Collect' },
35
+ { title: 'Analyze' },
36
+ { title: 'Plan' },
37
+ ],
38
+ }
39
+
40
+ const wins = args && typeof args === 'object' && args.wins
41
+ ? String(args.wins)
42
+ : 'Infer wins from the most recent user turn.'
43
+
44
+ const blockers = args && typeof args === 'object' && args.blockers
45
+ ? String(args.blockers)
46
+ : 'None specified — infer from context if possible.'
47
+
48
+ const carryover = args && typeof args === 'object' && args.carryover
49
+ ? String(args.carryover)
50
+ : ''
51
+
52
+ phase('Collect')
53
+ const collected = await agent(
54
+ 'Normalize this weekly input into structured facts: wins, blockers, carryover, energy level signals, and revenue/impact signals if mentioned. Be concise.\\n\\n' +
55
+ 'WINS:\\n' + wins + '\\nBLOCKERS:\\n' + blockers + '\\nCARRYOVER:\\n' + (carryover || '(none)'),
56
+ {
57
+ label: 'collect',
58
+ schema: {
59
+ type: 'object',
60
+ properties: {
61
+ wins: { type: 'array', items: { type: 'string' } },
62
+ blockers: { type: 'array', items: { type: 'string' } },
63
+ carryover: { type: 'array', items: { type: 'string' } },
64
+ themes: { type: 'array', items: { type: 'string' } },
65
+ },
66
+ required: ['wins', 'blockers'],
67
+ },
68
+ },
69
+ )
70
+
71
+ phase('Analyze')
72
+ const analysis = await agent(
73
+ 'Analyze this week for a solo operator. Identify patterns, root causes of blockers, what to stop doing, what to double down on, and one honest lesson.\\n\\n' +
74
+ JSON.stringify(collected, null, 2),
75
+ {
76
+ label: 'analyze',
77
+ schema: {
78
+ type: 'object',
79
+ properties: {
80
+ patterns: { type: 'array', items: { type: 'string' } },
81
+ rootCauses: { type: 'array', items: { type: 'string' } },
82
+ stopDoing: { type: 'array', items: { type: 'string' } },
83
+ doubleDown: { type: 'array', items: { type: 'string' } },
84
+ lesson: { type: 'string' },
85
+ },
86
+ required: ['patterns', 'lesson'],
87
+ },
88
+ },
89
+ )
90
+
91
+ phase('Plan')
92
+ const plan = await agent(
93
+ 'Produce next week plan for a solo founder: exactly 3–5 prioritized actions (each with why, estimated effort, and success signal), plus one optional stretch goal. Be realistic for ~20–30 focused hours.\\n\\n' +
94
+ JSON.stringify({ collected, analysis }, null, 2),
95
+ {
96
+ label: 'plan',
97
+ schema: {
98
+ type: 'object',
99
+ properties: {
100
+ priorities: {
101
+ type: 'array',
102
+ items: {
103
+ type: 'object',
104
+ properties: {
105
+ action: { type: 'string' },
106
+ why: { type: 'string' },
107
+ effort: { type: 'string', enum: ['low', 'med', 'high'] },
108
+ successSignal: { type: 'string' },
109
+ },
110
+ required: ['action', 'why', 'successSignal'],
111
+ },
112
+ },
113
+ stretchGoal: { type: 'string' },
114
+ weeklyTheme: { type: 'string' },
115
+ },
116
+ required: ['priorities', 'weeklyTheme'],
117
+ },
118
+ },
119
+ )
120
+
121
+ return {
122
+ ok: true,
123
+ collected,
124
+ analysis,
125
+ ...(plan ?? { priorities: [], weeklyTheme: 'planning failed' }),
126
+ }
127
+ `;
128
+ //#endregion
129
+ export { WEEKLY_REVIEW_SCRIPT };
130
+
131
+ //# sourceMappingURL=weekly-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weekly-review.js","names":[],"sources":["../../../../../src/agent/workflow/builtins/weekly-review.ts"],"sourcesContent":["/**\n * Built-in workflow: `weekly_review`\n *\n * Weekly retrospective for solopreneurs — collect wins, blockers, and carryover,\n * then synthesize next-week priorities.\n *\n * Args:\n * - wins: what went well this week\n * - blockers: what stalled or frustrated progress\n * - carryover: unfinished items (optional)\n */\n\nexport const WEEKLY_REVIEW_SCRIPT = `export const meta = {\n name: 'weekly_review',\n description: 'Review the week and produce 3–5 prioritized actions for next week.',\n whenToUse: 'Solo founder or super-individual doing a weekly retrospective and planning session.',\n examplePrompts: [\n { field: 'wins', text: 'Shipped landing page, got 2 demo calls, published one newsletter' },\n { field: 'blockers', text: 'Pricing still unclear, one client ghosted, distracted by side tasks' },\n ],\n i18n: {\n zh: {\n description: '复盘本周并产出下周 3–5 项优先行动。',\n whenToUse: '一人公司或超级个体做周复盘与下周规划时。',\n examplePrompts: [\n { field: 'wins', text: '上线了落地页、拿到 2 个 demo、发了一期 newsletter' },\n { field: 'blockers', text: '定价还不清晰、一个客户失联、被杂事分心' },\n ],\n },\n },\n tags: ['productivity', 'brainstorm'],\n estimatedAgents: { min: 3, max: 4 },\n phases: [\n { title: 'Collect' },\n { title: 'Analyze' },\n { title: 'Plan' },\n ],\n}\n\nconst wins = args && typeof args === 'object' && args.wins\n ? String(args.wins)\n : 'Infer wins from the most recent user turn.'\n\nconst blockers = args && typeof args === 'object' && args.blockers\n ? String(args.blockers)\n : 'None specified — infer from context if possible.'\n\nconst carryover = args && typeof args === 'object' && args.carryover\n ? String(args.carryover)\n : ''\n\nphase('Collect')\nconst collected = await agent(\n 'Normalize this weekly input into structured facts: wins, blockers, carryover, energy level signals, and revenue/impact signals if mentioned. Be concise.\\\\n\\\\n' +\n 'WINS:\\\\n' + wins + '\\\\nBLOCKERS:\\\\n' + blockers + '\\\\nCARRYOVER:\\\\n' + (carryover || '(none)'),\n {\n label: 'collect',\n schema: {\n type: 'object',\n properties: {\n wins: { type: 'array', items: { type: 'string' } },\n blockers: { type: 'array', items: { type: 'string' } },\n carryover: { type: 'array', items: { type: 'string' } },\n themes: { type: 'array', items: { type: 'string' } },\n },\n required: ['wins', 'blockers'],\n },\n },\n)\n\nphase('Analyze')\nconst analysis = await agent(\n 'Analyze this week for a solo operator. Identify patterns, root causes of blockers, what to stop doing, what to double down on, and one honest lesson.\\\\n\\\\n' +\n JSON.stringify(collected, null, 2),\n {\n label: 'analyze',\n schema: {\n type: 'object',\n properties: {\n patterns: { type: 'array', items: { type: 'string' } },\n rootCauses: { type: 'array', items: { type: 'string' } },\n stopDoing: { type: 'array', items: { type: 'string' } },\n doubleDown: { type: 'array', items: { type: 'string' } },\n lesson: { type: 'string' },\n },\n required: ['patterns', 'lesson'],\n },\n },\n)\n\nphase('Plan')\nconst plan = await agent(\n 'Produce next week plan for a solo founder: exactly 3–5 prioritized actions (each with why, estimated effort, and success signal), plus one optional stretch goal. Be realistic for ~20–30 focused hours.\\\\n\\\\n' +\n JSON.stringify({ collected, analysis }, null, 2),\n {\n label: 'plan',\n schema: {\n type: 'object',\n properties: {\n priorities: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n action: { type: 'string' },\n why: { type: 'string' },\n effort: { type: 'string', enum: ['low', 'med', 'high'] },\n successSignal: { type: 'string' },\n },\n required: ['action', 'why', 'successSignal'],\n },\n },\n stretchGoal: { type: 'string' },\n weeklyTheme: { type: 'string' },\n },\n required: ['priorities', 'weeklyTheme'],\n },\n },\n)\n\nreturn {\n ok: true,\n collected,\n analysis,\n ...(plan ?? { priorities: [], weeklyTheme: 'planning failed' }),\n}\n`\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,uBAAuB"}
@@ -13,9 +13,9 @@ function workflowStepLabel(toolName, args) {
13
13
  else if (n === "edit_file") label = "Edit file";
14
14
  else if (n === "web_fetch") label = "Fetch URL";
15
15
  else if (n === "open_url") label = "Open URL";
16
+ else if (n === "grep" || n === "rg" || n === "file_grep") label = "Search files";
16
17
  else if (n === "web_search" || n === "brave_search" || n.includes("search")) label = "Search web";
17
18
  else if (n === "read_file" || n.includes("read_file") || n.includes("file_read")) label = "Read file";
18
- else if (n === "grep" || n === "rg") label = "Search files";
19
19
  else if (n === "delegate_task" || n === "workflow") label = toolName;
20
20
  const detail = extractStepDetail(n, args);
21
21
  return detail ? {
@@ -35,7 +35,7 @@ function extractStepDetail(toolKey, args) {
35
35
  if (typeof v === "string" && v.trim()) return truncate(v.trim());
36
36
  }
37
37
  if (toolKey === "shell" && typeof args.command === "string" && args.command.trim()) return truncate(args.command.trim());
38
- if ((toolKey.includes("search") || toolKey === "grep" || toolKey === "rg") && typeof args.query === "string" && args.query.trim()) return truncate(args.query.trim());
38
+ if ((toolKey.includes("search") || toolKey === "grep" || toolKey === "rg" || toolKey === "file_grep") && typeof args.query === "string" && args.query.trim()) return truncate(args.query.trim());
39
39
  if (typeof args.url === "string" && args.url.trim()) return truncate(args.url.trim());
40
40
  }
41
41
  function truncate(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"step-labels.js","names":[],"sources":["../../../../src/agent/workflow/step-labels.ts"],"sourcesContent":["/**\n * Human-readable labels for workflow subagent tool steps (server-side snapshot).\n * Mirrors the web `tool-friendly-title` rules so IM/TUI and gateway stay aligned.\n */\n\nconst MAX_DETAIL_LEN = 120;\n\nexport function workflowStepLabel(\n toolName: string,\n args: Record<string, unknown>,\n): { label: string; detail?: string } {\n const n = toolName.toLowerCase().replace(/-/g, '_').trim();\n let label = toolName.trim() || 'tool';\n if (n === 'shell') label = 'Run command';\n else if (n === 'list_dir' || n === 'ls') label = 'List directory';\n else if (n === 'write_file') label = 'Write file';\n else if (n === 'edit_file') label = 'Edit file';\n else if (n === 'web_fetch') label = 'Fetch URL';\n else if (n === 'open_url') label = 'Open URL';\n else if (n === 'web_search' || n === 'brave_search' || n.includes('search')) label = 'Search web';\n else if (n === 'read_file' || n.includes('read_file') || n.includes('file_read')) label = 'Read file';\n else if (n === 'grep' || n === 'rg') label = 'Search files';\n else if (n === 'delegate_task' || n === 'workflow') label = toolName;\n\n const detail = extractStepDetail(n, args);\n return detail ? { label, detail } : { label };\n}\n\nfunction extractStepDetail(toolKey: string, args: Record<string, unknown>): string | undefined {\n const pathKeys = ['path', 'file_path', 'filePath', 'target_file', 'targetFile'];\n for (const key of pathKeys) {\n const v = args[key];\n if (typeof v === 'string' && v.trim()) return truncate(v.trim());\n }\n if (toolKey === 'shell' && typeof args.command === 'string' && args.command.trim()) {\n return truncate(args.command.trim());\n }\n if (\n (toolKey.includes('search') || toolKey === 'grep' || toolKey === 'rg') &&\n typeof args.query === 'string' &&\n args.query.trim()\n ) {\n return truncate(args.query.trim());\n }\n if (typeof args.url === 'string' && args.url.trim()) return truncate(args.url.trim());\n return undefined;\n}\n\nfunction truncate(text: string): string {\n if (text.length <= MAX_DETAIL_LEN) return text;\n return `${text.slice(0, MAX_DETAIL_LEN - 1)}…`;\n}\n"],"mappings":";;;;;AAKA,MAAM,iBAAiB;AAEvB,SAAgB,kBACd,UACA,MACoC;CACpC,MAAM,IAAI,SAAS,aAAa,CAAC,QAAQ,MAAM,IAAI,CAAC,MAAM;CAC1D,IAAI,QAAQ,SAAS,MAAM,IAAI;AAC/B,KAAI,MAAM,QAAS,SAAQ;UAClB,MAAM,cAAc,MAAM,KAAM,SAAQ;UACxC,MAAM,aAAc,SAAQ;UAC5B,MAAM,YAAa,SAAQ;UAC3B,MAAM,YAAa,SAAQ;UAC3B,MAAM,WAAY,SAAQ;UAC1B,MAAM,gBAAgB,MAAM,kBAAkB,EAAE,SAAS,SAAS,CAAE,SAAQ;UAC5E,MAAM,eAAe,EAAE,SAAS,YAAY,IAAI,EAAE,SAAS,YAAY,CAAE,SAAQ;UACjF,MAAM,UAAU,MAAM,KAAM,SAAQ;UACpC,MAAM,mBAAmB,MAAM,WAAY,SAAQ;CAE5D,MAAM,SAAS,kBAAkB,GAAG,KAAK;AACzC,QAAO,SAAS;EAAE;EAAO;EAAQ,GAAG,EAAE,OAAO;;AAG/C,SAAS,kBAAkB,SAAiB,MAAmD;AAE7F,MAAK,MAAM,OAAO;EADA;EAAQ;EAAa;EAAY;EAAe;EACxC,EAAE;EAC1B,MAAM,IAAI,KAAK;AACf,MAAI,OAAO,MAAM,YAAY,EAAE,MAAM,CAAE,QAAO,SAAS,EAAE,MAAM,CAAC;;AAElE,KAAI,YAAY,WAAW,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,MAAM,CAChF,QAAO,SAAS,KAAK,QAAQ,MAAM,CAAC;AAEtC,MACG,QAAQ,SAAS,SAAS,IAAI,YAAY,UAAU,YAAY,SACjE,OAAO,KAAK,UAAU,YACtB,KAAK,MAAM,MAAM,CAEjB,QAAO,SAAS,KAAK,MAAM,MAAM,CAAC;AAEpC,KAAI,OAAO,KAAK,QAAQ,YAAY,KAAK,IAAI,MAAM,CAAE,QAAO,SAAS,KAAK,IAAI,MAAM,CAAC;;AAIvF,SAAS,SAAS,MAAsB;AACtC,KAAI,KAAK,UAAU,eAAgB,QAAO;AAC1C,QAAO,GAAG,KAAK,MAAM,GAAG,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"step-labels.js","names":[],"sources":["../../../../src/agent/workflow/step-labels.ts"],"sourcesContent":["/**\n * Human-readable labels for workflow subagent tool steps (server-side snapshot).\n * Mirrors the web `tool-friendly-title` rules so IM/TUI and gateway stay aligned.\n */\n\nconst MAX_DETAIL_LEN = 120;\n\nexport function workflowStepLabel(\n toolName: string,\n args: Record<string, unknown>,\n): { label: string; detail?: string } {\n const n = toolName.toLowerCase().replace(/-/g, '_').trim();\n let label = toolName.trim() || 'tool';\n if (n === 'shell') label = 'Run command';\n else if (n === 'list_dir' || n === 'ls') label = 'List directory';\n else if (n === 'write_file') label = 'Write file';\n else if (n === 'edit_file') label = 'Edit file';\n else if (n === 'web_fetch') label = 'Fetch URL';\n else if (n === 'open_url') label = 'Open URL';\n else if (n === 'grep' || n === 'rg' || n === 'file_grep') label = 'Search files';\n else if (n === 'web_search' || n === 'brave_search' || n.includes('search')) label = 'Search web';\n else if (n === 'read_file' || n.includes('read_file') || n.includes('file_read')) label = 'Read file';\n else if (n === 'delegate_task' || n === 'workflow') label = toolName;\n\n const detail = extractStepDetail(n, args);\n return detail ? { label, detail } : { label };\n}\n\nfunction extractStepDetail(toolKey: string, args: Record<string, unknown>): string | undefined {\n const pathKeys = ['path', 'file_path', 'filePath', 'target_file', 'targetFile'];\n for (const key of pathKeys) {\n const v = args[key];\n if (typeof v === 'string' && v.trim()) return truncate(v.trim());\n }\n if (toolKey === 'shell' && typeof args.command === 'string' && args.command.trim()) {\n return truncate(args.command.trim());\n }\n if (\n (toolKey.includes('search') || toolKey === 'grep' || toolKey === 'rg' || toolKey === 'file_grep') &&\n typeof args.query === 'string' &&\n args.query.trim()\n ) {\n return truncate(args.query.trim());\n }\n if (typeof args.url === 'string' && args.url.trim()) return truncate(args.url.trim());\n return undefined;\n}\n\nfunction truncate(text: string): string {\n if (text.length <= MAX_DETAIL_LEN) return text;\n return `${text.slice(0, MAX_DETAIL_LEN - 1)}…`;\n}\n"],"mappings":";;;;;AAKA,MAAM,iBAAiB;AAEvB,SAAgB,kBACd,UACA,MACoC;CACpC,MAAM,IAAI,SAAS,aAAa,CAAC,QAAQ,MAAM,IAAI,CAAC,MAAM;CAC1D,IAAI,QAAQ,SAAS,MAAM,IAAI;AAC/B,KAAI,MAAM,QAAS,SAAQ;UAClB,MAAM,cAAc,MAAM,KAAM,SAAQ;UACxC,MAAM,aAAc,SAAQ;UAC5B,MAAM,YAAa,SAAQ;UAC3B,MAAM,YAAa,SAAQ;UAC3B,MAAM,WAAY,SAAQ;UAC1B,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAa,SAAQ;UACzD,MAAM,gBAAgB,MAAM,kBAAkB,EAAE,SAAS,SAAS,CAAE,SAAQ;UAC5E,MAAM,eAAe,EAAE,SAAS,YAAY,IAAI,EAAE,SAAS,YAAY,CAAE,SAAQ;UACjF,MAAM,mBAAmB,MAAM,WAAY,SAAQ;CAE5D,MAAM,SAAS,kBAAkB,GAAG,KAAK;AACzC,QAAO,SAAS;EAAE;EAAO;EAAQ,GAAG,EAAE,OAAO;;AAG/C,SAAS,kBAAkB,SAAiB,MAAmD;AAE7F,MAAK,MAAM,OAAO;EADA;EAAQ;EAAa;EAAY;EAAe;EACxC,EAAE;EAC1B,MAAM,IAAI,KAAK;AACf,MAAI,OAAO,MAAM,YAAY,EAAE,MAAM,CAAE,QAAO,SAAS,EAAE,MAAM,CAAC;;AAElE,KAAI,YAAY,WAAW,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,MAAM,CAChF,QAAO,SAAS,KAAK,QAAQ,MAAM,CAAC;AAEtC,MACG,QAAQ,SAAS,SAAS,IAAI,YAAY,UAAU,YAAY,QAAQ,YAAY,gBACrF,OAAO,KAAK,UAAU,YACtB,KAAK,MAAM,MAAM,CAEjB,QAAO,SAAS,KAAK,MAAM,MAAM,CAAC;AAEpC,KAAI,OAAO,KAAK,QAAQ,YAAY,KAAK,IAAI,MAAM,CAAE,QAAO,SAAS,KAAK,IAAI,MAAM,CAAC;;AAIvF,SAAS,SAAS,MAAsB;AACtC,KAAI,KAAK,UAAU,eAAgB,QAAO;AAC1C,QAAO,GAAG,KAAK,MAAM,GAAG,iBAAiB,EAAE,CAAC"}
@@ -122,7 +122,9 @@ function mapChildProgressEvent(event) {
122
122
  type: "tool_end",
123
123
  toolCallId: event.toolCallId ?? "",
124
124
  toolName: event.toolName ?? "tool",
125
- isError: Boolean(event.isError)
125
+ isError: Boolean(event.isError),
126
+ resultPreview: event.resultPreview,
127
+ error: event.error
126
128
  };
127
129
  case "iteration": return {
128
130
  type: "iteration",
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-runner.js","names":[],"sources":["../../../../src/agent/workflow/subagent-runner.ts"],"sourcesContent":["/**\n * Adapter: spawns one isolated child agent per `agent()` call from a workflow.\n *\n * Wraps the existing `createDelegateChildHandle` so the workflow runtime stays\n * decoupled from the LLM stack (it sees only the `SubagentRunner` interface).\n *\n * Key behaviour:\n * - When `opts.schema` is provided, we inject `structured_output` into the child\n * tool set and unwrap the captured value on success. If the subagent finishes\n * without ever calling `structured_output`, we treat it as failure (`null`).\n * - Failures and aborts resolve to `null`. The workflow runtime continues — this\n * matches the pi-dynamic-workflows contract and keeps fan-out pipelines robust.\n * - We do NOT mutate `createDelegateChildHandle` — we just leverage its\n * `buildChildTools` injection point.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n type BuildChildToolsOptions,\n createDelegateChildHandle,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\nimport {\n DEFAULT_DELEGATE_TOOLS,\n DELEGATE_BLOCKED_TOOLS,\n} from '../tools/delegate-tool.js';\nimport type { ToolExecutorConfig } from '../tools/executor.js';\n\nimport {\n createStructuredOutputTool,\n STRUCTURED_OUTPUT_TOOL_NAME,\n type StructuredOutputCapture,\n} from './structured-output-tool.js';\nimport type { SubagentRunOptions, SubagentRunner, SubagentProgressEvent } from './types.js';\n\nconst log = createLogger('workflow-subagent-runner');\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport interface DelegateSubagentRunnerDeps {\n workspace: string;\n bus: MessageBus;\n /** Resolves the default subagent model (typically the parent agent's primary model). */\n getDefaultModel: () => Model<Api>;\n getConfig: () => Config | undefined;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /**\n * Provided by the workflow tool from `AgentToolsFactory` — mirrors how\n * `delegate-tool` is wired (avoids importing `tools/factory.ts` here and\n * breaking the existing factory ↔ delegate-tool ↔ child-agent-factory\n * dependency contract).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\nexport class DelegateSubagentRunner implements SubagentRunner {\n constructor(private readonly deps: DelegateSubagentRunnerDeps) {}\n\n async run<T = string>(prompt: string, opts: SubagentRunOptions<T>): Promise<T | null> {\n if (opts.signal?.aborted) return null;\n\n const capture: StructuredOutputCapture<T> = { called: false, value: undefined };\n const wantStructured = Boolean(opts.schema);\n\n const allowed = resolveAllowedToolNames(opts.allowedToolNames, wantStructured);\n const model = opts.model ?? safeResolveDefaultModel(this.deps.getDefaultModel);\n if (!model) {\n log.warn({ label: opts.label }, 'subagent run skipped: no primary model resolved');\n return null;\n }\n\n const fullPrompt = buildPrompt(prompt, opts, wantStructured);\n const streamMode = resolveSubagentStreamMode(this.deps.getConfig);\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: this.deps.workspace,\n goal: fullPrompt,\n allowedToolNames: allowed,\n maxIterations: opts.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n model,\n bus: this.deps.bus,\n getConfig: this.deps.getConfig,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n buildChildTools: (childOpts) => {\n const base = this.deps.buildChildTools(childOpts);\n if (!wantStructured || !opts.schema) return base;\n // Replace any existing tool with the same name so the per-run capture wins.\n const filtered = base.filter((t) => t.name !== STRUCTURED_OUTPUT_TOOL_NAME);\n return [\n ...filtered,\n createStructuredOutputTool({ schema: opts.schema, capture }) as unknown as AgentTool<any, any>,\n ];\n },\n progressHooks:\n opts.onProgress && streamMode !== 'off'\n ? {\n mode: streamMode === 'full' ? 'full' : 'steps',\n onProgress: (event) => {\n opts.onProgress?.(mapChildProgressEvent(event));\n },\n }\n : undefined,\n };\n\n const handle = createDelegateChildHandle(childOptions);\n const onAbort = () => handle.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const { summary } = await handle.run();\n if (opts.signal?.aborted) return null;\n\n if (wantStructured) {\n if (!capture.called) {\n log.warn({ label: opts.label }, 'subagent finished without calling structured_output');\n return null;\n }\n return capture.value as T;\n }\n return summary as unknown as T;\n } catch (e) {\n if (opts.rethrow) throw e;\n const msg = e instanceof Error ? e.message : String(e);\n log.warn({ err: e, label: opts.label, errorMessage: msg }, `subagent run failed: ${msg}`);\n return null;\n } finally {\n opts.signal?.removeEventListener('abort', onAbort);\n }\n }\n}\n\nfunction resolveAllowedToolNames(\n requested: string[] | undefined,\n wantStructured: boolean,\n): string[] {\n const base = requested && requested.length > 0 ? requested : [...DEFAULT_DELEGATE_TOOLS];\n const filtered = base\n .map((s) => String(s).trim())\n .filter((s) => s.length > 0)\n .filter((s) => !DELEGATE_BLOCKED_TOOLS.has(s));\n if (wantStructured && !filtered.includes(STRUCTURED_OUTPUT_TOOL_NAME)) {\n filtered.push(STRUCTURED_OUTPUT_TOOL_NAME);\n }\n return [...new Set(filtered)];\n}\n\nfunction buildPrompt(prompt: string, opts: SubagentRunOptions<unknown>, structured: boolean): string {\n const parts: string[] = [];\n if (opts.instructions?.trim()) parts.push(opts.instructions.trim());\n if (opts.label) parts.push(`Task label: ${opts.label}`);\n if (opts.phase) parts.push(`Workflow phase: ${opts.phase}`);\n parts.push(prompt);\n if (structured) {\n parts.push(\n [\n 'Final output contract:',\n '- Your final action MUST be a structured_output tool call.',\n '- The structured_output arguments are the return value of this subagent.',\n '- Do not emit a prose final answer instead of structured_output.',\n '- If you need to inspect files or run commands first, do so, then call structured_output exactly once.',\n ].join('\\n'),\n );\n }\n return parts.join('\\n\\n');\n}\n\nfunction safeResolveDefaultModel(get: () => Model<Api>): Model<Api> | null {\n try {\n return get();\n } catch (e) {\n log.warn({ err: e }, 'failed to resolve default subagent model');\n return null;\n }\n}\n\nfunction resolveSubagentStreamMode(\n getConfig: () => Config | undefined,\n): 'off' | 'steps' | 'full' {\n const mode = getConfig()?.agents?.defaults?.workflow?.subagentStream;\n if (mode === 'off' || mode === 'steps' || mode === 'full') return mode;\n return 'steps';\n}\n\nfunction mapChildProgressEvent(event: {\n type: 'tool_start' | 'tool_end' | 'iteration' | 'text_delta' | 'thinking_delta';\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n isError?: boolean;\n count?: number;\n max?: number;\n delta?: string;\n}): SubagentProgressEvent {\n switch (event.type) {\n case 'tool_start':\n return {\n type: 'tool_start',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n args: event.args ?? {},\n };\n case 'tool_end':\n return {\n type: 'tool_end',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n isError: Boolean(event.isError),\n };\n case 'iteration':\n return {\n type: 'iteration',\n count: event.count ?? 0,\n max: event.max ?? 0,\n };\n case 'text_delta':\n return { type: 'text_delta', delta: event.delta ?? '' };\n case 'thinking_delta':\n return { type: 'thinking_delta', delta: event.delta ?? '' };\n default:\n return { type: 'text_delta', delta: '' };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"subagent-runner.js","names":[],"sources":["../../../../src/agent/workflow/subagent-runner.ts"],"sourcesContent":["/**\n * Adapter: spawns one isolated child agent per `agent()` call from a workflow.\n *\n * Wraps the existing `createDelegateChildHandle` so the workflow runtime stays\n * decoupled from the LLM stack (it sees only the `SubagentRunner` interface).\n *\n * Key behaviour:\n * - When `opts.schema` is provided, we inject `structured_output` into the child\n * tool set and unwrap the captured value on success. If the subagent finishes\n * without ever calling `structured_output`, we treat it as failure (`null`).\n * - Failures and aborts resolve to `null`. The workflow runtime continues — this\n * matches the pi-dynamic-workflows contract and keeps fan-out pipelines robust.\n * - We do NOT mutate `createDelegateChildHandle` — we just leverage its\n * `buildChildTools` injection point.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n type BuildChildToolsOptions,\n createDelegateChildHandle,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\nimport {\n DEFAULT_DELEGATE_TOOLS,\n DELEGATE_BLOCKED_TOOLS,\n} from '../tools/delegate-tool.js';\nimport type { ToolExecutorConfig } from '../tools/executor.js';\n\nimport {\n createStructuredOutputTool,\n STRUCTURED_OUTPUT_TOOL_NAME,\n type StructuredOutputCapture,\n} from './structured-output-tool.js';\nimport type { SubagentRunOptions, SubagentRunner, SubagentProgressEvent } from './types.js';\n\nconst log = createLogger('workflow-subagent-runner');\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport interface DelegateSubagentRunnerDeps {\n workspace: string;\n bus: MessageBus;\n /** Resolves the default subagent model (typically the parent agent's primary model). */\n getDefaultModel: () => Model<Api>;\n getConfig: () => Config | undefined;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /**\n * Provided by the workflow tool from `AgentToolsFactory` — mirrors how\n * `delegate-tool` is wired (avoids importing `tools/factory.ts` here and\n * breaking the existing factory ↔ delegate-tool ↔ child-agent-factory\n * dependency contract).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\nexport class DelegateSubagentRunner implements SubagentRunner {\n constructor(private readonly deps: DelegateSubagentRunnerDeps) {}\n\n async run<T = string>(prompt: string, opts: SubagentRunOptions<T>): Promise<T | null> {\n if (opts.signal?.aborted) return null;\n\n const capture: StructuredOutputCapture<T> = { called: false, value: undefined };\n const wantStructured = Boolean(opts.schema);\n\n const allowed = resolveAllowedToolNames(opts.allowedToolNames, wantStructured);\n const model = opts.model ?? safeResolveDefaultModel(this.deps.getDefaultModel);\n if (!model) {\n log.warn({ label: opts.label }, 'subagent run skipped: no primary model resolved');\n return null;\n }\n\n const fullPrompt = buildPrompt(prompt, opts, wantStructured);\n const streamMode = resolveSubagentStreamMode(this.deps.getConfig);\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: this.deps.workspace,\n goal: fullPrompt,\n allowedToolNames: allowed,\n maxIterations: opts.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n model,\n bus: this.deps.bus,\n getConfig: this.deps.getConfig,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n buildChildTools: (childOpts) => {\n const base = this.deps.buildChildTools(childOpts);\n if (!wantStructured || !opts.schema) return base;\n // Replace any existing tool with the same name so the per-run capture wins.\n const filtered = base.filter((t) => t.name !== STRUCTURED_OUTPUT_TOOL_NAME);\n return [\n ...filtered,\n createStructuredOutputTool({ schema: opts.schema, capture }) as unknown as AgentTool<any, any>,\n ];\n },\n progressHooks:\n opts.onProgress && streamMode !== 'off'\n ? {\n mode: streamMode === 'full' ? 'full' : 'steps',\n onProgress: (event) => {\n opts.onProgress?.(mapChildProgressEvent(event));\n },\n }\n : undefined,\n };\n\n const handle = createDelegateChildHandle(childOptions);\n const onAbort = () => handle.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const { summary } = await handle.run();\n if (opts.signal?.aborted) return null;\n\n if (wantStructured) {\n if (!capture.called) {\n log.warn({ label: opts.label }, 'subagent finished without calling structured_output');\n return null;\n }\n return capture.value as T;\n }\n return summary as unknown as T;\n } catch (e) {\n if (opts.rethrow) throw e;\n const msg = e instanceof Error ? e.message : String(e);\n log.warn({ err: e, label: opts.label, errorMessage: msg }, `subagent run failed: ${msg}`);\n return null;\n } finally {\n opts.signal?.removeEventListener('abort', onAbort);\n }\n }\n}\n\nfunction resolveAllowedToolNames(\n requested: string[] | undefined,\n wantStructured: boolean,\n): string[] {\n const base = requested && requested.length > 0 ? requested : [...DEFAULT_DELEGATE_TOOLS];\n const filtered = base\n .map((s) => String(s).trim())\n .filter((s) => s.length > 0)\n .filter((s) => !DELEGATE_BLOCKED_TOOLS.has(s));\n if (wantStructured && !filtered.includes(STRUCTURED_OUTPUT_TOOL_NAME)) {\n filtered.push(STRUCTURED_OUTPUT_TOOL_NAME);\n }\n return [...new Set(filtered)];\n}\n\nfunction buildPrompt(prompt: string, opts: SubagentRunOptions<unknown>, structured: boolean): string {\n const parts: string[] = [];\n if (opts.instructions?.trim()) parts.push(opts.instructions.trim());\n if (opts.label) parts.push(`Task label: ${opts.label}`);\n if (opts.phase) parts.push(`Workflow phase: ${opts.phase}`);\n parts.push(prompt);\n if (structured) {\n parts.push(\n [\n 'Final output contract:',\n '- Your final action MUST be a structured_output tool call.',\n '- The structured_output arguments are the return value of this subagent.',\n '- Do not emit a prose final answer instead of structured_output.',\n '- If you need to inspect files or run commands first, do so, then call structured_output exactly once.',\n ].join('\\n'),\n );\n }\n return parts.join('\\n\\n');\n}\n\nfunction safeResolveDefaultModel(get: () => Model<Api>): Model<Api> | null {\n try {\n return get();\n } catch (e) {\n log.warn({ err: e }, 'failed to resolve default subagent model');\n return null;\n }\n}\n\nfunction resolveSubagentStreamMode(\n getConfig: () => Config | undefined,\n): 'off' | 'steps' | 'full' {\n const mode = getConfig()?.agents?.defaults?.workflow?.subagentStream;\n if (mode === 'off' || mode === 'steps' || mode === 'full') return mode;\n return 'steps';\n}\n\nfunction mapChildProgressEvent(event: {\n type: 'tool_start' | 'tool_end' | 'iteration' | 'text_delta' | 'thinking_delta';\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n isError?: boolean;\n resultPreview?: string;\n error?: string;\n count?: number;\n max?: number;\n delta?: string;\n}): SubagentProgressEvent {\n switch (event.type) {\n case 'tool_start':\n return {\n type: 'tool_start',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n args: event.args ?? {},\n };\n case 'tool_end':\n return {\n type: 'tool_end',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n isError: Boolean(event.isError),\n resultPreview: event.resultPreview,\n error: event.error,\n };\n case 'iteration':\n return {\n type: 'iteration',\n count: event.count ?? 0,\n max: event.max ?? 0,\n };\n case 'text_delta':\n return { type: 'text_delta', delta: event.delta ?? '' };\n case 'thinking_delta':\n return { type: 'thinking_delta', delta: event.delta ?? '' };\n default:\n return { type: 'text_delta', delta: '' };\n }\n}\n"],"mappings":"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"}