@cursor/bdk 0.2.14 → 0.2.16

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 (392) hide show
  1. package/AGENTS.md +51 -52
  2. package/README.md +1 -1
  3. package/dist/bin/agent-sdk.js +0 -0
  4. package/dist/bin/agent-serve.js +41 -3
  5. package/dist/channels/github/index.d.ts +1 -1
  6. package/dist/channels/github/index.d.ts.map +1 -1
  7. package/dist/channels/github/index.js +1 -1
  8. package/dist/channels/slack/attachments.d.ts +2 -0
  9. package/dist/channels/slack/attachments.d.ts.map +1 -1
  10. package/dist/channels/slack/attachments.js +17 -5
  11. package/dist/channels/slack/channel-watch.d.ts +4 -2
  12. package/dist/channels/slack/channel-watch.d.ts.map +1 -1
  13. package/dist/channels/slack/channel-watch.js +4 -2
  14. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  15. package/dist/channels/slack/slack-channel.js +4 -2
  16. package/dist/channels/slack/types.d.ts +6 -4
  17. package/dist/channels/slack/types.d.ts.map +1 -1
  18. package/dist/connections.d.ts +29 -0
  19. package/dist/connections.d.ts.map +1 -1
  20. package/dist/connections.js +54 -0
  21. package/dist/docs/404.html +2 -2
  22. package/dist/docs/assets/{app.BN3sgOOo.js → app.BSrZkTHD.js} +4 -4
  23. package/dist/docs/assets/{building-with-agents.md.Df87rAe1.js → building-with-agents.md.Bi9CQ-bR.js} +3 -3
  24. package/dist/docs/assets/{building-with-agents.md.Df87rAe1.lean.js → building-with-agents.md.Bi9CQ-bR.lean.js} +1 -1
  25. package/dist/docs/assets/chunks/@localSearchIndexroot.JUnN1Be1.js +1 -0
  26. package/dist/docs/assets/chunks/{VPLocalSearchBox.CbA00dML.js → VPLocalSearchBox.BxmgcwIX.js} +1 -1
  27. package/dist/docs/assets/chunks/{arc.Byug8CZM.js → arc.CAid9y9R.js} +1 -1
  28. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.D1_qmnQy.js → architectureDiagram-Q4EWVU46.kLxg-1A5.js} +1 -1
  29. package/dist/docs/assets/chunks/{baseUniq.Dj-Nurf-.js → baseUniq.BWvpjFlO.js} +1 -1
  30. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.BZwq3EIg.js → blockDiagram-DXYQGD6D.DyjX8R7M.js} +1 -1
  31. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.dx75urO7.js → c4Diagram-AHTNJAMY.DBdWlnqr.js} +1 -1
  32. package/dist/docs/assets/chunks/channel.CWc3NN9g.js +1 -0
  33. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CIoddsDQ.js → chunk-4BX2VUAB.T5enPS2D.js} +1 -1
  34. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.O3VsVBES.js → chunk-4TB4RGXK.D6zswRAS.js} +1 -1
  35. package/dist/docs/assets/chunks/{chunk-55IACEB6.WNNWh0Pe.js → chunk-55IACEB6.Bh05N-a3.js} +1 -1
  36. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BKVQwEME.js → chunk-EDXVE4YY.DZv_O-d9.js} +1 -1
  37. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.Cv5iBz7A.js → chunk-FMBD7UC4.BY53CZaL.js} +1 -1
  38. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.wCDCToee.js → chunk-OYMX7WX6.CO5lI2PE.js} +1 -1
  39. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D3IGXhXA.js → chunk-QZHKN3VN.DMfpW0s4.js} +1 -1
  40. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CAPPh-E7.js → chunk-YZCP3GAM.COPT56Nr.js} +1 -1
  41. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D5a745iS.js +1 -0
  42. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D5a745iS.js +1 -0
  43. package/dist/docs/assets/chunks/clone.CCGVqN_B.js +1 -0
  44. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BQCFH3M5.js → cose-bilkent-S5V4N54A.BJSj7zzd.js} +1 -1
  45. package/dist/docs/assets/chunks/{dagre-KV5264BT.lHmdrh7L.js → dagre-KV5264BT.DDv7IQZT.js} +1 -1
  46. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.EtSPnHgD.js → diagram-5BDNPKRD.BUoE9HFH.js} +1 -1
  47. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DCyUnQT8.js → diagram-G4DWMVQ6.BF3JtrnJ.js} +1 -1
  48. package/dist/docs/assets/chunks/{diagram-MMDJMWI5._E0Qqblb.js → diagram-MMDJMWI5.BvuCWc4e.js} +1 -1
  49. package/dist/docs/assets/chunks/{diagram-TYMM5635.BDj4oyy_.js → diagram-TYMM5635._EqUGqFN.js} +1 -1
  50. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.CrvnO6a3.js → erDiagram-SMLLAGMA.DxNvSdzj.js} +1 -1
  51. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.DIhYc-2F.js → flowDiagram-DWJPFMVM.DVtRP546.js} +1 -1
  52. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.hFqm_vio.js → ganttDiagram-T4ZO3ILL.Bn9vb7xI.js} +1 -1
  53. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.N3GDaVDD.js → gitGraphDiagram-UUTBAWPF.45r6n737.js} +1 -1
  54. package/dist/docs/assets/chunks/{graph.DK28rMBx.js → graph.BOkX3Ws_.js} +1 -1
  55. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.DHmE6W9M.js → infoDiagram-42DDH7IO.DyBCcxOm.js} +1 -1
  56. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.ByUJuOYm.js → ishikawaDiagram-UXIWVN3A.kg0ywDlx.js} +1 -1
  57. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BIUChFMh.js → journeyDiagram-VCZTEJTY.BUfrLnXA.js} +1 -1
  58. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.CNgFXwo-.js → kanban-definition-6JOO6SKY.Bn7X35b2.js} +1 -1
  59. package/dist/docs/assets/chunks/{layout.BDnwE4ET.js → layout.B0QW6d8M.js} +1 -1
  60. package/dist/docs/assets/chunks/{linear.DmrYLXFs.js → linear.C59eCF0D.js} +1 -1
  61. package/dist/docs/assets/chunks/{min.BbYcWakN.js → min.BnDl0p08.js} +1 -1
  62. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.C9x-klkv.js → mindmap-definition-QFDTVHPH.u2HYLooo.js} +1 -1
  63. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.iufpEbi0.js → pieDiagram-DEJITSTG.CbnIrr9l.js} +1 -1
  64. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DdoXbWL9.js → quadrantDiagram-34T5L4WZ.D2zWIixq.js} +1 -1
  65. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.XL1-_pNk.js → requirementDiagram-MS252O5E.DvOFa3oO.js} +1 -1
  66. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DySXofNs.js → sankeyDiagram-XADWPNL6.BfKCkH3x.js} +1 -1
  67. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Cp0GZoOU.js → sequenceDiagram-FGHM5R23.CUPKdYN0.js} +1 -1
  68. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.DvK-sXUX.js → stateDiagram-FHFEXIEX.CimDCRiK.js} +1 -1
  69. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.ClNUVSTQ.js +1 -0
  70. package/dist/docs/assets/chunks/{theme.Clup4iIo.js → theme.CKht7z82.js} +2 -2
  71. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.gHI9ZLm6.js → timeline-definition-GMOUNBTQ.BFTd5qKs.js} +1 -1
  72. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.G2N2zXYe.js → vennDiagram-DHZGUBPP.N6t5MmCb.js} +1 -1
  73. package/dist/docs/assets/chunks/wardley-RL74JXVD.D2G6Zyds.js +162 -0
  74. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.BgUKEagd.js → wardleyDiagram-NUSXRM2D.BqScALbL.js} +1 -1
  75. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CwH7oege.js → xychartDiagram-5P7HB3ND.Br0WiDkT.js} +1 -1
  76. package/dist/docs/assets/deployment.md.hKKN9I4c.js +31 -0
  77. package/dist/docs/assets/{deployment.md.BYuEcDBv.lean.js → deployment.md.hKKN9I4c.lean.js} +1 -1
  78. package/dist/docs/assets/{evals.md.C851kViu.js → evals.md.CHR34K1Y.js} +3 -7
  79. package/dist/docs/assets/{evals.md.C851kViu.lean.js → evals.md.CHR34K1Y.lean.js} +1 -1
  80. package/dist/docs/assets/guides_cloud-agents.md.CBK7W0-O.js +9 -0
  81. package/dist/docs/assets/guides_cloud-agents.md.CBK7W0-O.lean.js +1 -0
  82. package/dist/docs/assets/guides_grokbot-agents.md.BwAykJ7U.js +15 -0
  83. package/dist/docs/assets/{guides_grokbot-agents.md.tD1smFhU.lean.js → guides_grokbot-agents.md.BwAykJ7U.lean.js} +1 -1
  84. package/dist/docs/assets/{guides_hooks.md.5Ce3NXxZ.js → guides_hooks.md.B_bKG1oA.js} +1 -1
  85. package/dist/docs/assets/{guides_improve.md.CRrYq22s.js → guides_improve.md.CZKVt1cT.js} +2 -3
  86. package/dist/docs/assets/{guides_improve.md.CRrYq22s.lean.js → guides_improve.md.CZKVt1cT.lean.js} +1 -1
  87. package/dist/docs/assets/{guides_mcp-oauth.md.DR3zhC9r.js → guides_mcp-oauth.md.BM_eFC0L.js} +3 -15
  88. package/dist/docs/assets/guides_mcp-oauth.md.BM_eFC0L.lean.js +1 -0
  89. package/dist/docs/assets/{guides_webhooks.md.BBvAm_VF.js → guides_webhooks.md.Cpdc3BDX.js} +13 -12
  90. package/dist/docs/assets/{guides_webhooks.md.BBvAm_VF.lean.js → guides_webhooks.md.Cpdc3BDX.lean.js} +1 -1
  91. package/dist/docs/assets/{index.md.Dxxr7pFa.js → index.md.BIBHIQtU.js} +1 -1
  92. package/dist/docs/assets/{quickstart.md.BK5gjHM2.js → quickstart.md.CduLGBAB.js} +1 -1
  93. package/dist/docs/assets/{reference_agent-config.md.DrtLxWgR.js → reference_agent-config.md.DYA6ge6t.js} +7 -4
  94. package/dist/docs/assets/{reference_agent-config.md.DrtLxWgR.lean.js → reference_agent-config.md.DYA6ge6t.lean.js} +1 -1
  95. package/dist/docs/assets/reference_channels.md.DYg0CLud.js +22 -0
  96. package/dist/docs/assets/{reference_channels.md.LbNIJBwd.lean.js → reference_channels.md.DYg0CLud.lean.js} +1 -1
  97. package/dist/docs/assets/{reference_cli.md.dYCAL2lB.js → reference_cli.md.2d2Y0O-d.js} +16 -13
  98. package/dist/docs/assets/{reference_cli.md.dYCAL2lB.lean.js → reference_cli.md.2d2Y0O-d.lean.js} +1 -1
  99. package/dist/docs/assets/{reference_connections.md.DLrgAd5f.js → reference_connections.md.CxbLpaaP.js} +4 -5
  100. package/dist/docs/assets/{reference_connections.md.DLrgAd5f.lean.js → reference_connections.md.CxbLpaaP.lean.js} +1 -1
  101. package/dist/docs/assets/{reference_evals.md.D5i8PuXJ.js → reference_evals.md.Ccwp4x3o.js} +4 -4
  102. package/dist/docs/assets/{reference_evals.md.D5i8PuXJ.lean.js → reference_evals.md.Ccwp4x3o.lean.js} +1 -1
  103. package/dist/docs/assets/{reference_hooks.md.B-eGa2km.js → reference_hooks.md.DbJC8mcZ.js} +1 -1
  104. package/dist/docs/assets/reference_http-api.md.CrqhTv6S.js +11 -0
  105. package/dist/docs/assets/{reference_http-api.md.DbFNOubV.lean.js → reference_http-api.md.CrqhTv6S.lean.js} +1 -1
  106. package/dist/docs/assets/reference_playground.md.q4MI-0td.js +1 -0
  107. package/dist/docs/assets/reference_playground.md.q4MI-0td.lean.js +1 -0
  108. package/dist/docs/assets/{reference_schedules.md.BuJ8fgMa.js → reference_schedules.md.03Ryy9ca.js} +5 -5
  109. package/dist/docs/assets/{reference_schedules.md.BuJ8fgMa.lean.js → reference_schedules.md.03Ryy9ca.lean.js} +1 -1
  110. package/dist/docs/assets/reference_sessions.md.C_uzIWuy.js +1 -0
  111. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C2GWh7g8.js} +4 -4
  112. package/dist/docs/assets/{reference_tools.md.DzIY9JzY.js → reference_tools.md.08XR7lIl.js} +3 -14
  113. package/dist/docs/assets/reference_tools.md.08XR7lIl.lean.js +1 -0
  114. package/dist/docs/assets/{templates_grokbot-agents.md.2sydjFiO.js → templates_grokbot-agents.md.DgpPEs7B.js} +1 -1
  115. package/dist/docs/assets/troubleshooting.md.PCafNCb5.js +1 -0
  116. package/dist/docs/assets/{troubleshooting.md.x-GBa7wN.lean.js → troubleshooting.md.PCafNCb5.lean.js} +1 -1
  117. package/dist/docs/building-with-agents.html +37 -37
  118. package/dist/docs/building-with-agents.md +5 -5
  119. package/dist/docs/deployment.html +43 -41
  120. package/dist/docs/deployment.md +70 -33
  121. package/dist/docs/evals.html +38 -42
  122. package/dist/docs/evals.md +1 -16
  123. package/dist/docs/guides/agent-to-agent.html +35 -35
  124. package/dist/docs/guides/bitbucket.html +35 -35
  125. package/dist/docs/guides/cloud-agents.html +38 -39
  126. package/dist/docs/guides/cloud-agents.md +2 -8
  127. package/dist/docs/guides/convert-automation.html +35 -35
  128. package/dist/docs/guides/github.html +35 -35
  129. package/dist/docs/guides/gitlab.html +35 -35
  130. package/dist/docs/guides/grokbot-agents.html +37 -38
  131. package/dist/docs/guides/grokbot-agents.md +9 -13
  132. package/dist/docs/guides/hooks.html +37 -37
  133. package/dist/docs/guides/hooks.md +0 -1
  134. package/dist/docs/guides/improve.html +37 -38
  135. package/dist/docs/guides/improve.md +4 -6
  136. package/dist/docs/guides/jev.html +35 -35
  137. package/dist/docs/guides/mcp-oauth.html +39 -51
  138. package/dist/docs/guides/mcp-oauth.md +17 -40
  139. package/dist/docs/guides/migrate.html +35 -35
  140. package/dist/docs/guides/opentelemetry.html +35 -35
  141. package/dist/docs/guides/slack.html +35 -35
  142. package/dist/docs/guides/webhooks.html +47 -46
  143. package/dist/docs/guides/webhooks.md +35 -18
  144. package/dist/docs/hashmap.json +1 -1
  145. package/dist/docs/hillclimbing.html +35 -35
  146. package/dist/docs/index.html +36 -36
  147. package/dist/docs/index.md +1 -1
  148. package/dist/docs/llms-full.txt +388 -272
  149. package/dist/docs/llms.txt +4 -4
  150. package/dist/docs/quickstart.html +37 -37
  151. package/dist/docs/quickstart.md +2 -2
  152. package/dist/docs/reference/agent-config.html +41 -38
  153. package/dist/docs/reference/agent-config.md +26 -1
  154. package/dist/docs/reference/artifacts.html +35 -35
  155. package/dist/docs/reference/channels.html +42 -43
  156. package/dist/docs/reference/channels.md +29 -13
  157. package/dist/docs/reference/cli.html +50 -47
  158. package/dist/docs/reference/cli.md +115 -42
  159. package/dist/docs/reference/connections.html +39 -40
  160. package/dist/docs/reference/connections.md +6 -5
  161. package/dist/docs/reference/evals.html +38 -38
  162. package/dist/docs/reference/evals.md +15 -4
  163. package/dist/docs/reference/extensions.html +35 -35
  164. package/dist/docs/reference/hooks.html +37 -37
  165. package/dist/docs/reference/hooks.md +0 -1
  166. package/dist/docs/reference/http-api.html +38 -38
  167. package/dist/docs/reference/http-api.md +7 -17
  168. package/dist/docs/reference/instructions.html +35 -35
  169. package/dist/docs/reference/playground.html +37 -37
  170. package/dist/docs/reference/playground.md +1 -4
  171. package/dist/docs/reference/project-layout.html +35 -35
  172. package/dist/docs/reference/prompt.html +35 -35
  173. package/dist/docs/reference/schedules.html +39 -39
  174. package/dist/docs/reference/schedules.md +26 -3
  175. package/dist/docs/reference/sessions.html +36 -36
  176. package/dist/docs/reference/sessions.md +1 -2
  177. package/dist/docs/reference/skills.html +39 -39
  178. package/dist/docs/reference/skills.md +1 -1
  179. package/dist/docs/reference/subagents.html +35 -35
  180. package/dist/docs/reference/tools.html +39 -50
  181. package/dist/docs/reference/tools.md +2 -28
  182. package/dist/docs/templates/agentic-owners.html +35 -35
  183. package/dist/docs/templates/grokbot-agents.html +37 -37
  184. package/dist/docs/templates/grokbot-agents.md +1 -1
  185. package/dist/docs/templates/security-reviewer.html +35 -35
  186. package/dist/docs/templates/thermo-quality-review.html +35 -35
  187. package/dist/docs/templates/thermo-review.html +35 -35
  188. package/dist/docs/templates/triage.html +35 -35
  189. package/dist/docs/troubleshooting.html +36 -36
  190. package/dist/docs/troubleshooting.md +12 -7
  191. package/dist/extensions/cursor-cloud-agents/extension.d.ts +5 -1
  192. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  193. package/dist/extensions/cursor-cloud-agents/extension.js +4 -0
  194. package/dist/extensions/cursor-cloud-agents/lib/channels.d.ts.map +1 -1
  195. package/dist/extensions/cursor-cloud-agents/lib/channels.js +5 -1
  196. package/dist/filesystem.d.ts.map +1 -1
  197. package/dist/filesystem.js +4 -8
  198. package/dist/internal/cli-convert-automation.js +9 -19
  199. package/dist/internal/cli-deploy.d.ts +1 -1
  200. package/dist/internal/cli-deploy.d.ts.map +1 -1
  201. package/dist/internal/cli-deploy.js +18 -3
  202. package/dist/internal/cli-init-grokbot.d.ts +29 -0
  203. package/dist/internal/cli-init-grokbot.d.ts.map +1 -0
  204. package/dist/internal/cli-init-grokbot.js +181 -0
  205. package/dist/internal/cli-slack.js +1 -1
  206. package/dist/internal/comment-safe.d.ts +8 -0
  207. package/dist/internal/comment-safe.d.ts.map +1 -0
  208. package/dist/internal/comment-safe.js +12 -0
  209. package/dist/internal/continuation-identity.js +1 -1
  210. package/dist/internal/convert-automation/convert-workflow.d.ts.map +1 -1
  211. package/dist/internal/convert-automation/convert-workflow.js +2 -14
  212. package/dist/internal/convert-grokbot/answers.d.ts +127 -0
  213. package/dist/internal/convert-grokbot/answers.d.ts.map +1 -0
  214. package/dist/internal/convert-grokbot/answers.js +443 -0
  215. package/dist/internal/convert-grokbot/bot.d.ts +50 -0
  216. package/dist/internal/convert-grokbot/bot.d.ts.map +1 -0
  217. package/dist/internal/convert-grokbot/bot.js +72 -0
  218. package/dist/internal/convert-grokbot/checks.d.ts +26 -0
  219. package/dist/internal/convert-grokbot/checks.d.ts.map +1 -0
  220. package/dist/internal/convert-grokbot/checks.js +170 -0
  221. package/dist/internal/convert-grokbot/convert.d.ts +60 -0
  222. package/dist/internal/convert-grokbot/convert.d.ts.map +1 -0
  223. package/dist/internal/convert-grokbot/convert.js +470 -0
  224. package/dist/internal/convert-grokbot/handoff.d.ts +44 -0
  225. package/dist/internal/convert-grokbot/handoff.d.ts.map +1 -0
  226. package/dist/internal/convert-grokbot/handoff.js +160 -0
  227. package/dist/internal/convert-grokbot/recipe.d.ts +61 -0
  228. package/dist/internal/convert-grokbot/recipe.d.ts.map +1 -0
  229. package/dist/internal/convert-grokbot/recipe.js +94 -0
  230. package/dist/internal/convert-grokbot/routine.d.ts +51 -0
  231. package/dist/internal/convert-grokbot/routine.d.ts.map +1 -0
  232. package/dist/internal/convert-grokbot/routine.js +128 -0
  233. package/dist/internal/convert-grokbot/slack.d.ts +28 -0
  234. package/dist/internal/convert-grokbot/slack.d.ts.map +1 -0
  235. package/dist/internal/convert-grokbot/slack.js +50 -0
  236. package/dist/internal/deploy-client.d.ts +0 -2
  237. package/dist/internal/deploy-client.d.ts.map +1 -1
  238. package/dist/internal/deploy-client.js +2 -11
  239. package/dist/internal/discovery/agent-config.d.ts +6 -0
  240. package/dist/internal/discovery/agent-config.d.ts.map +1 -1
  241. package/dist/internal/discovery/agent-config.js +19 -0
  242. package/dist/internal/discovery/agent.d.ts.map +1 -1
  243. package/dist/internal/discovery/agent.js +2 -1
  244. package/dist/internal/discovery/names.d.ts +2 -0
  245. package/dist/internal/discovery/names.d.ts.map +1 -1
  246. package/dist/internal/discovery/names.js +2 -0
  247. package/dist/internal/discovery/project.d.ts.map +1 -1
  248. package/dist/internal/discovery/project.js +1 -3
  249. package/dist/internal/eval-judge-model.d.ts +10 -5
  250. package/dist/internal/eval-judge-model.d.ts.map +1 -1
  251. package/dist/internal/eval-judge-model.js +36 -25
  252. package/dist/internal/filesystem/subagent-inherit.d.ts +39 -0
  253. package/dist/internal/filesystem/subagent-inherit.d.ts.map +1 -0
  254. package/dist/internal/filesystem/subagent-inherit.js +96 -0
  255. package/dist/internal/filesystem/tools.d.ts +6 -0
  256. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  257. package/dist/internal/filesystem/tools.js +38 -1
  258. package/dist/internal/hosted-catch-protocol.d.ts +2 -0
  259. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  260. package/dist/internal/hosted-catch-protocol.js +2 -0
  261. package/dist/internal/hosted-catch.d.ts +2 -3
  262. package/dist/internal/hosted-catch.d.ts.map +1 -1
  263. package/dist/internal/hosted-catch.js +2 -3
  264. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  265. package/dist/internal/hosted-delivery.js +46 -13
  266. package/dist/internal/hosted-execution-flush.d.ts +6 -3
  267. package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
  268. package/dist/internal/hosted-execution-flush.js +28 -31
  269. package/dist/internal/hosting.d.ts +1 -1
  270. package/dist/internal/hosting.d.ts.map +1 -1
  271. package/dist/internal/hosting.js +7 -3
  272. package/dist/internal/init-interview.d.ts +3 -5
  273. package/dist/internal/init-interview.d.ts.map +1 -1
  274. package/dist/internal/init-interview.js +15 -88
  275. package/dist/internal/init-project.d.ts +13 -0
  276. package/dist/internal/init-project.d.ts.map +1 -1
  277. package/dist/internal/init-project.js +30 -37
  278. package/dist/internal/init-scaffold.d.ts +11 -0
  279. package/dist/internal/init-scaffold.d.ts.map +1 -1
  280. package/dist/internal/init-scaffold.js +47 -13
  281. package/dist/internal/interview/agent-questions.d.ts +19 -0
  282. package/dist/internal/interview/agent-questions.d.ts.map +1 -0
  283. package/dist/internal/interview/agent-questions.js +120 -0
  284. package/dist/internal/interview/question.d.ts +82 -0
  285. package/dist/internal/interview/question.d.ts.map +1 -0
  286. package/dist/internal/interview/question.js +198 -0
  287. package/dist/internal/local-control-plane.d.ts.map +1 -1
  288. package/dist/internal/local-control-plane.js +5 -1
  289. package/dist/internal/otel/collector.d.ts +2 -0
  290. package/dist/internal/otel/collector.d.ts.map +1 -1
  291. package/dist/internal/otel/collector.js +4 -0
  292. package/dist/internal/peer-connections.d.ts +6 -2
  293. package/dist/internal/peer-connections.d.ts.map +1 -1
  294. package/dist/internal/peer-connections.js +23 -19
  295. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  296. package/dist/internal/resolve-prod-target.js +2 -1
  297. package/dist/internal/sdk-runner.d.ts.map +1 -1
  298. package/dist/internal/sdk-runner.js +43 -16
  299. package/dist/internal/sdk-subagent-inherit-support.d.ts +9 -0
  300. package/dist/internal/sdk-subagent-inherit-support.d.ts.map +1 -0
  301. package/dist/internal/sdk-subagent-inherit-support.js +89 -0
  302. package/dist/internal/server.d.ts.map +1 -1
  303. package/dist/internal/server.js +6 -5
  304. package/dist/internal/session-engine.d.ts +13 -0
  305. package/dist/internal/session-engine.d.ts.map +1 -1
  306. package/dist/internal/session-engine.js +62 -11
  307. package/dist/internal/session-run-log.d.ts.map +1 -1
  308. package/dist/internal/session-run-log.js +26 -11
  309. package/dist/internal/{convert-automation/slug.d.ts → slug.d.ts} +4 -1
  310. package/dist/internal/slug.d.ts.map +1 -0
  311. package/dist/internal/{convert-automation/slug.js → slug.js} +11 -1
  312. package/dist/playground/assets/index-7fVUOA5l.css +1 -0
  313. package/dist/playground/assets/{index-ClxRl2Cw.js → index-U3TRnwAP.js} +43 -43
  314. package/dist/playground/index.html +2 -2
  315. package/dist/types.d.ts +26 -1
  316. package/dist/types.d.ts.map +1 -1
  317. package/docs/README.md +1 -1
  318. package/docs/building-with-agents.md +5 -5
  319. package/docs/deployment.md +70 -33
  320. package/docs/evals.md +1 -16
  321. package/docs/guides/cloud-agents.md +3 -9
  322. package/docs/guides/grokbot-agents.md +10 -14
  323. package/docs/guides/hooks.md +0 -1
  324. package/docs/guides/improve.md +4 -6
  325. package/docs/guides/mcp-oauth.md +18 -41
  326. package/docs/guides/webhooks.md +35 -18
  327. package/docs/quickstart.md +2 -2
  328. package/docs/reference/agent-config.md +26 -1
  329. package/docs/reference/channels.md +29 -13
  330. package/docs/reference/cli.md +115 -42
  331. package/docs/reference/connections.md +6 -5
  332. package/docs/reference/evals.md +15 -4
  333. package/docs/reference/hooks.md +0 -1
  334. package/docs/reference/http-api.md +7 -17
  335. package/docs/reference/playground.md +2 -5
  336. package/docs/reference/schedules.md +26 -3
  337. package/docs/reference/sessions.md +1 -2
  338. package/docs/reference/skills.md +1 -1
  339. package/docs/reference/tools.md +3 -29
  340. package/docs/templates/grokbot-agents.md +1 -1
  341. package/docs/troubleshooting.md +12 -7
  342. package/package.json +36 -35
  343. package/schemas/grokbot-answers.schema.json +343 -0
  344. package/skills/create-agent/SKILL.md +16 -11
  345. package/skills/debug/SKILL.md +3 -4
  346. package/skills/evals/SKILL.md +2 -2
  347. package/skills/framework-map/SKILL.md +10 -10
  348. package/skills/mcp-auth/SKILL.md +10 -34
  349. package/skills/migrate-v2/SKILL.md +13 -9
  350. package/skills/setup-slack/SKILL.md +0 -13
  351. package/templates/agentic-owners/bot/lib/owners/handles.ts +1 -1
  352. package/templates/agentic-owners/bot/lib/owners/matching.ts +20 -9
  353. package/templates/agents-md/README.md +3 -3
  354. package/templates/agents-md/bot/channels/queue.ts +3 -8
  355. package/templates/agents-md/bot/instructions.md +1 -2
  356. package/templates/agents-md/bot/tools/apply_agents.ts +0 -1
  357. package/templates/agents-md/evals/agents.eval.ts +2 -2
  358. package/templates/demo/bot/channels/queue.ts +5 -15
  359. package/templates/grokbot-agents/.gitignore +4 -0
  360. package/templates/pr-autofixer/bot/channels/drive.ts +3 -16
  361. package/templates/security-help/.gitignore +4 -0
  362. package/templates/triage/bot/channels/queue.ts +11 -22
  363. package/templates/triage/bot/channels/webhook.ts +3 -6
  364. package/templates/triage/bot/lib/parse-queue-event.ts +0 -6
  365. package/dist/docs/assets/chunks/@localSearchIndexroot.CzrtdJ8s.js +0 -1
  366. package/dist/docs/assets/chunks/channel.6ebHhoF9.js +0 -1
  367. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BJ-CwKwu.js +0 -1
  368. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BJ-CwKwu.js +0 -1
  369. package/dist/docs/assets/chunks/clone.DfV2fkWH.js +0 -1
  370. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DNdUCJyd.js +0 -1
  371. package/dist/docs/assets/chunks/wardley-RL74JXVD.C46G0P5a.js +0 -162
  372. package/dist/docs/assets/deployment.md.BYuEcDBv.js +0 -29
  373. package/dist/docs/assets/guides_cloud-agents.md.CWJjS9No.js +0 -10
  374. package/dist/docs/assets/guides_cloud-agents.md.CWJjS9No.lean.js +0 -1
  375. package/dist/docs/assets/guides_grokbot-agents.md.tD1smFhU.js +0 -16
  376. package/dist/docs/assets/guides_mcp-oauth.md.DR3zhC9r.lean.js +0 -1
  377. package/dist/docs/assets/reference_channels.md.LbNIJBwd.js +0 -23
  378. package/dist/docs/assets/reference_http-api.md.DbFNOubV.js +0 -11
  379. package/dist/docs/assets/reference_playground.md.1hx0gcIu.js +0 -1
  380. package/dist/docs/assets/reference_playground.md.1hx0gcIu.lean.js +0 -1
  381. package/dist/docs/assets/reference_sessions.md.CyM7ARz1.js +0 -1
  382. package/dist/docs/assets/reference_tools.md.DzIY9JzY.lean.js +0 -1
  383. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +0 -1
  384. package/dist/internal/convert-automation/slug.d.ts.map +0 -1
  385. package/dist/playground/assets/index-BKSsuEMw.css +0 -1
  386. /package/dist/docs/assets/{guides_hooks.md.5Ce3NXxZ.lean.js → guides_hooks.md.B_bKG1oA.lean.js} +0 -0
  387. /package/dist/docs/assets/{index.md.Dxxr7pFa.lean.js → index.md.BIBHIQtU.lean.js} +0 -0
  388. /package/dist/docs/assets/{quickstart.md.BK5gjHM2.lean.js → quickstart.md.CduLGBAB.lean.js} +0 -0
  389. /package/dist/docs/assets/{reference_hooks.md.B-eGa2km.lean.js → reference_hooks.md.DbJC8mcZ.lean.js} +0 -0
  390. /package/dist/docs/assets/{reference_sessions.md.CyM7ARz1.lean.js → reference_sessions.md.C_uzIWuy.lean.js} +0 -0
  391. /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C2GWh7g8.lean.js} +0 -0
  392. /package/dist/docs/assets/{templates_grokbot-agents.md.2sydjFiO.lean.js → templates_grokbot-agents.md.DgpPEs7B.lean.js} +0 -0
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Answers for `bdk init --from-grokbot`: the create-agent answers an export
3
+ * uses, plus the export decisions. Grok Bot collects them in chat and passes
4
+ * an answers file; a TTY asks the same questions with the same defaults.
5
+ * Answers name secrets and connectors; they never carry secret values.
6
+ */
7
+ import { type Channel } from "../interview/agent-questions.js";
8
+ import { type Ask, type InterviewField } from "../interview/question.js";
9
+ import type { Bot } from "./bot.js";
10
+ export declare const GROKBOT_ANSWERS_VERSION = 1;
11
+ export declare const KINDS: readonly ["skills", "routines", "plugins"];
12
+ export declare const MEMORY_MODES: readonly ["skill", "kv", "drop"];
13
+ export declare const CONNECTOR_AUTH: readonly ["cursor-account", "oauth", "secret"];
14
+ export declare const DEPLOY_WHEN: readonly ["after-review", "now", "scheduled", "never"];
15
+ export declare const SLACK_APPS: readonly ["new", "move"];
16
+ export declare const SLACK_CUTOVERS: readonly ["manual", "after-deploy", "scheduled"];
17
+ export type Kind = (typeof KINDS)[number];
18
+ export interface Selection {
19
+ /** Slugs to keep; omitted keeps everything. */
20
+ include?: string[];
21
+ /** Slugs to leave behind, applied after `include`. */
22
+ exclude?: string[];
23
+ }
24
+ export interface ConnectorAnswer {
25
+ auth?: (typeof CONNECTOR_AUTH)[number];
26
+ /** Cursor account connector name (`cursor-account`). */
27
+ server?: string;
28
+ /** MCP server URL (`oauth`, `secret`). */
29
+ url?: string;
30
+ /** Secret name holding the bearer token (`secret`). */
31
+ secret?: string;
32
+ }
33
+ export interface SlackAnswers {
34
+ app?: (typeof SLACK_APPS)[number];
35
+ cutover?: (typeof SLACK_CUTOVERS)[number];
36
+ cutoverAt?: string;
37
+ teamPrefix?: string;
38
+ botName?: string;
39
+ justification?: string;
40
+ }
41
+ export interface GrokbotAnswers {
42
+ /** Editor hint pointing at the published JSON Schema; ignored. */
43
+ $schema?: string;
44
+ version?: number;
45
+ name?: string;
46
+ description?: string;
47
+ location?: string;
48
+ model?: string;
49
+ channels?: Channel[];
50
+ memory?: (typeof MEMORY_MODES)[number];
51
+ skills?: Selection;
52
+ routines?: Selection;
53
+ plugins?: Selection;
54
+ connectors?: Record<string, ConnectorAnswer>;
55
+ /** Routine slug → placeholder id → value. */
56
+ fillIns?: Record<string, Record<string, string>>;
57
+ secrets?: {
58
+ names?: string[];
59
+ reauth?: string[];
60
+ };
61
+ repo?: {
62
+ name?: string;
63
+ namespace?: string;
64
+ };
65
+ deploy?: {
66
+ when?: (typeof DEPLOY_WHEN)[number];
67
+ at?: string;
68
+ };
69
+ slack?: SlackAnswers;
70
+ }
71
+ /** A connector after defaults: one of the shapes its questions allow. */
72
+ export type ResolvedConnector = {
73
+ auth: "cursor-account";
74
+ server: string;
75
+ } | {
76
+ auth: "oauth";
77
+ url: string;
78
+ } | {
79
+ auth: "secret";
80
+ url: string;
81
+ secret: string;
82
+ };
83
+ /** Slack answers after defaults; present exactly when the Slack channel is on. */
84
+ export type ResolvedSlack = Required<Pick<SlackAnswers, "app" | "cutover" | "botName" | "justification">> & Pick<SlackAnswers, "cutoverAt" | "teamPrefix">;
85
+ /** Answers after defaults: what the conversion and the export record read. */
86
+ export type ResolvedAnswers = Omit<GrokbotAnswers, "connectors" | "repo" | "deploy" | "slack"> & Required<Pick<GrokbotAnswers, "version" | "name" | "description" | "location" | "model" | "channels">> & {
87
+ connectors?: Record<string, ResolvedConnector>;
88
+ repo: {
89
+ name: string;
90
+ namespace?: string;
91
+ };
92
+ deploy: {
93
+ when: (typeof DEPLOY_WHEN)[number];
94
+ at?: string;
95
+ };
96
+ slack?: ResolvedSlack;
97
+ };
98
+ /** The questions for one recipe, in asking order. */
99
+ export declare function grokbotFields(bot: Bot): InterviewField[];
100
+ export interface ResolveInput {
101
+ bot: Bot;
102
+ answers?: unknown;
103
+ interactive: boolean;
104
+ ask?: Ask;
105
+ out?: (text: string) => void;
106
+ }
107
+ export interface Resolved {
108
+ answers: ResolvedAnswers;
109
+ /** Answers filled from defaults without asking. */
110
+ defaulted: string[];
111
+ /** Answers given that this recipe never asks for. */
112
+ ignored: string[];
113
+ }
114
+ export type ResolveResult = ({
115
+ ok: true;
116
+ } & Resolved) | {
117
+ ok: false;
118
+ error: string;
119
+ };
120
+ export declare function resolveAnswers(input: ResolveInput): Promise<ResolveResult>;
121
+ /**
122
+ * JSON Schema for answers files, annotated from the questions so a chat
123
+ * client can render one widget per field: `title`, `description`, a static
124
+ * `default`, `x-labels` for choice labels, and `x-round` for the round.
125
+ */
126
+ export declare function answersJsonSchema(): Record<string, unknown>;
127
+ //# sourceMappingURL=answers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answers.d.ts","sourceRoot":"","sources":["../../../src/internal/convert-grokbot/answers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,443 @@
1
+ /**
2
+ * Answers for `bdk init --from-grokbot`: the create-agent answers an export
3
+ * uses, plus the export decisions. Grok Bot collects them in chat and passes
4
+ * an answers file; a TTY asks the same questions with the same defaults.
5
+ * Answers name secrets and connectors; they never carry secret values.
6
+ */
7
+ import { z } from "zod";
8
+ import { zodToJsonSchema } from "zod-to-json-schema";
9
+ import { envPrefixFromName } from "../../channels/slack/credentials.js";
10
+ import { CLI_COMMAND_NAME } from "../distribution.js";
11
+ import { MAX_SECRET_NAME_LENGTH, validateSettableSecretName } from "../hosting.js";
12
+ import { AGENT_FIELDS, agentName, CHANNELS } from "../interview/agent-questions.js";
13
+ import { checkedString, collectAnswers, field, listAnswer, } from "../interview/question.js";
14
+ import { isRecord } from "../is-record.js";
15
+ import { slugify } from "../slug.js";
16
+ import { connectorUrlError, defaultSlackBotName, namespaceError, redactSecretValues, repoNameError, slackBotNameError, } from "./checks.js";
17
+ import { formatIssues, versionSchema } from "./recipe.js";
18
+ import { liveChannel } from "./routine.js";
19
+ export const GROKBOT_ANSWERS_VERSION = 1;
20
+ export const KINDS = ["skills", "routines", "plugins"];
21
+ export const MEMORY_MODES = ["skill", "kv", "drop"];
22
+ export const CONNECTOR_AUTH = ["cursor-account", "oauth", "secret"];
23
+ export const DEPLOY_WHEN = ["after-review", "now", "scheduled", "never"];
24
+ export const SLACK_APPS = ["new", "move"];
25
+ export const SLACK_CUTOVERS = ["manual", "after-deploy", "scheduled"];
26
+ const slug = z.string().regex(/^[a-z0-9][a-z0-9-]*$/, "must be a lowercase slug");
27
+ const instant = z
28
+ .string()
29
+ .datetime({ offset: true, message: "must be an ISO 8601 time with a timezone" });
30
+ const secretName = checkedString(validateSettableSecretName);
31
+ const slackOn = (answers) => listAnswer(answers.channels).includes("slack");
32
+ function agentField(id) {
33
+ const found = AGENT_FIELDS.find((f) => f.question.id === id);
34
+ if (found === undefined) {
35
+ throw new Error(`No create-agent question "${id}".`);
36
+ }
37
+ return found;
38
+ }
39
+ /** Identity, surface, and item choices; recipe defaults are patched in per bot. */
40
+ const BASE_FIELDS = [
41
+ agentField("name"),
42
+ field("identity", {
43
+ id: "description",
44
+ label: "Description",
45
+ prompt: "What does the bot do, in a sentence or two?",
46
+ }, z.string().min(1)),
47
+ agentField("location"),
48
+ agentField("model"),
49
+ agentField("channels"),
50
+ field("export", {
51
+ id: "memory",
52
+ label: "Memory",
53
+ prompt: "What should happen to the bot's memories?",
54
+ hint: "skill: a knowledge skill the agent reads on demand. kv: data in bot/lib/memory-seed.json for your own seeding code (BDK has no built-in KV seed). drop: leave them behind.",
55
+ choices: [...MEMORY_MODES],
56
+ default: "skill",
57
+ }, z.enum(MEMORY_MODES)),
58
+ ...KINDS.map((kind) => field("export", {
59
+ id: `${kind}.include`,
60
+ label: `Include ${kind}`,
61
+ prompt: `Which ${kind} should come along?`,
62
+ multi: true,
63
+ default: "all",
64
+ }, z.array(slug))),
65
+ ];
66
+ /** One set per recipe plugin; `*` is its slug and `{plugin}` its name. */
67
+ const CONNECTOR_FIELDS = [
68
+ field("export", {
69
+ id: "connectors.*.auth",
70
+ label: "Auth",
71
+ prompt: "How should {plugin} authenticate?",
72
+ hint: `cursor-account: tools run through your Cursor account's connector, with no secret in the project. oauth: host OAuth against the server URL (\`${CLI_COMMAND_NAME} mcp oauth\`). secret: a bearer token read from a named secret.`,
73
+ choices: [...CONNECTOR_AUTH],
74
+ default: "cursor-account",
75
+ }, z.enum(CONNECTOR_AUTH)),
76
+ field("export", {
77
+ id: "connectors.*.server",
78
+ label: "Connector name",
79
+ prompt: "Name of the {plugin} connector in your Cursor account?",
80
+ }, z.string().min(1)),
81
+ field("export", { id: "connectors.*.url", label: "Server URL", prompt: "{plugin} MCP server URL?" }, checkedString(connectorUrlError)),
82
+ field("export", {
83
+ id: "connectors.*.secret",
84
+ label: "Secret name",
85
+ prompt: "Secret that holds the {plugin} token?",
86
+ hint: `A name only, like LINEAR_API_KEY. Set the value later with \`${CLI_COMMAND_NAME} secrets set\`.`,
87
+ }, secretName),
88
+ ];
89
+ /** One per routine placeholder; `*.*` is the routine slug and placeholder id. */
90
+ const FILL_IN_FIELD = field("export", {
91
+ id: "fillIns.*.*",
92
+ label: "{placeholder}",
93
+ prompt: "{routine}: {placeholder}?",
94
+ optional: true,
95
+ }, z.string().min(1));
96
+ const DECISION_FIELDS = [
97
+ field("export", {
98
+ id: "secrets.names",
99
+ label: "Secret names",
100
+ prompt: "Other secret names to list in SECRETS.md?",
101
+ hint: "Names only, UPPER_SNAKE_CASE. Names the generated files read are always listed.",
102
+ multi: true,
103
+ other: true,
104
+ optional: true,
105
+ }, z.array(secretName)),
106
+ field("export", {
107
+ id: "secrets.reauth",
108
+ label: "Fresh sign-in",
109
+ prompt: "Which other connectors need a fresh sign-in?",
110
+ hint: "OAuth connectors always do; they are listed without asking.",
111
+ multi: true,
112
+ optional: true,
113
+ }, z.array(slug)),
114
+ field("export", {
115
+ id: "repo.name",
116
+ label: "Repository",
117
+ prompt: `Repository name? (recorded only; ${CLI_COMMAND_NAME} does not create repositories)`,
118
+ default: (answers) => answers.name?.slice(0, 100),
119
+ }, checkedString(repoNameError)),
120
+ field("export", {
121
+ id: "repo.namespace",
122
+ label: "Repository namespace",
123
+ prompt: "Repository owner or namespace? (recorded only)",
124
+ optional: true,
125
+ }, checkedString(namespaceError)),
126
+ field("export", {
127
+ id: "deploy.when",
128
+ label: "Deploy",
129
+ prompt: `When should it deploy? (recorded only; ${CLI_COMMAND_NAME} does not deploy)`,
130
+ choices: [...DEPLOY_WHEN],
131
+ default: "after-review",
132
+ }, z.enum(DEPLOY_WHEN)),
133
+ field("export", {
134
+ id: "deploy.at",
135
+ label: "Deploy at",
136
+ prompt: "Deploy at (ISO 8601 with a timezone)?",
137
+ when: (answers) => answers["deploy.when"] === "scheduled",
138
+ }, instant),
139
+ field("export", {
140
+ id: "slack.app",
141
+ label: "Slack app",
142
+ prompt: "Mint a new Slack app, or move the bot's existing one?",
143
+ choices: [...SLACK_APPS],
144
+ default: "new",
145
+ when: slackOn,
146
+ }, z.enum(SLACK_APPS)),
147
+ field("export", {
148
+ id: "slack.cutover",
149
+ label: "Slack cutover",
150
+ prompt: "When should Slack traffic switch to the BDK agent?",
151
+ choices: [...SLACK_CUTOVERS],
152
+ default: "manual",
153
+ when: slackOn,
154
+ }, z.enum(SLACK_CUTOVERS)),
155
+ field("export", {
156
+ id: "slack.cutoverAt",
157
+ label: "Slack cutover at",
158
+ prompt: "Switch Slack traffic at (ISO 8601 with a timezone)?",
159
+ when: (answers) => slackOn(answers) && answers["slack.cutover"] === "scheduled",
160
+ }, instant),
161
+ field("export", {
162
+ id: "slack.teamPrefix",
163
+ label: "Team prefix",
164
+ prompt: "Team prefix the Slack bot name must start with?",
165
+ optional: true,
166
+ when: slackOn,
167
+ }, z.string().min(1)),
168
+ field("export", {
169
+ id: "slack.botName",
170
+ label: "Slack bot name",
171
+ prompt: "Slack bot display name?",
172
+ hint: 'Starts with the team prefix and must not contain "Grok".',
173
+ check: (value, answers) => slackBotNameError(value, answers["slack.teamPrefix"]),
174
+ when: slackOn,
175
+ }, z.string().min(1)),
176
+ field("export", {
177
+ id: "slack.justification",
178
+ label: "Security justification",
179
+ prompt: "Security justification for the Slack app review?",
180
+ hint: "What the bot does in Slack and why it needs its scopes. Saved for the Slack app setup.",
181
+ default: (answers) => answers.description,
182
+ when: slackOn,
183
+ }, z.string().min(1)),
184
+ ];
185
+ /** Every question an answers file can answer, in asking order. */
186
+ const FIELDS = [
187
+ ...BASE_FIELDS,
188
+ ...CONNECTOR_FIELDS,
189
+ FILL_IN_FIELD,
190
+ ...DECISION_FIELDS,
191
+ ];
192
+ /** Whether an item survives the include answer; an unasked include keeps everything. */
193
+ function isSelected(answers, kind, item) {
194
+ const include = answers[`${kind}.include`];
195
+ return include === undefined || listAnswer(include).includes(item);
196
+ }
197
+ function exportName(name) {
198
+ const candidate = slugify(name, "grokbot");
199
+ return agentName.safeParse(candidate).success ? candidate : `${candidate}-bot`;
200
+ }
201
+ /** The channels the recipe's live triggers use. */
202
+ function botChannels(bot) {
203
+ const used = new Set([...bot.skills, ...bot.routines].flatMap((item) => item.triggers).map(liveChannel));
204
+ return CHANNELS.filter((channel) => used.has(channel)).join(", ") || "none";
205
+ }
206
+ function defaultSecretName(plugin) {
207
+ const prefix = envPrefixFromName(plugin.slug).slice(0, MAX_SECRET_NAME_LENGTH - "MCP__TOKEN".length);
208
+ const name = `${prefix}_TOKEN`;
209
+ return validateSettableSecretName(name) === undefined ? name : `MCP_${name}`;
210
+ }
211
+ function patch(f, question) {
212
+ return { ...f, question: { ...f.question, ...question } };
213
+ }
214
+ function pluginFields(plugin) {
215
+ const id = (key) => `connectors.${plugin.slug}.${key}`;
216
+ const included = (answers) => isSelected(answers, "plugins", plugin.slug);
217
+ const auth = (answers) => (included(answers) ? answers[id("auth")] : undefined);
218
+ const patches = {
219
+ auth: { when: included },
220
+ server: { default: plugin.name, when: (answers) => auth(answers) === "cursor-account" },
221
+ url: { when: (answers) => auth(answers) === "oauth" || auth(answers) === "secret" },
222
+ secret: { default: defaultSecretName(plugin), when: (answers) => auth(answers) === "secret" },
223
+ };
224
+ return CONNECTOR_FIELDS.map((f) => {
225
+ const key = f.question.id.split(".").at(-1) ?? "";
226
+ return patch(f, {
227
+ id: id(key),
228
+ prompt: f.question.prompt.replace("{plugin}", plugin.name),
229
+ ...patches[key],
230
+ });
231
+ });
232
+ }
233
+ function fillInField(routine, fill) {
234
+ return patch(FILL_IN_FIELD, {
235
+ id: `fillIns.${routine.slug}.${fill.id}`,
236
+ label: fill.label,
237
+ prompt: `${routine.name}: ${fill.label}?`,
238
+ when: (answers) => isSelected(answers, "routines", routine.slug),
239
+ });
240
+ }
241
+ /** The questions for one recipe, in asking order. */
242
+ export function grokbotFields(bot) {
243
+ const patches = {
244
+ name: { default: exportName(bot.name) },
245
+ description: { default: bot.description },
246
+ channels: { default: botChannels(bot) },
247
+ memory: { when: () => bot.memory.length > 0 },
248
+ "secrets.reauth": {
249
+ choices: bot.plugins.map((plugin) => ({ value: plugin.slug, label: plugin.name })),
250
+ when: () => bot.plugins.length > 0,
251
+ },
252
+ "slack.botName": {
253
+ default: (answers) => defaultSlackBotName(bot.name, answers["slack.teamPrefix"]),
254
+ },
255
+ };
256
+ for (const kind of KINDS) {
257
+ const items = bot[kind];
258
+ patches[`${kind}.include`] = {
259
+ choices: items.map((item) => ({ value: item.slug, label: item.name })),
260
+ when: () => items.length > 0,
261
+ };
262
+ }
263
+ return [
264
+ ...BASE_FIELDS.map((f) => patch(f, patches[f.question.id])),
265
+ ...bot.plugins.flatMap(pluginFields),
266
+ ...bot.routines.flatMap((routine) => routine.fillIns.map((fill) => fillInField(routine, fill))),
267
+ ...DECISION_FIELDS.map((f) => patch(f, patches[f.question.id])),
268
+ ];
269
+ }
270
+ function child(node, key) {
271
+ if (!Object.hasOwn(node, key)) {
272
+ node[key] = {};
273
+ }
274
+ return node[key];
275
+ }
276
+ /** Schemas nested by dotted id; a `*` segment becomes a record. */
277
+ function shapeOf(entries) {
278
+ const tree = {};
279
+ for (const [id, schema] of entries) {
280
+ const path = id.split(".");
281
+ const leaf = path.pop() ?? id;
282
+ path.reduce(child, tree)[leaf] = schema;
283
+ }
284
+ return mapValues(tree, (node) => toZod(node).optional());
285
+ }
286
+ function toZod(node) {
287
+ if (node instanceof z.ZodType) {
288
+ return node;
289
+ }
290
+ const record = node;
291
+ return Object.hasOwn(record, "*")
292
+ ? z.record(z.string(), toZod(record["*"]))
293
+ : z.object(mapValues(record, (value) => toZod(value).optional())).strict();
294
+ }
295
+ function mapValues(record, fn) {
296
+ return Object.fromEntries(Object.entries(record).map(([key, value]) => [key, fn(value)]));
297
+ }
298
+ const EXCLUDES = KINDS.map((kind) => [`${kind}.exclude`, z.array(slug)]);
299
+ /** An answers file: every field optional, unknown fields rejected. */
300
+ const answersSchema = z
301
+ .object({
302
+ $schema: z.string().optional(),
303
+ version: versionSchema(GROKBOT_ANSWERS_VERSION),
304
+ ...shapeOf([...FIELDS.map((f) => [f.question.id, f.schema]), ...EXCLUDES]),
305
+ })
306
+ .strict();
307
+ export async function resolveAnswers(input) {
308
+ const file = answersSchema.safeParse(input.answers ?? {});
309
+ if (!file.success) {
310
+ return { ok: false, error: `Invalid answers: ${formatIssues(file.error)}` };
311
+ }
312
+ const { $schema: _schema, version: _version, ...rest } = file.data;
313
+ const given = foldExcludes(flatten(rest), input.bot);
314
+ const fields = grokbotFields(input.bot);
315
+ const collected = await collectAnswers({
316
+ questions: fields.map((f) => f.question),
317
+ given,
318
+ interactive: input.interactive,
319
+ ask: input.ask,
320
+ out: input.out,
321
+ show: (text) => redactSecretValues(text).text,
322
+ missing: (question) => `add ${question.id} to the answers file (${question.prompt})`,
323
+ });
324
+ if (!collected.ok) {
325
+ return collected;
326
+ }
327
+ const multi = new Set(fields.filter((f) => f.question.multi).map((f) => f.question.id));
328
+ const answers = answersSchema.parse({
329
+ version: GROKBOT_ANSWERS_VERSION,
330
+ ...unflatten(collected.answers, multi),
331
+ });
332
+ return {
333
+ ok: true,
334
+ answers,
335
+ defaulted: collected.defaulted,
336
+ ignored: Object.keys(given).filter((id) => !(id in collected.answers)),
337
+ };
338
+ }
339
+ /** `exclude` narrows `include` (everything when unset or `all`), so only `include` is asked. */
340
+ function foldExcludes(given, bot) {
341
+ for (const kind of KINDS) {
342
+ const exclude = given[`${kind}.exclude`];
343
+ if (exclude === undefined || bot[kind].length === 0) {
344
+ continue;
345
+ }
346
+ const include = given[`${kind}.include`];
347
+ const kept = (include === undefined || include.trim() === "all"
348
+ ? bot[kind].map((item) => item.slug)
349
+ : listAnswer(include)).filter((item) => !listAnswer(exclude).includes(item));
350
+ delete given[`${kind}.exclude`];
351
+ given[`${kind}.include`] = kept.length === 0 ? "none" : kept.join(", ");
352
+ }
353
+ return given;
354
+ }
355
+ function flatten(value, prefix = "", out = {}) {
356
+ if (Array.isArray(value)) {
357
+ out[prefix] = value.length === 0 ? "none" : value.join(", ");
358
+ }
359
+ else if (isRecord(value)) {
360
+ for (const [key, nested] of Object.entries(value)) {
361
+ flatten(nested, prefix === "" ? key : `${prefix}.${key}`, out);
362
+ }
363
+ }
364
+ else if (value !== undefined) {
365
+ out[prefix] = String(value);
366
+ }
367
+ return out;
368
+ }
369
+ function unflatten(answers, multi) {
370
+ const out = {};
371
+ for (const [id, raw] of Object.entries(answers)) {
372
+ const path = id.split(".");
373
+ const leaf = path.pop() ?? id;
374
+ path.reduce(child, out)[leaf] = multi.has(id) ? listAnswer(raw) : raw;
375
+ }
376
+ return out;
377
+ }
378
+ /**
379
+ * JSON Schema for answers files, annotated from the questions so a chat
380
+ * client can render one widget per field: `title`, `description`, a static
381
+ * `default`, `x-labels` for choice labels, and `x-round` for the round.
382
+ */
383
+ export function answersJsonSchema() {
384
+ const json = zodToJsonSchema(answersSchema, {
385
+ $refStrategy: "none",
386
+ target: "jsonSchema7",
387
+ });
388
+ for (const f of FIELDS) {
389
+ annotate(json, f.question.id.split("."), fieldMeta(f));
390
+ }
391
+ for (const kind of KINDS) {
392
+ annotate(json, [kind, "exclude"], {
393
+ title: `Exclude ${kind}`,
394
+ description: `Which ${kind} should stay behind, applied after the include list.`,
395
+ "x-round": "export",
396
+ });
397
+ }
398
+ annotate(json, ["$schema"], { description: "Path or URL of this schema, for editors. Ignored." });
399
+ annotate(json, ["version"], { description: "Answers format version." });
400
+ annotate(json, ["connectors"], {
401
+ description: "How each recipe plugin connects, keyed by plugin slug.",
402
+ });
403
+ annotate(json, ["fillIns"], {
404
+ description: "Values for recipe placeholders, keyed by routine slug, then placeholder id (e.g. slack_channel). Unfilled placeholders stay in the text.",
405
+ });
406
+ return {
407
+ $schema: json.$schema,
408
+ title: `${CLI_COMMAND_NAME} init --from-grokbot answers`,
409
+ description: "Decisions for exporting a Grok Bot recipe. Every field is optional: a missing answer takes the default an interactive run offers. Names only, never secret values.",
410
+ ...json,
411
+ };
412
+ }
413
+ function fieldMeta({ question, round }) {
414
+ const meta = {
415
+ title: question.label,
416
+ description: question.hint === undefined ? question.prompt : `${question.prompt} ${question.hint}`,
417
+ "x-round": round,
418
+ };
419
+ if (typeof question.default === "string" && question.default !== "all") {
420
+ meta.default = question.multi ? listAnswer(question.default) : question.default;
421
+ }
422
+ const labeled = (question.choices ?? []).filter((choice) => typeof choice !== "string");
423
+ if (labeled.length > 0) {
424
+ meta["x-labels"] = Object.fromEntries(labeled.map((choice) => [choice.value, choice.label]));
425
+ }
426
+ return meta;
427
+ }
428
+ function annotate(json, path, meta) {
429
+ let node = json;
430
+ for (const key of path) {
431
+ const parent = isRecord(node) ? node : {};
432
+ node =
433
+ key === "*"
434
+ ? parent.additionalProperties
435
+ : isRecord(parent.properties)
436
+ ? parent.properties[key]
437
+ : undefined;
438
+ }
439
+ if (!isRecord(node)) {
440
+ throw new Error(`The answers JSON Schema has no ${path.join(".")}.`);
441
+ }
442
+ Object.assign(node, meta);
443
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The bot a recipe describes. Slugs are claimed here once, so questions,
3
+ * answers, and output paths all name items the same way. Names become one
4
+ * printable line and prose loses unprintable characters, so recipe text is
5
+ * safe to show in a terminal or a list.
6
+ */
7
+ import type { GrokbotRecipe } from "./recipe.js";
8
+ import { type CronTrigger, type FillIn, type Trigger } from "./routine.js";
9
+ export interface BotSkill {
10
+ slug: string;
11
+ name: string;
12
+ description: string;
13
+ body: string;
14
+ /** The skill's own schedule, when its frontmatter has one. */
15
+ triggers: CronTrigger[];
16
+ }
17
+ export interface BotRoutine {
18
+ slug: string;
19
+ name: string;
20
+ description: string;
21
+ job: string;
22
+ triggers: Trigger[];
23
+ fillIns: FillIn[];
24
+ }
25
+ export interface BotPlugin {
26
+ slug: string;
27
+ name: string;
28
+ }
29
+ export interface BotMemory {
30
+ kind?: string;
31
+ createdAt?: string;
32
+ content: string;
33
+ }
34
+ export interface Bot {
35
+ name: string;
36
+ description: string;
37
+ avatar?: {
38
+ color?: string;
39
+ shape?: string;
40
+ };
41
+ skills: BotSkill[];
42
+ routines: BotRoutine[];
43
+ plugins: BotPlugin[];
44
+ memory: BotMemory[];
45
+ /** Slug of the skill a new user starts with. */
46
+ gettingStarted?: string;
47
+ unknownFields: string[];
48
+ }
49
+ export declare function botFromRecipe(recipe: GrokbotRecipe, unknownFields?: string[]): Bot;
50
+ //# sourceMappingURL=bot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/internal/convert-grokbot/bot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,MAAM,EAGX,KAAK,OAAO,EACb,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAOD,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,GAAG,CA6CtF"}