@cursor/july 0.1.90 → 0.1.92
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.
- package/AGENTS.md +12 -0
- package/README.md +8 -7
- package/dist/channels/slack/channel-watch.d.ts +1 -1
- package/dist/channels/slack/channel-watch.js +1 -1
- package/dist/channels/slack/slack-channel.js +1 -1
- package/dist/channels/slack/types.d.ts +2 -4
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/docs/404.html +5 -3
- package/dist/docs/ab.html +9 -7
- package/dist/docs/ab.md +338 -0
- package/dist/docs/assets/{ab.md.DYjwREAP.js → ab.md.CVzWxLoB.js} +1 -1
- package/dist/docs/assets/{ab.md.DYjwREAP.lean.js → ab.md.CVzWxLoB.lean.js} +1 -1
- package/dist/docs/assets/{app.wiNkt6G7.js → app.Bci6CM9E.js} +1 -1
- package/dist/docs/assets/{building-with-agents.md.PeZaZA1P.js → building-with-agents.md.DH8A_cHA.js} +1 -1
- package/dist/docs/assets/{building-with-agents.md.PeZaZA1P.lean.js → building-with-agents.md.DH8A_cHA.lean.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.Dv-Q0XtU.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.ByhUGu47.js → VPLocalSearchBox.BCPT6xA-.js} +1 -1
- package/dist/docs/assets/chunks/{framework.CAZyNGu9.js → framework.BCISBCiQ.js} +1 -1
- package/dist/docs/assets/chunks/theme.BEA8BF3c.js +2 -0
- package/dist/docs/assets/{concepts.md.2NfkGjqM.js → concepts.md.CRfU3bVg.js} +1 -1
- package/dist/docs/assets/{concepts.md.2NfkGjqM.lean.js → concepts.md.CRfU3bVg.lean.js} +1 -1
- package/dist/docs/assets/{deployment.md.B8kW-h7P.js → deployment.md.DX_hc3ze.js} +6 -5
- package/dist/docs/assets/{deployment.md.B8kW-h7P.lean.js → deployment.md.DX_hc3ze.lean.js} +1 -1
- package/dist/docs/assets/{evals.md.CVe_O75-.js → evals.md.a0SMN6r9.js} +3 -3
- package/dist/docs/assets/{evals.md.CVe_O75-.lean.js → evals.md.a0SMN6r9.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_approval-buddy.md.CIiZ9coo.js → example-agents_approval-buddy.md.DNL83puR.js} +1 -1
- package/dist/docs/assets/{example-agents_approval-buddy.md.CIiZ9coo.lean.js → example-agents_approval-buddy.md.DNL83puR.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_benny.md.B-LIDGja.js → example-agents_benny.md.C40vHRLc.js} +1 -1
- package/dist/docs/assets/{example-agents_benny.md.B-LIDGja.lean.js → example-agents_benny.md.C40vHRLc.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_bugbot.md.Dp5JqHSQ.js → example-agents_bugbot.md.BRGMi9O2.js} +1 -1
- package/dist/docs/assets/{example-agents_bugbot.md.Dp5JqHSQ.lean.js → example-agents_bugbot.md.BRGMi9O2.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_codebase-wiki.md.D-lteFf0.js → example-agents_codebase-wiki.md.Dftj_tPp.js} +1 -1
- package/dist/docs/assets/{example-agents_codebase-wiki.md.D-lteFf0.lean.js → example-agents_codebase-wiki.md.Dftj_tPp.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_codeowners-review.md.BU2ZXLf-.js → example-agents_codeowners-review.md.Bfta-lBU.js} +1 -1
- package/dist/docs/assets/{example-agents_codeowners-review.md.BU2ZXLf-.lean.js → example-agents_codeowners-review.md.Bfta-lBU.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_concierge.md.DA2al_NK.js → example-agents_concierge.md.MrKpQndp.js} +1 -1
- package/dist/docs/assets/{example-agents_concierge.md.DA2al_NK.lean.js → example-agents_concierge.md.MrKpQndp.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_fsd.md.ZeGEpAw_.js → example-agents_fsd.md.ZWHWWZPE.js} +1 -1
- package/dist/docs/assets/{example-agents_fsd.md.ZeGEpAw_.lean.js → example-agents_fsd.md.ZWHWWZPE.lean.js} +1 -1
- package/dist/docs/assets/example-agents_index.md.QZ8mhr6n.js +2 -0
- package/dist/docs/assets/{example-agents_index.md.xmJ87d_3.lean.js → example-agents_index.md.QZ8mhr6n.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_knowledge-base.md.IneynQSR.js → example-agents_knowledge-base.md.DqKqHQ9u.js} +1 -1
- package/dist/docs/assets/{example-agents_knowledge-base.md.IneynQSR.lean.js → example-agents_knowledge-base.md.DqKqHQ9u.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_oncall.md.CBmyuAKc.js → example-agents_oncall.md.DK4XkYTd.js} +1 -1
- package/dist/docs/assets/{example-agents_oncall.md.CBmyuAKc.lean.js → example-agents_oncall.md.DK4XkYTd.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_security-reviewer.md.DBL1TwtP.js → example-agents_security-reviewer.md.Bai6D0Ee.js} +4 -4
- package/dist/docs/assets/{example-agents_security-reviewer.md.DBL1TwtP.lean.js → example-agents_security-reviewer.md.Bai6D0Ee.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_slack-agent.md.06jQXTAI.js → example-agents_slack-agent.md.D7Kdj5BV.js} +1 -1
- package/dist/docs/assets/{example-agents_slack-agent.md.06jQXTAI.lean.js → example-agents_slack-agent.md.D7Kdj5BV.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_weather-agent.md.DC3lINjo.js → example-agents_weather-agent.md.lVEAbWFf.js} +5 -5
- package/dist/docs/assets/example-agents_weather-agent.md.lVEAbWFf.lean.js +1 -0
- package/dist/docs/assets/{guides_agent-to-agent.md.Bmbxy-FA.js → guides_agent-to-agent.md.BCeVdJRJ.js} +1 -1
- package/dist/docs/assets/{guides_agent-to-agent.md.Bmbxy-FA.lean.js → guides_agent-to-agent.md.BCeVdJRJ.lean.js} +1 -1
- package/dist/docs/assets/{guides_cloud-runtime.md.CbklWfzh.js → guides_cloud-runtime.md.BSMLIBHr.js} +1 -1
- package/dist/docs/assets/{guides_cloud-runtime.md.CbklWfzh.lean.js → guides_cloud-runtime.md.BSMLIBHr.lean.js} +1 -1
- package/dist/docs/assets/{guides_convert-automation.md.BhMzTkE5.js → guides_convert-automation.md.D06eIzea.js} +1 -1
- package/dist/docs/assets/{guides_convert-automation.md.BhMzTkE5.lean.js → guides_convert-automation.md.D06eIzea.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.CLLQJKRB.js → guides_github.md.Cdt1s2QC.js} +4 -4
- package/dist/docs/assets/{guides_github.md.CLLQJKRB.lean.js → guides_github.md.Cdt1s2QC.lean.js} +1 -1
- package/dist/docs/assets/{guides_human-in-the-loop.md.Cf8kIIqC.js → guides_human-in-the-loop.md.By1G2T3_.js} +1 -1
- package/dist/docs/assets/{guides_human-in-the-loop.md.Cf8kIIqC.lean.js → guides_human-in-the-loop.md.By1G2T3_.lean.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.CzEB6RaG.js → guides_mcp-oauth.md.Du0f7pGU.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.CzEB6RaG.lean.js → guides_mcp-oauth.md.Du0f7pGU.lean.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.Csn7ZI25.js → guides_opentelemetry.md.bmPmkvJu.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.Csn7ZI25.lean.js → guides_opentelemetry.md.bmPmkvJu.lean.js} +1 -1
- package/dist/docs/assets/{guides_slack.md.DP4H75WP.js → guides_slack.md.DiUmk_Oi.js} +5 -5
- package/dist/docs/assets/{guides_slack.md.DP4H75WP.lean.js → guides_slack.md.DiUmk_Oi.lean.js} +1 -1
- package/dist/docs/assets/{guides_webhooks.md.DB-r_er9.js → guides_webhooks.md.BpnIdO0i.js} +5 -6
- package/dist/docs/assets/{guides_webhooks.md.DB-r_er9.lean.js → guides_webhooks.md.BpnIdO0i.lean.js} +1 -1
- package/dist/docs/assets/{hillclimbing.md.yXqdlv2R.js → hillclimbing.md.ywF3yDAd.js} +1 -1
- package/dist/docs/assets/{hillclimbing.md.yXqdlv2R.lean.js → hillclimbing.md.ywF3yDAd.lean.js} +1 -1
- package/dist/docs/assets/index.md.BAaMXLFd.js +5 -0
- package/dist/docs/assets/{index.md.DhRHS_-L.lean.js → index.md.BAaMXLFd.lean.js} +1 -1
- package/dist/docs/assets/{quickstart.md.DZxBu44y.js → quickstart.md.DsrarzEg.js} +1 -1
- package/dist/docs/assets/{quickstart.md.DZxBu44y.lean.js → quickstart.md.DsrarzEg.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.CTWp4DnU.js → reference_agent-config.md.Bqylgw50.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.CTWp4DnU.lean.js → reference_agent-config.md.Bqylgw50.lean.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.BGG4bZo-.js → reference_artifacts.md.Dior32Qw.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.BGG4bZo-.lean.js → reference_artifacts.md.Dior32Qw.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.CboFd5IH.js → reference_channels.md.DQZjCnyh.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.CboFd5IH.lean.js → reference_channels.md.DQZjCnyh.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.TAaYU8br.js → reference_cli.md.B7GkAJRC.js} +8 -7
- package/dist/docs/assets/{reference_cli.md.TAaYU8br.lean.js → reference_cli.md.B7GkAJRC.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.Cu3N-S3Q.js → reference_connections.md.DYidrb-j.js} +5 -5
- package/dist/docs/assets/{reference_connections.md.Cu3N-S3Q.lean.js → reference_connections.md.DYidrb-j.lean.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.DJE5DXcT.js → reference_hooks.md.B9FSgdDe.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.DJE5DXcT.lean.js → reference_hooks.md.B9FSgdDe.lean.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.DMbdFGVQ.js → reference_http-api.md.CSHVobzG.js} +4 -4
- package/dist/docs/assets/{reference_http-api.md.DMbdFGVQ.lean.js → reference_http-api.md.CSHVobzG.lean.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.CgoV-YEb.js → reference_instructions.md.DhNCOl7r.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.CgoV-YEb.lean.js → reference_instructions.md.DhNCOl7r.lean.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.CPZhfYaO.js → reference_playground.md.Dfb92yQf.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.CPZhfYaO.lean.js → reference_playground.md.Dfb92yQf.lean.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.CueaKpjr.js → reference_project-layout.md.CwkSbEWT.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.CueaKpjr.lean.js → reference_project-layout.md.CwkSbEWT.lean.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.BaiweQxE.js → reference_prompt.md.DZUMtLPD.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.BaiweQxE.lean.js → reference_prompt.md.DZUMtLPD.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.gmfYzf_I.js → reference_schedules.md.DNipebiG.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.gmfYzf_I.lean.js → reference_schedules.md.DNipebiG.lean.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.B0DdlM-K.js → reference_sessions.md.tUFzz98S.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.B0DdlM-K.lean.js → reference_sessions.md.tUFzz98S.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.BRF2nDv9.js → reference_skills.md.B5ZEuHfG.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.BRF2nDv9.lean.js → reference_skills.md.B5ZEuHfG.lean.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.DSrGLIuB.js → reference_subagents.md.Xoav0AII.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.DSrGLIuB.lean.js → reference_subagents.md.Xoav0AII.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.XmeFP_3d.js → reference_tools.md.wpaJtHn6.js} +2 -3
- package/dist/docs/assets/{reference_tools.md.XmeFP_3d.lean.js → reference_tools.md.wpaJtHn6.lean.js} +1 -1
- package/dist/docs/assets/{scaffolding-agents.md.BpMFXv2J.js → scaffolding-agents.md.CRDDUtYJ.js} +1 -1
- package/dist/docs/assets/{scaffolding-agents.md.BpMFXv2J.lean.js → scaffolding-agents.md.CRDDUtYJ.lean.js} +1 -1
- package/dist/docs/assets/{storage.md.ks1u64_R.js → storage.md.JbjlHWZ6.js} +1 -1
- package/dist/docs/assets/{storage.md.ks1u64_R.lean.js → storage.md.JbjlHWZ6.lean.js} +1 -1
- package/dist/docs/assets/{style.kTsvp4pE.css → style.BRuM8477.css} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.BkTLORaU.js → templates_agentic-owners.md.DSJSIpWU.js} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.BkTLORaU.lean.js → templates_agentic-owners.md.DSJSIpWU.lean.js} +1 -1
- package/dist/docs/assets/{templates_demo.md.Bgd6MBaZ.js → templates_demo.md.DhFcWN6j.js} +1 -1
- package/dist/docs/assets/{templates_demo.md.Bgd6MBaZ.lean.js → templates_demo.md.DhFcWN6j.lean.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.DcmoeUNZ.js → templates_pr-autofixer.md.1HAR3RXE.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.DcmoeUNZ.lean.js → templates_pr-autofixer.md.1HAR3RXE.lean.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.C0yIUaYs.js → templates_security-reviewer.md.ByFyRta2.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.C0yIUaYs.lean.js → templates_security-reviewer.md.ByFyRta2.lean.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.DWuQ1bZz.js → templates_triage.md.CVlpctKS.js} +2 -2
- package/dist/docs/assets/{templates_triage.md.DWuQ1bZz.lean.js → templates_triage.md.CVlpctKS.lean.js} +1 -1
- package/dist/docs/assets/troubleshooting.md.DYECCZiJ.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.KgmmaCgw.lean.js → troubleshooting.md.DYECCZiJ.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +9 -7
- package/dist/docs/building-with-agents.md +124 -0
- package/dist/docs/concepts.html +9 -7
- package/dist/docs/concepts.md +174 -0
- package/dist/docs/deployment.html +13 -10
- package/dist/docs/deployment.md +464 -0
- package/dist/docs/evals.html +10 -8
- package/dist/docs/evals.md +481 -0
- package/dist/docs/example-agents/approval-buddy.html +9 -7
- package/dist/docs/example-agents/approval-buddy.md +266 -0
- package/dist/docs/example-agents/benny.html +9 -7
- package/dist/docs/example-agents/benny.md +182 -0
- package/dist/docs/example-agents/bugbot.html +9 -7
- package/dist/docs/example-agents/bugbot.md +229 -0
- package/dist/docs/example-agents/codebase-wiki.html +9 -7
- package/dist/docs/example-agents/codebase-wiki.md +170 -0
- package/dist/docs/example-agents/codeowners-review.html +9 -7
- package/dist/docs/example-agents/codeowners-review.md +192 -0
- package/dist/docs/example-agents/concierge.html +9 -7
- package/dist/docs/example-agents/concierge.md +201 -0
- package/dist/docs/example-agents/fsd.html +9 -7
- package/dist/docs/example-agents/fsd.md +329 -0
- package/dist/docs/example-agents/index.html +9 -7
- package/dist/docs/example-agents/index.md +102 -0
- package/dist/docs/example-agents/knowledge-base.html +9 -7
- package/dist/docs/example-agents/knowledge-base.md +168 -0
- package/dist/docs/example-agents/oncall.html +9 -7
- package/dist/docs/example-agents/oncall.md +212 -0
- package/dist/docs/example-agents/security-reviewer.html +12 -10
- package/dist/docs/example-agents/security-reviewer.md +265 -0
- package/dist/docs/example-agents/slack-agent.html +9 -7
- package/dist/docs/example-agents/slack-agent.md +142 -0
- package/dist/docs/example-agents/weather-agent.html +14 -12
- package/dist/docs/example-agents/weather-agent.md +296 -0
- package/dist/docs/guides/agent-to-agent.html +9 -7
- package/dist/docs/guides/agent-to-agent.md +113 -0
- package/dist/docs/guides/cloud-runtime.html +9 -7
- package/dist/docs/guides/cloud-runtime.md +131 -0
- package/dist/docs/guides/convert-automation.html +9 -7
- package/dist/docs/guides/convert-automation.md +171 -0
- package/dist/docs/guides/github.html +11 -9
- package/dist/docs/guides/github.md +287 -0
- package/dist/docs/guides/human-in-the-loop.html +9 -7
- package/dist/docs/guides/human-in-the-loop.md +126 -0
- package/dist/docs/guides/mcp-oauth.html +9 -7
- package/dist/docs/guides/mcp-oauth.md +159 -0
- package/dist/docs/guides/opentelemetry.html +9 -7
- package/dist/docs/guides/opentelemetry.md +209 -0
- package/dist/docs/guides/slack.html +12 -10
- package/dist/docs/guides/slack.md +337 -0
- package/dist/docs/guides/webhooks.html +12 -11
- package/dist/docs/guides/webhooks.md +463 -0
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +9 -7
- package/dist/docs/hillclimbing.md +88 -0
- package/dist/docs/index.html +10 -8
- package/dist/docs/index.md +179 -0
- package/dist/docs/llms-full.txt +11518 -0
- package/dist/docs/llms.txt +75 -0
- package/dist/docs/quickstart.html +9 -7
- package/dist/docs/quickstart.md +364 -0
- package/dist/docs/reference/agent-config.html +9 -7
- package/dist/docs/reference/agent-config.md +256 -0
- package/dist/docs/reference/artifacts.html +9 -7
- package/dist/docs/reference/artifacts.md +112 -0
- package/dist/docs/reference/channels.html +10 -8
- package/dist/docs/reference/channels.md +255 -0
- package/dist/docs/reference/cli.html +15 -12
- package/dist/docs/reference/cli.md +957 -0
- package/dist/docs/reference/connections.html +12 -10
- package/dist/docs/reference/connections.md +268 -0
- package/dist/docs/reference/hooks.html +9 -7
- package/dist/docs/reference/hooks.md +102 -0
- package/dist/docs/reference/http-api.html +12 -10
- package/dist/docs/reference/http-api.md +267 -0
- package/dist/docs/reference/instructions.html +9 -7
- package/dist/docs/reference/instructions.md +74 -0
- package/dist/docs/reference/playground.html +9 -7
- package/dist/docs/reference/playground.md +62 -0
- package/dist/docs/reference/project-layout.html +9 -7
- package/dist/docs/reference/project-layout.md +107 -0
- package/dist/docs/reference/prompt.html +9 -7
- package/dist/docs/reference/prompt.md +42 -0
- package/dist/docs/reference/schedules.html +9 -7
- package/dist/docs/reference/schedules.md +215 -0
- package/dist/docs/reference/sessions.html +9 -7
- package/dist/docs/reference/sessions.md +170 -0
- package/dist/docs/reference/skills.html +9 -7
- package/dist/docs/reference/skills.md +83 -0
- package/dist/docs/reference/subagents.html +9 -7
- package/dist/docs/reference/subagents.md +71 -0
- package/dist/docs/reference/tools.html +10 -9
- package/dist/docs/reference/tools.md +298 -0
- package/dist/docs/scaffolding-agents.html +9 -7
- package/dist/docs/scaffolding-agents.md +130 -0
- package/dist/docs/storage.html +9 -7
- package/dist/docs/storage.md +219 -0
- package/dist/docs/templates/agentic-owners.html +9 -7
- package/dist/docs/templates/agentic-owners.md +92 -0
- package/dist/docs/templates/demo.html +9 -7
- package/dist/docs/templates/demo.md +79 -0
- package/dist/docs/templates/pr-autofixer.html +9 -7
- package/dist/docs/templates/pr-autofixer.md +131 -0
- package/dist/docs/templates/security-reviewer.html +9 -7
- package/dist/docs/templates/security-reviewer.md +84 -0
- package/dist/docs/templates/triage.html +10 -8
- package/dist/docs/templates/triage.md +98 -0
- package/dist/docs/troubleshooting.html +9 -7
- package/dist/docs/troubleshooting.md +111 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +21 -3
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +1 -0
- package/dist/internal/deploy-client.d.ts +18 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +25 -1
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +5 -1
- package/dist/internal/discovery.d.ts +5 -1
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +16 -0
- package/dist/internal/http-channel.d.ts +2 -2
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +11 -31
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +2 -0
- package/dist/internal/init-scaffold.d.ts.map +1 -1
- package/dist/internal/init-scaffold.js +1 -0
- package/dist/internal/playground/static.d.ts.map +1 -1
- package/dist/internal/playground/static.js +2 -0
- package/dist/internal/session-engine.d.ts +8 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +50 -6
- package/dist/playground/assets/index-D9N7-q97.css +1 -0
- package/dist/playground/assets/{index-DxapiDj_.js → index-DDvyC2z6.js} +49 -49
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +8 -5
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +3 -1
- package/docs/concepts.md +1 -1
- package/docs/deployment.md +9 -6
- package/docs/evals.md +1 -5
- package/docs/example-agents/codebase-wiki.md +2 -3
- package/docs/example-agents/fsd.md +1 -1
- package/docs/example-agents/index.md +2 -2
- package/docs/example-agents/knowledge-base.md +3 -3
- package/docs/example-agents/security-reviewer.md +17 -48
- package/docs/example-agents/weather-agent.md +14 -45
- package/docs/guides/github.md +7 -4
- package/docs/guides/slack.md +7 -2
- package/docs/guides/webhooks.md +12 -15
- package/docs/reference/channels.md +4 -0
- package/docs/reference/cli.md +21 -7
- package/docs/reference/connections.md +13 -32
- package/docs/reference/http-api.md +14 -9
- package/docs/reference/tools.md +1 -3
- package/docs/templates/triage.md +3 -5
- package/docs/troubleshooting.md +1 -1
- package/package.json +2 -2
- package/skills/ab/SKILL.md +3 -0
- package/skills/create-agent/SKILL.md +9 -7
- package/skills/debug/SKILL.md +3 -0
- package/skills/evals/SKILL.md +3 -0
- package/skills/framework-map/SKILL.md +9 -6
- package/skills/github/SKILL.md +3 -0
- package/skills/hillclimb/SKILL.md +3 -0
- package/skills/mcp-auth/SKILL.md +3 -0
- package/skills/otel/SKILL.md +3 -0
- package/skills/setup-slack/SKILL.md +4 -1
- package/src/channels/slack/channel-watch.ts +1 -1
- package/src/channels/slack/slack-channel.ts +1 -1
- package/src/channels/slack/types.ts +2 -4
- package/src/internal/cli-deploy.ts +27 -7
- package/src/internal/cursor-agent-template.ts +1 -0
- package/src/internal/deploy-client.ts +40 -1
- package/src/internal/deploy-manifest.ts +10 -1
- package/src/internal/discovery.ts +20 -0
- package/src/internal/http-channel.ts +14 -41
- package/src/internal/init-project.ts +2 -0
- package/src/internal/init-scaffold.ts +1 -0
- package/src/internal/playground/static.ts +2 -0
- package/src/internal/session-engine.ts +62 -14
- package/src/types.ts +8 -5
- package/templates/security-help/README.md +37 -0
- package/templates/security-help/agent/agent.ts +18 -0
- package/templates/security-help/agent/channels/github.ts +13 -0
- package/templates/security-help/agent/channels/slack.ts +89 -0
- package/templates/security-help/agent/instructions.md +20 -0
- package/templates/security-help/agent/knowledge/faq/approvals.md +5 -0
- package/templates/security-help/agent/knowledge/faq/channels.md +6 -0
- package/templates/security-help/agent/knowledge/faq/phishing.md +10 -0
- package/templates/security-help/agent/lib/pr-first-pass.ts +42 -0
- package/templates/security-help/agent/lib/repos.ts +5 -0
- package/templates/security-help/agent/skills/access-request.md +10 -0
- package/templates/security-help/agent/skills/security-first-pass.md +15 -0
- package/templates/security-help/agent/skills/security-playbooks.md +12 -0
- package/templates/security-help/agent/skills/security-pr-first-pass.md +12 -0
- package/templates/security-help/evals/evals.config.ts +5 -0
- package/templates/security-help/evals/security-help.eval.ts +53 -0
- package/templates/security-help/init.json +31 -0
- package/templates/security-help/package.json +18 -0
- package/templates/security-help/tsconfig.json +12 -0
- package/templates/triage/agent/channels/webhook.ts +2 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.FV0R6kOb.js +0 -1
- package/dist/docs/assets/chunks/theme.Dx7j_-0n.js +0 -2
- package/dist/docs/assets/example-agents_index.md.xmJ87d_3.js +0 -2
- package/dist/docs/assets/example-agents_weather-agent.md.DC3lINjo.lean.js +0 -1
- package/dist/docs/assets/index.md.DhRHS_-L.js +0 -5
- package/dist/docs/assets/troubleshooting.md.KgmmaCgw.js +0 -1
- package/dist/playground/assets/index-BpVS-paP.css +0 -1
|
@@ -16,6 +16,9 @@ over HTTP/Slack/GitHub channels, with the Cursor SDK + harness as the
|
|
|
16
16
|
execution engine. Ground truth is the package `README.md` (full reference)
|
|
17
17
|
and `AGENTS.md` (coding-agent loop) — this skill is the map, not the spec.
|
|
18
18
|
|
|
19
|
+
Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
|
|
20
|
+
host serves the same index at `/docs/llms.txt`.
|
|
21
|
+
|
|
19
22
|
Run the CLI as `agent-sdk <cmd>`. In the everysphere monorepo there is no
|
|
20
23
|
installed bin — use:
|
|
21
24
|
|
|
@@ -77,10 +80,11 @@ the serve host; `runtime: "cloud"` runs them on Cursor cloud agents
|
|
|
77
80
|
|
|
78
81
|
| Capability | local | cloud |
|
|
79
82
|
| --- | --- | --- |
|
|
80
|
-
| Server tools (`execution: "server"`)
|
|
83
|
+
| Server tools (`execution: "server"`) | yes | yes on managed hosting; self-hosted needs `--public-url` |
|
|
84
|
+
| Tool approvals | yes | no |
|
|
81
85
|
| Agent tools (`execution: "agent"` scripts) | yes | yes |
|
|
82
|
-
| Skills | yes | yes
|
|
83
|
-
| sandbox seeds | yes |
|
|
86
|
+
| Skills | yes | yes |
|
|
87
|
+
| sandbox seeds | yes | no |
|
|
84
88
|
| Instructions | `AGENTS.md` in session workspace | prepended to first prompt |
|
|
85
89
|
| Checkout of a repo/PR | you arrange it | the VM carries it |
|
|
86
90
|
|
|
@@ -93,9 +97,8 @@ scale, use cloud and keep the host to routing, briefs, and bookkeeping.
|
|
|
93
97
|
|
|
94
98
|
Two handles, two owners:
|
|
95
99
|
|
|
96
|
-
- **continuationToken
|
|
97
|
-
|
|
98
|
-
Rotates on each accepted HTTP follow-up; stale tokens get `409`.
|
|
100
|
+
- **continuationToken:** credential for continuing a conversation. HTTP
|
|
101
|
+
follow-ups rotate it; stale tokens get `409`.
|
|
99
102
|
- **sessionId** — runtime-owned handle for streaming/inspection
|
|
100
103
|
(`GET /v1/session/:id/stream?startIndex=N`, durable NDJSON replay).
|
|
101
104
|
|
package/skills/github/SKILL.md
CHANGED
|
@@ -9,6 +9,9 @@ description: >-
|
|
|
9
9
|
|
|
10
10
|
# GitHub channels in the Agent SDK
|
|
11
11
|
|
|
12
|
+
Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
|
|
13
|
+
host serves the same index at `/docs/llms.txt`.
|
|
14
|
+
|
|
12
15
|
Author `agent/channels/github.ts` with `githubChannel()` from
|
|
13
16
|
`@cursor/july/channels/github`. It mounts
|
|
14
17
|
`POST /<slug>/v1/channels/github` and publishes the events it dispatches on
|
|
@@ -11,6 +11,9 @@ paths:
|
|
|
11
11
|
|
|
12
12
|
# Agent SDK hillclimb
|
|
13
13
|
|
|
14
|
+
Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
|
|
15
|
+
host serves the same index at `/docs/llms.txt`.
|
|
16
|
+
|
|
14
17
|
Optimize one Agent SDK agent project
|
|
15
18
|
with a tight measure → change → remeasure loop. Do not redesign the
|
|
16
19
|
whole framework; climb one concrete failure mode at a time. Sibling skills:
|
package/skills/mcp-auth/SKILL.md
CHANGED
|
@@ -8,6 +8,9 @@ description: >-
|
|
|
8
8
|
|
|
9
9
|
# Host MCP OAuth (mcp auth)
|
|
10
10
|
|
|
11
|
+
Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
|
|
12
|
+
host serves the same index at `/docs/llms.txt`.
|
|
13
|
+
|
|
11
14
|
Use this skill when a human asks to authorize a remote MCP server on an
|
|
12
15
|
Agent SDK host, store credentials for Cursor-managed hosting, or debug
|
|
13
16
|
`host.mcp` auth failures for `oauth: true` connections.
|
package/skills/otel/SKILL.md
CHANGED
|
@@ -8,6 +8,9 @@ description: >-
|
|
|
8
8
|
|
|
9
9
|
# Agent SDK OpenTelemetry (`defineOtel`)
|
|
10
10
|
|
|
11
|
+
Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
|
|
12
|
+
host serves the same index at `/docs/llms.txt`.
|
|
13
|
+
|
|
11
14
|
Push session, turn, tool, and subagent traces, plus token and cost
|
|
12
15
|
metrics, from the serve process to an OTLP collector. Logs are off
|
|
13
16
|
until you opt in.
|
|
@@ -9,6 +9,9 @@ description: >-
|
|
|
9
9
|
|
|
10
10
|
# Setup Slack for the Agent SDK
|
|
11
11
|
|
|
12
|
+
Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
|
|
13
|
+
host serves the same index at `/docs/llms.txt`.
|
|
14
|
+
|
|
12
15
|
Use this skill when a human asks to wire Slack to an Agent SDK agent.
|
|
13
16
|
|
|
14
17
|
There are **two ways to connect**:
|
|
@@ -303,7 +306,7 @@ a mention), opt in explicitly:
|
|
|
303
306
|
export default slackChannel({
|
|
304
307
|
engagement: {
|
|
305
308
|
channelPosts: {
|
|
306
|
-
allow: ["#issues-cursor-desktop"], //
|
|
309
|
+
allow: ["#issues-cursor-desktop"], // use ["*"] for every joined channel
|
|
307
310
|
posts: "top-level", // default — thread replies never dispatch
|
|
308
311
|
debounceMs: 15_000, // optional: edits settle, deletes cancel
|
|
309
312
|
},
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Opt-in channel watch: dispatch on posts in allowlisted channels.
|
|
3
3
|
*
|
|
4
4
|
* Filtering rules (the anti-slop guarantees):
|
|
5
|
-
* - Only
|
|
5
|
+
* - Only configured channels are watched; `"*"` opts into every channel.
|
|
6
6
|
* - Top-level posts only by default; thread replies never dispatch unless
|
|
7
7
|
* `posts: "all"` is configured.
|
|
8
8
|
* - Posts that @mention the bot are skipped here (the `app_mention` path
|
|
@@ -233,7 +233,7 @@ export function slackChannel<const Name extends string = string>(
|
|
|
233
233
|
const entries = channelPosts.allow.filter((entry) => entry.trim() !== "");
|
|
234
234
|
if (entries.length === 0) {
|
|
235
235
|
throw new Error(
|
|
236
|
-
|
|
236
|
+
'slackChannel engagement.channelPosts.allow must list at least one channel (id, #name, or "*").'
|
|
237
237
|
);
|
|
238
238
|
}
|
|
239
239
|
}
|
|
@@ -324,10 +324,8 @@ export type SlackBlockActionHandler = (
|
|
|
324
324
|
| Promise<SlackDispatchDecision | null | undefined>;
|
|
325
325
|
|
|
326
326
|
/**
|
|
327
|
-
* Opt-in channel watch: dispatch on posts in
|
|
328
|
-
*
|
|
329
|
-
* "every channel the bot is in" wildcard — watching a channel is a
|
|
330
|
-
* per-channel decision.
|
|
327
|
+
* Opt-in channel watch: dispatch on posts in configured channels without an
|
|
328
|
+
* @mention. Use `"*"` for every channel the bot has joined.
|
|
331
329
|
*/
|
|
332
330
|
export interface SlackChannelPostsOptions {
|
|
333
331
|
/**
|
|
@@ -28,6 +28,7 @@ import { readDeployTemplate } from "./cursor-agent-template.js";
|
|
|
28
28
|
import {
|
|
29
29
|
type AgentkitDeployAccepted,
|
|
30
30
|
type AgentkitDeployStatus,
|
|
31
|
+
type AgentkitStopAccepted,
|
|
31
32
|
AgentServeDeployClient,
|
|
32
33
|
type DeleteAccepted,
|
|
33
34
|
type DeployAccepted,
|
|
@@ -1187,11 +1188,25 @@ export async function cmdStop(
|
|
|
1187
1188
|
if (typeof ctx === "number") {
|
|
1188
1189
|
return ctx;
|
|
1189
1190
|
}
|
|
1190
|
-
|
|
1191
|
+
// Stop takes only a slug, so there is no manifest to dispatch on (unlike
|
|
1192
|
+
// deploy). The v2 agentkit control plane goes first: v1 endpoints refuse
|
|
1193
|
+
// `architecture: "v2"` slugs with a 409 rather than a 404, so v1-first
|
|
1194
|
+
// could not fall through. A v2 404 (including an older backend without
|
|
1195
|
+
// the agentkit mount) falls back to the v1 stop.
|
|
1196
|
+
let architecture: "v1" | "v2" = "v2";
|
|
1197
|
+
let accepted: StopAccepted | AgentkitStopAccepted;
|
|
1191
1198
|
try {
|
|
1192
|
-
accepted = await ctx.client.
|
|
1199
|
+
accepted = await ctx.client.stopAgentkit({ teamId: ctx.teamId, slug });
|
|
1193
1200
|
} catch (error) {
|
|
1194
|
-
|
|
1201
|
+
if (!(error instanceof DeployApiError) || error.status !== 404) {
|
|
1202
|
+
return renderApiError(error, ctx.err);
|
|
1203
|
+
}
|
|
1204
|
+
try {
|
|
1205
|
+
accepted = await ctx.client.stopDeployment({ teamId: ctx.teamId, slug });
|
|
1206
|
+
architecture = "v1";
|
|
1207
|
+
} catch (v1Error) {
|
|
1208
|
+
return renderApiError(v1Error, ctx.err);
|
|
1209
|
+
}
|
|
1195
1210
|
}
|
|
1196
1211
|
if (ctx.noWait) {
|
|
1197
1212
|
if (ctx.json) {
|
|
@@ -1201,11 +1216,16 @@ export async function cmdStop(
|
|
|
1201
1216
|
}
|
|
1202
1217
|
return 0;
|
|
1203
1218
|
}
|
|
1204
|
-
let detail: DeploymentDetail;
|
|
1219
|
+
let detail: DeploymentDetail | AgentkitDeployStatus;
|
|
1205
1220
|
try {
|
|
1206
|
-
detail =
|
|
1207
|
-
|
|
1208
|
-
|
|
1221
|
+
detail =
|
|
1222
|
+
architecture === "v2"
|
|
1223
|
+
? await pollUntil(ctx, slug, new Set(["stopped"]), () =>
|
|
1224
|
+
ctx.client.getAgentkitDeploy({ teamId: ctx.teamId, slug })
|
|
1225
|
+
)
|
|
1226
|
+
: await pollUntil(ctx, slug, new Set(["stopped"]), () =>
|
|
1227
|
+
ctx.client.getDeployment({ teamId: ctx.teamId, slug })
|
|
1228
|
+
);
|
|
1209
1229
|
} catch (error) {
|
|
1210
1230
|
return renderApiError(error, ctx.err);
|
|
1211
1231
|
}
|
|
@@ -255,6 +255,17 @@ export interface AgentkitDeployStatus {
|
|
|
255
255
|
export const TERMINAL_AGENTKIT_DEPLOY_STATUSES: ReadonlySet<AgentkitCustomerStatus> =
|
|
256
256
|
new Set(["running", "failed", "stopped"]);
|
|
257
257
|
|
|
258
|
+
/**
|
|
259
|
+
* `POST /internal/agentkit/deployments/:slug/stop` 202 body. Like v1
|
|
260
|
+
* {@link StopAccepted} but keyed by catalog ids instead of the numeric
|
|
261
|
+
* deployment row id.
|
|
262
|
+
*/
|
|
263
|
+
export interface AgentkitStopAccepted {
|
|
264
|
+
applicationId: string;
|
|
265
|
+
releaseId: string;
|
|
266
|
+
status: string;
|
|
267
|
+
}
|
|
268
|
+
|
|
258
269
|
/** One secret's metadata from the list endpoint — names only, never values. */
|
|
259
270
|
export interface SecretInfo {
|
|
260
271
|
name: string;
|
|
@@ -332,6 +343,14 @@ const agentkitDeployStatusSchema = z
|
|
|
332
343
|
})
|
|
333
344
|
.passthrough();
|
|
334
345
|
|
|
346
|
+
const agentkitStopAcceptedSchema = z
|
|
347
|
+
.object({
|
|
348
|
+
applicationId: z.string().min(1),
|
|
349
|
+
releaseId: z.string().min(1),
|
|
350
|
+
status: z.string(),
|
|
351
|
+
})
|
|
352
|
+
.passthrough();
|
|
353
|
+
|
|
335
354
|
const deploymentSchema = z.object({
|
|
336
355
|
id: z.number(),
|
|
337
356
|
slug: z.string(),
|
|
@@ -602,6 +621,22 @@ export class AgentServeDeployClient {
|
|
|
602
621
|
return agentkitDeployStatusSchema.parse(raw);
|
|
603
622
|
}
|
|
604
623
|
|
|
624
|
+
/**
|
|
625
|
+
* Stop a v2 deployment (`POST /internal/agentkit/deployments/:slug/stop`).
|
|
626
|
+
* 202 means accepted; poll {@link getAgentkitDeploy} until `stopped`.
|
|
627
|
+
*/
|
|
628
|
+
async stopAgentkit(args: {
|
|
629
|
+
teamId: number;
|
|
630
|
+
slug: string;
|
|
631
|
+
}): Promise<AgentkitStopAccepted> {
|
|
632
|
+
const raw = await this.request({
|
|
633
|
+
method: "POST",
|
|
634
|
+
path: `/internal/agentkit/deployments/${encodeURIComponent(args.slug)}/stop?teamId=${args.teamId}`,
|
|
635
|
+
context: { verb: "stop", slug: args.slug },
|
|
636
|
+
});
|
|
637
|
+
return agentkitStopAcceptedSchema.parse(raw);
|
|
638
|
+
}
|
|
639
|
+
|
|
605
640
|
async listDeployments(args: { teamId: number }): Promise<Deployment[]> {
|
|
606
641
|
const raw = await this.request({
|
|
607
642
|
method: "GET",
|
|
@@ -888,8 +923,12 @@ function mapErrorResponse(
|
|
|
888
923
|
);
|
|
889
924
|
}
|
|
890
925
|
case 409:
|
|
926
|
+
// The server's 409 body distinguishes real conflicts (CAS races,
|
|
927
|
+
// "still deploying", architecture-v2 slugs on the v1 surface); keep
|
|
928
|
+
// its message when present.
|
|
891
929
|
return new DeployApiError(
|
|
892
|
-
|
|
930
|
+
serverError ??
|
|
931
|
+
`A concurrent deploy or stop is changing deployment${slugPart}; retry in a moment.`,
|
|
893
932
|
409
|
|
894
933
|
);
|
|
895
934
|
case 429: {
|
|
@@ -40,7 +40,10 @@ import {
|
|
|
40
40
|
handshakeChannelContinuation,
|
|
41
41
|
} from "./continuation-channel.js";
|
|
42
42
|
import { CONTINUATION_SELECTORS } from "./continuation-identity.js";
|
|
43
|
-
import {
|
|
43
|
+
import {
|
|
44
|
+
projectInfo,
|
|
45
|
+
runtimeArchitectureCompatibilityError,
|
|
46
|
+
} from "./discovery.js";
|
|
44
47
|
import { packageVersion } from "./distribution.js";
|
|
45
48
|
|
|
46
49
|
export const DEPLOY_MANIFEST_VERSION: 1 = 1;
|
|
@@ -125,6 +128,12 @@ export function buildAgentDeployManifest(
|
|
|
125
128
|
project: AgentProject,
|
|
126
129
|
options?: { nowMs?: number; cliVersion?: string }
|
|
127
130
|
): AgentDeployManifestV1 {
|
|
131
|
+
const runtimeArchitectureError = runtimeArchitectureCompatibilityError(
|
|
132
|
+
project.agent
|
|
133
|
+
);
|
|
134
|
+
if (runtimeArchitectureError !== undefined) {
|
|
135
|
+
throw new Error(runtimeArchitectureError);
|
|
136
|
+
}
|
|
128
137
|
applyAgentContinuationDefaults(project);
|
|
129
138
|
const channels = project.channels.map((channel) => {
|
|
130
139
|
const handshake = handshakeChannelContinuation(channel);
|
|
@@ -524,6 +524,17 @@ async function loadAgent(
|
|
|
524
524
|
const hosting = resolveHosting(ctx, agentDir, config?.hosting);
|
|
525
525
|
const concurrency = resolveConcurrency(ctx, agentDir, config?.concurrency);
|
|
526
526
|
const architecture = resolveArchitecture(ctx, agentDir, config?.architecture);
|
|
527
|
+
const runtimeArchitectureError = runtimeArchitectureCompatibilityError({
|
|
528
|
+
runtime,
|
|
529
|
+
architecture,
|
|
530
|
+
});
|
|
531
|
+
if (runtimeArchitectureError !== undefined) {
|
|
532
|
+
ctx.diagnostics.push({
|
|
533
|
+
severity: "error",
|
|
534
|
+
path: displayPath(ctx, join(agentDir, "agent.ts")),
|
|
535
|
+
message: runtimeArchitectureError,
|
|
536
|
+
});
|
|
537
|
+
}
|
|
527
538
|
|
|
528
539
|
if (runtime === "cloud") {
|
|
529
540
|
warnCloudRuntimeLimitations(ctx, agentDir, {
|
|
@@ -570,6 +581,15 @@ async function loadAgent(
|
|
|
570
581
|
};
|
|
571
582
|
}
|
|
572
583
|
|
|
584
|
+
export function runtimeArchitectureCompatibilityError(agent: {
|
|
585
|
+
runtime: AgentRuntime;
|
|
586
|
+
architecture?: AgentArchitecture;
|
|
587
|
+
}): string | undefined {
|
|
588
|
+
return agent.architecture === "v2" && agent.runtime === "grokbot"
|
|
589
|
+
? 'architecture: "v2" cannot use runtime: "grokbot": the grokbot runtime executes through the signed-in account\'s hosted /v0/grokbot box, not a deployment-scoped v2 runtime.'
|
|
590
|
+
: undefined;
|
|
591
|
+
}
|
|
592
|
+
|
|
573
593
|
function resolveArchitecture(
|
|
574
594
|
ctx: DiscoveryContext,
|
|
575
595
|
agentDir: string,
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* Continuation semantics: `POST /v1/session` returns a `continuationToken`;
|
|
8
8
|
* each accepted follow-up rotates it and returns the replacement, and a
|
|
9
9
|
* stale token is rejected with 409. Follow-ups address any chat session by
|
|
10
|
-
* id (including custom channels such as `drive`) when the token matches
|
|
11
|
-
*
|
|
10
|
+
* id (including custom channels such as `drive`) when the token matches its
|
|
11
|
+
* active HTTP follow-up key; task sessions stay fire-and-forget.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import type {
|
|
@@ -20,11 +20,7 @@ import type {
|
|
|
20
20
|
SessionRecord,
|
|
21
21
|
} from "../types.js";
|
|
22
22
|
import { samePrincipal } from "./auth.js";
|
|
23
|
-
import {
|
|
24
|
-
formatContinuationToken,
|
|
25
|
-
newContinuationKey,
|
|
26
|
-
parseContinuationToken,
|
|
27
|
-
} from "./ids.js";
|
|
23
|
+
import { formatContinuationToken, parseContinuationToken } from "./ids.js";
|
|
28
24
|
import { isLoopbackAddress } from "./net.js";
|
|
29
25
|
import type { ServerRoute } from "./router.js";
|
|
30
26
|
import {
|
|
@@ -32,7 +28,6 @@ import {
|
|
|
32
28
|
ApprovalNotFoundError,
|
|
33
29
|
HTTP_CHANNEL_ID,
|
|
34
30
|
SessionAuthError,
|
|
35
|
-
SessionBusyError,
|
|
36
31
|
type SessionEngine,
|
|
37
32
|
} from "./session-engine.js";
|
|
38
33
|
import {
|
|
@@ -143,10 +138,8 @@ export function buildHttpChannelRoutes(args: {
|
|
|
143
138
|
`Unknown session ${sessionId}.`
|
|
144
139
|
);
|
|
145
140
|
}
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
// session's own continuation token. Task/schedule sessions stay
|
|
149
|
-
// fire-and-forget.
|
|
141
|
+
// HTTP can follow any chat session. Its credential is separate from the
|
|
142
|
+
// owning channel's continuation key.
|
|
150
143
|
if (record.mode === "task") {
|
|
151
144
|
return errorResponse(
|
|
152
145
|
409,
|
|
@@ -178,12 +171,7 @@ export function buildHttpChannelRoutes(args: {
|
|
|
178
171
|
);
|
|
179
172
|
}
|
|
180
173
|
const presented = parseContinuationToken(body.continuationToken);
|
|
181
|
-
if (
|
|
182
|
-
presented === null ||
|
|
183
|
-
presented.channelId !== record.channelId ||
|
|
184
|
-
record.continuationKey === null ||
|
|
185
|
-
presented.key !== record.continuationKey
|
|
186
|
-
) {
|
|
174
|
+
if (presented === null) {
|
|
187
175
|
return errorResponse(
|
|
188
176
|
409,
|
|
189
177
|
"stale_continuation_token",
|
|
@@ -192,34 +180,19 @@ export function buildHttpChannelRoutes(args: {
|
|
|
192
180
|
}
|
|
193
181
|
|
|
194
182
|
const message = await transformMessage(body.message, ctx.auth);
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
});
|
|
203
|
-
} catch (error) {
|
|
204
|
-
if (error instanceof SessionBusyError) {
|
|
205
|
-
return errorResponse(
|
|
206
|
-
409,
|
|
207
|
-
"session_busy",
|
|
208
|
-
"A turn is already running; wait for session.waiting before sending a follow-up."
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
throw error;
|
|
183
|
+
const rotated = await engine.followUpHttp(sessionId, presented, message);
|
|
184
|
+
if (rotated === undefined) {
|
|
185
|
+
return errorResponse(
|
|
186
|
+
409,
|
|
187
|
+
"stale_continuation_token",
|
|
188
|
+
"The continuation token does not address this session's active continuation."
|
|
189
|
+
);
|
|
212
190
|
}
|
|
213
|
-
|
|
214
|
-
// Rotate only after the message is accepted so a rejected send leaves
|
|
215
|
-
// the caller's token valid for retry.
|
|
216
|
-
const rotated = newContinuationKey();
|
|
217
|
-
await engine.setContinuationToken(sessionId, rotated);
|
|
218
191
|
return jsonResponse(
|
|
219
192
|
{
|
|
220
193
|
ok: true,
|
|
221
194
|
sessionId,
|
|
222
|
-
continuationToken: formatContinuationToken(
|
|
195
|
+
continuationToken: formatContinuationToken(HTTP_CHANNEL_ID, rotated),
|
|
223
196
|
},
|
|
224
197
|
{ headers: { [SESSION_ID_HEADER]: sessionId } }
|
|
225
198
|
);
|
|
@@ -76,6 +76,7 @@ const TEMPLATES: Readonly<Record<TemplateName, TemplateEntry>> = {
|
|
|
76
76
|
"agentic-owners": { dir: "agentic-owners" },
|
|
77
77
|
demo: { dir: "demo" },
|
|
78
78
|
"pr-autofixer": { dir: "pr-autofixer" },
|
|
79
|
+
"security-help": { dir: "security-help" },
|
|
79
80
|
"security-reviewer": { dir: "security-reviewer" },
|
|
80
81
|
"triage-linear": { dir: "triage", overlay: "linear" },
|
|
81
82
|
"triage-jira": { dir: "triage", overlay: "jira" },
|
|
@@ -709,6 +710,7 @@ Scaffold a project, then open the playground:
|
|
|
709
710
|
npx ${PACKAGE_NAME} init ./my-agent # installs deps + links agent-sdk onto PATH
|
|
710
711
|
npx ${PACKAGE_NAME} init ./my-demo --template demo # record a PR walkthrough
|
|
711
712
|
npx ${PACKAGE_NAME} init ./my-reviewer --template security-reviewer # review PRs for security bugs
|
|
713
|
+
npx ${PACKAGE_NAME} init ./security-help --template security-help # answer security questions in Slack
|
|
712
714
|
npx ${PACKAGE_NAME} init ./my-triage --template triage-linear # comment on Linear issues
|
|
713
715
|
npx ${PACKAGE_NAME} init ./my-triage --template triage-jira # comment on Jira issues
|
|
714
716
|
npx ${PACKAGE_NAME} init ./my-owners --template agentic-owners # review PRs via owners policies
|
|
@@ -103,6 +103,7 @@ Run the CLI under Node, never Bun.
|
|
|
103
103
|
- Package loop: \`node_modules/${PACKAGE_NAME}/AGENTS.md\`
|
|
104
104
|
- Skills: \`node_modules/${PACKAGE_NAME}/skills/\` (\`create-agent\`, \`evals\`, \`hillclimb\`, \`debug\`)
|
|
105
105
|
- Docs: \`npx ${PACKAGE_NAME} docs\`
|
|
106
|
+
- LLM docs index: \`node_modules/${PACKAGE_NAME}/dist/docs/llms.txt\`
|
|
106
107
|
`;
|
|
107
108
|
}
|
|
108
109
|
|
|
@@ -27,6 +27,7 @@ const ASSETS_DIR = join(DIST_DIR, "assets");
|
|
|
27
27
|
export const STATIC_CONTENT_TYPES: Record<string, string> = {
|
|
28
28
|
".html": "text/html; charset=utf-8",
|
|
29
29
|
".js": "text/javascript; charset=utf-8",
|
|
30
|
+
".md": "text/markdown; charset=utf-8",
|
|
30
31
|
".mjs": "text/javascript; charset=utf-8",
|
|
31
32
|
".css": "text/css; charset=utf-8",
|
|
32
33
|
".map": "application/json; charset=utf-8",
|
|
@@ -41,6 +42,7 @@ export const STATIC_CONTENT_TYPES: Record<string, string> = {
|
|
|
41
42
|
".woff": "font/woff",
|
|
42
43
|
".woff2": "font/woff2",
|
|
43
44
|
".ttf": "font/ttf",
|
|
45
|
+
".txt": "text/plain; charset=utf-8",
|
|
44
46
|
};
|
|
45
47
|
|
|
46
48
|
/** Whether `pnpm run build:playground` has produced the SPA bundle. */
|
|
@@ -925,6 +925,51 @@ export class SessionEngine {
|
|
|
925
925
|
return this.channelSession(record.sessionId, record, true, false, since);
|
|
926
926
|
}
|
|
927
927
|
|
|
928
|
+
/**
|
|
929
|
+
* Atomically validate and rotate an HTTP follow-up credential, then admit
|
|
930
|
+
* the message to its exact session without changing the owning channel key.
|
|
931
|
+
*/
|
|
932
|
+
async followUpHttp(
|
|
933
|
+
sessionId: string,
|
|
934
|
+
token: { channelId: string; key: string },
|
|
935
|
+
message: string
|
|
936
|
+
): Promise<string | undefined> {
|
|
937
|
+
const next = newContinuationKey();
|
|
938
|
+
const stale = new Error("stale HTTP continuation");
|
|
939
|
+
let previous: string | undefined;
|
|
940
|
+
try {
|
|
941
|
+
await this.updateRecord(sessionId, (record) => {
|
|
942
|
+
const expectedChannel =
|
|
943
|
+
record.httpContinuationKey === undefined
|
|
944
|
+
? record.channelId
|
|
945
|
+
: HTTP_CHANNEL_ID;
|
|
946
|
+
const expectedKey =
|
|
947
|
+
record.httpContinuationKey ?? record.continuationKey;
|
|
948
|
+
if (token.channelId !== expectedChannel || token.key !== expectedKey) {
|
|
949
|
+
throw stale;
|
|
950
|
+
}
|
|
951
|
+
previous = record.httpContinuationKey;
|
|
952
|
+
return { ...record, httpContinuationKey: next };
|
|
953
|
+
});
|
|
954
|
+
} catch (error) {
|
|
955
|
+
if (error === stale) {
|
|
956
|
+
return undefined;
|
|
957
|
+
}
|
|
958
|
+
throw error;
|
|
959
|
+
}
|
|
960
|
+
try {
|
|
961
|
+
await this.startTurn(sessionId, message);
|
|
962
|
+
return next;
|
|
963
|
+
} catch (error) {
|
|
964
|
+
await this.updateRecord(sessionId, (record) =>
|
|
965
|
+
record.httpContinuationKey === next
|
|
966
|
+
? { ...record, httpContinuationKey: previous }
|
|
967
|
+
: record
|
|
968
|
+
);
|
|
969
|
+
throw error;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
928
973
|
/** Whether a continuation token already maps to a session on this channel. */
|
|
929
974
|
async hasContinuationSession(
|
|
930
975
|
channelId: string,
|
|
@@ -2339,14 +2384,12 @@ export class SessionEngine {
|
|
|
2339
2384
|
tools[tool.name] = {
|
|
2340
2385
|
description: tool.description,
|
|
2341
2386
|
inputSchema: tool.inputSchema as SDKCustomTool["inputSchema"],
|
|
2342
|
-
// `SDKCustomTool.outputSchema` ships in the next published
|
|
2343
|
-
// @cursor/sdk; the conditional spread carries the field through the
|
|
2344
|
-
// pinned SDK's type until the dependency bumps, at which point local
|
|
2345
|
-
// runs start advertising it.
|
|
2346
2387
|
...(tool.outputSchema === undefined
|
|
2347
2388
|
? {}
|
|
2348
|
-
: {
|
|
2349
|
-
|
|
2389
|
+
: {
|
|
2390
|
+
outputSchema: tool.outputSchema as SDKCustomTool["outputSchema"],
|
|
2391
|
+
}),
|
|
2392
|
+
// Pinned-SDK carry for `SDKCustomTool.annotations`: an advertised
|
|
2350
2393
|
// MCP passthrough's server-declared hints (bounded at listing time)
|
|
2351
2394
|
// ride into the harness listing once the dependency bumps.
|
|
2352
2395
|
...(tool.annotations === undefined
|
|
@@ -3315,12 +3358,17 @@ export class SessionEngine {
|
|
|
3315
3358
|
createdAt: record.createdAt,
|
|
3316
3359
|
updatedAt: record.updatedAt,
|
|
3317
3360
|
continuationToken:
|
|
3318
|
-
record.
|
|
3319
|
-
?
|
|
3320
|
-
|
|
3321
|
-
record.
|
|
3322
|
-
|
|
3323
|
-
|
|
3361
|
+
record.httpContinuationKey !== undefined
|
|
3362
|
+
? formatContinuationToken(
|
|
3363
|
+
HTTP_CHANNEL_ID,
|
|
3364
|
+
record.httpContinuationKey
|
|
3365
|
+
)
|
|
3366
|
+
: record.continuationKey === null
|
|
3367
|
+
? null
|
|
3368
|
+
: formatContinuationToken(
|
|
3369
|
+
record.channelId,
|
|
3370
|
+
record.continuationKey
|
|
3371
|
+
),
|
|
3324
3372
|
externalUrl: links.slack ?? links.github,
|
|
3325
3373
|
prUrl: links.github,
|
|
3326
3374
|
};
|
|
@@ -3606,8 +3654,8 @@ export class SessionEngine {
|
|
|
3606
3654
|
...current,
|
|
3607
3655
|
continuationKey: token,
|
|
3608
3656
|
}));
|
|
3609
|
-
// Keep armed reminders addressed at the conversation across
|
|
3610
|
-
//
|
|
3657
|
+
// Keep armed reminders addressed at the conversation across channel
|
|
3658
|
+
// continuation rotation.
|
|
3611
3659
|
if (
|
|
3612
3660
|
previous?.continuationKey != null &&
|
|
3613
3661
|
token !== null &&
|
package/src/types.ts
CHANGED
|
@@ -1201,10 +1201,8 @@ export type ConnectionConfig = (
|
|
|
1201
1201
|
*
|
|
1202
1202
|
* Derive the identity from durable session facts — `session.auth`,
|
|
1203
1203
|
* `session.id`, or your channel's own session state. Do **not** key it
|
|
1204
|
-
* off `session.continuationKey`:
|
|
1205
|
-
*
|
|
1206
|
-
* keyed on it silently breaks mid-conversation. (Channels that mint
|
|
1207
|
-
* stable, parseable tokens by design are the exception.)
|
|
1204
|
+
* off `session.continuationKey`: it is a channel routing key, and channels
|
|
1205
|
+
* may re-key it independently of the authenticated principal.
|
|
1208
1206
|
*
|
|
1209
1207
|
* Works attached or advertised. Advertised connections
|
|
1210
1208
|
* ({@link advertiseTools}) open per-operation clients with the
|
|
@@ -1593,6 +1591,11 @@ export interface SessionRecord {
|
|
|
1593
1591
|
abs?: Record<string, string | null>;
|
|
1594
1592
|
/** Channel-local continuation key; null when the session is not addressable. */
|
|
1595
1593
|
continuationKey: string | null;
|
|
1594
|
+
/**
|
|
1595
|
+
* Rotating HTTP follow-up credential for a channel-owned session.
|
|
1596
|
+
* Omitted until HTTP accepts the first follow-up.
|
|
1597
|
+
*/
|
|
1598
|
+
httpContinuationKey?: string;
|
|
1596
1599
|
auth: AuthContext | null;
|
|
1597
1600
|
title?: string;
|
|
1598
1601
|
channelState?: JsonValue;
|
|
@@ -1668,7 +1671,7 @@ export interface SessionSummary {
|
|
|
1668
1671
|
queued?: boolean;
|
|
1669
1672
|
createdAt: string;
|
|
1670
1673
|
updatedAt: string;
|
|
1671
|
-
/**
|
|
1674
|
+
/** Active wire token for HTTP follow-ups, or null when not addressable. */
|
|
1672
1675
|
continuationToken: string | null;
|
|
1673
1676
|
/**
|
|
1674
1677
|
* Conversation permalink (Slack thread, else GitHub PR).
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Security help
|
|
2
|
+
|
|
3
|
+
Answers security questions in Slack from your FAQ files and takes a first
|
|
4
|
+
look when someone pastes a GitHub pull request.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
npx @cursor/july init ./security-help --template security-help
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
`init` asks which repos it may read. Skip the prompt with
|
|
11
|
+
`--var repos=owner/repo`.
|
|
12
|
+
|
|
13
|
+
## Run
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
agent-sdk login
|
|
17
|
+
agent-sdk slack create --name "Security Help" --channel-posts
|
|
18
|
+
agent-sdk dev
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Slack is a dedicated bot (`@Security Help`). Mentions, DMs, and channel
|
|
22
|
+
watch go through that app. GitHub reads use your Cursor GitHub connection
|
|
23
|
+
for the repos in `agent/lib/repos.ts`. Paste a PR URL in Slack, or replay
|
|
24
|
+
one in the playground.
|
|
25
|
+
|
|
26
|
+
## Edit
|
|
27
|
+
|
|
28
|
+
- `agent/lib/repos.ts`: repos it may read
|
|
29
|
+
- `agent/channels/slack.ts`: channel ids to watch (`watch`)
|
|
30
|
+
- `agent/knowledge/faq/`: answers for your company
|
|
31
|
+
- `agent/skills/`: how to look at a PR, a leak, or an access ask
|
|
32
|
+
- `agent/instructions.md`: routing
|
|
33
|
+
|
|
34
|
+
`--channel-posts` is required to watch channels. Mentions and DMs work
|
|
35
|
+
without it.
|
|
36
|
+
|
|
37
|
+
`agent-sdk eval` runs three smoke turns and writes nothing to Slack or GitHub.
|