@cursor/bdk 0.2.15 → 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 (232) hide show
  1. package/dist/bin/agent-serve.js +41 -3
  2. package/dist/channels/github/index.d.ts +1 -1
  3. package/dist/channels/github/index.d.ts.map +1 -1
  4. package/dist/channels/github/index.js +1 -1
  5. package/dist/docs/404.html +2 -2
  6. package/dist/docs/assets/{app.CRMxF0qX.js → app.BSrZkTHD.js} +4 -4
  7. package/dist/docs/assets/chunks/@localSearchIndexroot.JUnN1Be1.js +1 -0
  8. package/dist/docs/assets/chunks/{VPLocalSearchBox.C4BiQe53.js → VPLocalSearchBox.BxmgcwIX.js} +1 -1
  9. package/dist/docs/assets/chunks/{arc.D1TA2Mxn.js → arc.CAid9y9R.js} +1 -1
  10. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CA-hBJCN.js → architectureDiagram-Q4EWVU46.kLxg-1A5.js} +1 -1
  11. package/dist/docs/assets/chunks/{baseUniq.CzsSgiab.js → baseUniq.BWvpjFlO.js} +1 -1
  12. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.sxrH_f0l.js → blockDiagram-DXYQGD6D.DyjX8R7M.js} +1 -1
  13. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D_Z3mqAl.js → c4Diagram-AHTNJAMY.DBdWlnqr.js} +1 -1
  14. package/dist/docs/assets/chunks/channel.CWc3NN9g.js +1 -0
  15. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.BS6_uTUf.js → chunk-4BX2VUAB.T5enPS2D.js} +1 -1
  16. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.D-URAeTU.js → chunk-4TB4RGXK.D6zswRAS.js} +1 -1
  17. package/dist/docs/assets/chunks/{chunk-55IACEB6.b4SZc5kO.js → chunk-55IACEB6.Bh05N-a3.js} +1 -1
  18. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DLKEEDkN.js → chunk-EDXVE4YY.DZv_O-d9.js} +1 -1
  19. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.3SyQHgpY.js → chunk-FMBD7UC4.BY53CZaL.js} +1 -1
  20. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.DBKKaFeS.js → chunk-OYMX7WX6.CO5lI2PE.js} +1 -1
  21. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BhCYeR7H.js → chunk-QZHKN3VN.DMfpW0s4.js} +1 -1
  22. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.Cpg0VgI7.js → chunk-YZCP3GAM.COPT56Nr.js} +1 -1
  23. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D5a745iS.js +1 -0
  24. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D5a745iS.js +1 -0
  25. package/dist/docs/assets/chunks/clone.CCGVqN_B.js +1 -0
  26. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.4q0YNZN6.js → cose-bilkent-S5V4N54A.BJSj7zzd.js} +1 -1
  27. package/dist/docs/assets/chunks/{dagre-KV5264BT.Bk_CcQPr.js → dagre-KV5264BT.DDv7IQZT.js} +1 -1
  28. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.CgreoM_Z.js → diagram-5BDNPKRD.BUoE9HFH.js} +1 -1
  29. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DlZGpm6W.js → diagram-G4DWMVQ6.BF3JtrnJ.js} +1 -1
  30. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BxtXxgIR.js → diagram-MMDJMWI5.BvuCWc4e.js} +1 -1
  31. package/dist/docs/assets/chunks/{diagram-TYMM5635.DSzlJp2D.js → diagram-TYMM5635._EqUGqFN.js} +1 -1
  32. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.BN1YUmEV.js → erDiagram-SMLLAGMA.DxNvSdzj.js} +1 -1
  33. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.B61NGNYu.js → flowDiagram-DWJPFMVM.DVtRP546.js} +1 -1
  34. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DR-tto3M.js → ganttDiagram-T4ZO3ILL.Bn9vb7xI.js} +1 -1
  35. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CBPs2W_2.js → gitGraphDiagram-UUTBAWPF.45r6n737.js} +1 -1
  36. package/dist/docs/assets/chunks/{graph.DmlaqzCE.js → graph.BOkX3Ws_.js} +1 -1
  37. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.obPv-fFg.js → infoDiagram-42DDH7IO.DyBCcxOm.js} +1 -1
  38. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CXHTUcM3.js → ishikawaDiagram-UXIWVN3A.kg0ywDlx.js} +1 -1
  39. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BoVHerYZ.js → journeyDiagram-VCZTEJTY.BUfrLnXA.js} +1 -1
  40. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.CfYmPHZg.js → kanban-definition-6JOO6SKY.Bn7X35b2.js} +1 -1
  41. package/dist/docs/assets/chunks/{layout.621UdAhB.js → layout.B0QW6d8M.js} +1 -1
  42. package/dist/docs/assets/chunks/{linear.Cz_zRKjr.js → linear.C59eCF0D.js} +1 -1
  43. package/dist/docs/assets/chunks/{min.ON4GjCH7.js → min.BnDl0p08.js} +1 -1
  44. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.DLPMLJlv.js → mindmap-definition-QFDTVHPH.u2HYLooo.js} +1 -1
  45. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.BFp11AYt.js → pieDiagram-DEJITSTG.CbnIrr9l.js} +1 -1
  46. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.ChX7xo6B.js → quadrantDiagram-34T5L4WZ.D2zWIixq.js} +1 -1
  47. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DbKtHG_Q.js → requirementDiagram-MS252O5E.DvOFa3oO.js} +1 -1
  48. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.Spw8tv-7.js → sankeyDiagram-XADWPNL6.BfKCkH3x.js} +1 -1
  49. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.BYso9LlE.js → sequenceDiagram-FGHM5R23.CUPKdYN0.js} +1 -1
  50. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.D8l54jqW.js → stateDiagram-FHFEXIEX.CimDCRiK.js} +1 -1
  51. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.ClNUVSTQ.js +1 -0
  52. package/dist/docs/assets/chunks/{theme.m_Ethbkv.js → theme.CKht7z82.js} +2 -2
  53. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BLdhhyy9.js → timeline-definition-GMOUNBTQ.BFTd5qKs.js} +1 -1
  54. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CyGT2F_P.js → vennDiagram-DHZGUBPP.N6t5MmCb.js} +1 -1
  55. package/dist/docs/assets/chunks/wardley-RL74JXVD.D2G6Zyds.js +162 -0
  56. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.p_Sz9p1i.js → wardleyDiagram-NUSXRM2D.BqScALbL.js} +1 -1
  57. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.DtXsNUaf.js → xychartDiagram-5P7HB3ND.Br0WiDkT.js} +1 -1
  58. package/dist/docs/assets/{reference_agent-config.md.DrtLxWgR.js → reference_agent-config.md.DYA6ge6t.js} +7 -4
  59. package/dist/docs/assets/{reference_agent-config.md.DrtLxWgR.lean.js → reference_agent-config.md.DYA6ge6t.lean.js} +1 -1
  60. package/dist/docs/assets/{reference_cli.md.BYNIHwbi.js → reference_cli.md.2d2Y0O-d.js} +2 -2
  61. package/dist/docs/assets/{reference_evals.md.if--BLd0.js → reference_evals.md.Ccwp4x3o.js} +3 -3
  62. package/dist/docs/assets/{reference_evals.md.if--BLd0.lean.js → reference_evals.md.Ccwp4x3o.lean.js} +1 -1
  63. package/dist/docs/assets/{reference_skills.md.Ckddg6KX.js → reference_skills.md.C2GWh7g8.js} +3 -3
  64. package/dist/docs/building-with-agents.html +35 -35
  65. package/dist/docs/deployment.html +35 -35
  66. package/dist/docs/evals.html +35 -35
  67. package/dist/docs/guides/agent-to-agent.html +35 -35
  68. package/dist/docs/guides/bitbucket.html +35 -35
  69. package/dist/docs/guides/cloud-agents.html +35 -35
  70. package/dist/docs/guides/convert-automation.html +35 -35
  71. package/dist/docs/guides/github.html +35 -35
  72. package/dist/docs/guides/gitlab.html +35 -35
  73. package/dist/docs/guides/grokbot-agents.html +35 -35
  74. package/dist/docs/guides/hooks.html +35 -35
  75. package/dist/docs/guides/improve.html +35 -35
  76. package/dist/docs/guides/jev.html +35 -35
  77. package/dist/docs/guides/mcp-oauth.html +35 -35
  78. package/dist/docs/guides/migrate.html +35 -35
  79. package/dist/docs/guides/opentelemetry.html +35 -35
  80. package/dist/docs/guides/slack.html +35 -35
  81. package/dist/docs/guides/webhooks.html +35 -35
  82. package/dist/docs/hashmap.json +1 -1
  83. package/dist/docs/hillclimbing.html +35 -35
  84. package/dist/docs/index.html +35 -35
  85. package/dist/docs/llms-full.txt +41 -3
  86. package/dist/docs/quickstart.html +35 -35
  87. package/dist/docs/reference/agent-config.html +41 -38
  88. package/dist/docs/reference/agent-config.md +26 -1
  89. package/dist/docs/reference/artifacts.html +35 -35
  90. package/dist/docs/reference/channels.html +35 -35
  91. package/dist/docs/reference/cli.html +38 -38
  92. package/dist/docs/reference/cli.md +2 -2
  93. package/dist/docs/reference/connections.html +35 -35
  94. package/dist/docs/reference/evals.html +37 -37
  95. package/dist/docs/reference/evals.md +13 -0
  96. package/dist/docs/reference/extensions.html +35 -35
  97. package/dist/docs/reference/hooks.html +35 -35
  98. package/dist/docs/reference/http-api.html +35 -35
  99. package/dist/docs/reference/instructions.html +35 -35
  100. package/dist/docs/reference/playground.html +35 -35
  101. package/dist/docs/reference/project-layout.html +35 -35
  102. package/dist/docs/reference/prompt.html +35 -35
  103. package/dist/docs/reference/schedules.html +35 -35
  104. package/dist/docs/reference/sessions.html +35 -35
  105. package/dist/docs/reference/skills.html +38 -38
  106. package/dist/docs/reference/subagents.html +35 -35
  107. package/dist/docs/reference/tools.html +35 -35
  108. package/dist/docs/templates/agentic-owners.html +35 -35
  109. package/dist/docs/templates/grokbot-agents.html +35 -35
  110. package/dist/docs/templates/security-reviewer.html +35 -35
  111. package/dist/docs/templates/thermo-quality-review.html +35 -35
  112. package/dist/docs/templates/thermo-review.html +35 -35
  113. package/dist/docs/templates/triage.html +35 -35
  114. package/dist/docs/troubleshooting.html +35 -35
  115. package/dist/filesystem.d.ts.map +1 -1
  116. package/dist/filesystem.js +4 -8
  117. package/dist/internal/cli-convert-automation.js +9 -19
  118. package/dist/internal/cli-deploy.d.ts +1 -1
  119. package/dist/internal/cli-deploy.d.ts.map +1 -1
  120. package/dist/internal/cli-deploy.js +4 -3
  121. package/dist/internal/cli-init-grokbot.d.ts +29 -0
  122. package/dist/internal/cli-init-grokbot.d.ts.map +1 -0
  123. package/dist/internal/cli-init-grokbot.js +181 -0
  124. package/dist/internal/cli-slack.js +1 -1
  125. package/dist/internal/comment-safe.d.ts +8 -0
  126. package/dist/internal/comment-safe.d.ts.map +1 -0
  127. package/dist/internal/comment-safe.js +12 -0
  128. package/dist/internal/convert-automation/convert-workflow.d.ts.map +1 -1
  129. package/dist/internal/convert-automation/convert-workflow.js +2 -14
  130. package/dist/internal/convert-grokbot/answers.d.ts +127 -0
  131. package/dist/internal/convert-grokbot/answers.d.ts.map +1 -0
  132. package/dist/internal/convert-grokbot/answers.js +443 -0
  133. package/dist/internal/convert-grokbot/bot.d.ts +50 -0
  134. package/dist/internal/convert-grokbot/bot.d.ts.map +1 -0
  135. package/dist/internal/convert-grokbot/bot.js +72 -0
  136. package/dist/internal/convert-grokbot/checks.d.ts +26 -0
  137. package/dist/internal/convert-grokbot/checks.d.ts.map +1 -0
  138. package/dist/internal/convert-grokbot/checks.js +170 -0
  139. package/dist/internal/convert-grokbot/convert.d.ts +60 -0
  140. package/dist/internal/convert-grokbot/convert.d.ts.map +1 -0
  141. package/dist/internal/convert-grokbot/convert.js +470 -0
  142. package/dist/internal/convert-grokbot/handoff.d.ts +44 -0
  143. package/dist/internal/convert-grokbot/handoff.d.ts.map +1 -0
  144. package/dist/internal/convert-grokbot/handoff.js +160 -0
  145. package/dist/internal/convert-grokbot/recipe.d.ts +61 -0
  146. package/dist/internal/convert-grokbot/recipe.d.ts.map +1 -0
  147. package/dist/internal/convert-grokbot/recipe.js +94 -0
  148. package/dist/internal/convert-grokbot/routine.d.ts +51 -0
  149. package/dist/internal/convert-grokbot/routine.d.ts.map +1 -0
  150. package/dist/internal/convert-grokbot/routine.js +128 -0
  151. package/dist/internal/convert-grokbot/slack.d.ts +28 -0
  152. package/dist/internal/convert-grokbot/slack.d.ts.map +1 -0
  153. package/dist/internal/convert-grokbot/slack.js +50 -0
  154. package/dist/internal/deploy-client.d.ts +0 -2
  155. package/dist/internal/deploy-client.d.ts.map +1 -1
  156. package/dist/internal/deploy-client.js +2 -11
  157. package/dist/internal/discovery/names.d.ts +2 -0
  158. package/dist/internal/discovery/names.d.ts.map +1 -1
  159. package/dist/internal/discovery/names.js +2 -0
  160. package/dist/internal/discovery/project.d.ts.map +1 -1
  161. package/dist/internal/discovery/project.js +1 -3
  162. package/dist/internal/eval-judge-model.d.ts +10 -5
  163. package/dist/internal/eval-judge-model.d.ts.map +1 -1
  164. package/dist/internal/eval-judge-model.js +36 -25
  165. package/dist/internal/filesystem/subagent-inherit.d.ts +39 -0
  166. package/dist/internal/filesystem/subagent-inherit.d.ts.map +1 -0
  167. package/dist/internal/filesystem/subagent-inherit.js +96 -0
  168. package/dist/internal/filesystem/tools.d.ts +6 -0
  169. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  170. package/dist/internal/filesystem/tools.js +38 -1
  171. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  172. package/dist/internal/hosted-delivery.js +24 -1
  173. package/dist/internal/hosting.d.ts +1 -1
  174. package/dist/internal/hosting.d.ts.map +1 -1
  175. package/dist/internal/hosting.js +7 -3
  176. package/dist/internal/init-interview.d.ts +3 -5
  177. package/dist/internal/init-interview.d.ts.map +1 -1
  178. package/dist/internal/init-interview.js +15 -88
  179. package/dist/internal/init-project.d.ts +13 -0
  180. package/dist/internal/init-project.d.ts.map +1 -1
  181. package/dist/internal/init-project.js +30 -37
  182. package/dist/internal/init-scaffold.d.ts +11 -0
  183. package/dist/internal/init-scaffold.d.ts.map +1 -1
  184. package/dist/internal/init-scaffold.js +47 -13
  185. package/dist/internal/interview/agent-questions.d.ts +19 -0
  186. package/dist/internal/interview/agent-questions.d.ts.map +1 -0
  187. package/dist/internal/interview/agent-questions.js +120 -0
  188. package/dist/internal/interview/question.d.ts +82 -0
  189. package/dist/internal/interview/question.d.ts.map +1 -0
  190. package/dist/internal/interview/question.js +198 -0
  191. package/dist/internal/local-control-plane.d.ts.map +1 -1
  192. package/dist/internal/local-control-plane.js +5 -1
  193. package/dist/internal/otel/collector.d.ts +2 -0
  194. package/dist/internal/otel/collector.d.ts.map +1 -1
  195. package/dist/internal/otel/collector.js +4 -0
  196. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  197. package/dist/internal/resolve-prod-target.js +2 -1
  198. package/dist/internal/sdk-runner.d.ts.map +1 -1
  199. package/dist/internal/sdk-runner.js +38 -14
  200. package/dist/internal/sdk-subagent-inherit-support.d.ts +9 -0
  201. package/dist/internal/sdk-subagent-inherit-support.d.ts.map +1 -0
  202. package/dist/internal/sdk-subagent-inherit-support.js +89 -0
  203. package/dist/internal/session-engine.d.ts +13 -0
  204. package/dist/internal/session-engine.d.ts.map +1 -1
  205. package/dist/internal/session-engine.js +59 -11
  206. package/dist/internal/{convert-automation/slug.d.ts → slug.d.ts} +4 -1
  207. package/dist/internal/slug.d.ts.map +1 -0
  208. package/dist/internal/{convert-automation/slug.js → slug.js} +11 -1
  209. package/dist/playground/assets/index-7fVUOA5l.css +1 -0
  210. package/dist/playground/assets/{index-DCsq6f_I.js → index-U3TRnwAP.js} +43 -43
  211. package/dist/playground/index.html +2 -2
  212. package/dist/types.d.ts +10 -1
  213. package/dist/types.d.ts.map +1 -1
  214. package/docs/reference/agent-config.md +26 -1
  215. package/docs/reference/cli.md +2 -2
  216. package/docs/reference/evals.md +13 -0
  217. package/package.json +6 -5
  218. package/schemas/grokbot-answers.schema.json +343 -0
  219. package/skills/create-agent/SKILL.md +7 -5
  220. package/templates/agentic-owners/bot/lib/owners/handles.ts +1 -1
  221. package/templates/agentic-owners/bot/lib/owners/matching.ts +20 -9
  222. package/dist/docs/assets/chunks/@localSearchIndexroot.BZwvb2LN.js +0 -1
  223. package/dist/docs/assets/chunks/channel.D7DtboxW.js +0 -1
  224. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.irslOV8B.js +0 -1
  225. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.irslOV8B.js +0 -1
  226. package/dist/docs/assets/chunks/clone.DosLeDYL.js +0 -1
  227. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CAYMmzGj.js +0 -1
  228. package/dist/docs/assets/chunks/wardley-RL74JXVD.C5JJS3bh.js +0 -162
  229. package/dist/internal/convert-automation/slug.d.ts.map +0 -1
  230. package/dist/playground/assets/index-BVYWBxLU.css +0 -1
  231. /package/dist/docs/assets/{reference_cli.md.BYNIHwbi.lean.js → reference_cli.md.2d2Y0O-d.lean.js} +0 -0
  232. /package/dist/docs/assets/{reference_skills.md.Ckddg6KX.lean.js → reference_skills.md.C2GWh7g8.lean.js} +0 -0
@@ -33,8 +33,9 @@ import { describeError, describeErrorCode } from "./describe-error.js";
33
33
  import { isDevMode } from "./dev-mode.js";
34
34
  import { EventLogStore } from "./event-log.js";
35
35
  import { TurnEventMapper } from "./event-mapper.js";
36
+ import { createRootSubagentInherit, } from "./filesystem/subagent-inherit.js";
36
37
  import { applyWebScratchUpdate, ingestHostAgentToolsScratch, remapScratchPaths, } from "./filesystem/scratch.js";
37
- import { fileSystemTool, hostFileToolsFromAuthored, rootFileToolsFromAuthored, synthesizeFileSystemTools, } from "./filesystem/tools.js";
38
+ import { fileSystemTool, hostFileToolsFromAuthored, isSynthesizedFileSystemToolName, rootFileToolsFromAuthored, runWithFileSystem, synthesizeFileSystemTools, } from "./filesystem/tools.js";
38
39
  import { selectFrameworkStorageDefinition } from "./framework-storage-selection.js";
39
40
  import { createHostFilesApi } from "./host-files.js";
40
41
  import { createHostKvApi } from "./host-kv.js";
@@ -394,6 +395,19 @@ export class SessionEngine {
394
395
  return (this.project.agent.connections.find((item) => item.name === name) ??
395
396
  this.project.agent.hostConnections?.find((item) => item.name === name));
396
397
  }
398
+ /**
399
+ * The agent that advertised-tool listing sees. A symbolic connection serve
400
+ * never resolved (a peer under `--mode single`) is left out, as it is from
401
+ * each turn's MCP servers, instead of failing every listing.
402
+ */
403
+ advertisingAgent() {
404
+ const { agent } = this.project;
405
+ const resolved = new Set(this.resolvedConnections.map(({ name }) => name));
406
+ return {
407
+ ...agent,
408
+ connections: agent.connections.filter(({ name, transport }) => !isSymbolicConnectionTransport(transport) || resolved.has(name)),
409
+ };
410
+ }
397
411
  setCloudServerToolsConnection(connection, resolveHeaders) {
398
412
  this.cloudServerToolsConnection = connection;
399
413
  this.cloudServerToolsHeaders = resolveHeaders;
@@ -1674,11 +1688,14 @@ export class SessionEngine {
1674
1688
  try {
1675
1689
  if (record.workspaceOverride === undefined &&
1676
1690
  this.project.agent.local?.workspaceDir !== undefined) {
1691
+ const endPrewarm = this.startTurnPhase(record, turnId, "prewarm");
1677
1692
  await this.prewarmSharedWorkspace();
1693
+ endPrewarm();
1678
1694
  }
1679
1695
  // Scaffold agent files into the session workspace even when the harness
1680
1696
  // cwd is overridden (e.g. a PR worktree).
1681
1697
  if (!this.hasRootOverride()) {
1698
+ const endWorkspace = this.startTurnPhase(record, turnId, "workspace");
1682
1699
  await materializeWorkspace({
1683
1700
  agent: this.project.agent,
1684
1701
  workspaceDir,
@@ -1695,10 +1712,13 @@ export class SessionEngine {
1695
1712
  await ensureOwnGitRoot(harnessCwd);
1696
1713
  }
1697
1714
  await this.materializeNudgeCarrier(record, harnessCwd);
1715
+ endWorkspace();
1698
1716
  }
1699
1717
  // Baseline before the agent can run, so a follow-up that arrives and
1700
1718
  // drains before the first tool boundary still counts as an increase.
1719
+ const endNudges = this.startTurnPhase(record, turnId, "nudges");
1701
1720
  await this.baselineDeliveredNudges(record);
1721
+ endNudges();
1702
1722
  const pendingFiles = record.pendingWorkspaceFiles;
1703
1723
  const pendingImages = record.pendingImages;
1704
1724
  const runtime = resolveSessionRuntime({
@@ -1727,7 +1747,10 @@ export class SessionEngine {
1727
1747
  pendingImages: current.pendingImages === pendingImages ? undefined : current.pendingImages,
1728
1748
  }));
1729
1749
  }
1750
+ let endFirstUpdate;
1730
1751
  const onUpdate = async (update) => {
1752
+ endFirstUpdate?.();
1753
+ endFirstUpdate = undefined;
1731
1754
  const turn = this.turnRoots.get(sessionId);
1732
1755
  if (turn !== undefined) {
1733
1756
  update = await applyWebScratchUpdate({
@@ -1750,13 +1773,19 @@ export class SessionEngine {
1750
1773
  await yieldEventLoop();
1751
1774
  }
1752
1775
  };
1776
+ const endBuildRequest = this.startTurnPhase(record, turnId, "build_request");
1753
1777
  const request = await this.buildTurnRequest(record, turnId, message, isFirstTurn, emit, eventContext, onUpdate, signal, pendingImages);
1778
+ endBuildRequest();
1779
+ // Runner start (SDK agent create/resume, MCP connect, model request)
1780
+ // until the first streamed update.
1781
+ endFirstUpdate = this.startTurnPhase(record, turnId, "first_update");
1754
1782
  this.activeToolContexts.set(sessionId, { record, turnId, emit });
1755
1783
  this.stubbedCallIds.set(sessionId, stubbed);
1756
1784
  try {
1757
1785
  outcome = await this.runTurnExecute(record, turnId, () => this.runner.runTurn(request));
1758
1786
  }
1759
1787
  finally {
1788
+ endFirstUpdate?.();
1760
1789
  this.activeToolContexts.delete(sessionId);
1761
1790
  this.stubbedCallIds.delete(sessionId);
1762
1791
  }
@@ -1790,6 +1819,7 @@ export class SessionEngine {
1790
1819
  }
1791
1820
  const finalResult = outcome.result ?? mapper.finalText;
1792
1821
  const finalUsage = outcome.usage ?? mapper.usage;
1822
+ const preBoundaryDispatch = this.dispatchChains.get(sessionId);
1793
1823
  if (outcome.status === "finished") {
1794
1824
  const completed = await this.appendEvent(sessionId, {
1795
1825
  type: "turn.completed",
@@ -1842,10 +1872,12 @@ export class SessionEngine {
1842
1872
  data: {},
1843
1873
  }, eventContext);
1844
1874
  }
1845
- // Commit live channel state here. appendEvent does not wait for
1846
- // dispatch, and awaiting that chain deadlocks when an earlier handler
1847
- // is waiting on the next turn (defineResult refresh). Coalesce drain
1848
- // snapshots disk as soon as this returns.
1875
+ // Commit live channel state here, once the handlers queued before this
1876
+ // turn's boundary have run (for a coalesced follow-up, that includes the
1877
+ // owner turn's boundary handlers). This turn's own boundary handlers stay
1878
+ // unawaited: one may wait on the next turn, which cannot start until this
1879
+ // returns. Coalesce drain snapshots disk as soon as this returns.
1880
+ await preBoundaryDispatch?.catch(() => { });
1849
1881
  await this.updateRecord(sessionId, (current) => ({
1850
1882
  ...current,
1851
1883
  channelState: mergeChannelStateMutation({
@@ -2150,11 +2182,13 @@ export class SessionEngine {
2150
2182
  includeScripts: this.hasBorrowedWorkspace(record),
2151
2183
  })
2152
2184
  : undefined;
2185
+ const childFiles = authoredRoot && root !== undefined ? createRootSubagentInherit(root) : undefined;
2153
2186
  return {
2154
2187
  sessionId: record.sessionId,
2155
2188
  ...(record.sdkAgentId === undefined ? {} : { sdkAgentId: record.sdkAgentId }),
2156
2189
  workspaceDir: this.harnessCwd(record),
2157
2190
  sandbox: authoredRoot ? false : agent.local?.sandbox === true,
2191
+ subagentInherit: childFiles?.inherit,
2158
2192
  ...(runtime === "local" && harnessTools !== undefined
2159
2193
  ? {
2160
2194
  ...(harnessTools.tools === undefined ? {} : { tools: harnessTools.tools }),
@@ -2190,7 +2224,7 @@ export class SessionEngine {
2190
2224
  ? { agentServeAgent: this.project.name }
2191
2225
  : {}),
2192
2226
  customTools: runtime === "local"
2193
- ? await this.buildCustomTools(record, turnId, emit, synthesized, signal)
2227
+ ? await this.buildCustomTools(record, turnId, emit, synthesized, signal, childFiles)
2194
2228
  : {},
2195
2229
  mcpServers: this.buildMcpServers(runtime, record.sessionId, await this.evaluateConnectionAuth(record)),
2196
2230
  ...(runtime === "local" &&
@@ -2442,7 +2476,7 @@ export class SessionEngine {
2442
2476
  }
2443
2477
  return evaluated;
2444
2478
  }
2445
- async buildCustomTools(record, turnId, emit, extraTools = [], signal) {
2479
+ async buildCustomTools(record, turnId, emit, extraTools = [], signal, childFiles) {
2446
2480
  const agent = this.project.agent;
2447
2481
  const tools = {};
2448
2482
  const register = (tool) => {
@@ -2459,7 +2493,7 @@ export class SessionEngine {
2459
2493
  // ride into the harness listing once the dependency bumps.
2460
2494
  ...(tool.annotations === undefined ? {} : { annotations: tool.annotations }),
2461
2495
  execute: async (args, context) => {
2462
- return this.executeServerTool({
2496
+ const run = () => this.executeServerTool({
2463
2497
  tool,
2464
2498
  input: args,
2465
2499
  toolCallId: context.toolCallId,
@@ -2468,6 +2502,16 @@ export class SessionEngine {
2468
2502
  emit,
2469
2503
  signal,
2470
2504
  });
2505
+ const sessionId = context.sessionId;
2506
+ if (childFiles === undefined ||
2507
+ sessionId === undefined ||
2508
+ sessionId === "" ||
2509
+ sessionId === record.sessionId ||
2510
+ sessionId === record.sdkAgentId ||
2511
+ !isSynthesizedFileSystemToolName(tool.name)) {
2512
+ return run();
2513
+ }
2514
+ return runWithFileSystem(childFiles.fileSystemForSession(sessionId), run);
2471
2515
  },
2472
2516
  };
2473
2517
  };
@@ -2491,7 +2535,7 @@ export class SessionEngine {
2491
2535
  toolName: "mcp",
2492
2536
  emit,
2493
2537
  }, () => resolveAdvertisedTools({
2494
- agent,
2538
+ agent: this.advertisingAgent(),
2495
2539
  session: this.sessionInfo(record),
2496
2540
  hostMcp: this.advertiseMcp(),
2497
2541
  }))) {
@@ -2661,6 +2705,10 @@ export class SessionEngine {
2661
2705
  turnId,
2662
2706
  }, run);
2663
2707
  }
2708
+ /** Child span of the turn for one setup step; returns its end. No-op when OTel is off. */
2709
+ startTurnPhase(record, turnId, phase) {
2710
+ return (this.otel?.startPhase({ sessionId: record.sessionId, session: this.sessionInfo(record), turnId }, phase) ?? (() => { }));
2711
+ }
2664
2712
  /**
2665
2713
  * Bind outbound inject (Factory / Cursor API `traceparent`) to the
2666
2714
  * tool span. No-op when OTel is off.
@@ -3148,7 +3196,7 @@ export class SessionEngine {
3148
3196
  const { session } = await this.resolveDirectCallIdentity(newToolCallId("catalog"), options);
3149
3197
  const connectionErrors = [];
3150
3198
  const advertised = await resolveAdvertisedTools({
3151
- agent: this.project.agent,
3199
+ agent: this.advertisingAgent(),
3152
3200
  session,
3153
3201
  hostMcp: this.mcpHost,
3154
3202
  onConnectionError: (connection, error) => {
@@ -3220,7 +3268,7 @@ export class SessionEngine {
3220
3268
  // the same model-facing name a turn would. A listing failure fails
3221
3269
  // the call closed, like it fails a turn.
3222
3270
  const advertised = await resolveAdvertisedTools({
3223
- agent: this.project.agent,
3271
+ agent: this.advertisingAgent(),
3224
3272
  session,
3225
3273
  hostMcp: this.advertiseMcp(),
3226
3274
  });
@@ -1,6 +1,9 @@
1
- /** Filename slugs for generated project files. */
1
+ /** Slugs for generated project files and deployment names. */
2
2
  /** Lowercase, dashes, alphanumerics only; `fallback` when nothing survives. */
3
3
  export declare function slugify(name: string, fallback: string): string;
4
+ export declare const DEPLOYMENT_SLUG_PATTERN: RegExp;
5
+ /** Derive a valid deployment slug from a directory name, or undefined if impossible. */
6
+ export declare function slugFromDirectoryName(name: string): string | undefined;
4
7
  /** Dedupes slugs with numeric suffixes: `linear`, `linear-2`, `linear-3`, … */
5
8
  export declare class SlugRegistry {
6
9
  private readonly used;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/internal/slug.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,eAAO,MAAM,uBAAuB,EAAE,MAA6B,CAAC;AAEpE,wFAAwF;AACxF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOtE;AAED,+EAA+E;AAC/E,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAE1C,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY1B;CACF"}
@@ -1,4 +1,4 @@
1
- /** Filename slugs for generated project files. */
1
+ /** Slugs for generated project files and deployment names. */
2
2
  /** Lowercase, dashes, alphanumerics only; `fallback` when nothing survives. */
3
3
  export function slugify(name, fallback) {
4
4
  const slug = name
@@ -7,6 +7,16 @@ export function slugify(name, fallback) {
7
7
  .replace(/^-+|-+$/g, "");
8
8
  return slug === "" ? fallback : slug;
9
9
  }
10
+ export const DEPLOYMENT_SLUG_PATTERN = /^[a-z0-9_-]{1,64}$/;
11
+ /** Derive a valid deployment slug from a directory name, or undefined if impossible. */
12
+ export function slugFromDirectoryName(name) {
13
+ const slug = name
14
+ .toLowerCase()
15
+ .replace(/[^a-z0-9_-]+/g, "-")
16
+ .replace(/^-+|-+$/g, "")
17
+ .slice(0, 64);
18
+ return DEPLOYMENT_SLUG_PATTERN.test(slug) ? slug : undefined;
19
+ }
10
20
  /** Dedupes slugs with numeric suffixes: `linear`, `linear-2`, `linear-3`, … */
11
21
  export class SlugRegistry {
12
22
  constructor() {