@cursor/bdk 0.2.2 → 0.2.3
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 +1 -1
- package/dist/bin/agent-serve.js +23 -7
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +36 -5
- package/dist/connections.d.ts +1 -1
- package/dist/connections.js +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.DtYVVVyK.js → app.BOIHhrKi.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.D5L-b34G.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D47xT7J4.js → VPLocalSearchBox.D49zVZqM.js} +1 -1
- package/dist/docs/assets/chunks/{arc.CDJ6xzxR.js → arc.hmjb-sc4.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.l1Xnjd3N.js → architectureDiagram-Q4EWVU46.CxEI1KqM.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.x-finShZ.js → baseUniq.DHHvBWoV.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.COC3qynH.js → blockDiagram-DXYQGD6D.DnXW-3bu.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.DdQO850E.js → c4Diagram-AHTNJAMY.e-47O2jM.js} +1 -1
- package/dist/docs/assets/chunks/channel.BbOGaJQP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.Dpn8omLk.js → chunk-4BX2VUAB.3ry4pYXB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C0XWStUN.js → chunk-4TB4RGXK.DGIZFRx6.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.DsKSZfIM.js → chunk-55IACEB6.DKBnqg9U.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.dNU6JDu6.js → chunk-EDXVE4YY.BIU8Ue5k.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DN41fxKE.js → chunk-FMBD7UC4.DP-TFhjI.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.COpKCZus.js → chunk-OYMX7WX6.Ux0OYj5v.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.HDB-azx2.js → chunk-QZHKN3VN.BzHMwYox.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DEeX_a2j.js → chunk-YZCP3GAM.D4OGAsSP.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Db58HCb1.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Db58HCb1.js +1 -0
- package/dist/docs/assets/chunks/clone.Co4MBflG.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.C3yGL2A8.js → cose-bilkent-S5V4N54A.Jq_7BUNx.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Bpl24en4.js → dagre-KV5264BT.Di-skR2x.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.nFco6seU.js → diagram-5BDNPKRD.DeREHIdH.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DXhA6DWR.js → diagram-G4DWMVQ6.C7Kcqxro.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.8GoOYcwk.js → diagram-MMDJMWI5.BK3eohyo.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.DDBlqvlJ.js → diagram-TYMM5635.C6TyymXT.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.vl_N81P4.js → erDiagram-SMLLAGMA.DYGG-gGx.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.Cteg8g7I.js → flowDiagram-DWJPFMVM.C9nBcSV4.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.D4aMhlMM.js → ganttDiagram-T4ZO3ILL.wAg_ymsp.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DF_J0D4q.js → gitGraphDiagram-UUTBAWPF.B87j9Oeg.js} +1 -1
- package/dist/docs/assets/chunks/{graph.DJs0LDCf.js → graph.CuFMj31w.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.Bb-4RQwg.js → infoDiagram-42DDH7IO.P_mLGumP.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DEtQRSbc.js → ishikawaDiagram-UXIWVN3A.DyuL_MsT.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.DhQQ75FA.js → journeyDiagram-VCZTEJTY.CtP09IoJ.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.C4gEw3Rk.js → kanban-definition-6JOO6SKY.BoeSYPZo.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DT-PGlXa.js → layout.B0lMMtNo.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BMMe__JW.js → linear.HxRBiAFX.js} +1 -1
- package/dist/docs/assets/chunks/{min.XyaU9K9Q.js → min.BGlFFHwS.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CbBM6xZ-.js → mindmap-definition-QFDTVHPH.JyLBD9M8.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DFJoIVou.js → pieDiagram-DEJITSTG.DnSmNZF8.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CQjkDYqb.js → quadrantDiagram-34T5L4WZ.CUCnbfCa.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.D-mK-JQu.js → requirementDiagram-MS252O5E.py0IVUn5.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BStQInpd.js → sankeyDiagram-XADWPNL6.Bkc-HWYp.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.CA_eooPJ.js → sequenceDiagram-FGHM5R23.Dqn8Mlv2.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BXl-b7ad.js → stateDiagram-FHFEXIEX.JikkoQUU.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CMsKhrW0.js +1 -0
- package/dist/docs/assets/chunks/{theme.q37tOs4x.js → theme.b6HQ6zG_.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.vjuaGOSe.js → timeline-definition-GMOUNBTQ.BvpSXiBj.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BxduJl-F.js → vennDiagram-DHZGUBPP.CU7MVnZx.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.BKwC4ctG.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D1z3ds0D.js → wardleyDiagram-NUSXRM2D.BfaF6Uhe.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CRU5Ti9b.js → xychartDiagram-5P7HB3ND.Bg5dcpj4.js} +1 -1
- package/dist/docs/assets/{deployment.md.nGo1yIsa.js → deployment.md.BJ8i7Q6p.js} +5 -8
- package/dist/docs/assets/{deployment.md.nGo1yIsa.lean.js → deployment.md.BJ8i7Q6p.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.C2_DSWlE.js → guides_github.md.Bq9kQU9B.js} +9 -3
- package/dist/docs/assets/{guides_github.md.C2_DSWlE.lean.js → guides_github.md.Bq9kQU9B.lean.js} +1 -1
- package/dist/docs/assets/{guides_slack.md.ZbHQETOT.js → guides_slack.md.diqqXTTm.js} +2 -2
- package/dist/docs/assets/{guides_slack.md.ZbHQETOT.lean.js → guides_slack.md.diqqXTTm.lean.js} +1 -1
- package/dist/docs/assets/{quickstart.md.wG4shE1f.js → quickstart.md.CHpHPBUN.js} +5 -3
- package/dist/docs/assets/{quickstart.md.wG4shE1f.lean.js → quickstart.md.CHpHPBUN.lean.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.CFMNPreZ.js → reference_artifacts.md.CQfKq8F2.js} +1 -1
- package/dist/docs/assets/reference_cli.md.DgeLTO18.js +91 -0
- package/dist/docs/assets/reference_cli.md.DgeLTO18.lean.js +1 -0
- package/dist/docs/assets/{reference_connections.md._XpKiOaF.js → reference_connections.md.COq--gAm.js} +7 -3
- package/dist/docs/assets/{reference_connections.md._XpKiOaF.lean.js → reference_connections.md.COq--gAm.lean.js} +1 -1
- package/dist/docs/assets/{reference_evals.md.DqNyHMA6.js → reference_evals.md.CJm3uCUm.js} +4 -4
- package/dist/docs/assets/{reference_evals.md.DqNyHMA6.lean.js → reference_evals.md.CJm3uCUm.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.CRFTxt9M.js → reference_skills.md.Cy00QMKS.js} +3 -3
- package/dist/docs/assets/{reference_skills.md.CRFTxt9M.lean.js → reference_skills.md.Cy00QMKS.lean.js} +1 -1
- package/dist/docs/assets/troubleshooting.md.Cw5PKa3t.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.BzZSu1Gz.lean.js → troubleshooting.md.Cw5PKa3t.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +40 -43
- package/dist/docs/deployment.md +45 -15
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +43 -37
- package/dist/docs/guides/github.md +34 -0
- package/dist/docs/guides/gitlab.html +35 -35
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +37 -37
- package/dist/docs/guides/slack.md +5 -0
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +198 -92
- package/dist/docs/quickstart.html +40 -38
- package/dist/docs/quickstart.md +7 -1
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +37 -37
- package/dist/docs/reference/artifacts.md +1 -1
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +55 -61
- package/dist/docs/reference/cli.md +65 -63
- package/dist/docs/reference/connections.html +42 -38
- package/dist/docs/reference/connections.md +28 -2
- package/dist/docs/reference/evals.html +39 -39
- package/dist/docs/reference/evals.md +6 -7
- package/dist/docs/reference/extensions.html +35 -35
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +38 -38
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/docs/troubleshooting.md +7 -3
- package/dist/extensions/cursor-grokbot-agents/extension.d.ts +77 -0
- package/dist/extensions/cursor-grokbot-agents/extension.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/extension.js +63 -0
- package/dist/extensions/cursor-grokbot-agents/lib/agents.d.ts +11 -0
- package/dist/extensions/cursor-grokbot-agents/lib/agents.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +31 -0
- package/dist/extensions/cursor-grokbot-agents/lib/backend.d.ts +56 -0
- package/dist/extensions/cursor-grokbot-agents/lib/backend.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +158 -0
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.d.ts +28 -0
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +59 -0
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.d.ts +53 -0
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +206 -0
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.js +15 -0
- package/dist/extensions/cursor-grokbot-agents/lib/lock.d.ts +12 -0
- package/dist/extensions/cursor-grokbot-agents/lib/lock.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +25 -0
- package/dist/extensions/cursor-grokbot-agents/skills/consult.md +40 -0
- package/dist/extensions/cursor-grokbot-agents/tools/ask.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/tools/ask.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +37 -0
- package/dist/extensions/cursor-grokbot-agents/tools/check.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/tools/check.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +32 -0
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +24 -0
- package/dist/extensions/cursor-grokbot-agents/tools/list.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/tools/list.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +34 -0
- package/dist/internal/cli-ax.d.ts +1 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +43 -10
- package/dist/internal/cli-deploy.d.ts +5 -1
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +22 -4
- package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
- package/dist/internal/cli-mcp-oauth.js +2 -1
- package/dist/internal/cli-skills.d.ts +1 -1
- package/dist/internal/cli-skills.d.ts.map +1 -1
- package/dist/internal/cli-skills.js +5 -5
- package/dist/internal/connection-env.d.ts +31 -0
- package/dist/internal/connection-env.d.ts.map +1 -0
- package/dist/internal/connection-env.js +84 -0
- package/dist/internal/cursor/backend-client.js +5 -0
- package/dist/internal/deploy-client.d.ts +30 -6
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +45 -9
- package/dist/internal/discovery/connections.d.ts.map +1 -1
- package/dist/internal/discovery/connections.js +11 -0
- package/dist/internal/hosted-delivery-protocol.d.ts +36 -11
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +31 -8
- package/dist/internal/hosted-delivery.d.ts +2 -2
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +228 -48
- package/dist/internal/hosting.d.ts +2 -2
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +9 -3
- package/dist/internal/install-cursor-skills.d.ts +20 -24
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +50 -48
- package/dist/internal/legacy-command-guard.d.ts +2 -0
- package/dist/internal/legacy-command-guard.d.ts.map +1 -1
- package/dist/internal/legacy-command-guard.js +10 -1
- package/dist/internal/mcp-host.d.ts +6 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +35 -16
- package/dist/internal/sdk-runner.d.ts +2 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +10 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +11 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +9 -5
- package/dist/types.d.ts +11 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/deployment.md +45 -15
- package/docs/guides/github.md +34 -0
- package/docs/guides/slack.md +5 -0
- package/docs/quickstart.md +7 -1
- package/docs/reference/artifacts.md +1 -1
- package/docs/reference/cli.md +65 -63
- package/docs/reference/connections.md +28 -2
- package/docs/reference/evals.md +6 -7
- package/docs/troubleshooting.md +7 -3
- package/package.json +1 -3
- package/scripts/install-cursor-skills.mjs +1 -1
- package/skills/create-agent/SKILL.md +1 -1
- package/skills/debug/SKILL.md +1 -1
- package/skills/deploy/SKILL.md +1 -1
- package/skills/evals/SKILL.md +1 -1
- package/skills/framework-map/SKILL.md +1 -1
- package/skills/github/SKILL.md +1 -1
- package/skills/hillclimb/SKILL.md +1 -1
- package/skills/mcp-auth/SKILL.md +1 -1
- package/skills/otel/SKILL.md +1 -1
- package/skills/setup-slack/SKILL.md +1 -1
- package/src/bin/agent-serve.ts +27 -6
- package/src/channels/github/auth.ts +44 -5
- package/src/connections.ts +1 -1
- package/src/extensions/cursor-grokbot-agents/extension.ts +132 -0
- package/src/extensions/cursor-grokbot-agents/lib/agents.ts +42 -0
- package/src/extensions/cursor-grokbot-agents/lib/backend.ts +208 -0
- package/src/extensions/cursor-grokbot-agents/lib/contacts.ts +74 -0
- package/src/extensions/cursor-grokbot-agents/lib/conversation.ts +260 -0
- package/src/extensions/cursor-grokbot-agents/lib/inputs.ts +21 -0
- package/src/extensions/cursor-grokbot-agents/lib/lock.ts +26 -0
- package/src/extensions/cursor-grokbot-agents/skills/consult.md +40 -0
- package/src/extensions/cursor-grokbot-agents/tools/ask.ts +32 -0
- package/src/extensions/cursor-grokbot-agents/tools/check.ts +25 -0
- package/src/extensions/cursor-grokbot-agents/tools/interrupt.ts +17 -0
- package/src/extensions/cursor-grokbot-agents/tools/list.ts +26 -0
- package/src/internal/cli-ax.ts +52 -7
- package/src/internal/cli-deploy.ts +39 -6
- package/src/internal/cli-mcp-oauth.ts +2 -1
- package/src/internal/cli-skills.ts +4 -5
- package/src/internal/connection-env.ts +106 -0
- package/src/internal/cursor/backend-client.ts +6 -0
- package/src/internal/deploy-client.ts +79 -9
- package/src/internal/discovery/connections.ts +11 -0
- package/src/internal/hosted-delivery-protocol.ts +57 -20
- package/src/internal/hosted-delivery.ts +486 -228
- package/src/internal/hosting.ts +10 -3
- package/src/internal/install-cursor-skills.ts +56 -53
- package/src/internal/legacy-command-guard.ts +13 -1
- package/src/internal/mcp-host.ts +45 -17
- package/src/internal/sdk-runner.ts +11 -0
- package/src/internal/server.ts +13 -1
- package/src/internal/session-engine.ts +9 -5
- package/src/types.ts +11 -1
- package/templates/agents-md/bot/lib/collect.ts +1 -4
- package/templates/code-wiki/bot/channels/github.ts +2 -2
- package/templates/demo/bot/channels/github.ts +5 -1
- package/templates/pr-autofixer/bot/lib/start-drive.ts +4 -4
- package/templates/triage/bot/lib/types.ts +6 -6
- package/dist/docs/assets/chunks/@localSearchIndexroot.BgTA2tV1.js +0 -1
- package/dist/docs/assets/chunks/channel.B2nMEx82.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D8iCH2ve.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D8iCH2ve.js +0 -1
- package/dist/docs/assets/chunks/clone.5XNLjby0.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.yGM2uLZQ.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.DKfyIejL.js +0 -162
- package/dist/docs/assets/reference_cli.md.BK2QUH67.js +0 -97
- package/dist/docs/assets/reference_cli.md.BK2QUH67.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.BzZSu1Gz.js +0 -1
- /package/dist/docs/assets/{reference_artifacts.md.CFMNPreZ.lean.js → reference_artifacts.md.CQfKq8F2.lean.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../../src/extensions/cursor-grokbot-agents/lib/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,sBAAsB,EAAE,GAAG,SAAS,GAC/C,MAAM,CA2BR"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which Grok Bot agent a call addresses. The model names one per call, but
|
|
3
|
+
* the author's `agents` are the allowlist: with them configured, a name
|
|
4
|
+
* outside the list is refused (the backend would create an agent of that
|
|
5
|
+
* name), and a lone configured agent stands in when the call names none.
|
|
6
|
+
* Matching is case-insensitive and resolves to the configured spelling,
|
|
7
|
+
* since the backend looks names up exactly.
|
|
8
|
+
*/
|
|
9
|
+
export function resolveAgentName(requested, configured) {
|
|
10
|
+
var _a;
|
|
11
|
+
const name = requested === null || requested === void 0 ? void 0 : requested.trim();
|
|
12
|
+
if (configured === undefined) {
|
|
13
|
+
if (name === undefined || name === "") {
|
|
14
|
+
throw new Error("`agent` is required: this extension has no configured Grok Bot agents.");
|
|
15
|
+
}
|
|
16
|
+
return name;
|
|
17
|
+
}
|
|
18
|
+
const names = configured.map(agent => `"${agent.name}"`).join(", ");
|
|
19
|
+
if (name === undefined || name === "") {
|
|
20
|
+
const only = configured.length === 1 ? configured[0] : undefined;
|
|
21
|
+
if (only === undefined) {
|
|
22
|
+
throw new Error(`\`agent\` is required: this extension configures several Grok Bot agents (${names}).`);
|
|
23
|
+
}
|
|
24
|
+
return only.name;
|
|
25
|
+
}
|
|
26
|
+
const match = (_a = configured.find(agent => agent.name === name)) !== null && _a !== void 0 ? _a : configured.find(agent => agent.name.toLowerCase() === name.toLowerCase());
|
|
27
|
+
if (match === undefined) {
|
|
28
|
+
throw new Error(`"${name}" is not one of this extension's configured Grok Bot agents (${names}).`);
|
|
29
|
+
}
|
|
30
|
+
return match.name;
|
|
31
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `/v0/grokbot` session API as the tools use it: the same four routes
|
|
3
|
+
* the grokbot runtime drives, on the external API host (`api.cursor.com`;
|
|
4
|
+
* they 404 on api2), under the host's Cursor API key. A session is a hosted
|
|
5
|
+
* Grok Bot agent of the key's account, get-or-created by name; messages go
|
|
6
|
+
* into its one conversation, and the transcript is read back as entries
|
|
7
|
+
* after a cursor, with the turn's status alongside.
|
|
8
|
+
*/
|
|
9
|
+
export declare class GrokBotApiError extends Error {
|
|
10
|
+
readonly status?: number | undefined;
|
|
11
|
+
constructor(message: string, status?: number | undefined);
|
|
12
|
+
}
|
|
13
|
+
export type GrokBotSession = {
|
|
14
|
+
/** The hosted agent's durable id; every other route addresses it. */
|
|
15
|
+
sessionId: string;
|
|
16
|
+
/** The name as the backend stores it (trimmed). */
|
|
17
|
+
name: string;
|
|
18
|
+
createdAtMs: number;
|
|
19
|
+
/** Transcript tail: reading after it skips the conversation's history. */
|
|
20
|
+
latestUpdatedSeq: string;
|
|
21
|
+
};
|
|
22
|
+
export type GrokBotEntry = {
|
|
23
|
+
seq: string;
|
|
24
|
+
updatedSeq: string;
|
|
25
|
+
kind: string;
|
|
26
|
+
role?: string;
|
|
27
|
+
text?: string;
|
|
28
|
+
createdAtMs: number;
|
|
29
|
+
};
|
|
30
|
+
export type GrokBotTurnStatus = {
|
|
31
|
+
idle: boolean;
|
|
32
|
+
inFlight: boolean;
|
|
33
|
+
queued: number;
|
|
34
|
+
};
|
|
35
|
+
export type GrokBotEntriesPage = {
|
|
36
|
+
entries: GrokBotEntry[];
|
|
37
|
+
latestUpdatedSeq: string;
|
|
38
|
+
turn: GrokBotTurnStatus;
|
|
39
|
+
};
|
|
40
|
+
export declare class GrokBotAgentsBackend {
|
|
41
|
+
private readonly apiKey;
|
|
42
|
+
private readonly fetchImpl;
|
|
43
|
+
constructor(apiKey: () => string, fetchImpl?: typeof fetch);
|
|
44
|
+
/** `POST /v0/grokbot/sessions`: the account's agent of that name, created when missing. */
|
|
45
|
+
session(name: string): Promise<GrokBotSession>;
|
|
46
|
+
/** Deliver one user message to the agent's conversation. */
|
|
47
|
+
send(sessionId: string, text: string): Promise<void>;
|
|
48
|
+
/** Transcript entries after `afterUpdatedSeq`, oldest first, with the turn's status. */
|
|
49
|
+
entries(sessionId: string, afterUpdatedSeq: string): Promise<GrokBotEntriesPage>;
|
|
50
|
+
interrupt(sessionId: string, reason: string): Promise<void>;
|
|
51
|
+
private request;
|
|
52
|
+
}
|
|
53
|
+
/** The process-wide backend for this mount, built on first use. */
|
|
54
|
+
export declare function grokBotAgentsBackend(): GrokBotAgentsBackend;
|
|
55
|
+
export declare function apiKey(): string;
|
|
56
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../../src/extensions/cursor-grokbot-agents/lib/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,qBAAa,eAAgB,SAAQ,KAAK;IAGtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAF1B,YACE,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA,EAIzB;CACF;AAGD,MAAM,MAAM,cAAc,GAAG;IAC3B,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAiCF,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAF5B,YACmB,MAAM,EAAE,MAAM,MAAM,EACpB,SAAS,GAAE,OAAO,KAAa,EAC9C;IAEJ,2FAA2F;IACrF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAYnD;IAED,4DAA4D;IACtD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYzD;IAED,wFAAwF;IAClF,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAOrF;IAEK,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;YAEa,OAAO;CA+BtB;AAID,mEAAmE;AACnE,wBAAgB,oBAAoB,IAAI,oBAAoB,CAG3D;AAED,wBAAgB,MAAM,IAAI,MAAM,CAO/B"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `/v0/grokbot` session API as the tools use it: the same four routes
|
|
3
|
+
* the grokbot runtime drives, on the external API host (`api.cursor.com`;
|
|
4
|
+
* they 404 on api2), under the host's Cursor API key. A session is a hosted
|
|
5
|
+
* Grok Bot agent of the key's account, get-or-created by name; messages go
|
|
6
|
+
* into its one conversation, and the transcript is read back as entries
|
|
7
|
+
* after a cursor, with the turn's status alongside.
|
|
8
|
+
*/
|
|
9
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
10
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
11
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
12
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
13
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
14
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
15
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
import { randomUUID } from "node:crypto";
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
import { cursorExternalApiUrl, resolveApiKeySync, SIGN_IN_HINT, } from "../../../internal/cursor/credentials.js";
|
|
21
|
+
import extension from "../extension.js";
|
|
22
|
+
const REQUEST_TIMEOUT_MS = 60000;
|
|
23
|
+
export class GrokBotApiError extends Error {
|
|
24
|
+
constructor(message, status) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.status = status;
|
|
27
|
+
this.name = "GrokBotApiError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const sessionSchema = z.object({
|
|
31
|
+
id: z.string(),
|
|
32
|
+
name: z.string(),
|
|
33
|
+
createdAtMs: z.number(),
|
|
34
|
+
latestUpdatedSeq: z.string(),
|
|
35
|
+
});
|
|
36
|
+
const sendSchema = z.object({
|
|
37
|
+
messageId: z.string(),
|
|
38
|
+
delivery: z.string(),
|
|
39
|
+
});
|
|
40
|
+
const entriesSchema = z.object({
|
|
41
|
+
entries: z.array(z.object({
|
|
42
|
+
seq: z.string(),
|
|
43
|
+
updatedSeq: z.string(),
|
|
44
|
+
kind: z.string(),
|
|
45
|
+
role: z.string().optional(),
|
|
46
|
+
text: z.string().optional(),
|
|
47
|
+
createdAtMs: z.number(),
|
|
48
|
+
})),
|
|
49
|
+
latestUpdatedSeq: z.string(),
|
|
50
|
+
turn: z.object({
|
|
51
|
+
idle: z.boolean(),
|
|
52
|
+
inFlight: z.boolean(),
|
|
53
|
+
queued: z.number(),
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
export class GrokBotAgentsBackend {
|
|
57
|
+
constructor(apiKey, fetchImpl = fetch) {
|
|
58
|
+
this.apiKey = apiKey;
|
|
59
|
+
this.fetchImpl = fetchImpl;
|
|
60
|
+
}
|
|
61
|
+
/** `POST /v0/grokbot/sessions`: the account's agent of that name, created when missing. */
|
|
62
|
+
session(name) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
// No `instructions`: the agent is somebody's, configured in the app, and
|
|
65
|
+
// an omitted field never touches its stored profile.
|
|
66
|
+
const parsed = sessionSchema.parse(yield this.request("POST", "/v0/grokbot/sessions", { name }));
|
|
67
|
+
return {
|
|
68
|
+
sessionId: parsed.id,
|
|
69
|
+
name: parsed.name,
|
|
70
|
+
createdAtMs: parsed.createdAtMs,
|
|
71
|
+
latestUpdatedSeq: parsed.latestUpdatedSeq,
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Deliver one user message to the agent's conversation. */
|
|
76
|
+
send(sessionId, text) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const { delivery } = sendSchema.parse(yield this.request("POST", `/v0/grokbot/sessions/${sessionId}/messages`, {
|
|
79
|
+
text,
|
|
80
|
+
messageId: randomUUID(),
|
|
81
|
+
}));
|
|
82
|
+
if (delivery !== "accepted_temporal" && delivery !== "duplicate") {
|
|
83
|
+
throw new GrokBotApiError(`The Grok Bot agent's harness did not accept the message (delivery: ${delivery}).`);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Transcript entries after `afterUpdatedSeq`, oldest first, with the turn's status. */
|
|
88
|
+
entries(sessionId, afterUpdatedSeq) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
return entriesSchema.parse(yield this.request("GET", `/v0/grokbot/sessions/${sessionId}/entries?afterUpdatedSeq=${encodeURIComponent(afterUpdatedSeq)}`));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
interrupt(sessionId, reason) {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
yield this.request("POST", `/v0/grokbot/sessions/${sessionId}/interrupt`, {
|
|
96
|
+
reason,
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
request(method, path, body) {
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
const headers = {
|
|
103
|
+
authorization: `Bearer ${this.apiKey()}`,
|
|
104
|
+
"x-cursor-client-type": "agent-serve",
|
|
105
|
+
"x-request-id": randomUUID(),
|
|
106
|
+
};
|
|
107
|
+
if (body !== undefined) {
|
|
108
|
+
headers["content-type"] = "application/json";
|
|
109
|
+
}
|
|
110
|
+
let response;
|
|
111
|
+
try {
|
|
112
|
+
response = yield this.fetchImpl(`${cursorExternalApiUrl()}${path}`, {
|
|
113
|
+
method,
|
|
114
|
+
headers,
|
|
115
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
116
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw new GrokBotApiError(`Grok Bot API ${method} ${path} failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
121
|
+
}
|
|
122
|
+
const text = yield response.text();
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
throw new GrokBotApiError(`Grok Bot API ${method} ${path} failed (${response.status}): ${apiErrorMessage(text)}`, response.status);
|
|
125
|
+
}
|
|
126
|
+
return JSON.parse(text);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
let backend;
|
|
131
|
+
/** The process-wide backend for this mount, built on first use. */
|
|
132
|
+
export function grokBotAgentsBackend() {
|
|
133
|
+
backend !== null && backend !== void 0 ? backend : (backend = new GrokBotAgentsBackend(apiKey));
|
|
134
|
+
return backend;
|
|
135
|
+
}
|
|
136
|
+
export function apiKey() {
|
|
137
|
+
// Read per call: the host can sign in after the mount.
|
|
138
|
+
const key = resolveApiKeySync({ apiKey: extension.config.apiKey });
|
|
139
|
+
if (key === undefined) {
|
|
140
|
+
throw new Error(`Grok Bot agents need a Cursor API key. ${SIGN_IN_HINT}`);
|
|
141
|
+
}
|
|
142
|
+
return key.apiKey;
|
|
143
|
+
}
|
|
144
|
+
/** The route's `{ error }` envelope when it is one, the raw body otherwise. */
|
|
145
|
+
function apiErrorMessage(text) {
|
|
146
|
+
var _a;
|
|
147
|
+
try {
|
|
148
|
+
const parsed = JSON.parse(text);
|
|
149
|
+
const message = (_a = parsed.error) !== null && _a !== void 0 ? _a : parsed.message;
|
|
150
|
+
if (typeof message === "string" && message !== "") {
|
|
151
|
+
return message;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (_b) {
|
|
155
|
+
// Not JSON; fall through to the raw body.
|
|
156
|
+
}
|
|
157
|
+
return text.slice(0, 300);
|
|
158
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who has talked to which Grok Bot agent, and how far into its transcript
|
|
3
|
+
* they have read. The tools authenticate with the serve host's one Cursor
|
|
4
|
+
* API key, so every agent is that account's; what the host keeps per
|
|
5
|
+
* principal is the read cursor, so `check` returns what the agent said
|
|
6
|
+
* since that caller last read, and a lookup by name for `check` and
|
|
7
|
+
* `interrupt`, which never create an agent the caller has not spoken to.
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolContext } from "../../../types.js";
|
|
10
|
+
export type Contact = {
|
|
11
|
+
/** The agent's name as the backend stores it. */
|
|
12
|
+
name: string;
|
|
13
|
+
/** The hosted agent's `/v0/grokbot` session id. */
|
|
14
|
+
sessionId: string;
|
|
15
|
+
/** Newest transcript `updatedSeq` this principal has read. */
|
|
16
|
+
cursor: string;
|
|
17
|
+
firstContactAt: string;
|
|
18
|
+
lastContactAt: string;
|
|
19
|
+
};
|
|
20
|
+
/** Unauthenticated sessions (local dev, direct calls) share one principal. */
|
|
21
|
+
export declare function principalOf(ctx: ToolContext): string;
|
|
22
|
+
/** The caller's contacts, most recently spoken to first. */
|
|
23
|
+
export declare function listContacts(ctx: ToolContext): Promise<Contact[]>;
|
|
24
|
+
/** The contact of that name, exact spelling first, then case-insensitively. */
|
|
25
|
+
export declare function findContact(contacts: Contact[], name: string): Contact | undefined;
|
|
26
|
+
/** Insert or replace the caller's record of one agent, newest first. */
|
|
27
|
+
export declare function saveContact(ctx: ToolContext, contact: Contact): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=contacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../../src/extensions/cursor-grokbot-agents/lib/contacts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,MAAM,MAAM,OAAO,GAAG;IACpB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAcF,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAGpD;AAED,4DAA4D;AAC5D,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAGvE;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAMlF;AAED,wEAAwE;AACxE,wBAAsB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who has talked to which Grok Bot agent, and how far into its transcript
|
|
3
|
+
* they have read. The tools authenticate with the serve host's one Cursor
|
|
4
|
+
* API key, so every agent is that account's; what the host keeps per
|
|
5
|
+
* principal is the read cursor, so `check` returns what the agent said
|
|
6
|
+
* since that caller last read, and a lookup by name for `check` and
|
|
7
|
+
* `interrupt`, which never create an agent the caller has not spoken to.
|
|
8
|
+
*/
|
|
9
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
10
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
11
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
12
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
13
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
14
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
15
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
import { KeyedLock } from "./lock.js";
|
|
20
|
+
const PREFIX = "grokbot-agents";
|
|
21
|
+
const contactsSchema = z.array(z.object({
|
|
22
|
+
name: z.string(),
|
|
23
|
+
sessionId: z.string(),
|
|
24
|
+
cursor: z.string(),
|
|
25
|
+
firstContactAt: z.string(),
|
|
26
|
+
lastContactAt: z.string(),
|
|
27
|
+
}));
|
|
28
|
+
const locks = new KeyedLock();
|
|
29
|
+
/** Unauthenticated sessions (local dev, direct calls) share one principal. */
|
|
30
|
+
export function principalOf(ctx) {
|
|
31
|
+
const auth = ctx.session.auth;
|
|
32
|
+
return auth === null ? "anonymous" : `${auth.principalType}:${auth.principalId}`;
|
|
33
|
+
}
|
|
34
|
+
/** The caller's contacts, most recently spoken to first. */
|
|
35
|
+
export function listContacts(ctx) {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
const contacts = contactsSchema.safeParse(yield ctx.host.kv.get(contactsKey(principalOf(ctx))));
|
|
38
|
+
return contacts.success ? contacts.data : [];
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** The contact of that name, exact spelling first, then case-insensitively. */
|
|
42
|
+
export function findContact(contacts, name) {
|
|
43
|
+
var _a;
|
|
44
|
+
const wanted = name.trim();
|
|
45
|
+
return ((_a = contacts.find(contact => contact.name === wanted)) !== null && _a !== void 0 ? _a : contacts.find(contact => contact.name.toLowerCase() === wanted.toLowerCase()));
|
|
46
|
+
}
|
|
47
|
+
/** Insert or replace the caller's record of one agent, newest first. */
|
|
48
|
+
export function saveContact(ctx, contact) {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
const key = contactsKey(principalOf(ctx));
|
|
51
|
+
yield locks.run(key, () => __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
const others = (yield listContacts(ctx)).filter(existing => existing.sessionId !== contact.sessionId);
|
|
53
|
+
yield ctx.host.kv.put(key, [contact, ...others]);
|
|
54
|
+
}));
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function contactsKey(principal) {
|
|
58
|
+
return `${PREFIX}/principals/${encodeURIComponent(principal)}`;
|
|
59
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One exchange with a hosted Grok Bot agent, the way the grokbot runtime
|
|
3
|
+
* drives a turn: send a user message, then read the transcript until the
|
|
4
|
+
* agent's turn settles. Only `send-message` entries (what the agent delivers
|
|
5
|
+
* through SendToUser) are the reply; its internal work never appears in the
|
|
6
|
+
* transcript. Waits are bounded, so a long turn comes back as `running` and
|
|
7
|
+
* `check` picks it up from the caller's cursor.
|
|
8
|
+
*
|
|
9
|
+
* Sends and reads on one hosted agent are chained within this process, and
|
|
10
|
+
* a send waits for an in-flight turn to settle first, so a reply always
|
|
11
|
+
* attributes to the message that prompted it.
|
|
12
|
+
*/
|
|
13
|
+
import type { ToolContext } from "../../../types.js";
|
|
14
|
+
export declare const DEFAULT_WAIT_SECONDS = 120;
|
|
15
|
+
export declare const MAX_WAIT_SECONDS = 600;
|
|
16
|
+
export type ReplyStatus = "finished" | "running";
|
|
17
|
+
export type AskResult = {
|
|
18
|
+
agent: string;
|
|
19
|
+
sessionId: string;
|
|
20
|
+
status: ReplyStatus;
|
|
21
|
+
/** What the agent sent back, in order; absent when it sent nothing (yet). */
|
|
22
|
+
reply?: string;
|
|
23
|
+
/** Replies to earlier messages that this caller had not read yet. */
|
|
24
|
+
earlierReplies?: string[];
|
|
25
|
+
/** The account had no agent of that name; this call created an empty one. */
|
|
26
|
+
created?: true;
|
|
27
|
+
note?: string;
|
|
28
|
+
};
|
|
29
|
+
export type CheckResult = {
|
|
30
|
+
agent: string;
|
|
31
|
+
sessionId: string;
|
|
32
|
+
status: ReplyStatus;
|
|
33
|
+
reply?: string;
|
|
34
|
+
note?: string;
|
|
35
|
+
};
|
|
36
|
+
export type InterruptResult = {
|
|
37
|
+
agent: string;
|
|
38
|
+
sessionId: string;
|
|
39
|
+
interrupted: true;
|
|
40
|
+
};
|
|
41
|
+
export declare function ask(ctx: ToolContext, input: {
|
|
42
|
+
agent?: string;
|
|
43
|
+
message: string;
|
|
44
|
+
waitSeconds: number;
|
|
45
|
+
}): Promise<AskResult>;
|
|
46
|
+
export declare function check(ctx: ToolContext, input: {
|
|
47
|
+
agent?: string;
|
|
48
|
+
waitSeconds: number;
|
|
49
|
+
}): Promise<CheckResult>;
|
|
50
|
+
export declare function interrupt(ctx: ToolContext, input: {
|
|
51
|
+
agent?: string;
|
|
52
|
+
}): Promise<InterruptResult>;
|
|
53
|
+
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../../src/extensions/cursor-grokbot-agents/lib/conversation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWrD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAkBpC,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAGjD,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,IAAI,CAAC;CACnB,CAAC;AAWF,wBAAsB,GAAG,CACvB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,SAAS,CAAC,CA0DpB;AAED,wBAAsB,KAAK,CACzB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,WAAW,CAAC,CAsBtB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC,eAAe,CAAC,CAQ1B"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One exchange with a hosted Grok Bot agent, the way the grokbot runtime
|
|
3
|
+
* drives a turn: send a user message, then read the transcript until the
|
|
4
|
+
* agent's turn settles. Only `send-message` entries (what the agent delivers
|
|
5
|
+
* through SendToUser) are the reply; its internal work never appears in the
|
|
6
|
+
* transcript. Waits are bounded, so a long turn comes back as `running` and
|
|
7
|
+
* `check` picks it up from the caller's cursor.
|
|
8
|
+
*
|
|
9
|
+
* Sends and reads on one hosted agent are chained within this process, and
|
|
10
|
+
* a send waits for an in-flight turn to settle first, so a reply always
|
|
11
|
+
* attributes to the message that prompted it.
|
|
12
|
+
*/
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
import extension from "../extension.js";
|
|
23
|
+
import { resolveAgentName } from "./agents.js";
|
|
24
|
+
import { grokBotAgentsBackend, } from "./backend.js";
|
|
25
|
+
import { findContact, listContacts, saveContact } from "./contacts.js";
|
|
26
|
+
import { KeyedLock } from "./lock.js";
|
|
27
|
+
export const DEFAULT_WAIT_SECONDS = 120;
|
|
28
|
+
export const MAX_WAIT_SECONDS = 600;
|
|
29
|
+
/**
|
|
30
|
+
* Idle polls required before a turn counts as settled when the workflow
|
|
31
|
+
* never reported busy: covers the window between an accepted send and the
|
|
32
|
+
* workflow picking the signal up, which a `check` right after a short `ask`
|
|
33
|
+
* can still be inside.
|
|
34
|
+
*/
|
|
35
|
+
const MIN_IDLE_POLLS_WITHOUT_BUSY = 4;
|
|
36
|
+
/**
|
|
37
|
+
* A session whose row is this young, and whose transcript is still empty,
|
|
38
|
+
* was created by the call that fetched it; the allowance covers clock skew
|
|
39
|
+
* between this host and the backend.
|
|
40
|
+
*/
|
|
41
|
+
const CREATED_WINDOW_MS = 60000;
|
|
42
|
+
/** The transcript tail of an agent nobody has spoken to. */
|
|
43
|
+
const EMPTY_TRANSCRIPT_TAIL = "-1";
|
|
44
|
+
const agentLocks = new KeyedLock();
|
|
45
|
+
export function ask(ctx, input) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const name = resolveAgentName(input.agent, extension.config.agents);
|
|
48
|
+
const backend = grokBotAgentsBackend();
|
|
49
|
+
const startedAt = Date.now();
|
|
50
|
+
const session = yield backend.session(name);
|
|
51
|
+
return agentLocks.run(session.sessionId, () => __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
var _a, _b;
|
|
53
|
+
const contact = (yield listContacts(ctx)).find(candidate => candidate.sessionId === session.sessionId);
|
|
54
|
+
const created = contact === undefined &&
|
|
55
|
+
session.latestUpdatedSeq === EMPTY_TRANSCRIPT_TAIL &&
|
|
56
|
+
session.createdAtMs >= startedAt - CREATED_WINDOW_MS;
|
|
57
|
+
const deadline = Date.now() + input.waitSeconds * 1000;
|
|
58
|
+
// A turn already in flight, from an earlier message or from the person
|
|
59
|
+
// in the app, must settle first; otherwise its deliveries would read as
|
|
60
|
+
// the reply to this message. Nothing is persisted on the way out, so
|
|
61
|
+
// `check` still returns whatever landed meanwhile.
|
|
62
|
+
const before = yield collectReplies(backend, session.sessionId, {
|
|
63
|
+
cursor: (_a = contact === null || contact === void 0 ? void 0 : contact.cursor) !== null && _a !== void 0 ? _a : session.latestUpdatedSeq,
|
|
64
|
+
deadline,
|
|
65
|
+
confirmIdle: false,
|
|
66
|
+
});
|
|
67
|
+
if (before.status === "running") {
|
|
68
|
+
throw new Error(`"${session.name}" is still working on an earlier message; nothing was sent. Call check to read that reply, wait, or interrupt it.`);
|
|
69
|
+
}
|
|
70
|
+
yield backend.send(session.sessionId, input.message);
|
|
71
|
+
const replies = yield collectReplies(backend, session.sessionId, {
|
|
72
|
+
cursor: before.cursor,
|
|
73
|
+
deadline,
|
|
74
|
+
confirmIdle: true,
|
|
75
|
+
});
|
|
76
|
+
const now = ctx.now().toISOString();
|
|
77
|
+
yield saveContact(ctx, {
|
|
78
|
+
name: session.name,
|
|
79
|
+
sessionId: session.sessionId,
|
|
80
|
+
cursor: replies.cursor,
|
|
81
|
+
firstContactAt: (_b = contact === null || contact === void 0 ? void 0 : contact.firstContactAt) !== null && _b !== void 0 ? _b : now,
|
|
82
|
+
lastContactAt: now,
|
|
83
|
+
});
|
|
84
|
+
const notes = [
|
|
85
|
+
created
|
|
86
|
+
? `No Grok Bot agent named "${session.name}" existed on this account, so an empty one was created. Check the name if that is unexpected.`
|
|
87
|
+
: undefined,
|
|
88
|
+
runningNote(session.name, replies.status),
|
|
89
|
+
].filter(note => note !== undefined);
|
|
90
|
+
return {
|
|
91
|
+
agent: session.name,
|
|
92
|
+
sessionId: session.sessionId,
|
|
93
|
+
status: replies.status,
|
|
94
|
+
reply: joinReplies(replies.deliveries),
|
|
95
|
+
earlierReplies: before.deliveries.length === 0 ? undefined : before.deliveries,
|
|
96
|
+
created: created ? true : undefined,
|
|
97
|
+
note: notes.length === 0 ? undefined : notes.join(" "),
|
|
98
|
+
};
|
|
99
|
+
}));
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export function check(ctx, input) {
|
|
103
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
104
|
+
const contact = yield knownContact(ctx, input.agent);
|
|
105
|
+
const backend = grokBotAgentsBackend();
|
|
106
|
+
return agentLocks.run(contact.sessionId, () => __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
var _a;
|
|
108
|
+
// Re-read under the lock: a parallel call may have moved the cursor.
|
|
109
|
+
const current = (_a = (yield listContacts(ctx)).find(candidate => candidate.sessionId === contact.sessionId)) !== null && _a !== void 0 ? _a : contact;
|
|
110
|
+
const replies = yield collectReplies(backend, current.sessionId, {
|
|
111
|
+
cursor: current.cursor,
|
|
112
|
+
deadline: Date.now() + input.waitSeconds * 1000,
|
|
113
|
+
confirmIdle: true,
|
|
114
|
+
});
|
|
115
|
+
yield saveContact(ctx, Object.assign(Object.assign({}, current), { cursor: replies.cursor }));
|
|
116
|
+
return {
|
|
117
|
+
agent: current.name,
|
|
118
|
+
sessionId: current.sessionId,
|
|
119
|
+
status: replies.status,
|
|
120
|
+
reply: joinReplies(replies.deliveries),
|
|
121
|
+
note: runningNote(current.name, replies.status),
|
|
122
|
+
};
|
|
123
|
+
}));
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
export function interrupt(ctx, input) {
|
|
127
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
const contact = yield knownContact(ctx, input.agent);
|
|
129
|
+
yield grokBotAgentsBackend().interrupt(contact.sessionId, "Interrupted from the Agent SDK.");
|
|
130
|
+
return {
|
|
131
|
+
agent: contact.name,
|
|
132
|
+
sessionId: contact.sessionId,
|
|
133
|
+
interrupted: true,
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The caller's record of the named agent. Only `ask` resolves a name on the
|
|
139
|
+
* backend, because that creates an agent when none matches; the other tools
|
|
140
|
+
* reach agents the caller has already spoken to.
|
|
141
|
+
*/
|
|
142
|
+
function knownContact(ctx, requested) {
|
|
143
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
144
|
+
const name = resolveAgentName(requested, extension.config.agents);
|
|
145
|
+
const contact = findContact(yield listContacts(ctx), name);
|
|
146
|
+
if (contact === undefined) {
|
|
147
|
+
throw new Error(`You have not asked "${name}" anything yet; call ask first.`);
|
|
148
|
+
}
|
|
149
|
+
return contact;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Read the transcript after `cursor` until the agent's turn settles or the
|
|
154
|
+
* deadline passes. Only an empty page can settle the turn, so a backlog
|
|
155
|
+
* drains page by page first. With `confirmIdle`, an idle report may predate
|
|
156
|
+
* the workflow picking a message up, so settling takes
|
|
157
|
+
* {@link MIN_IDLE_POLLS_WITHOUT_BUSY} idle polls unless the turn was seen
|
|
158
|
+
* busy; without it, the first idle report settles.
|
|
159
|
+
*/
|
|
160
|
+
function collectReplies(backend, sessionId, options) {
|
|
161
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
162
|
+
const deliveries = [];
|
|
163
|
+
let cursor = options.cursor;
|
|
164
|
+
let sawBusy = false;
|
|
165
|
+
let idlePolls = 0;
|
|
166
|
+
while (true) {
|
|
167
|
+
const page = yield backend.entries(sessionId, cursor);
|
|
168
|
+
cursor = page.latestUpdatedSeq;
|
|
169
|
+
for (const entry of page.entries) {
|
|
170
|
+
if (entry.kind === "send-message" && entry.text !== undefined) {
|
|
171
|
+
deliveries.push(entry.text);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const busy = isBusy(page.turn);
|
|
175
|
+
if (busy) {
|
|
176
|
+
sawBusy = true;
|
|
177
|
+
}
|
|
178
|
+
if (page.entries.length === 0 && !busy && page.turn.idle) {
|
|
179
|
+
idlePolls += 1;
|
|
180
|
+
if (sawBusy || !options.confirmIdle || idlePolls >= MIN_IDLE_POLLS_WITHOUT_BUSY) {
|
|
181
|
+
return { status: "finished", deliveries, cursor };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (Date.now() >= options.deadline) {
|
|
185
|
+
return { status: "running", deliveries, cursor };
|
|
186
|
+
}
|
|
187
|
+
yield sleep(extension.config.pollIntervalMs);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function isBusy(turn) {
|
|
192
|
+
return turn.inFlight || turn.queued > 0;
|
|
193
|
+
}
|
|
194
|
+
function joinReplies(deliveries) {
|
|
195
|
+
return deliveries.length === 0 ? undefined : deliveries.join("\n\n");
|
|
196
|
+
}
|
|
197
|
+
function runningNote(name, status) {
|
|
198
|
+
return status === "running"
|
|
199
|
+
? `"${name}" is still replying. Call check with the same agent to keep waiting; a reply so far, if any, is above.`
|
|
200
|
+
: undefined;
|
|
201
|
+
}
|
|
202
|
+
function sleep(ms) {
|
|
203
|
+
return new Promise(resolve => {
|
|
204
|
+
setTimeout(resolve, ms);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../../../src/extensions/cursor-grokbot-agents/lib/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAM9C,CAAC;AAEJ,eAAO,MAAM,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAQ/C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AGENT_NAME_MAX_LENGTH } from "../extension.js";
|
|
3
|
+
import { DEFAULT_WAIT_SECONDS, MAX_WAIT_SECONDS } from "./conversation.js";
|
|
4
|
+
export const agentName = z
|
|
5
|
+
.string()
|
|
6
|
+
.max(AGENT_NAME_MAX_LENGTH)
|
|
7
|
+
.optional()
|
|
8
|
+
.describe("The Grok Bot agent's name, as shown in the Grok Bot app. With agents configured, one of those; optional when exactly one is configured.");
|
|
9
|
+
export const waitSeconds = z
|
|
10
|
+
.number()
|
|
11
|
+
.int()
|
|
12
|
+
.min(0)
|
|
13
|
+
.max(MAX_WAIT_SECONDS)
|
|
14
|
+
.default(DEFAULT_WAIT_SECONDS)
|
|
15
|
+
.describe(`How long to wait for the reply before returning status "running" (default ${DEFAULT_WAIT_SECONDS}, max ${MAX_WAIT_SECONDS}). 0 returns after one look.`);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-key chaining of async work. `host.kv` has no compare-and-swap, and a
|
|
3
|
+
* model that talks to two agents in one turn calls these tools in parallel,
|
|
4
|
+
* so read-modify-writes of one principal's records queue up here. The same
|
|
5
|
+
* chain keeps one hosted agent's sends and reads from interleaving within
|
|
6
|
+
* this process, so a reply attributes to the message that prompted it.
|
|
7
|
+
*/
|
|
8
|
+
export declare class KeyedLock {
|
|
9
|
+
private readonly chains;
|
|
10
|
+
run<T>(key: string, task: () => Promise<T>): Promise<T>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../../src/extensions/cursor-grokbot-agents/lib/lock.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAE3D,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CActD;CACF"}
|