@cursor/bdk 0.2.9 → 0.2.11
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/dist/artifacts.js +3 -5
- package/dist/bin/agent-serve.js +803 -812
- package/dist/channels/bitbucket/api.js +305 -321
- package/dist/channels/bitbucket/binding.js +97 -61
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
- package/dist/channels/bitbucket/checks.js +9 -21
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/defaults.js +14 -4
- package/dist/channels/bitbucket/events.js +1 -2
- package/dist/channels/bitbucket/index.d.ts +6 -2
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +6 -2
- package/dist/channels/bitbucket/replay.js +80 -56
- package/dist/channels/bitbucket/state.js +16 -7
- package/dist/channels/bitbucket/types.d.ts +11 -2
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/checks.js +18 -28
- package/dist/channels/deployments/deployments-channel.js +26 -34
- package/dist/channels/github/api.js +216 -210
- package/dist/channels/github/auth.d.ts +5 -1
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +157 -174
- package/dist/channels/github/binding.js +48 -39
- package/dist/channels/github/checks.js +9 -14
- package/dist/channels/github/cursor-account.js +6 -11
- package/dist/channels/github/defaults.js +105 -130
- package/dist/channels/github/forward.js +13 -17
- package/dist/channels/github/github-channel.d.ts +43 -2
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +1228 -958
- package/dist/channels/github/progress.js +145 -146
- package/dist/channels/github/replay.js +30 -39
- package/dist/channels/github/state.js +40 -16
- package/dist/channels/github/types.d.ts +30 -6
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +100 -114
- package/dist/channels/gitlab/binding.js +52 -33
- package/dist/channels/gitlab/checks.js +28 -29
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/defaults.js +9 -3
- package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +95 -42
- package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +282 -249
- package/dist/channels/gitlab/index.d.ts +6 -2
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +6 -2
- package/dist/channels/gitlab/replay.js +50 -27
- package/dist/channels/gitlab/state.js +14 -6
- package/dist/channels/gitlab/types.d.ts +13 -2
- package/dist/channels/gitlab/types.d.ts.map +1 -1
- package/dist/channels/origin/api.js +100 -116
- package/dist/channels/origin/binding.js +15 -16
- package/dist/channels/origin/checks.js +30 -28
- package/dist/channels/origin/defaults.js +50 -65
- package/dist/channels/origin/origin-channel.js +266 -272
- package/dist/channels/origin/origin-webhook.js +70 -88
- package/dist/channels/origin/reactions.js +9 -21
- package/dist/channels/origin/state.js +13 -5
- package/dist/channels/slack/agentic-delivery.js +426 -478
- package/dist/channels/slack/agentic-posted.js +9 -10
- package/dist/channels/slack/agentic-signals.js +2 -3
- package/dist/channels/slack/api.js +417 -427
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/assistant.js +37 -47
- package/dist/channels/slack/attachments.js +188 -206
- package/dist/channels/slack/auth.js +8 -6
- package/dist/channels/slack/bot-mentions.js +31 -45
- package/dist/channels/slack/channel-watch.js +42 -48
- package/dist/channels/slack/cli-project.js +112 -137
- package/dist/channels/slack/code-fences.js +3 -5
- package/dist/channels/slack/constants.js +2 -2
- package/dist/channels/slack/credentials.js +23 -38
- package/dist/channels/slack/defaults.js +292 -331
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +533 -460
- package/dist/channels/slack/doctor.js +200 -214
- package/dist/channels/slack/eval-directive.js +79 -96
- package/dist/channels/slack/event-id-dedupe.js +1 -1
- package/dist/channels/slack/external-policy.js +26 -39
- package/dist/channels/slack/footer.js +28 -41
- package/dist/channels/slack/inbound.d.ts +1 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +50 -31
- package/dist/channels/slack/init.d.ts +1 -5
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +42 -59
- package/dist/channels/slack/interactive.d.ts +9 -3
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +160 -162
- package/dist/channels/slack/links.js +1 -2
- package/dist/channels/slack/live-delivery.js +172 -190
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +44 -23
- package/dist/channels/slack/message-body.js +2 -2
- package/dist/channels/slack/nudge-carrier.js +30 -42
- package/dist/channels/slack/nudge-store.js +164 -191
- package/dist/channels/slack/paint-start.js +66 -81
- package/dist/channels/slack/placeholder.js +123 -152
- package/dist/channels/slack/pr-ref.js +1 -1
- package/dist/channels/slack/progress-delivery.js +65 -78
- package/dist/channels/slack/reasoning-card.js +36 -49
- package/dist/channels/slack/recording-sink.js +12 -24
- package/dist/channels/slack/reply-options.js +7 -12
- package/dist/channels/slack/self-identity.js +27 -35
- package/dist/channels/slack/sender-name.d.ts +12 -3
- package/dist/channels/slack/sender-name.d.ts.map +1 -1
- package/dist/channels/slack/sender-name.js +57 -61
- package/dist/channels/slack/setup.js +2 -4
- package/dist/channels/slack/slack-channel.d.ts +6 -4
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +441 -308
- package/dist/channels/slack/socket-mode.js +38 -52
- package/dist/channels/slack/thread-context.js +143 -160
- package/dist/channels/slack/tool-approval-events.js +149 -166
- package/dist/channels/slack/tool-cards.js +6 -11
- package/dist/channels/slack/tool-chip.js +1 -2
- package/dist/channels/slack/types.d.ts +15 -17
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.js +84 -97
- package/dist/channels/slack/user-info.js +27 -41
- package/dist/channels.js +9 -20
- package/dist/dashboard-session-url.js +3 -4
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
- package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
- package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
- package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
- package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
- package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
- package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/building-with-agents.md +2 -0
- package/dist/docs/deployment.html +38 -38
- package/dist/docs/deployment.md +7 -0
- package/dist/docs/evals.html +36 -36
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +38 -38
- package/dist/docs/guides/bitbucket.md +9 -1
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +39 -39
- package/dist/docs/guides/github.md +20 -4
- package/dist/docs/guides/gitlab.html +38 -38
- package/dist/docs/guides/gitlab.md +9 -1
- 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/migrate.html +66 -0
- package/dist/docs/guides/migrate.md +122 -0
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- 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 +214 -6
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +39 -38
- package/dist/docs/reference/cli.md +39 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- 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 +35 -35
- 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/grokbot-agents.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 +1 -0
- package/dist/evals/assertions.js +20 -34
- package/dist/evals/expect.js +3 -6
- package/dist/evals/judge.js +5 -8
- package/dist/evals/loaders.js +45 -62
- package/dist/evals/matchers.js +2 -3
- package/dist/evals/reporters.js +43 -67
- package/dist/evals/results.js +1 -1
- package/dist/evals/run-facts.js +5 -6
- package/dist/evals.js +27 -15
- package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
- package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
- package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
- package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
- package/dist/extensions/jev/extension.js +3 -3
- package/dist/extensions/jev/lib/evaluate.js +43 -60
- package/dist/extensions/jev/tools/evaluate.js +6 -17
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions.js +3 -5
- package/dist/files-backends/cursor-hosted.js +504 -523
- package/dist/files-backends/local-fs.js +72 -134
- package/dist/files.js +3 -3
- package/dist/filesystem.js +562 -861
- package/dist/index.js +16 -35
- package/dist/internal/advertise-tools.js +74 -86
- package/dist/internal/artifacts-store.js +298 -361
- package/dist/internal/as-of.js +2 -4
- package/dist/internal/authored-alias-hooks.js +6 -4
- package/dist/internal/authored-loaders.js +37 -52
- package/dist/internal/bounded-int.js +1 -2
- package/dist/internal/bounded.js +13 -24
- package/dist/internal/brand.js +1 -1
- package/dist/internal/browser-origin-guard.js +4 -4
- package/dist/internal/builtin-tools/artifacts.js +15 -27
- package/dist/internal/builtin-tools/index.js +2 -3
- package/dist/internal/builtin-tools/reminders.js +33 -52
- package/dist/internal/channel-architecture.d.ts +21 -0
- package/dist/internal/channel-architecture.d.ts.map +1 -0
- package/dist/internal/channel-architecture.js +41 -0
- package/dist/internal/channel-dispatch.js +3 -4
- package/dist/internal/channel-route-dispatch.js +40 -51
- package/dist/internal/channel-state.js +1 -1
- package/dist/internal/chat-client.js +319 -340
- package/dist/internal/cli-ax.js +1262 -1294
- package/dist/internal/cli-bitbucket.js +244 -272
- package/dist/internal/cli-convert-automation.js +137 -151
- package/dist/internal/cli-cursor.js +126 -147
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +1457 -1507
- package/dist/internal/cli-docs.js +130 -147
- package/dist/internal/cli-github.js +437 -476
- package/dist/internal/cli-gitlab.js +259 -288
- package/dist/internal/cli-images.js +266 -334
- package/dist/internal/cli-manifest.js +25 -37
- package/dist/internal/cli-mcp-oauth.js +228 -247
- package/dist/internal/cli-mcp.js +358 -383
- package/dist/internal/cli-migrate.js +73 -90
- package/dist/internal/cli-skills.js +35 -47
- package/dist/internal/cli-slack-manual.d.ts +0 -1
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +175 -204
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +416 -456
- package/dist/internal/cloud-merge.js +7 -3
- package/dist/internal/cloud-turn-cost.js +8 -1
- package/dist/internal/connection-env.js +5 -6
- package/dist/internal/continuation-channel.js +10 -7
- package/dist/internal/continuation-identity.js +85 -67
- package/dist/internal/conversation-mirror.js +112 -131
- package/dist/internal/convert-automation/convert-workflow.js +21 -31
- package/dist/internal/cron.js +3 -3
- package/dist/internal/cursor/account-mcp.js +147 -146
- package/dist/internal/cursor/backend-client.js +290 -320
- package/dist/internal/cursor/bound-secret-file.js +3 -3
- package/dist/internal/cursor/credentials.js +127 -142
- package/dist/internal/cursor/cursor-api-transport.js +4 -8
- package/dist/internal/cursor/github-credentials.js +91 -108
- package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
- package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +5 -9
- package/dist/internal/cursor/session-token.js +36 -48
- package/dist/internal/cursor/store-api-client.js +77 -92
- package/dist/internal/cursor-account-mcp-auth.js +132 -149
- package/dist/internal/cursor-agent-template.js +1 -1
- package/dist/internal/cursor-deployment-relay.js +33 -54
- package/dist/internal/cursor-event-relay.js +65 -59
- package/dist/internal/cursor-relay-core.js +258 -286
- package/dist/internal/deferred-channel-session.js +3 -12
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +413 -475
- package/dist/internal/deploy-manifest.d.ts +17 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +71 -21
- package/dist/internal/deploy-source.js +31 -43
- package/dist/internal/discovery/agent-config.js +45 -59
- package/dist/internal/discovery/agent.js +276 -280
- package/dist/internal/discovery/channels.js +67 -80
- package/dist/internal/discovery/connections.js +286 -296
- package/dist/internal/discovery/context.js +2 -13
- package/dist/internal/discovery/cursor-plugin.js +223 -259
- package/dist/internal/discovery/extension-overlay.js +104 -131
- package/dist/internal/discovery/extensions.js +276 -281
- package/dist/internal/discovery/fs.js +56 -79
- package/dist/internal/discovery/hooks.js +39 -50
- package/dist/internal/discovery/info.js +17 -19
- package/dist/internal/discovery/instructions.js +58 -71
- package/dist/internal/discovery/modules.js +45 -58
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +192 -215
- package/dist/internal/discovery/reminders.js +41 -52
- package/dist/internal/discovery/runtime.js +1 -1
- package/dist/internal/discovery/schedules.js +71 -82
- package/dist/internal/discovery/seed-files.js +21 -32
- package/dist/internal/discovery/services.js +74 -96
- package/dist/internal/discovery/skills.js +77 -94
- package/dist/internal/discovery/subagent.js +79 -95
- package/dist/internal/discovery/tools.js +12 -23
- package/dist/internal/distribution.js +2 -2
- package/dist/internal/docs-site.js +30 -45
- package/dist/internal/duration.js +1 -1
- package/dist/internal/env-file.js +48 -64
- package/dist/internal/eval-judge-model.js +17 -28
- package/dist/internal/eval-run-store.js +265 -254
- package/dist/internal/eval-runner.d.ts +8 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +406 -408
- package/dist/internal/eval-transport.d.ts +24 -0
- package/dist/internal/eval-transport.d.ts.map +1 -0
- package/dist/internal/eval-transport.js +22 -0
- package/dist/internal/evals-client.js +242 -246
- package/dist/internal/event-log.js +72 -120
- package/dist/internal/event-mapper.js +30 -31
- package/dist/internal/factory-resource-channel.js +16 -30
- package/dist/internal/filesystem/errors.js +6 -6
- package/dist/internal/filesystem/format.js +10 -13
- package/dist/internal/filesystem/merge.js +52 -94
- package/dist/internal/filesystem/nearest.js +15 -27
- package/dist/internal/filesystem/scratch.js +65 -85
- package/dist/internal/filesystem/tools.js +221 -241
- package/dist/internal/filesystem/walk.js +76 -143
- package/dist/internal/framework-file-storage.js +118 -139
- package/dist/internal/framework-storage-selection.js +21 -13
- package/dist/internal/frontmatter.js +4 -6
- package/dist/internal/github-fanout.js +50 -64
- package/dist/internal/guest-network.js +96 -109
- package/dist/internal/handleAgentServeTrigger.js +121 -126
- package/dist/internal/host-files.js +73 -88
- package/dist/internal/host-kv.js +21 -36
- package/dist/internal/host-otel.js +22 -19
- package/dist/internal/host-platforms.js +49 -63
- package/dist/internal/hosted-catch-protocol.d.ts +1 -0
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +1 -0
- package/dist/internal/hosted-catch.d.ts +5 -3
- package/dist/internal/hosted-catch.d.ts.map +1 -1
- package/dist/internal/hosted-catch.js +84 -93
- package/dist/internal/hosted-delivery-protocol.js +32 -8
- package/dist/internal/hosted-delivery.d.ts +13 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +614 -584
- package/dist/internal/hosted-eval-cases.d.ts +21 -0
- package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
- package/dist/internal/hosted-eval-cases.js +162 -0
- package/dist/internal/hosted-execution-diag.js +38 -30
- package/dist/internal/hosted-execution-flush.js +75 -66
- package/dist/internal/hosted-execution-latency.js +16 -8
- package/dist/internal/hosted-managed-automation.js +2 -2
- package/dist/internal/hosting.js +2 -3
- package/dist/internal/http-channel-define.js +4 -1
- package/dist/internal/http-channel.js +101 -112
- package/dist/internal/http-control-plane-session.d.ts +18 -1
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +66 -32
- package/dist/internal/incoming-headers-to-fetch.js +1 -2
- package/dist/internal/init-interview.js +73 -93
- package/dist/internal/init-project.js +182 -214
- package/dist/internal/init-scaffold.js +10 -21
- package/dist/internal/inline-stdio-mcp.js +80 -86
- package/dist/internal/install-cursor-skills.js +231 -273
- package/dist/internal/legacy-command-guard.js +18 -31
- package/dist/internal/listen-port.js +34 -45
- package/dist/internal/local-control-plane.js +293 -307
- package/dist/internal/local-env.js +1 -1
- package/dist/internal/local-ingress.js +15 -9
- package/dist/internal/log-ring.js +1 -2
- package/dist/internal/logs-client.js +207 -227
- package/dist/internal/map-pool.js +24 -38
- package/dist/internal/mcp-endpoint.js +204 -180
- package/dist/internal/mcp-host.js +165 -168
- package/dist/internal/mcp-oauth-on-demand.js +170 -207
- package/dist/internal/mcp-oauth-persist.js +15 -29
- package/dist/internal/mcp-oauth.js +209 -266
- package/dist/internal/named-webhook-secret.d.ts +39 -0
- package/dist/internal/named-webhook-secret.d.ts.map +1 -0
- package/dist/internal/named-webhook-secret.js +47 -0
- package/dist/internal/open-browser.js +2 -3
- package/dist/internal/otel/collector.js +104 -68
- package/dist/internal/otel/config.js +24 -37
- package/dist/internal/otel/http.js +5 -7
- package/dist/internal/otel/mcp.js +3 -12
- package/dist/internal/otel/runtime.js +69 -83
- package/dist/internal/package-inline-stdio.js +57 -65
- package/dist/internal/peer-connections.js +9 -5
- package/dist/internal/platform-schedule-sync.js +39 -54
- package/dist/internal/platform-timers.js +176 -210
- package/dist/internal/playground/static.js +1 -2
- package/dist/internal/playground/toolchain.js +37 -53
- package/dist/internal/playground-proxy.js +230 -270
- package/dist/internal/process-memory-telemetry.js +33 -51
- package/dist/internal/prompt-context.js +3 -6
- package/dist/internal/reminder-control-plane-protocol.js +46 -13
- package/dist/internal/reminder-runner.js +770 -785
- package/dist/internal/reminder-schedule.js +1 -1
- package/dist/internal/reminder-store.js +57 -78
- package/dist/internal/request-error-status.js +1 -3
- package/dist/internal/request-headers.js +2 -2
- package/dist/internal/resolve-prod-target.js +119 -135
- package/dist/internal/resolved-connections.js +16 -6
- package/dist/internal/run-client.js +221 -229
- package/dist/internal/runtime-dispatch-runner.js +18 -43
- package/dist/internal/schedule-runner.js +49 -58
- package/dist/internal/scm/pr-url.js +7 -6
- package/dist/internal/sdk-runner.js +388 -363
- package/dist/internal/serve-restart.js +26 -39
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +1283 -1244
- package/dist/internal/session-cost.js +7 -9
- package/dist/internal/session-engine.d.ts +3 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +2801 -2777
- package/dist/internal/session-links.js +12 -16
- package/dist/internal/session-run-log.js +134 -82
- package/dist/internal/session-store.js +133 -164
- package/dist/internal/sessions-client.js +97 -118
- package/dist/internal/skill-catalog.js +18 -23
- package/dist/internal/skills-sync.js +16 -30
- package/dist/internal/slack-provision-client.js +90 -116
- package/dist/internal/start-log-store.js +48 -67
- package/dist/internal/steering.js +1 -2
- package/dist/internal/storage-coordinator.js +160 -196
- package/dist/internal/store-mirror.js +16 -30
- package/dist/internal/stream-progress.js +6 -8
- package/dist/internal/terminal-style.js +3 -4
- package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
- package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
- package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
- package/dist/internal/tool-catalog.js +11 -5
- package/dist/internal/tool-result.js +1 -1
- package/dist/internal/trajectory.js +19 -22
- package/dist/internal/turn-cost.js +52 -62
- package/dist/internal/turn-governor.js +5 -8
- package/dist/internal/turn-lease-store.js +85 -105
- package/dist/internal/turn-outbox.js +28 -43
- package/dist/internal/update-check.js +231 -259
- package/dist/internal/v2-hosting.js +1 -2
- package/dist/internal/workspace-sync.js +25 -41
- package/dist/internal/workspace.js +111 -139
- package/dist/kv/memory-kv.js +27 -51
- package/dist/memory.js +106 -148
- package/dist/otel.js +5 -8
- package/dist/playground/assets/{index-Co4CUVTQ.js → index-Be0-1hw2.js} +45 -45
- package/dist/playground/assets/index-Clz6uHj9.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +2 -4
- package/dist/storage-backends/cursor-hosted-v2.js +53 -83
- package/dist/storage-backends/cursor-hosted.js +105 -145
- package/dist/storage-backends/file-kv.js +100 -128
- package/dist/storage-protocol.js +3 -5
- package/dist/storage.js +17 -26
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -18
- package/docs/building-with-agents.md +2 -0
- package/docs/deployment.md +7 -0
- package/docs/guides/bitbucket.md +9 -1
- package/docs/guides/github.md +20 -4
- package/docs/guides/gitlab.md +9 -1
- package/docs/guides/migrate.md +127 -0
- package/docs/reference/cli.md +39 -0
- package/docs/troubleshooting.md +1 -0
- package/package.json +1 -1
- package/skills/debug/SKILL.md +1 -0
- package/skills/github/SKILL.md +23 -0
- package/skills/migrate-v2/SKILL.md +51 -10
- package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
- package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
- package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
- package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
- /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
- /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
|
@@ -12,15 +12,6 @@
|
|
|
12
12
|
* conclude "no such session" rescans the directory first, listings pick up
|
|
13
13
|
* new directories, and a cached record is re-read when its file changed.
|
|
14
14
|
*/
|
|
15
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
16
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
17
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
18
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
19
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
20
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
21
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
15
|
import { randomBytes } from "node:crypto";
|
|
25
16
|
import { mkdir, readdir, readFile, rename, stat, writeFile } from "node:fs/promises";
|
|
26
17
|
import { join } from "node:path";
|
|
@@ -67,89 +58,79 @@ export class SessionStore {
|
|
|
67
58
|
* share it rather than queueing another.
|
|
68
59
|
*/
|
|
69
60
|
scan() {
|
|
70
|
-
var _a;
|
|
71
61
|
if (this.scanning === undefined) {
|
|
72
62
|
this.scanning = this.rescan().finally(() => {
|
|
73
63
|
this.scanning = undefined;
|
|
74
64
|
});
|
|
75
|
-
|
|
65
|
+
this.hydrated ??= this.scanning;
|
|
76
66
|
}
|
|
77
67
|
return this.scanning;
|
|
78
68
|
}
|
|
79
|
-
rescan() {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
69
|
+
async rescan() {
|
|
70
|
+
let entries;
|
|
71
|
+
try {
|
|
72
|
+
entries = await readdir(this.sessionsDir);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error.code !== "ENOENT") {
|
|
76
|
+
// Unreadable for a reason other than absence: keep what we have
|
|
77
|
+
// rather than forgetting sessions we cannot currently list.
|
|
78
|
+
return;
|
|
84
79
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
entries = [];
|
|
80
|
+
// No directory means no sessions; the cache must not outlive it.
|
|
81
|
+
entries = [];
|
|
82
|
+
}
|
|
83
|
+
const present = new Set();
|
|
84
|
+
for (const sessionId of entries) {
|
|
85
|
+
if (!isSafeSessionId(sessionId)) {
|
|
86
|
+
continue;
|
|
93
87
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
present.add(sessionId);
|
|
100
|
-
if (this.cache.has(sessionId)) {
|
|
101
|
-
yield this.refreshIfChanged(sessionId);
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
yield this.load(sessionId);
|
|
88
|
+
present.add(sessionId);
|
|
89
|
+
if (this.cache.has(sessionId)) {
|
|
90
|
+
await this.refreshIfChanged(sessionId);
|
|
91
|
+
continue;
|
|
105
92
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
93
|
+
await this.load(sessionId);
|
|
94
|
+
}
|
|
95
|
+
// The listing is a snapshot: a session saved since it was taken is not
|
|
96
|
+
// in `present` but is on disk, so ask the file rather than the listing.
|
|
97
|
+
for (const sessionId of [...this.cache.keys()]) {
|
|
98
|
+
if (!present.has(sessionId)) {
|
|
99
|
+
await this.refreshIfChanged(sessionId);
|
|
112
100
|
}
|
|
113
|
-
}
|
|
101
|
+
}
|
|
114
102
|
}
|
|
115
|
-
ensureHydrated() {
|
|
116
|
-
|
|
117
|
-
var _a;
|
|
118
|
-
yield ((_a = this.hydrated) !== null && _a !== void 0 ? _a : this.scan());
|
|
119
|
-
});
|
|
103
|
+
async ensureHydrated() {
|
|
104
|
+
await (this.hydrated ?? this.scan());
|
|
120
105
|
}
|
|
121
|
-
readRecord(sessionId) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
});
|
|
106
|
+
async readRecord(sessionId) {
|
|
107
|
+
if (!isSafeSessionId(sessionId)) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const raw = await readFile(this.recordPath(sessionId), "utf8");
|
|
112
|
+
return JSON.parse(raw);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
134
117
|
}
|
|
135
118
|
/**
|
|
136
119
|
* Identity of the file at `path`: inode plus mtime, so two renames within
|
|
137
120
|
* one clock tick still read as different. Undefined when there is no
|
|
138
121
|
* file; any other failure propagates.
|
|
139
122
|
*/
|
|
140
|
-
stampOf(path) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return undefined;
|
|
149
|
-
}
|
|
150
|
-
throw error;
|
|
123
|
+
async stampOf(path) {
|
|
124
|
+
try {
|
|
125
|
+
const info = await stat(path);
|
|
126
|
+
return `${info.ino}:${info.mtimeMs}`;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (error.code === "ENOENT") {
|
|
130
|
+
return undefined;
|
|
151
131
|
}
|
|
152
|
-
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
153
134
|
}
|
|
154
135
|
/**
|
|
155
136
|
* Read a record from disk into the cache; returns it when present. The
|
|
@@ -157,45 +138,41 @@ export class SessionStore {
|
|
|
157
138
|
* stale stamp, and the next lookup re-reads, rather than a fresh stamp on
|
|
158
139
|
* stale bytes.
|
|
159
140
|
*/
|
|
160
|
-
load(sessionId) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
return record;
|
|
175
|
-
});
|
|
141
|
+
async load(sessionId) {
|
|
142
|
+
if (!isSafeSessionId(sessionId)) {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
const stamp = await this.stampOf(this.recordPath(sessionId)).catch(() => undefined);
|
|
146
|
+
if (stamp === undefined) {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
const record = await this.readRecord(sessionId);
|
|
150
|
+
if (record === undefined) {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
this.remember(record, stamp);
|
|
154
|
+
return record;
|
|
176
155
|
}
|
|
177
|
-
refreshIfChanged(sessionId) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
this.evict(sessionId);
|
|
192
|
-
}
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
if (stamp !== this.stamps.get(sessionId)) {
|
|
196
|
-
yield this.load(sessionId);
|
|
156
|
+
async refreshIfChanged(sessionId) {
|
|
157
|
+
let stamp;
|
|
158
|
+
try {
|
|
159
|
+
stamp = await this.stampOf(this.recordPath(sessionId));
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Unreadable for a reason other than absence: keep what we have.
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (stamp === undefined) {
|
|
166
|
+
// No file for a record we never stamped is our own `save` still
|
|
167
|
+
// writing it, not a deletion.
|
|
168
|
+
if (this.stamps.has(sessionId)) {
|
|
169
|
+
this.evict(sessionId);
|
|
197
170
|
}
|
|
198
|
-
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (stamp !== this.stamps.get(sessionId)) {
|
|
174
|
+
await this.load(sessionId);
|
|
175
|
+
}
|
|
199
176
|
}
|
|
200
177
|
remember(record, stamp) {
|
|
201
178
|
const previous = this.cache.get(record.sessionId);
|
|
@@ -214,7 +191,7 @@ export class SessionStore {
|
|
|
214
191
|
const previous = this.cache.get(sessionId);
|
|
215
192
|
this.cache.delete(sessionId);
|
|
216
193
|
this.stamps.delete(sessionId);
|
|
217
|
-
if (
|
|
194
|
+
if (previous?.continuationKey != null) {
|
|
218
195
|
this.unindex(previous);
|
|
219
196
|
}
|
|
220
197
|
}
|
|
@@ -248,63 +225,55 @@ export class SessionStore {
|
|
|
248
225
|
this.continuationIndex.set(this.continuationKeyOf(record.channelId, record.continuationKey), record.sessionId);
|
|
249
226
|
}
|
|
250
227
|
}
|
|
251
|
-
get(sessionId) {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
return this.load(sessionId);
|
|
261
|
-
});
|
|
228
|
+
async get(sessionId) {
|
|
229
|
+
if (!isSafeSessionId(sessionId)) {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
if (this.cache.has(sessionId)) {
|
|
233
|
+
await this.refreshIfChanged(sessionId);
|
|
234
|
+
return this.cache.get(sessionId);
|
|
235
|
+
}
|
|
236
|
+
return this.load(sessionId);
|
|
262
237
|
}
|
|
263
|
-
list() {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
return [...this.cache.values()].sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
267
|
-
});
|
|
238
|
+
async list() {
|
|
239
|
+
await this.scan();
|
|
240
|
+
return [...this.cache.values()].sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
268
241
|
}
|
|
269
|
-
findByContinuation(channelId, key) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
return undefined;
|
|
277
|
-
}
|
|
278
|
-
const record = yield this.get(sessionId);
|
|
279
|
-
// `get` may have re-read the record and found its continuation moved,
|
|
280
|
-
// or evicted it; either way this hit is stale.
|
|
281
|
-
return (record === null || record === void 0 ? void 0 : record.continuationKey) === key ? record : undefined;
|
|
282
|
-
});
|
|
283
|
-
const found = yield lookup();
|
|
284
|
-
if (found !== undefined) {
|
|
285
|
-
return found;
|
|
242
|
+
async findByContinuation(channelId, key) {
|
|
243
|
+
await this.ensureHydrated();
|
|
244
|
+
const indexKey = this.continuationKeyOf(channelId, key);
|
|
245
|
+
const lookup = async () => {
|
|
246
|
+
const sessionId = this.continuationIndex.get(indexKey);
|
|
247
|
+
if (sessionId === undefined) {
|
|
248
|
+
return undefined;
|
|
286
249
|
}
|
|
287
|
-
|
|
288
|
-
//
|
|
289
|
-
|
|
290
|
-
return
|
|
291
|
-
}
|
|
250
|
+
const record = await this.get(sessionId);
|
|
251
|
+
// `get` may have re-read the record and found its continuation moved,
|
|
252
|
+
// or evicted it; either way this hit is stale.
|
|
253
|
+
return record?.continuationKey === key ? record : undefined;
|
|
254
|
+
};
|
|
255
|
+
const found = await lookup();
|
|
256
|
+
if (found !== undefined) {
|
|
257
|
+
return found;
|
|
258
|
+
}
|
|
259
|
+
// A miss or a stale hit: another process may have created or re-keyed a
|
|
260
|
+
// session since the last scan. Rescan once and retry.
|
|
261
|
+
await this.scan();
|
|
262
|
+
return lookup();
|
|
292
263
|
}
|
|
293
|
-
save(record) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
this.remember(record, stamp);
|
|
308
|
-
});
|
|
264
|
+
async save(record) {
|
|
265
|
+
this.remember(record, undefined);
|
|
266
|
+
const dir = this.sessionDir(record.sessionId);
|
|
267
|
+
await mkdir(dir, { recursive: true });
|
|
268
|
+
const finalPath = this.recordPath(record.sessionId);
|
|
269
|
+
const tmpPath = `${finalPath}.${randomBytes(4).toString("hex")}.tmp`;
|
|
270
|
+
await writeFile(tmpPath, `${JSON.stringify(record, null, 2)}\n`, "utf8");
|
|
271
|
+
// Stamp the bytes we wrote, not whatever is at `finalPath` afterwards:
|
|
272
|
+
// rename keeps inode and mtime, and a peer landing right behind us must
|
|
273
|
+
// read as a change. Remember again so a concurrent read that loaded the
|
|
274
|
+
// peer's earlier file does not leave the cache pointing at it.
|
|
275
|
+
const stamp = await this.stampOf(tmpPath);
|
|
276
|
+
await rename(tmpPath, finalPath);
|
|
277
|
+
this.remember(record, stamp);
|
|
309
278
|
}
|
|
310
279
|
}
|
|
@@ -3,126 +3,108 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Customer-facing errors never include hosting URLs or infra jargon.
|
|
5
5
|
*/
|
|
6
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
8
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
9
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
10
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
11
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
12
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
|
-
});
|
|
14
|
-
};
|
|
15
6
|
import { sanitizeCustomerError } from "./logs-client.js";
|
|
16
7
|
import { mergeRequestHeaders } from "./request-headers.js";
|
|
17
|
-
export function listSessions(args) {
|
|
18
|
-
return
|
|
19
|
-
return (yield listSessionsWithSource(args)).sessions;
|
|
20
|
-
});
|
|
8
|
+
export async function listSessions(args) {
|
|
9
|
+
return (await listSessionsWithSource(args)).sessions;
|
|
21
10
|
}
|
|
22
|
-
export function listSessionsWithSource(args) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const sessions
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (parsed !== undefined) {
|
|
46
|
-
sessions.push(parsed);
|
|
47
|
-
}
|
|
11
|
+
export async function listSessionsWithSource(args) {
|
|
12
|
+
const baseUrl = args.baseUrl.replace(/\/$/, "");
|
|
13
|
+
const fetchImpl = args.fetchImpl ?? fetch;
|
|
14
|
+
const query = args.latest === true ? "?latest=1" : "";
|
|
15
|
+
let resp;
|
|
16
|
+
try {
|
|
17
|
+
resp = await fetchImpl(`${baseUrl}/v1/sessions${query}`, {
|
|
18
|
+
headers: mergeRequestHeaders(args.auth),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw new Error(sanitizeCustomerError(error instanceof Error ? error.message : "Could not list sessions."));
|
|
23
|
+
}
|
|
24
|
+
if (!resp.ok) {
|
|
25
|
+
throw new Error(`Could not list sessions (HTTP ${resp.status}).`);
|
|
26
|
+
}
|
|
27
|
+
const body = (await resp.json());
|
|
28
|
+
const sessions = [];
|
|
29
|
+
if (Array.isArray(body.sessions)) {
|
|
30
|
+
for (const row of body.sessions) {
|
|
31
|
+
const parsed = parseSessionSummary(row);
|
|
32
|
+
if (parsed !== undefined) {
|
|
33
|
+
sessions.push(parsed);
|
|
48
34
|
}
|
|
49
35
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
36
|
+
}
|
|
37
|
+
const source = body.source === "cursor-hosted" || body.source === "local" ? body.source : undefined;
|
|
38
|
+
return source === undefined ? { sessions } : { sessions, source };
|
|
53
39
|
}
|
|
54
|
-
export function fetchSessionEvents(args) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const body = (yield jsonResp.json());
|
|
68
|
-
if (Array.isArray(body.events)) {
|
|
69
|
-
return body.events;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else if (jsonResp.status === 404) {
|
|
73
|
-
throw new Error(`Session ${args.sessionId} not found.`);
|
|
74
|
-
}
|
|
75
|
-
else if (jsonResp.status === 403) {
|
|
76
|
-
throw new Error(`Session ${args.sessionId} is not readable by this caller.`);
|
|
40
|
+
export async function fetchSessionEvents(args) {
|
|
41
|
+
const baseUrl = args.baseUrl.replace(/\/$/, "");
|
|
42
|
+
const fetchImpl = args.fetchImpl ?? fetch;
|
|
43
|
+
const path = `/v1/session/${encodeURIComponent(args.sessionId)}/events`;
|
|
44
|
+
try {
|
|
45
|
+
const jsonResp = await fetchImpl(`${baseUrl}${path}?format=json`, {
|
|
46
|
+
headers: mergeRequestHeaders(args.auth),
|
|
47
|
+
signal: args.signal,
|
|
48
|
+
});
|
|
49
|
+
if (jsonResp.ok) {
|
|
50
|
+
const body = (await jsonResp.json());
|
|
51
|
+
if (Array.isArray(body.events)) {
|
|
52
|
+
return body.events;
|
|
77
53
|
}
|
|
78
54
|
}
|
|
79
|
-
|
|
80
|
-
(
|
|
81
|
-
if (error instanceof Error && error.message.startsWith("Session ")) {
|
|
82
|
-
throw error;
|
|
83
|
-
}
|
|
84
|
-
// Fall through to NDJSON.
|
|
55
|
+
else if (jsonResp.status === 404) {
|
|
56
|
+
throw new Error(`Session ${args.sessionId} not found.`);
|
|
85
57
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
58
|
+
else if (jsonResp.status === 403) {
|
|
59
|
+
throw new Error(`Session ${args.sessionId} is not readable by this caller.`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
args.signal?.throwIfAborted();
|
|
64
|
+
if (error instanceof Error && error.message.startsWith("Session ")) {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
// Fall through to NDJSON.
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const resp = await fetchImpl(`${baseUrl}${path}`, {
|
|
71
|
+
headers: mergeRequestHeaders(args.auth),
|
|
72
|
+
signal: args.signal,
|
|
73
|
+
});
|
|
74
|
+
if (resp.status === 404) {
|
|
75
|
+
throw new Error(`Session ${args.sessionId} not found.`);
|
|
76
|
+
}
|
|
77
|
+
if (resp.status === 403) {
|
|
78
|
+
throw new Error(`Session ${args.sessionId} is not readable by this caller.`);
|
|
79
|
+
}
|
|
80
|
+
if (!resp.ok) {
|
|
81
|
+
throw new Error(`Could not fetch session events (HTTP ${resp.status}).`);
|
|
82
|
+
}
|
|
83
|
+
const text = await resp.text();
|
|
84
|
+
const events = [];
|
|
85
|
+
for (const line of text.split("\n")) {
|
|
86
|
+
if (line.trim() === "") {
|
|
87
|
+
continue;
|
|
96
88
|
}
|
|
97
|
-
|
|
98
|
-
|
|
89
|
+
try {
|
|
90
|
+
events.push(JSON.parse(line));
|
|
99
91
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
for (const line of text.split("\n")) {
|
|
103
|
-
if (line.trim() === "") {
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
try {
|
|
107
|
-
events.push(JSON.parse(line));
|
|
108
|
-
}
|
|
109
|
-
catch (_d) {
|
|
110
|
-
// skip malformed lines
|
|
111
|
-
}
|
|
92
|
+
catch {
|
|
93
|
+
// skip malformed lines
|
|
112
94
|
}
|
|
113
|
-
return events;
|
|
114
95
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
throw new Error(sanitizeCustomerError(error.message));
|
|
122
|
-
}
|
|
123
|
-
throw new Error(sanitizeCustomerError(error instanceof Error ? error.message : "Could not fetch session events."));
|
|
96
|
+
return events;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
args.signal?.throwIfAborted();
|
|
100
|
+
if (error instanceof Error && error.message.startsWith("Session ")) {
|
|
101
|
+
throw error;
|
|
124
102
|
}
|
|
125
|
-
|
|
103
|
+
if (error instanceof Error && error.message.startsWith("Could not fetch")) {
|
|
104
|
+
throw new Error(sanitizeCustomerError(error.message));
|
|
105
|
+
}
|
|
106
|
+
throw new Error(sanitizeCustomerError(error instanceof Error ? error.message : "Could not fetch session events."));
|
|
107
|
+
}
|
|
126
108
|
}
|
|
127
109
|
/** Lenient parse so partial stubs / older servers still list by sessionId. */
|
|
128
110
|
function parseSessionSummary(value) {
|
|
@@ -168,16 +150,13 @@ export function pickPreviousSession(sessions) {
|
|
|
168
150
|
return [...followable].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))[0];
|
|
169
151
|
}
|
|
170
152
|
/** Look up the most recently updated followable session id. */
|
|
171
|
-
export function resolvePreviousSessionId(args) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
auth: args.auth,
|
|
177
|
-
fetchImpl: args.fetchImpl,
|
|
178
|
-
});
|
|
179
|
-
return (_a = pickPreviousSession(sessions)) === null || _a === void 0 ? void 0 : _a.sessionId;
|
|
153
|
+
export async function resolvePreviousSessionId(args) {
|
|
154
|
+
const sessions = await listSessions({
|
|
155
|
+
baseUrl: args.baseUrl,
|
|
156
|
+
auth: args.auth,
|
|
157
|
+
fetchImpl: args.fetchImpl,
|
|
180
158
|
});
|
|
159
|
+
return pickPreviousSession(sessions)?.sessionId;
|
|
181
160
|
}
|
|
182
161
|
/** Human label for {@link SessionListSource} in CLI output. */
|
|
183
162
|
export function formatSessionListSource(source) {
|
|
@@ -187,7 +166,7 @@ export function formatSessionListSource(source) {
|
|
|
187
166
|
}
|
|
188
167
|
/** Format a sessions table (id, channel, mode, turns, running, updated). */
|
|
189
168
|
export function formatSessionsTable(sessions, options) {
|
|
190
|
-
const sourceLine =
|
|
169
|
+
const sourceLine = options?.source === undefined ? "" : `${formatSessionListSource(options.source)}\n`;
|
|
191
170
|
if (sessions.length === 0) {
|
|
192
171
|
return `${sourceLine}No sessions.\n`;
|
|
193
172
|
}
|
|
@@ -203,9 +182,9 @@ export function formatSessionsTable(sessions, options) {
|
|
|
203
182
|
return `${sourceLine}${renderTable(header, rows)}\n`;
|
|
204
183
|
}
|
|
205
184
|
function renderTable(header, rows) {
|
|
206
|
-
const widths = header.map((h, i) => Math.max(h.length, ...rows.map(row =>
|
|
185
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map(row => (row[i] ?? "").length)));
|
|
207
186
|
const renderRow = (row) => row
|
|
208
|
-
.map((cell, i) =>
|
|
187
|
+
.map((cell, i) => cell.padEnd(widths[i] ?? 0))
|
|
209
188
|
.join(" ")
|
|
210
189
|
.trimEnd();
|
|
211
190
|
return [renderRow(header), ...rows.map(renderRow)].join("\n");
|