@cursor/july 0.1.101 → 0.1.102

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 (374) hide show
  1. package/README.md +27 -0
  2. package/dist/channels/slack/api.d.ts +1 -1
  3. package/dist/channels/slack/api.d.ts.map +1 -1
  4. package/dist/channels/slack/api.js +3 -1
  5. package/dist/channels/slack/assistant.d.ts +1 -1
  6. package/dist/channels/slack/assistant.d.ts.map +1 -1
  7. package/dist/channels/slack/dispatch.d.ts +3 -2
  8. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  9. package/dist/channels/slack/dispatch.js +28 -8
  10. package/dist/channels/slack/inbound.d.ts +8 -0
  11. package/dist/channels/slack/inbound.d.ts.map +1 -1
  12. package/dist/channels/slack/inbound.js +28 -0
  13. package/dist/channels/slack/manifest.d.ts.map +1 -1
  14. package/dist/channels/slack/manifest.js +2 -1
  15. package/dist/docs/404.html +2 -2
  16. package/dist/docs/ab.html +4 -4
  17. package/dist/docs/assets/{app.BASO9Kih.js → app.CLA03RCz.js} +1 -1
  18. package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +1 -0
  19. package/dist/docs/assets/chunks/{VPLocalSearchBox.DwkqxoE0.js → VPLocalSearchBox.ifxv-cJV.js} +1 -1
  20. package/dist/docs/assets/chunks/{theme.CCil_13e.js → theme.DWCwM6p-.js} +2 -2
  21. package/dist/docs/assets/concepts.md.rPzW2HZN.js +1 -0
  22. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +9 -0
  23. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.lean.js +1 -0
  24. package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.js → guides_cloud-runtime.md.BRirbRAN.js} +1 -1
  25. package/dist/docs/assets/index.md.Kiht7ell.js +5 -0
  26. package/dist/docs/assets/{index.md.Bb4k8kUm.lean.js → index.md.Kiht7ell.lean.js} +1 -1
  27. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.js +56 -0
  28. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +1 -0
  29. package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.js → reference_project-layout.md.CA6QP6Lw.js} +2 -2
  30. package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.lean.js → reference_project-layout.md.CA6QP6Lw.lean.js} +1 -1
  31. package/dist/docs/assets/{reference_skills.md.BFW9retM.js → reference_skills.md.l2ezAcaN.js} +1 -1
  32. package/dist/docs/assets/{reference_tools.md.CvAHsdSp.js → reference_tools.md.B1up2r9W.js} +1 -1
  33. package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +1 -0
  34. package/dist/docs/assets/{skills_framework-map.md.BTi817yv.lean.js → skills_framework-map.md.DDa4MeEW.lean.js} +1 -1
  35. package/dist/docs/building-with-agents.html +4 -4
  36. package/dist/docs/concepts.html +5 -5
  37. package/dist/docs/concepts.md +3 -3
  38. package/dist/docs/deployment.html +4 -4
  39. package/dist/docs/evals.html +4 -4
  40. package/dist/docs/guides/agent-to-agent.html +4 -4
  41. package/dist/docs/guides/cloud-agents.html +35 -0
  42. package/dist/docs/guides/cloud-agents.md +93 -0
  43. package/dist/docs/guides/cloud-runtime.html +6 -6
  44. package/dist/docs/guides/cloud-runtime.md +2 -0
  45. package/dist/docs/guides/convert-automation.html +4 -4
  46. package/dist/docs/guides/github.html +4 -4
  47. package/dist/docs/guides/human-in-the-loop.html +4 -4
  48. package/dist/docs/guides/mcp-oauth.html +4 -4
  49. package/dist/docs/guides/opentelemetry.html +5 -5
  50. package/dist/docs/guides/slack.html +4 -4
  51. package/dist/docs/guides/webhooks.html +4 -4
  52. package/dist/docs/hashmap.json +1 -1
  53. package/dist/docs/hillclimbing.html +4 -4
  54. package/dist/docs/index.html +6 -6
  55. package/dist/docs/index.md +5 -1
  56. package/dist/docs/llms-full.txt +321 -4
  57. package/dist/docs/llms.txt +2 -0
  58. package/dist/docs/quickstart.html +4 -4
  59. package/dist/docs/reference/agent-config.html +4 -4
  60. package/dist/docs/reference/artifacts.html +4 -4
  61. package/dist/docs/reference/channels.html +5 -5
  62. package/dist/docs/reference/cli.html +4 -4
  63. package/dist/docs/reference/connections.html +4 -4
  64. package/dist/docs/reference/extensions.html +82 -0
  65. package/dist/docs/reference/extensions.md +200 -0
  66. package/dist/docs/reference/hooks.html +4 -4
  67. package/dist/docs/reference/http-api.html +4 -4
  68. package/dist/docs/reference/instructions.html +4 -4
  69. package/dist/docs/reference/playground.html +4 -4
  70. package/dist/docs/reference/project-layout.html +6 -6
  71. package/dist/docs/reference/project-layout.md +3 -0
  72. package/dist/docs/reference/prompt.html +4 -4
  73. package/dist/docs/reference/schedules.html +4 -4
  74. package/dist/docs/reference/sessions.html +4 -4
  75. package/dist/docs/reference/skills.html +6 -6
  76. package/dist/docs/reference/skills.md +2 -0
  77. package/dist/docs/reference/subagents.html +5 -5
  78. package/dist/docs/reference/tools.html +6 -6
  79. package/dist/docs/reference/tools.md +2 -0
  80. package/dist/docs/scaffolding-agents.html +4 -4
  81. package/dist/docs/skills/ab.html +4 -4
  82. package/dist/docs/skills/create-agent.html +4 -4
  83. package/dist/docs/skills/debug.html +4 -4
  84. package/dist/docs/skills/evals.html +4 -4
  85. package/dist/docs/skills/framework-map.html +5 -5
  86. package/dist/docs/skills/framework-map.md +1 -0
  87. package/dist/docs/skills/github.html +4 -4
  88. package/dist/docs/skills/hillclimb.html +4 -4
  89. package/dist/docs/skills/index.html +4 -4
  90. package/dist/docs/skills/mcp-auth.html +4 -4
  91. package/dist/docs/skills/otel.html +4 -4
  92. package/dist/docs/skills/setup-slack.html +4 -4
  93. package/dist/docs/storage.html +4 -4
  94. package/dist/docs/templates/agentic-owners.html +4 -4
  95. package/dist/docs/templates/agents-md.html +4 -4
  96. package/dist/docs/templates/code-wiki.html +4 -4
  97. package/dist/docs/templates/demo.html +4 -4
  98. package/dist/docs/templates/pr-autofixer.html +4 -4
  99. package/dist/docs/templates/security-help.html +4 -4
  100. package/dist/docs/templates/security-reviewer.html +4 -4
  101. package/dist/docs/templates/triage.html +4 -4
  102. package/dist/docs/troubleshooting.html +4 -4
  103. package/dist/extensions/cursor-cloud-agents/extension.d.ts +9 -7
  104. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  105. package/dist/extensions/cursor-cloud-agents/extension.js +9 -7
  106. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +78 -0
  107. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -0
  108. package/dist/extensions/cursor-cloud-agents/lib/backend.js +286 -0
  109. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +5 -0
  110. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -0
  111. package/dist/extensions/cursor-cloud-agents/lib/inputs.js +4 -0
  112. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts +8 -0
  113. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts.map +1 -0
  114. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +15 -0
  115. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +21 -7
  116. package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts +4 -0
  117. package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts.map +1 -0
  118. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +26 -0
  119. package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts +4 -0
  120. package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts.map +1 -0
  121. package/dist/extensions/cursor-cloud-agents/tools/dump.js +54 -0
  122. package/dist/extensions/cursor-cloud-agents/tools/get.d.ts +4 -0
  123. package/dist/extensions/cursor-cloud-agents/tools/get.d.ts.map +1 -0
  124. package/dist/extensions/cursor-cloud-agents/tools/get.js +25 -0
  125. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -1
  126. package/dist/extensions/cursor-cloud-agents/tools/launch.js +14 -38
  127. package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
  128. package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts +4 -0
  129. package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts.map +1 -0
  130. package/dist/extensions/cursor-cloud-agents/tools/{follow_up.js → reply.js} +12 -14
  131. package/dist/extensions.d.ts +38 -14
  132. package/dist/extensions.d.ts.map +1 -1
  133. package/dist/extensions.js +49 -12
  134. package/dist/files-backends/cursor-hosted.d.ts +0 -8
  135. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  136. package/dist/files-backends/cursor-hosted.js +1 -11
  137. package/dist/files.d.ts +5 -1
  138. package/dist/files.d.ts.map +1 -1
  139. package/dist/files.js +22 -18
  140. package/dist/index.d.ts +3 -3
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +2 -2
  143. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  144. package/dist/internal/conversation-mirror.js +13 -15
  145. package/dist/internal/cursor/backend-client.d.ts +8 -1
  146. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  147. package/dist/internal/cursor/backend-client.js +25 -9
  148. package/dist/internal/cursor/hosted-store-secrets.d.ts +11 -0
  149. package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
  150. package/dist/internal/cursor/hosted-store-secrets.js +15 -0
  151. package/dist/internal/discovery/ab.d.ts +9 -0
  152. package/dist/internal/discovery/ab.d.ts.map +1 -0
  153. package/dist/internal/discovery/ab.js +101 -0
  154. package/dist/internal/discovery/agent-config.d.ts +35 -0
  155. package/dist/internal/discovery/agent-config.d.ts.map +1 -0
  156. package/dist/internal/discovery/agent-config.js +173 -0
  157. package/dist/internal/discovery/agent.d.ts +11 -0
  158. package/dist/internal/discovery/agent.d.ts.map +1 -0
  159. package/dist/internal/discovery/agent.js +306 -0
  160. package/dist/internal/discovery/channels.d.ts +10 -0
  161. package/dist/internal/discovery/channels.d.ts.map +1 -0
  162. package/dist/internal/discovery/channels.js +97 -0
  163. package/dist/internal/discovery/connections.d.ts +17 -0
  164. package/dist/internal/discovery/connections.d.ts.map +1 -0
  165. package/dist/internal/discovery/connections.js +436 -0
  166. package/dist/internal/discovery/context.d.ts +20 -0
  167. package/dist/internal/discovery/context.d.ts.map +1 -0
  168. package/dist/internal/discovery/context.js +30 -0
  169. package/dist/internal/discovery/cursor-plugin.d.ts +25 -0
  170. package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -0
  171. package/dist/internal/discovery/cursor-plugin.js +570 -0
  172. package/dist/internal/discovery/extensions.d.ts +19 -0
  173. package/dist/internal/discovery/extensions.d.ts.map +1 -0
  174. package/dist/internal/discovery/extensions.js +238 -0
  175. package/dist/internal/discovery/fs.d.ts +15 -0
  176. package/dist/internal/discovery/fs.d.ts.map +1 -0
  177. package/dist/internal/discovery/fs.js +115 -0
  178. package/dist/internal/discovery/hooks.d.ts +7 -0
  179. package/dist/internal/discovery/hooks.d.ts.map +1 -0
  180. package/dist/internal/discovery/hooks.js +48 -0
  181. package/dist/internal/discovery/info.d.ts +6 -0
  182. package/dist/internal/discovery/info.d.ts.map +1 -0
  183. package/dist/internal/discovery/info.js +141 -0
  184. package/dist/internal/discovery/instructions.d.ts +7 -0
  185. package/dist/internal/discovery/instructions.d.ts.map +1 -0
  186. package/dist/internal/discovery/instructions.js +95 -0
  187. package/dist/internal/discovery/modules.d.ts +20 -0
  188. package/dist/internal/discovery/modules.d.ts.map +1 -0
  189. package/dist/internal/discovery/modules.js +101 -0
  190. package/dist/internal/discovery/names.d.ts +12 -0
  191. package/dist/internal/discovery/names.d.ts.map +1 -0
  192. package/dist/internal/discovery/names.js +36 -0
  193. package/dist/internal/discovery/project.d.ts +53 -0
  194. package/dist/internal/discovery/project.d.ts.map +1 -0
  195. package/dist/internal/discovery/project.js +239 -0
  196. package/dist/internal/discovery/runtime.d.ts +34 -0
  197. package/dist/internal/discovery/runtime.d.ts.map +1 -0
  198. package/dist/internal/discovery/runtime.js +98 -0
  199. package/dist/internal/discovery/schedules.d.ts +7 -0
  200. package/dist/internal/discovery/schedules.d.ts.map +1 -0
  201. package/dist/internal/discovery/schedules.js +97 -0
  202. package/dist/internal/discovery/seed-files.d.ts +7 -0
  203. package/dist/internal/discovery/seed-files.d.ts.map +1 -0
  204. package/dist/internal/discovery/seed-files.js +41 -0
  205. package/dist/internal/discovery/services.d.ts +17 -0
  206. package/dist/internal/discovery/services.d.ts.map +1 -0
  207. package/dist/internal/discovery/services.js +104 -0
  208. package/dist/internal/discovery/skills.d.ts +16 -0
  209. package/dist/internal/discovery/skills.d.ts.map +1 -0
  210. package/dist/internal/discovery/skills.js +151 -0
  211. package/dist/internal/discovery/subagent.d.ts +13 -0
  212. package/dist/internal/discovery/subagent.d.ts.map +1 -0
  213. package/dist/internal/discovery/subagent.js +19 -0
  214. package/dist/internal/discovery/tools.d.ts +18 -0
  215. package/dist/internal/discovery/tools.d.ts.map +1 -0
  216. package/dist/internal/discovery/tools.js +159 -0
  217. package/dist/internal/discovery.d.ts +8 -62
  218. package/dist/internal/discovery.d.ts.map +1 -1
  219. package/dist/internal/discovery.js +8 -2505
  220. package/dist/internal/framework-file-storage.js +6 -6
  221. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  222. package/dist/internal/framework-storage-selection.js +8 -7
  223. package/dist/internal/frontmatter.d.ts +11 -3
  224. package/dist/internal/frontmatter.d.ts.map +1 -1
  225. package/dist/internal/frontmatter.js +29 -3
  226. package/dist/internal/mcp-host.d.ts.map +1 -1
  227. package/dist/internal/mcp-host.js +37 -20
  228. package/dist/internal/otel/collector.d.ts +13 -0
  229. package/dist/internal/otel/collector.d.ts.map +1 -1
  230. package/dist/internal/otel/collector.js +84 -17
  231. package/dist/internal/otel/http.d.ts.map +1 -1
  232. package/dist/internal/otel/http.js +2 -10
  233. package/dist/internal/otel/mcp.d.ts +16 -0
  234. package/dist/internal/otel/mcp.d.ts.map +1 -0
  235. package/dist/internal/otel/mcp.js +68 -0
  236. package/dist/internal/otel/propagation.d.ts +6 -0
  237. package/dist/internal/otel/propagation.d.ts.map +1 -0
  238. package/dist/internal/otel/propagation.js +14 -0
  239. package/dist/internal/otel/runtime.d.ts.map +1 -1
  240. package/dist/internal/otel/runtime.js +2 -0
  241. package/dist/internal/session-engine.d.ts +5 -0
  242. package/dist/internal/session-engine.d.ts.map +1 -1
  243. package/dist/internal/session-engine.js +68 -32
  244. package/dist/internal/session-run-log.d.ts +2 -1
  245. package/dist/internal/session-run-log.d.ts.map +1 -1
  246. package/dist/internal/session-run-log.js +13 -14
  247. package/dist/internal/start-log-store.d.ts +1 -1
  248. package/dist/internal/start-log-store.d.ts.map +1 -1
  249. package/dist/internal/start-log-store.js +12 -14
  250. package/dist/internal/storage-coordinator.d.ts +4 -1
  251. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  252. package/dist/internal/storage-coordinator.js +15 -13
  253. package/dist/internal/tool-catalog.d.ts.map +1 -1
  254. package/dist/internal/tool-catalog.js +9 -6
  255. package/dist/internal/turn-cost.d.ts +14 -0
  256. package/dist/internal/turn-cost.d.ts.map +1 -1
  257. package/dist/internal/turn-cost.js +41 -9
  258. package/dist/internal/v2-hosting.d.ts +22 -0
  259. package/dist/internal/v2-hosting.d.ts.map +1 -0
  260. package/dist/internal/v2-hosting.js +23 -0
  261. package/dist/otel.d.ts +16 -0
  262. package/dist/otel.d.ts.map +1 -1
  263. package/dist/otel.js +26 -0
  264. package/dist/playground/assets/index-B6C9S9nG.css +1 -0
  265. package/dist/playground/index.html +2 -2
  266. package/dist/storage-protocol.d.ts +24 -23
  267. package/dist/storage-protocol.d.ts.map +1 -1
  268. package/dist/storage-protocol.js +68 -65
  269. package/dist/storage.d.ts +2 -2
  270. package/dist/storage.d.ts.map +1 -1
  271. package/dist/storage.js +1 -1
  272. package/dist/tools.d.ts +9 -0
  273. package/dist/tools.d.ts.map +1 -1
  274. package/dist/tools.js +9 -0
  275. package/dist/types.d.ts +39 -3
  276. package/dist/types.d.ts.map +1 -1
  277. package/docs/README.md +5 -1
  278. package/docs/concepts.md +3 -3
  279. package/docs/guides/cloud-agents.md +98 -0
  280. package/docs/guides/cloud-runtime.md +2 -0
  281. package/docs/reference/extensions.md +205 -0
  282. package/docs/reference/project-layout.md +3 -0
  283. package/docs/reference/skills.md +2 -0
  284. package/docs/reference/tools.md +2 -0
  285. package/package.json +1 -1
  286. package/skills/framework-map/SKILL.md +1 -0
  287. package/src/channels/slack/api.ts +4 -2
  288. package/src/channels/slack/assistant.ts +1 -1
  289. package/src/channels/slack/dispatch.ts +27 -2
  290. package/src/channels/slack/inbound.ts +37 -0
  291. package/src/channels/slack/manifest.ts +2 -1
  292. package/src/extensions/cursor-cloud-agents/extension.ts +9 -7
  293. package/src/extensions/cursor-cloud-agents/lib/backend.ts +395 -0
  294. package/src/extensions/cursor-cloud-agents/lib/inputs.ts +5 -0
  295. package/src/extensions/cursor-cloud-agents/lib/transcript.ts +23 -0
  296. package/src/extensions/cursor-cloud-agents/skills/handoff.md +21 -7
  297. package/src/extensions/cursor-cloud-agents/tools/cancel.ts +19 -0
  298. package/src/extensions/cursor-cloud-agents/tools/dump.ts +51 -0
  299. package/src/extensions/cursor-cloud-agents/tools/get.ts +18 -0
  300. package/src/extensions/cursor-cloud-agents/tools/launch.ts +22 -42
  301. package/src/extensions/cursor-cloud-agents/tools/list.ts +1 -1
  302. package/src/extensions/cursor-cloud-agents/tools/reply.ts +34 -0
  303. package/src/extensions.ts +55 -12
  304. package/src/files-backends/cursor-hosted.ts +1 -17
  305. package/src/files.ts +43 -34
  306. package/src/index.ts +10 -1
  307. package/src/internal/conversation-mirror.ts +23 -18
  308. package/src/internal/cursor/backend-client.ts +32 -10
  309. package/src/internal/cursor/hosted-store-secrets.ts +27 -0
  310. package/src/internal/discovery/ab.ts +111 -0
  311. package/src/internal/discovery/agent-config.ts +222 -0
  312. package/src/internal/discovery/agent.ts +360 -0
  313. package/src/internal/discovery/channels.ts +103 -0
  314. package/src/internal/discovery/connections.ts +540 -0
  315. package/src/internal/discovery/context.ts +46 -0
  316. package/src/internal/discovery/cursor-plugin.ts +708 -0
  317. package/src/internal/discovery/extensions.ts +348 -0
  318. package/src/internal/discovery/fs.ts +108 -0
  319. package/src/internal/discovery/hooks.ts +45 -0
  320. package/src/internal/discovery/info.ts +179 -0
  321. package/src/internal/discovery/instructions.ts +113 -0
  322. package/src/internal/discovery/modules.ts +107 -0
  323. package/src/internal/discovery/names.ts +44 -0
  324. package/src/internal/discovery/project.ts +270 -0
  325. package/src/internal/discovery/runtime.ts +159 -0
  326. package/src/internal/discovery/schedules.ts +94 -0
  327. package/src/internal/discovery/seed-files.ts +37 -0
  328. package/src/internal/discovery/services.ts +124 -0
  329. package/src/internal/discovery/skills.ts +176 -0
  330. package/src/internal/discovery/subagent.ts +29 -0
  331. package/src/internal/discovery/tools.ts +182 -0
  332. package/src/internal/discovery.ts +20 -3081
  333. package/src/internal/framework-file-storage.ts +6 -6
  334. package/src/internal/framework-storage-selection.ts +9 -9
  335. package/src/internal/frontmatter.ts +36 -3
  336. package/src/internal/mcp-host.ts +84 -31
  337. package/src/internal/otel/collector.ts +125 -25
  338. package/src/internal/otel/http.ts +2 -12
  339. package/src/internal/otel/mcp.ts +69 -0
  340. package/src/internal/otel/propagation.ts +17 -0
  341. package/src/internal/otel/runtime.ts +2 -0
  342. package/src/internal/session-engine.ts +96 -11
  343. package/src/internal/session-run-log.ts +17 -16
  344. package/src/internal/start-log-store.ts +13 -16
  345. package/src/internal/storage-coordinator.ts +19 -16
  346. package/src/internal/tool-catalog.ts +9 -6
  347. package/src/internal/turn-cost.ts +47 -4
  348. package/src/internal/v2-hosting.ts +38 -0
  349. package/src/otel.ts +38 -0
  350. package/src/storage-protocol.ts +101 -91
  351. package/src/storage.ts +4 -0
  352. package/src/tools.ts +18 -0
  353. package/src/types.ts +43 -2
  354. package/dist/docs/assets/chunks/@localSearchIndexroot.DbFXINq2.js +0 -1
  355. package/dist/docs/assets/concepts.md.lwAgBIMI.js +0 -1
  356. package/dist/docs/assets/index.md.Bb4k8kUm.js +0 -5
  357. package/dist/docs/assets/skills_framework-map.md.BTi817yv.js +0 -1
  358. package/dist/extensions/cursor-cloud-agents/lib/cloud.d.ts +0 -30
  359. package/dist/extensions/cursor-cloud-agents/lib/cloud.d.ts.map +0 -1
  360. package/dist/extensions/cursor-cloud-agents/lib/cloud.js +0 -45
  361. package/dist/extensions/cursor-cloud-agents/tools/follow_up.d.ts +0 -4
  362. package/dist/extensions/cursor-cloud-agents/tools/follow_up.d.ts.map +0 -1
  363. package/dist/extensions/cursor-cloud-agents/tools/status.d.ts +0 -4
  364. package/dist/extensions/cursor-cloud-agents/tools/status.d.ts.map +0 -1
  365. package/dist/extensions/cursor-cloud-agents/tools/status.js +0 -41
  366. package/dist/playground/assets/index-DBQCwFp0.css +0 -1
  367. package/src/extensions/cursor-cloud-agents/lib/cloud.ts +0 -79
  368. package/src/extensions/cursor-cloud-agents/tools/follow_up.ts +0 -29
  369. package/src/extensions/cursor-cloud-agents/tools/status.ts +0 -39
  370. /package/dist/docs/assets/{concepts.md.lwAgBIMI.lean.js → concepts.md.rPzW2HZN.lean.js} +0 -0
  371. /package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.lean.js → guides_cloud-runtime.md.BRirbRAN.lean.js} +0 -0
  372. /package/dist/docs/assets/{reference_skills.md.BFW9retM.lean.js → reference_skills.md.l2ezAcaN.lean.js} +0 -0
  373. /package/dist/docs/assets/{reference_tools.md.CvAHsdSp.lean.js → reference_tools.md.B1up2r9W.lean.js} +0 -0
  374. /package/dist/playground/assets/{index-BnNN1-EK.js → index-ZqNoT8Ie.js} +0 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * `agent/schedules/*.ts`: cron-driven runs.
3
+ */
4
+
5
+ import { readFile } from "node:fs/promises";
6
+ import { basename, extname, relative } from "node:path";
7
+ import type { DiscoveredSchedule, ScheduleDefinition } from "../../types.js";
8
+ import { isValidCron } from "../cron.js";
9
+ import { parseFrontmatter } from "../frontmatter.js";
10
+ import { type DiscoveryContext, displayPath } from "./context.js";
11
+ import { isDirectory, isModuleFile, toPosix, walkFiles } from "./fs.js";
12
+ import { importDefault } from "./modules.js";
13
+
14
+ export async function loadSchedules(
15
+ ctx: DiscoveryContext,
16
+ schedulesDir: string
17
+ ): Promise<DiscoveredSchedule[]> {
18
+ if (!(await isDirectory(schedulesDir))) {
19
+ return [];
20
+ }
21
+ const schedules: DiscoveredSchedule[] = [];
22
+ for (const filePath of await walkFiles(schedulesDir)) {
23
+ const rel = toPosix(relative(schedulesDir, filePath));
24
+ if (rel.endsWith(".md")) {
25
+ const name = rel.slice(0, -".md".length);
26
+ const { data, body } = parseFrontmatter(await readFile(filePath, "utf8"));
27
+ const cron = data.cron;
28
+ if (cron === undefined || !isValidCron(cron)) {
29
+ ctx.diagnostics.push({
30
+ severity: "error",
31
+ path: displayPath(ctx, filePath),
32
+ message:
33
+ cron === undefined
34
+ ? "Markdown schedules require `cron` frontmatter."
35
+ : `Invalid cron expression: "${cron}".`,
36
+ });
37
+ continue;
38
+ }
39
+ const markdown = body.trim();
40
+ if (markdown === "") {
41
+ ctx.diagnostics.push({
42
+ severity: "error",
43
+ path: displayPath(ctx, filePath),
44
+ message: "Markdown schedules require a non-empty prompt body.",
45
+ });
46
+ continue;
47
+ }
48
+ schedules.push({
49
+ name,
50
+ cron,
51
+ kind: "markdown",
52
+ definition: {
53
+ __agentServe: "schedule",
54
+ cron,
55
+ markdown,
56
+ },
57
+ });
58
+ continue;
59
+ }
60
+
61
+ if (!isModuleFile(basename(filePath))) {
62
+ continue;
63
+ }
64
+ const name = rel.slice(0, -extname(rel).length);
65
+ const definition = await importDefault(ctx, filePath, "schedule");
66
+ if (definition === undefined) {
67
+ continue;
68
+ }
69
+ const schedule = definition as ScheduleDefinition;
70
+ if ((schedule.markdown === undefined) === (schedule.run === undefined)) {
71
+ ctx.diagnostics.push({
72
+ severity: "error",
73
+ path: displayPath(ctx, filePath),
74
+ message: "Schedules require exactly one of `markdown` or `run`.",
75
+ });
76
+ continue;
77
+ }
78
+ if (!isValidCron(schedule.cron)) {
79
+ ctx.diagnostics.push({
80
+ severity: "error",
81
+ path: displayPath(ctx, filePath),
82
+ message: `Invalid cron expression: "${schedule.cron}".`,
83
+ });
84
+ continue;
85
+ }
86
+ schedules.push({
87
+ name,
88
+ cron: schedule.cron,
89
+ kind: schedule.run === undefined ? "markdown" : "run",
90
+ definition: schedule,
91
+ });
92
+ }
93
+ return schedules;
94
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `agent/sandbox/workspace/**`: files seeded into each local session workspace.
3
+ */
4
+
5
+ import { join, relative } from "node:path";
6
+ import type { SeedFile } from "../../types.js";
7
+ import { type DiscoveryContext, displayPath } from "./context.js";
8
+ import { isDirectory, isFile, toPosix, walkFiles } from "./fs.js";
9
+
10
+ export async function loadSeedFiles(
11
+ ctx: DiscoveryContext,
12
+ agentDir: string
13
+ ): Promise<SeedFile[]> {
14
+ const sandboxDir = join(agentDir, "sandbox");
15
+ for (const candidate of ["sandbox.ts", join("sandbox", "sandbox.ts")]) {
16
+ if (await isFile(join(agentDir, candidate))) {
17
+ ctx.diagnostics.push({
18
+ severity: "warning",
19
+ path: displayPath(ctx, join(agentDir, candidate)),
20
+ message:
21
+ "Custom sandbox backends are not supported; the agent runs in the session workspace directory. Ignoring.",
22
+ });
23
+ }
24
+ }
25
+ const workspaceDir = join(sandboxDir, "workspace");
26
+ if (!(await isDirectory(workspaceDir))) {
27
+ return [];
28
+ }
29
+ const seedFiles: SeedFile[] = [];
30
+ for (const filePath of await walkFiles(workspaceDir)) {
31
+ seedFiles.push({
32
+ relativePath: toPosix(relative(workspaceDir, filePath)),
33
+ sourcePath: filePath,
34
+ });
35
+ }
36
+ return seedFiles;
37
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * `agent/storage.ts`, `agent/otel.ts`, `agent/artifacts.ts`: host services the agent configures.
3
+ */
4
+
5
+ import { join } from "node:path";
6
+ import type { OtelDefinition } from "../../otel.js";
7
+ import type { StorageDefinition } from "../../storage.js";
8
+ import type {
9
+ AgentArchitecture,
10
+ ArtifactsDefinition,
11
+ ResolvedAgent,
12
+ } from "../../types.js";
13
+ import {
14
+ artifactBuiltinTool,
15
+ TAG_ARTIFACT_TOOL_NAME,
16
+ } from "../builtin-tools/index.js";
17
+ import { type DiscoveryContext, displayPath } from "./context.js";
18
+ import { findModuleFile } from "./fs.js";
19
+ import { importDefault } from "./modules.js";
20
+
21
+ export async function loadStorage(
22
+ ctx: DiscoveryContext,
23
+ agentDir: string,
24
+ architecture: AgentArchitecture | undefined
25
+ ): Promise<StorageDefinition | undefined> {
26
+ const path = await findModuleFile(agentDir, "storage");
27
+ if (path === undefined) {
28
+ return undefined;
29
+ }
30
+ if (architecture === "v2") {
31
+ // Storage is a hosting-mode decision on v2, made by
32
+ // framework-storage-selection.ts: the state root when self-hosted,
33
+ // Cursor-managed storage on Cursor hosting. Fail early (error
34
+ // diagnostics refuse serve and deploy) rather than silently running
35
+ // with storage the author believes they configured. Not imported.
36
+ ctx.diagnostics.push({
37
+ severity: "error",
38
+ path: displayPath(ctx, path),
39
+ message:
40
+ 'agent/storage.ts is not supported on architecture "v2": the platform selects storage (the local state root when self-hosted; Cursor-managed storage on Cursor hosting). Delete the file.',
41
+ });
42
+ return undefined;
43
+ }
44
+ // v1 keeps loading the authored sink, with notice: defineStorage is going
45
+ // away with the v1 control plane.
46
+ ctx.diagnostics.push({
47
+ severity: "warning",
48
+ path: displayPath(ctx, path),
49
+ message:
50
+ 'agent/storage.ts (defineStorage) is deprecated and going away: architecture "v2" selects storage automatically (the local state root when self-hosted; Cursor-managed storage on Cursor hosting). Still honored on v1.',
51
+ });
52
+ const definition = await importDefault(ctx, path, "storage");
53
+ return definition as StorageDefinition | undefined;
54
+ }
55
+
56
+ export async function loadOtel(
57
+ ctx: DiscoveryContext,
58
+ agentDir: string
59
+ ): Promise<OtelDefinition | undefined> {
60
+ const path = await findModuleFile(agentDir, "otel");
61
+ if (path === undefined) {
62
+ return undefined;
63
+ }
64
+ const definition = await importDefault(ctx, path, "otel");
65
+ return definition as OtelDefinition | undefined;
66
+ }
67
+
68
+ export async function loadArtifacts(
69
+ ctx: DiscoveryContext,
70
+ agentDir: string
71
+ ): Promise<ArtifactsDefinition | undefined> {
72
+ const path = await findModuleFile(agentDir, "artifacts");
73
+ if (path === undefined) {
74
+ return undefined;
75
+ }
76
+ const imported = await importDefault(ctx, path, "artifacts");
77
+ if (imported === undefined) {
78
+ return undefined;
79
+ }
80
+ const definition = imported as ArtifactsDefinition;
81
+ if (
82
+ definition.agentTool === true &&
83
+ Object.keys(definition.kinds ?? {}).length === 0
84
+ ) {
85
+ ctx.diagnostics.push({
86
+ severity: "error",
87
+ path: displayPath(ctx, path),
88
+ message:
89
+ "artifacts.agentTool requires kinds: the tag_artifact tool needs at least one declared kind; its descriptions are the tool prompt.",
90
+ });
91
+ }
92
+ return definition;
93
+ }
94
+
95
+ /**
96
+ * Materialize the `tag_artifact` built-in when `defineArtifacts` set
97
+ * `agentTool: true`. Appended after `loadAgent` because the tool is
98
+ * generated from the artifacts kinds registry, not `AgentConfig.builtinTools`.
99
+ */
100
+ export async function appendArtifactTool(
101
+ ctx: DiscoveryContext,
102
+ agentDir: string,
103
+ agent: ResolvedAgent,
104
+ artifacts: ArtifactsDefinition | undefined
105
+ ): Promise<void> {
106
+ const tool = artifactBuiltinTool(artifacts);
107
+ if (tool === undefined) {
108
+ return;
109
+ }
110
+ const artifactsPath = displayPath(
111
+ ctx,
112
+ (await findModuleFile(agentDir, "artifacts")) ??
113
+ join(agentDir, "artifacts.ts")
114
+ );
115
+ if (agent.tools.some((t) => t.name === TAG_ARTIFACT_TOOL_NAME)) {
116
+ ctx.diagnostics.push({
117
+ severity: "warning",
118
+ path: artifactsPath,
119
+ message: `Authored tool "${TAG_ARTIFACT_TOOL_NAME}" shadows the built-in tool of the same name; the authored tool wins.`,
120
+ });
121
+ return;
122
+ }
123
+ agent.tools.push(tool);
124
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * `agent/skills/*`: markdown, packaged, and `defineSkill` skills.
3
+ */
4
+
5
+ import { readFile } from "node:fs/promises";
6
+ import { join, relative } from "node:path";
7
+ import type {
8
+ DiscoveredSkill,
9
+ SkillConfig,
10
+ SkillDefinition,
11
+ SkillFileSource,
12
+ } from "../../types.js";
13
+ import { parseFrontmatter } from "../frontmatter.js";
14
+ import { type DiscoveryContext, displayPath, isBlank } from "./context.js";
15
+ import {
16
+ isDirectory,
17
+ isFile,
18
+ isModuleFile,
19
+ moduleStem,
20
+ sortedEntries,
21
+ toPosix,
22
+ walkFiles,
23
+ } from "./fs.js";
24
+ import { importDefault } from "./modules.js";
25
+ import { validateName } from "./names.js";
26
+
27
+ /** Declared frontmatter, else the body's first line, else a generic line. */
28
+ export function skillDescription(
29
+ name: string,
30
+ declared: string | undefined,
31
+ body: string
32
+ ): string {
33
+ return (
34
+ declared ??
35
+ deriveSkillDescription(body) ??
36
+ `Instructions for the ${name} skill.`
37
+ );
38
+ }
39
+
40
+ /** A packaged skill's sibling files, keyed by path relative to the skill dir. */
41
+ export async function skillFiles(
42
+ skillDir: string
43
+ ): Promise<Record<string, SkillFileSource>> {
44
+ const files: Record<string, SkillFileSource> = {};
45
+ for (const filePath of await walkFiles(skillDir)) {
46
+ const rel = toPosix(relative(skillDir, filePath));
47
+ if (rel !== "SKILL.md") {
48
+ files[rel] = { sourcePath: filePath };
49
+ }
50
+ }
51
+ return files;
52
+ }
53
+
54
+ export async function loadSkills(
55
+ ctx: DiscoveryContext,
56
+ skillsDir: string
57
+ ): Promise<DiscoveredSkill[]> {
58
+ if (!(await isDirectory(skillsDir))) {
59
+ return [];
60
+ }
61
+ const skills: DiscoveredSkill[] = [];
62
+ for (const entry of await sortedEntries(skillsDir)) {
63
+ const entryPath = join(skillsDir, entry.name);
64
+ if (entry.isDirectory()) {
65
+ const skill = await loadPackagedSkill(ctx, entryPath, entry.name);
66
+ if (skill !== undefined) {
67
+ skills.push(skill);
68
+ }
69
+ continue;
70
+ }
71
+ if (!entry.isFile()) {
72
+ continue;
73
+ }
74
+ if (entry.name.endsWith(".md")) {
75
+ const name = entry.name.slice(0, -".md".length);
76
+ if (!validateName(ctx, "skill", name, entryPath)) {
77
+ continue;
78
+ }
79
+ const { data, body } = parseFrontmatter(
80
+ await readFile(entryPath, "utf8")
81
+ );
82
+ skills.push({
83
+ name,
84
+ description: skillDescription(name, data.description, body),
85
+ markdown: body.trim(),
86
+ files: {},
87
+ });
88
+ continue;
89
+ }
90
+ if (isModuleFile(entry.name)) {
91
+ const name = moduleStem(entry.name);
92
+ if (!validateName(ctx, "skill", name, entryPath)) {
93
+ continue;
94
+ }
95
+ const definition = await importDefault(ctx, entryPath, "skill");
96
+ if (definition === undefined) {
97
+ continue;
98
+ }
99
+ skills.push(compileSkill(name, definition as SkillDefinition));
100
+ }
101
+ }
102
+ return skills;
103
+ }
104
+
105
+ /** A skill whose body and sibling files are in memory (`defineSkill`, extensions). */
106
+ function compileSkill(name: string, skill: SkillConfig): DiscoveredSkill {
107
+ const files: Record<string, SkillFileSource> = {};
108
+ for (const [rel, contents] of Object.entries(skill.files ?? {})) {
109
+ files[rel] = { contents };
110
+ }
111
+ return {
112
+ name,
113
+ description: skillDescription(name, skill.description, skill.markdown),
114
+ markdown: skill.markdown.trim(),
115
+ files,
116
+ };
117
+ }
118
+
119
+ async function loadPackagedSkill(
120
+ ctx: DiscoveryContext,
121
+ skillDir: string,
122
+ name: string
123
+ ): Promise<DiscoveredSkill | undefined> {
124
+ const skillMdPath = join(skillDir, "SKILL.md");
125
+ if (!(await isFile(skillMdPath))) {
126
+ ctx.diagnostics.push({
127
+ severity: "warning",
128
+ path: displayPath(ctx, skillDir),
129
+ message: "Skill directories must contain a SKILL.md; ignoring.",
130
+ });
131
+ return undefined;
132
+ }
133
+ if (!validateName(ctx, "skill", name, skillDir)) {
134
+ return undefined;
135
+ }
136
+ const { data, body } = parseFrontmatter(await readFile(skillMdPath, "utf8"));
137
+ if (data.description === undefined || isBlank(data.description)) {
138
+ ctx.diagnostics.push({
139
+ severity: "error",
140
+ path: displayPath(ctx, skillMdPath),
141
+ message:
142
+ "Packaged skills require `description` frontmatter in SKILL.md (there is no filename slug to fall back on).",
143
+ });
144
+ return undefined;
145
+ }
146
+
147
+ return {
148
+ name,
149
+ description: data.description,
150
+ markdown: body.trim(),
151
+ files: await skillFiles(skillDir),
152
+ };
153
+ }
154
+
155
+ /**
156
+ * Advertise the first non-empty, non-code-fence line of the body, with any
157
+ * leading `#`, `>`, `*`, or `-` markers stripped.
158
+ */
159
+ export function deriveSkillDescription(markdown: string): string | undefined {
160
+ let inFence = false;
161
+ for (const rawLine of markdown.split(/\r?\n/)) {
162
+ const line = rawLine.trim();
163
+ if (line.startsWith("```")) {
164
+ inFence = !inFence;
165
+ continue;
166
+ }
167
+ if (inFence || line === "") {
168
+ continue;
169
+ }
170
+ const stripped = line.replace(/^[#>*\s-]+/, "").trim();
171
+ if (stripped !== "") {
172
+ return stripped.length > 200 ? `${stripped.slice(0, 197)}...` : stripped;
173
+ }
174
+ }
175
+ return undefined;
176
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * A subagent as the Cursor harness runs it: description, model, and prompt. Its other slots are inert.
3
+ */
4
+
5
+ import type { ModelSetting, ResolvedAgent } from "../../types.js";
6
+ import { withIdentityPreamble } from "../workspace.js";
7
+
8
+ interface SubagentFields {
9
+ description?: string;
10
+ model?: ModelSetting;
11
+ /** Authored prompt; the identity preamble is prepended. */
12
+ prompt?: string;
13
+ }
14
+
15
+ export function subagent(name: string, fields: SubagentFields): ResolvedAgent {
16
+ return {
17
+ name,
18
+ description: fields.description,
19
+ model: fields.model,
20
+ instructions: withIdentityPreamble(name, fields.prompt),
21
+ runtime: "local",
22
+ tools: [],
23
+ skills: [],
24
+ connections: [],
25
+ hostConnections: [],
26
+ subagents: [],
27
+ seedFiles: [],
28
+ };
29
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * `agent/tools/*.ts`: typed tools and the built-in tools appended after them.
3
+ */
4
+
5
+ import { join } from "node:path";
6
+ import type {
7
+ BuiltinToolsConfig,
8
+ DiscoveredTool,
9
+ ToolDefinition,
10
+ ToolEffect,
11
+ } from "../../types.js";
12
+ import { builtinTools } from "../builtin-tools/index.js";
13
+ import { toolInputJsonSchema, toolOutputJsonSchema } from "../json-schema.js";
14
+ import {
15
+ type DiscoveryContext,
16
+ displayPath,
17
+ errorMessage,
18
+ isBlank,
19
+ } from "./context.js";
20
+ import { importDefault, moduleEntries } from "./modules.js";
21
+
22
+ export async function loadTools(
23
+ ctx: DiscoveryContext,
24
+ toolsDir: string
25
+ ): Promise<DiscoveredTool[]> {
26
+ const tools: DiscoveredTool[] = [];
27
+ for (const { name, path } of await moduleEntries(ctx, toolsDir, "tool")) {
28
+ const definition = await importDefault(ctx, path, "tool");
29
+ if (definition === undefined) {
30
+ continue;
31
+ }
32
+ const tool = compileTool(ctx, path, name, definition as ToolDefinition);
33
+ if (tool !== undefined) {
34
+ tools.push(tool);
35
+ }
36
+ }
37
+ return tools;
38
+ }
39
+
40
+ /**
41
+ * Validate one tool definition against the tool contract and convert its
42
+ * schemas. Diagnostics point at `entryPath` (the authored file, or the
43
+ * extension mount that contributed the tool).
44
+ */
45
+ export function compileTool(
46
+ ctx: DiscoveryContext,
47
+ entryPath: string,
48
+ name: string,
49
+ tool: ToolDefinition
50
+ ): DiscoveredTool | undefined {
51
+ if (isBlank(tool.description)) {
52
+ ctx.diagnostics.push({
53
+ severity: "error",
54
+ path: displayPath(ctx, entryPath),
55
+ message: "Tools require a non-empty description.",
56
+ });
57
+ return undefined;
58
+ }
59
+ const execution = tool.execution === "agent" ? "agent" : "server";
60
+ const needsApprovalConfigured =
61
+ tool.needsApproval === true || typeof tool.needsApproval === "function";
62
+ const effect = declaredEffect(tool);
63
+ if (execution === "agent") {
64
+ if (isBlank(tool.script)) {
65
+ ctx.diagnostics.push({
66
+ severity: "error",
67
+ path: displayPath(ctx, entryPath),
68
+ message:
69
+ 'Tools with execution: "agent" require a non-empty `script` (shell body; JSON on stdin, result on stdout).',
70
+ });
71
+ return undefined;
72
+ }
73
+ if (typeof tool.execute === "function") {
74
+ ctx.diagnostics.push({
75
+ severity: "warning",
76
+ path: displayPath(ctx, entryPath),
77
+ message:
78
+ '`execute` is ignored when execution is "agent"; the Cursor agent runs `script` instead.',
79
+ });
80
+ }
81
+ if (needsApprovalConfigured) {
82
+ ctx.diagnostics.push({
83
+ severity: "error",
84
+ path: displayPath(ctx, entryPath),
85
+ message:
86
+ '`needsApproval` is only supported for execution: "server" tools (in-process).',
87
+ });
88
+ return undefined;
89
+ }
90
+ } else if (typeof tool.execute !== "function") {
91
+ ctx.diagnostics.push({
92
+ severity: "error",
93
+ path: displayPath(ctx, entryPath),
94
+ message:
95
+ 'Tools require an execute(input, ctx) function (or set execution: "agent" with a script).',
96
+ });
97
+ return undefined;
98
+ }
99
+ let inputSchema: DiscoveredTool["inputSchema"];
100
+ try {
101
+ inputSchema = toolInputJsonSchema(tool.inputSchema);
102
+ } catch (error) {
103
+ ctx.diagnostics.push({
104
+ severity: "error",
105
+ path: displayPath(ctx, entryPath),
106
+ message: `Failed to convert inputSchema to JSON Schema: ${errorMessage(error)}`,
107
+ });
108
+ return undefined;
109
+ }
110
+ let outputSchema: DiscoveredTool["outputSchema"];
111
+ try {
112
+ outputSchema = toolOutputJsonSchema(tool.outputSchema);
113
+ } catch (error) {
114
+ ctx.diagnostics.push({
115
+ severity: "error",
116
+ path: displayPath(ctx, entryPath),
117
+ message: `Failed to convert outputSchema to JSON Schema: ${errorMessage(error)}`,
118
+ });
119
+ return undefined;
120
+ }
121
+ return {
122
+ name,
123
+ description: tool.description,
124
+ inputSchema,
125
+ outputSchema,
126
+ execution,
127
+ needsApproval: needsApprovalConfigured,
128
+ effect,
129
+ script: execution === "agent" ? tool.script : undefined,
130
+ definition: tool,
131
+ };
132
+ }
133
+
134
+ /**
135
+ * Static view of a tool's `effect` for the manifest: the literal when it is
136
+ * one, `"dynamic"` for a per-call predicate, `undefined` when undeclared. A
137
+ * malformed value is left undeclared rather than guessed — undeclared is the
138
+ * safe state (a dry run stubs it), where a guess could be the unsafe one.
139
+ */
140
+ function declaredEffect(
141
+ tool: ToolDefinition
142
+ ): ToolEffect | "dynamic" | undefined {
143
+ if (typeof tool.effect === "function") {
144
+ return "dynamic";
145
+ }
146
+ return tool.effect === "read" || tool.effect === "write"
147
+ ? tool.effect
148
+ : undefined;
149
+ }
150
+
151
+ /**
152
+ * Append enabled built-in tools after authored tools. Authored tools with
153
+ * the same name win.
154
+ */
155
+ export function appendBuiltinTools(
156
+ ctx: DiscoveryContext,
157
+ agentDir: string,
158
+ tools: DiscoveredTool[],
159
+ config: BuiltinToolsConfig | undefined
160
+ ): void {
161
+ const builtin = builtinTools(config);
162
+ if (builtin.length === 0) {
163
+ return;
164
+ }
165
+ const agentPath = displayPath(ctx, join(agentDir, "agent.ts"));
166
+ for (const tool of builtin) {
167
+ const existing = tools.find((t) => t.name === tool.name);
168
+ if (existing !== undefined) {
169
+ const owner =
170
+ existing.extension === undefined
171
+ ? "Authored"
172
+ : `Extension "${existing.extension}"`;
173
+ ctx.diagnostics.push({
174
+ severity: "warning",
175
+ path: agentPath,
176
+ message: `${owner} tool "${tool.name}" shadows the built-in tool of the same name; the built-in is skipped.`,
177
+ });
178
+ continue;
179
+ }
180
+ tools.push(tool);
181
+ }
182
+ }