@cursor/bdk 0.2.9 → 0.2.10
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/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
- 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 +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/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.js +410 -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-DXm_VXAQ.css +1 -0
- package/dist/playground/assets/{index-Co4CUVTQ.js → index-JekUQERK.js} +45 -45
- 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
- /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -19,15 +19,6 @@
|
|
|
19
19
|
* per agent, and splitting it would change backpressure behavior, which this
|
|
20
20
|
* seam deliberately does not touch.
|
|
21
21
|
*/
|
|
22
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
23
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
24
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
25
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
26
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
27
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
28
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
29
|
-
});
|
|
30
|
-
};
|
|
31
22
|
import { resolveStoragePolicy, storageKeys, } from "../storage.js";
|
|
32
23
|
import { isCursorHostedStorage } from "../storage-backends/cursor-hosted.js";
|
|
33
24
|
import { describeError } from "./describe-error.js";
|
|
@@ -52,16 +43,16 @@ const TERMINAL_SESSION_EVENTS = new Set([
|
|
|
52
43
|
* At-most-once delivery already tolerates loss; bounding the queue keeps a
|
|
53
44
|
* slow sink from growing memory without limit under sustained traffic.
|
|
54
45
|
*/
|
|
55
|
-
const MAX_PENDING_OPS =
|
|
46
|
+
const MAX_PENDING_OPS = 1_000;
|
|
56
47
|
/**
|
|
57
48
|
* How long {@link StorageCoordinator.close} waits for the sink to
|
|
58
49
|
* drain before giving up. Keeps a hung sink within the shutdown budget.
|
|
59
50
|
*/
|
|
60
|
-
const CLOSE_DRAIN_TIMEOUT_MS =
|
|
51
|
+
const CLOSE_DRAIN_TIMEOUT_MS = 10_000;
|
|
61
52
|
/** Debounced event batching flushes early past this many buffered events. */
|
|
62
53
|
const DEBOUNCE_MAX_BATCH = 200;
|
|
63
54
|
/** Cap on the per-session acked-record dedupe cache (oldest-out). */
|
|
64
|
-
const MAX_ACKED_RECORDS =
|
|
55
|
+
const MAX_ACKED_RECORDS = 5_000;
|
|
65
56
|
/**
|
|
66
57
|
* Cap on consecutive record rewrites skipped because only volatile
|
|
67
58
|
* bookkeeping changed. Bounds how stale the durable copy's `turnCount` /
|
|
@@ -78,7 +69,7 @@ export const MAX_VOLATILE_RECORD_SKIPS = 20;
|
|
|
78
69
|
* metadata) would lag.
|
|
79
70
|
*/
|
|
80
71
|
function resumeProjectionJson(record) {
|
|
81
|
-
return JSON.stringify(
|
|
72
|
+
return JSON.stringify({ ...record, turnCount: 0, updatedAt: "" });
|
|
82
73
|
}
|
|
83
74
|
/** Session records out of raw sink entries; rows without a usable id are dropped. */
|
|
84
75
|
function sessionRecordsOf(entries) {
|
|
@@ -88,7 +79,6 @@ function sessionRecordsOf(entries) {
|
|
|
88
79
|
}
|
|
89
80
|
export class StorageCoordinator {
|
|
90
81
|
constructor(options) {
|
|
91
|
-
var _a;
|
|
92
82
|
/** Per-session pending state (events + coalesced record). */
|
|
93
83
|
this.buffers = new Map();
|
|
94
84
|
/**
|
|
@@ -119,7 +109,7 @@ export class StorageCoordinator {
|
|
|
119
109
|
this.dropped = 0;
|
|
120
110
|
this.closed = false;
|
|
121
111
|
this.definition = options.definition;
|
|
122
|
-
this.keys =
|
|
112
|
+
this.keys = options.keys ?? storageKeys;
|
|
123
113
|
this.policy = resolveStoragePolicy(options.definition.policy);
|
|
124
114
|
this.agentName = options.agentName;
|
|
125
115
|
this.projectRoot = options.projectRoot;
|
|
@@ -183,26 +173,26 @@ export class StorageCoordinator {
|
|
|
183
173
|
this.flushSessionInternal(sessionId, "policy", true);
|
|
184
174
|
}
|
|
185
175
|
flushSessionInternal(sessionId, reason, exactRecord) {
|
|
186
|
-
var _a, _b;
|
|
187
176
|
const buffer = this.buffers.get(sessionId);
|
|
188
177
|
const acked = this.lastAckedRecord.get(sessionId);
|
|
189
|
-
if (buffer === undefined && !(exactRecord &&
|
|
178
|
+
if (buffer === undefined && !(exactRecord && acked?.skippedJson !== undefined)) {
|
|
190
179
|
return;
|
|
191
180
|
}
|
|
192
181
|
this.buffers.delete(sessionId);
|
|
193
|
-
if (
|
|
182
|
+
if (buffer?.debounceTimer !== undefined) {
|
|
194
183
|
clearTimeout(buffer.debounceTimer);
|
|
195
184
|
}
|
|
196
|
-
const events =
|
|
185
|
+
const events = buffer?.events ?? [];
|
|
197
186
|
// A terminal event can arrive through a debounce-policy timer flush,
|
|
198
187
|
// where eventDispatched never ran: detect it from the buffered events
|
|
199
188
|
// so a finished session's record is exact under either policy.
|
|
200
189
|
const exact = exactRecord || events.some(event => TERMINAL_SESSION_EVENTS.has(event.type));
|
|
201
190
|
// Exact flushes repair earlier volatile-only skips: when the buffer no
|
|
202
191
|
// longer holds a record, the newest skipped one still gets written.
|
|
203
|
-
const record =
|
|
204
|
-
|
|
205
|
-
|
|
192
|
+
const record = buffer?.record ??
|
|
193
|
+
(exact && acked?.skippedJson !== undefined
|
|
194
|
+
? JSON.parse(acked.skippedJson)
|
|
195
|
+
: undefined);
|
|
206
196
|
const ops = [];
|
|
207
197
|
const puts = [];
|
|
208
198
|
const first = events[0];
|
|
@@ -217,7 +207,7 @@ export class StorageCoordinator {
|
|
|
217
207
|
if (record !== undefined) {
|
|
218
208
|
const recordJson = JSON.stringify(record);
|
|
219
209
|
const projection = resumeProjectionJson(record);
|
|
220
|
-
if (
|
|
210
|
+
if (acked?.json === recordJson) {
|
|
221
211
|
// Byte-identical to the last acknowledged write: rewriting it buys
|
|
222
212
|
// nothing. Events and continuation index still flush normally.
|
|
223
213
|
}
|
|
@@ -258,7 +248,6 @@ export class StorageCoordinator {
|
|
|
258
248
|
* logged and dropped (at-most-once), never failing batch siblings.
|
|
259
249
|
*/
|
|
260
250
|
putsOp(puts, recordAck) {
|
|
261
|
-
var _a;
|
|
262
251
|
const recordKey = recordAck === undefined ? undefined : this.keys.session(this.agentName, recordAck.sessionId);
|
|
263
252
|
const settleRecord = (failed) => {
|
|
264
253
|
if (recordAck === undefined) {
|
|
@@ -280,12 +269,12 @@ export class StorageCoordinator {
|
|
|
280
269
|
skips: 0,
|
|
281
270
|
});
|
|
282
271
|
};
|
|
283
|
-
const putMany =
|
|
272
|
+
const putMany = this.definition.putMany?.bind(this.definition);
|
|
284
273
|
if (putMany !== undefined) {
|
|
285
274
|
return {
|
|
286
275
|
label: `putMany(${puts.map(entry => entry.key).join(", ")})`,
|
|
287
|
-
run: (ctx) =>
|
|
288
|
-
const results =
|
|
276
|
+
run: async (ctx) => {
|
|
277
|
+
const results = await putMany(puts, ctx);
|
|
289
278
|
let recordFailed = false;
|
|
290
279
|
for (const result of results) {
|
|
291
280
|
if (result.error === undefined) {
|
|
@@ -297,16 +286,16 @@ export class StorageCoordinator {
|
|
|
297
286
|
this.logger(`[bdk] storage put(${result.key}) failed: ${describeError(result.error)}`);
|
|
298
287
|
}
|
|
299
288
|
settleRecord(recordFailed);
|
|
300
|
-
}
|
|
289
|
+
},
|
|
301
290
|
};
|
|
302
291
|
}
|
|
303
292
|
return {
|
|
304
293
|
label: `put(${puts.map(entry => entry.key).join(", ")})`,
|
|
305
|
-
run: (ctx) =>
|
|
294
|
+
run: async (ctx) => {
|
|
306
295
|
let recordFailed = false;
|
|
307
296
|
for (const entry of puts) {
|
|
308
297
|
try {
|
|
309
|
-
|
|
298
|
+
await this.definition.put(entry.key, entry.value, ctx);
|
|
310
299
|
}
|
|
311
300
|
catch (error) {
|
|
312
301
|
if (entry.key === recordKey) {
|
|
@@ -316,7 +305,7 @@ export class StorageCoordinator {
|
|
|
316
305
|
}
|
|
317
306
|
}
|
|
318
307
|
settleRecord(recordFailed);
|
|
319
|
-
}
|
|
308
|
+
},
|
|
320
309
|
};
|
|
321
310
|
}
|
|
322
311
|
/**
|
|
@@ -352,7 +341,7 @@ export class StorageCoordinator {
|
|
|
352
341
|
deleteOp(key) {
|
|
353
342
|
return {
|
|
354
343
|
label: `delete(${key})`,
|
|
355
|
-
run: ctx =>
|
|
344
|
+
run: ctx => this.definition.delete?.(key, ctx),
|
|
356
345
|
};
|
|
357
346
|
}
|
|
358
347
|
// ==========================================================================
|
|
@@ -374,31 +363,27 @@ export class StorageCoordinator {
|
|
|
374
363
|
* logged and read as "nothing saved" — a broken store must never block
|
|
375
364
|
* serve start.
|
|
376
365
|
*/
|
|
377
|
-
listSessions() {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
.filter(record => record != null);
|
|
383
|
-
});
|
|
366
|
+
async listSessions() {
|
|
367
|
+
const entries = await this.tryList(this.keys.sessionPrefix(this.agentName));
|
|
368
|
+
return entries
|
|
369
|
+
.map(entry => entry.value)
|
|
370
|
+
.filter(record => record != null);
|
|
384
371
|
}
|
|
385
372
|
/**
|
|
386
373
|
* Session records from the sink for the sessions API. Unlike
|
|
387
374
|
* {@link listSessions}, missing `list` or a thrown sink error **propagates**
|
|
388
375
|
* so the caller can fall back to the local session store.
|
|
389
376
|
*/
|
|
390
|
-
listSessionsFromSink() {
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
return sessionRecordsOf(entries);
|
|
401
|
-
});
|
|
377
|
+
async listSessionsFromSink() {
|
|
378
|
+
const list = this.definition.list;
|
|
379
|
+
if (list === undefined) {
|
|
380
|
+
throw new Error("storage sink has no list");
|
|
381
|
+
}
|
|
382
|
+
const entries = await list(this.keys.sessionPrefix(this.agentName), this.context("restore"));
|
|
383
|
+
if (!Array.isArray(entries)) {
|
|
384
|
+
throw new Error("storage list returned a non-array");
|
|
385
|
+
}
|
|
386
|
+
return sessionRecordsOf(entries);
|
|
402
387
|
}
|
|
403
388
|
/**
|
|
404
389
|
* Newest-written session records from the sink (`GET /v1/sessions?latest=1`
|
|
@@ -406,35 +391,31 @@ export class StorageCoordinator {
|
|
|
406
391
|
* posture as {@link listSessionsFromSink}; `undefined` when the sink
|
|
407
392
|
* cannot order by write time, so the caller falls back to the full list.
|
|
408
393
|
*/
|
|
409
|
-
listNewestSessionsFromSink(limit) {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
return sessionRecordsOf(entries);
|
|
420
|
-
});
|
|
394
|
+
async listNewestSessionsFromSink(limit) {
|
|
395
|
+
const listNewest = this.definition.listNewest;
|
|
396
|
+
if (listNewest === undefined) {
|
|
397
|
+
return undefined;
|
|
398
|
+
}
|
|
399
|
+
const entries = await listNewest(this.keys.sessionPrefix(this.agentName), limit, this.context("restore"));
|
|
400
|
+
if (!Array.isArray(entries)) {
|
|
401
|
+
throw new Error("storage listNewest returned a non-array");
|
|
402
|
+
}
|
|
403
|
+
return sessionRecordsOf(entries);
|
|
421
404
|
}
|
|
422
405
|
/**
|
|
423
406
|
* Saved event stream for one session: chunk values concatenated in key
|
|
424
407
|
* order (chunks are keyed by their first event's index, zero-padded, so
|
|
425
408
|
* ascending key order is append order). Errors read as an empty stream.
|
|
426
409
|
*/
|
|
427
|
-
listSessionEvents(sessionId) {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
events.push(...entry.value);
|
|
434
|
-
}
|
|
410
|
+
async listSessionEvents(sessionId) {
|
|
411
|
+
const entries = await this.tryList(this.keys.sessionEventsPrefix(this.agentName, sessionId));
|
|
412
|
+
const events = [];
|
|
413
|
+
for (const entry of entries) {
|
|
414
|
+
if (Array.isArray(entry.value)) {
|
|
415
|
+
events.push(...entry.value);
|
|
435
416
|
}
|
|
436
|
-
|
|
437
|
-
|
|
417
|
+
}
|
|
418
|
+
return events;
|
|
438
419
|
}
|
|
439
420
|
/**
|
|
440
421
|
* One saved session by id (lazy restore for playground Open-trace /
|
|
@@ -442,25 +423,23 @@ export class StorageCoordinator {
|
|
|
442
423
|
* — same posture as {@link getSessionByContinuation}. A definitive miss
|
|
443
424
|
* (no row, or a write-only sink without `get`) resolves undefined.
|
|
444
425
|
*/
|
|
445
|
-
getSessionById(sessionId) {
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
return record;
|
|
463
|
-
});
|
|
426
|
+
async getSessionById(sessionId) {
|
|
427
|
+
const get = this.definition.get;
|
|
428
|
+
if (get === undefined) {
|
|
429
|
+
return undefined;
|
|
430
|
+
}
|
|
431
|
+
if (typeof sessionId !== "string" || sessionId === "") {
|
|
432
|
+
return undefined;
|
|
433
|
+
}
|
|
434
|
+
const ctx = this.context("restore");
|
|
435
|
+
const record = (await get(this.keys.session(this.agentName, sessionId), ctx));
|
|
436
|
+
if (record == null) {
|
|
437
|
+
return undefined;
|
|
438
|
+
}
|
|
439
|
+
if (record.sessionId !== sessionId) {
|
|
440
|
+
throw new Error(`storage returned a session that does not match the requested id ${sessionId}`);
|
|
441
|
+
}
|
|
442
|
+
return record;
|
|
464
443
|
}
|
|
465
444
|
/**
|
|
466
445
|
* One saved session by channel continuation key (lazy restore). Unlike
|
|
@@ -471,37 +450,35 @@ export class StorageCoordinator {
|
|
|
471
450
|
* A definitive miss (no index entry, or a write-only sink without
|
|
472
451
|
* `get`) resolves undefined.
|
|
473
452
|
*/
|
|
474
|
-
getSessionByContinuation(channelId, continuationKey) {
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
return record;
|
|
504
|
-
});
|
|
453
|
+
async getSessionByContinuation(channelId, continuationKey) {
|
|
454
|
+
const get = this.definition.get;
|
|
455
|
+
if (get === undefined) {
|
|
456
|
+
return undefined;
|
|
457
|
+
}
|
|
458
|
+
const ctx = this.context("restore");
|
|
459
|
+
const pointer = await get(this.keys.continuation(this.agentName, channelId, continuationKey), ctx);
|
|
460
|
+
if (pointer == null) {
|
|
461
|
+
return undefined;
|
|
462
|
+
}
|
|
463
|
+
const sessionId = typeof pointer === "object" && !Array.isArray(pointer) ? pointer.sessionId : undefined;
|
|
464
|
+
if (typeof sessionId !== "string" || sessionId === "") {
|
|
465
|
+
throw new Error(`storage returned a malformed continuation entry for channel ${channelId}`);
|
|
466
|
+
}
|
|
467
|
+
const record = await this.getSessionById(sessionId);
|
|
468
|
+
if (record === undefined) {
|
|
469
|
+
// Index entry without its record (e.g. the record write was shed
|
|
470
|
+
// under at-most-once). The session is unrecoverable; treat as a miss
|
|
471
|
+
// so the conversation can continue rather than failing forever.
|
|
472
|
+
this.logger(`[bdk] storage continuation entry points at missing session ${sessionId}; treating as a miss`);
|
|
473
|
+
return undefined;
|
|
474
|
+
}
|
|
475
|
+
// The sink must answer for the exact key it was asked about — a
|
|
476
|
+
// mismatched row is a broken store, not a miss; treating it as a miss
|
|
477
|
+
// would fork the continuation token onto a new session.
|
|
478
|
+
if (record.channelId !== channelId || record.continuationKey !== continuationKey) {
|
|
479
|
+
throw new Error(`storage returned a session that does not match the requested continuation (channel ${channelId})`);
|
|
480
|
+
}
|
|
481
|
+
return record;
|
|
505
482
|
}
|
|
506
483
|
// ==========================================================================
|
|
507
484
|
// Author KV ({@link HostContext.kv})
|
|
@@ -517,34 +494,27 @@ export class StorageCoordinator {
|
|
|
517
494
|
* Awaited author KV read. Unlike framework session mirrors, this awaits
|
|
518
495
|
* the sink and propagates errors — handlers need read-after-write.
|
|
519
496
|
*/
|
|
520
|
-
kvGet(authorKey) {
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
return yield get(key, this.context("restore"));
|
|
529
|
-
});
|
|
497
|
+
async kvGet(authorKey) {
|
|
498
|
+
const get = this.definition.get;
|
|
499
|
+
if (get === undefined) {
|
|
500
|
+
throw new Error("storage get is not configured");
|
|
501
|
+
}
|
|
502
|
+
const key = this.keys.kv(this.agentName, authorKey);
|
|
503
|
+
// Preserve stored JSON `null` (distinct from a missing key).
|
|
504
|
+
return await get(key, this.context("restore"));
|
|
530
505
|
}
|
|
531
506
|
/**
|
|
532
507
|
* Awaited author KV write. Goes straight to the sink (not the
|
|
533
508
|
* at-most-once delivery queue) so callers observe durable success/failure.
|
|
534
509
|
*/
|
|
535
|
-
kvPut(authorKey, value) {
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
yield this.definition.put(key, value, this.context("policy"));
|
|
539
|
-
});
|
|
510
|
+
async kvPut(authorKey, value) {
|
|
511
|
+
const key = this.keys.kv(this.agentName, authorKey);
|
|
512
|
+
await this.definition.put(key, value, this.context("policy"));
|
|
540
513
|
}
|
|
541
514
|
/** Awaited author KV delete. No-op when the sink omits `delete`. */
|
|
542
|
-
kvDelete(authorKey) {
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
const key = this.keys.kv(this.agentName, authorKey);
|
|
546
|
-
yield (_b = (_a = this.definition).delete) === null || _b === void 0 ? void 0 : _b.call(_a, key, this.context("policy"));
|
|
547
|
-
});
|
|
515
|
+
async kvDelete(authorKey) {
|
|
516
|
+
const key = this.keys.kv(this.agentName, authorKey);
|
|
517
|
+
await this.definition.delete?.(key, this.context("policy"));
|
|
548
518
|
}
|
|
549
519
|
// ==========================================================================
|
|
550
520
|
// Evals (dedicated `evals` table)
|
|
@@ -579,16 +549,16 @@ export class StorageCoordinator {
|
|
|
579
549
|
},
|
|
580
550
|
], "policy");
|
|
581
551
|
},
|
|
582
|
-
list: () =>
|
|
552
|
+
list: async () => {
|
|
583
553
|
try {
|
|
584
|
-
const runs =
|
|
554
|
+
const runs = await table.list(this.context("restore"));
|
|
585
555
|
return Array.isArray(runs) ? runs : [];
|
|
586
556
|
}
|
|
587
557
|
catch (error) {
|
|
588
558
|
this.logger(`[bdk] storage evals.list() failed: ${describeError(error)}`);
|
|
589
559
|
return [];
|
|
590
560
|
}
|
|
591
|
-
}
|
|
561
|
+
},
|
|
592
562
|
};
|
|
593
563
|
}
|
|
594
564
|
// ==========================================================================
|
|
@@ -598,36 +568,33 @@ export class StorageCoordinator {
|
|
|
598
568
|
* Flush all buffers and drain the queue, giving the sink at most
|
|
599
569
|
* {@link CLOSE_DRAIN_TIMEOUT_MS}. Called from engine close.
|
|
600
570
|
*/
|
|
601
|
-
close() {
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
this.flushSession(sessionId, "shutdown");
|
|
606
|
-
}
|
|
607
|
-
// Sessions whose newest record was only ever skipped (volatile-only
|
|
608
|
-
// turns) have no buffer left; drain their stashed records too so a
|
|
609
|
-
// graceful shutdown leaves exact bookkeeping behind.
|
|
610
|
-
for (const [sessionId, acked] of this.lastAckedRecord) {
|
|
611
|
-
if (acked.skippedJson !== undefined) {
|
|
612
|
-
this.flushSessionInternal(sessionId, "shutdown", true);
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
this.closed = true;
|
|
571
|
+
async close() {
|
|
572
|
+
if (!this.closed) {
|
|
573
|
+
for (const sessionId of [...this.buffers.keys()]) {
|
|
574
|
+
this.flushSession(sessionId, "shutdown");
|
|
616
575
|
}
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
}),
|
|
625
|
-
]);
|
|
626
|
-
clearTimeout(timer);
|
|
627
|
-
if (!drained) {
|
|
628
|
-
this.logger(`[bdk] storage shutdown drain timed out after ${CLOSE_DRAIN_TIMEOUT_MS}ms with ${this.pending} write(s) undelivered`);
|
|
576
|
+
// Sessions whose newest record was only ever skipped (volatile-only
|
|
577
|
+
// turns) have no buffer left; drain their stashed records too so a
|
|
578
|
+
// graceful shutdown leaves exact bookkeeping behind.
|
|
579
|
+
for (const [sessionId, acked] of this.lastAckedRecord) {
|
|
580
|
+
if (acked.skippedJson !== undefined) {
|
|
581
|
+
this.flushSessionInternal(sessionId, "shutdown", true);
|
|
582
|
+
}
|
|
629
583
|
}
|
|
630
|
-
|
|
584
|
+
this.closed = true;
|
|
585
|
+
}
|
|
586
|
+
let timer;
|
|
587
|
+
const drained = await Promise.race([
|
|
588
|
+
this.queue.then(() => true),
|
|
589
|
+
new Promise(resolve => {
|
|
590
|
+
timer = setTimeout(() => resolve(false), CLOSE_DRAIN_TIMEOUT_MS);
|
|
591
|
+
timer.unref?.();
|
|
592
|
+
}),
|
|
593
|
+
]);
|
|
594
|
+
clearTimeout(timer);
|
|
595
|
+
if (!drained) {
|
|
596
|
+
this.logger(`[bdk] storage shutdown drain timed out after ${CLOSE_DRAIN_TIMEOUT_MS}ms with ${this.pending} write(s) undelivered`);
|
|
597
|
+
}
|
|
631
598
|
}
|
|
632
599
|
/** Pending deliveries (exposed for tests and drain instrumentation). */
|
|
633
600
|
whenIdle() {
|
|
@@ -642,7 +609,6 @@ export class StorageCoordinator {
|
|
|
642
609
|
return buffer;
|
|
643
610
|
}
|
|
644
611
|
armDebounce(sessionId, buffer, debounceMs) {
|
|
645
|
-
var _a, _b;
|
|
646
612
|
if (buffer.debounceTimer !== undefined) {
|
|
647
613
|
clearTimeout(buffer.debounceTimer);
|
|
648
614
|
}
|
|
@@ -651,24 +617,22 @@ export class StorageCoordinator {
|
|
|
651
617
|
this.flushSession(sessionId);
|
|
652
618
|
}, debounceMs);
|
|
653
619
|
// Never keep the process alive just for a pending storage flush.
|
|
654
|
-
|
|
620
|
+
buffer.debounceTimer.unref?.();
|
|
655
621
|
}
|
|
656
622
|
/** `list` wrapper for the startup reads: missing hook or throw ⇒ empty. */
|
|
657
|
-
tryList(prefix) {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
}
|
|
671
|
-
});
|
|
623
|
+
async tryList(prefix) {
|
|
624
|
+
const list = this.definition.list;
|
|
625
|
+
if (list === undefined) {
|
|
626
|
+
return [];
|
|
627
|
+
}
|
|
628
|
+
try {
|
|
629
|
+
const entries = await list(prefix, this.context("restore"));
|
|
630
|
+
return Array.isArray(entries) ? entries : [];
|
|
631
|
+
}
|
|
632
|
+
catch (error) {
|
|
633
|
+
this.logger(`[bdk] storage list(${prefix}) failed: ${describeError(error)}`);
|
|
634
|
+
return [];
|
|
635
|
+
}
|
|
672
636
|
}
|
|
673
637
|
enqueue(ops, reason) {
|
|
674
638
|
if (this.closed && reason !== "shutdown") {
|
|
@@ -676,17 +640,17 @@ export class StorageCoordinator {
|
|
|
676
640
|
}
|
|
677
641
|
if (this.pending + ops.length > MAX_PENDING_OPS) {
|
|
678
642
|
this.dropped += ops.length;
|
|
679
|
-
if (this.dropped <= ops.length || this.dropped %
|
|
643
|
+
if (this.dropped <= ops.length || this.dropped % 1_000 < ops.length) {
|
|
680
644
|
this.logger(`[bdk] storage queue full (${MAX_PENDING_OPS} pending writes); dropped ${this.dropped} write(s) so far — the sink is too slow for the traffic`);
|
|
681
645
|
}
|
|
682
646
|
return;
|
|
683
647
|
}
|
|
684
648
|
this.pending += ops.length;
|
|
685
649
|
const ctx = this.context(reason);
|
|
686
|
-
this.queue = this.queue.then(() =>
|
|
650
|
+
this.queue = this.queue.then(async () => {
|
|
687
651
|
for (const op of ops) {
|
|
688
652
|
try {
|
|
689
|
-
|
|
653
|
+
await op.run(ctx);
|
|
690
654
|
}
|
|
691
655
|
catch (error) {
|
|
692
656
|
this.logger(`[bdk] storage ${op.label} failed: ${describeError(error)}`);
|
|
@@ -695,7 +659,7 @@ export class StorageCoordinator {
|
|
|
695
659
|
this.pending -= 1;
|
|
696
660
|
}
|
|
697
661
|
}
|
|
698
|
-
})
|
|
662
|
+
});
|
|
699
663
|
}
|
|
700
664
|
context(reason) {
|
|
701
665
|
return { agentName: this.agentName, projectRoot: this.projectRoot, reason };
|
|
@@ -3,15 +3,6 @@
|
|
|
3
3
|
* skills, workspace seed, and session workspaceFile syncs so they keep the
|
|
4
4
|
* same write-then-sweep discipline and the same path refusals.
|
|
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 { posix } from "node:path";
|
|
16
7
|
import { FileConflictError } from "../files.js";
|
|
17
8
|
/**
|
|
@@ -20,16 +11,13 @@ import { FileConflictError } from "../files.js";
|
|
|
20
11
|
* Writes land before stale deletes, so a failed sync never leaves a gap a
|
|
21
12
|
* concurrent cloud reader could see.
|
|
22
13
|
*/
|
|
23
|
-
export function mirrorToStore(args) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
.filter(entry => !args.desired.has(entry.key))
|
|
31
|
-
.map(entry => args.sink.delete(entry.key)));
|
|
32
|
-
});
|
|
14
|
+
export async function mirrorToStore(args) {
|
|
15
|
+
await Promise.all([...args.desired].map(([key, body]) => putLastWriterWins(args.sink, key, body)));
|
|
16
|
+
const listed = await Promise.all([args.prefix, ...(args.legacyPrefixes ?? [])].map(prefix => args.sink.list(prefix)));
|
|
17
|
+
await Promise.all(listed
|
|
18
|
+
.flat()
|
|
19
|
+
.filter(entry => !args.desired.has(entry.key))
|
|
20
|
+
.map(entry => args.sink.delete(entry.key)));
|
|
33
21
|
}
|
|
34
22
|
/**
|
|
35
23
|
* Same refusals as local materialization's `resolveInside`: a rel that
|
|
@@ -53,16 +41,14 @@ export function storeRelPath(relPath, what) {
|
|
|
53
41
|
* Last writer wins. A raced conditional put clears the sink's cached etag,
|
|
54
42
|
* so one retry re-learns the current version and lands.
|
|
55
43
|
*/
|
|
56
|
-
function putLastWriterWins(sink, key, body) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
throw error;
|
|
64
|
-
}
|
|
65
|
-
yield sink.put(key, body);
|
|
44
|
+
async function putLastWriterWins(sink, key, body) {
|
|
45
|
+
try {
|
|
46
|
+
await sink.put(key, body);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (!(error instanceof FileConflictError)) {
|
|
50
|
+
throw error;
|
|
66
51
|
}
|
|
67
|
-
|
|
52
|
+
await sink.put(key, body);
|
|
53
|
+
}
|
|
68
54
|
}
|