@cursor/bdk 0.2.8 → 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.d.ts +1 -0
- package/dist/bin/agent-serve.d.ts.map +1 -1
- package/dist/bin/agent-serve.js +820 -807
- 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.oyjtOr3W.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.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.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.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.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.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.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.d.ts +0 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
- 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.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
- 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.d.ts +18 -0
- package/dist/internal/cli-migrate.d.ts.map +1 -0
- package/dist/internal/cli-migrate.js +136 -0
- 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.d.ts +1 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +130 -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.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +238 -274
- 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-MijLHTbB.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 +264 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
- package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
- 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-DPKLl4C_.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
|
@@ -5,15 +5,6 @@
|
|
|
5
5
|
* Cursor-managed hosting preserves artifacts across deployment replacement.
|
|
6
6
|
* Self-hosted agents store them under `--state-root/artifacts`.
|
|
7
7
|
*/
|
|
8
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
8
|
import { createHash, randomUUID } from "node:crypto";
|
|
18
9
|
import { mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
19
10
|
import { join } from "node:path";
|
|
@@ -24,7 +15,7 @@ import { mapBounded } from "./bounded.js";
|
|
|
24
15
|
/** Default {@link ArtifactPageOptions.limit}; also `GET /v1/artifacts`. */
|
|
25
16
|
export const ARTIFACTS_PAGE_DEFAULT_LIMIT = 200;
|
|
26
17
|
/** Ceiling for {@link ArtifactPageOptions.limit}; larger asks clamp. */
|
|
27
|
-
export const ARTIFACTS_PAGE_MAX_LIMIT =
|
|
18
|
+
export const ARTIFACTS_PAGE_MAX_LIMIT = 1_000;
|
|
28
19
|
/**
|
|
29
20
|
* Rows examined per `page()` call, floor. Filters live in row bodies, so a
|
|
30
21
|
* sparse filter must hydrate rows just to reject them; this stops one call
|
|
@@ -62,10 +53,9 @@ export const ARTIFACT_DEFAULT_KIND = "artifact";
|
|
|
62
53
|
*/
|
|
63
54
|
export class ArtifactsStore {
|
|
64
55
|
constructor(options) {
|
|
65
|
-
var _a, _b;
|
|
66
56
|
/** Serializes tags so read-modify-write upserts and eviction don't race. */
|
|
67
57
|
this.tagChain = Promise.resolve();
|
|
68
|
-
const sink =
|
|
58
|
+
const sink = options.sink ?? (isCursorHostedFilesAvailable() ? cursorHostedFiles() : undefined);
|
|
69
59
|
if (sink === undefined) {
|
|
70
60
|
this.rows = createFilesystemRowStore(options.stateRoot);
|
|
71
61
|
this.content = createFilesystemContentStore(options.stateRoot);
|
|
@@ -76,57 +66,54 @@ export class ArtifactsStore {
|
|
|
76
66
|
}
|
|
77
67
|
this.config = options.config;
|
|
78
68
|
this.max = resolveArtifactsMax(options.config);
|
|
79
|
-
this.enforceCap =
|
|
69
|
+
this.enforceCap = options.enforceCap ?? (() => true);
|
|
80
70
|
}
|
|
81
71
|
tag(input) {
|
|
82
72
|
const result = this.tagChain.then(() => this.tagSerialized(input));
|
|
83
73
|
this.tagChain = result.catch(() => { });
|
|
84
74
|
return result;
|
|
85
75
|
}
|
|
86
|
-
tagSerialized(input) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
76
|
+
async tagSerialized(input) {
|
|
77
|
+
const { kind, data } = this.resolveKindAndData(input);
|
|
78
|
+
const id = input.key === undefined ? `art_${randomUUID()}` : artifactIdForKey(input.key);
|
|
79
|
+
// Fresh random ids can't collide; only keyed tags upsert.
|
|
80
|
+
const existing = input.key === undefined ? undefined : await this.rows.get(id);
|
|
81
|
+
const now = new Date().toISOString();
|
|
82
|
+
const record = {
|
|
83
|
+
id,
|
|
84
|
+
kind,
|
|
85
|
+
key: input.key,
|
|
86
|
+
title: input.title,
|
|
87
|
+
data,
|
|
88
|
+
sessionId: input.sessionId,
|
|
89
|
+
turnId: input.turnId,
|
|
90
|
+
source: input.source ?? "host",
|
|
91
|
+
createdAt: existing?.createdAt ?? now,
|
|
92
|
+
updatedAt: now,
|
|
93
|
+
};
|
|
94
|
+
if (input.contents !== undefined) {
|
|
95
|
+
const body = typeof input.contents === "string" ? Buffer.from(input.contents, "utf8") : input.contents;
|
|
96
|
+
await this.content.put(id, body);
|
|
97
|
+
record.content = {
|
|
98
|
+
size: body.byteLength,
|
|
99
|
+
contentType: input.contentType,
|
|
105
100
|
};
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
record.content =
|
|
110
|
-
size: body.byteLength,
|
|
111
|
-
contentType: input.contentType,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
else if ((existing === null || existing === void 0 ? void 0 : existing.content) !== undefined) {
|
|
115
|
-
if (existing.sessionId === record.sessionId) {
|
|
116
|
-
record.content = existing.content;
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
// Keys are deployment-global: rebinding a keyed row to another
|
|
120
|
-
// session must not carry the prior session's payload with it.
|
|
121
|
-
yield this.content.delete(id);
|
|
122
|
-
}
|
|
101
|
+
}
|
|
102
|
+
else if (existing?.content !== undefined) {
|
|
103
|
+
if (existing.sessionId === record.sessionId) {
|
|
104
|
+
record.content = existing.content;
|
|
123
105
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
106
|
+
else {
|
|
107
|
+
// Keys are deployment-global: rebinding a keyed row to another
|
|
108
|
+
// session must not carry the prior session's payload with it.
|
|
109
|
+
await this.content.delete(id);
|
|
127
110
|
}
|
|
128
|
-
|
|
129
|
-
|
|
111
|
+
}
|
|
112
|
+
await this.rows.put(record);
|
|
113
|
+
if (existing === undefined && this.enforceCap()) {
|
|
114
|
+
await this.evictPastCap();
|
|
115
|
+
}
|
|
116
|
+
return record;
|
|
130
117
|
}
|
|
131
118
|
get(id) {
|
|
132
119
|
return this.rows.get(id);
|
|
@@ -140,11 +127,9 @@ export class ArtifactsStore {
|
|
|
140
127
|
* {@link ArtifactsApi.list} contract. Walk the full set via
|
|
141
128
|
* {@link ArtifactsStore.page}.
|
|
142
129
|
*/
|
|
143
|
-
list(filter) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return page.records;
|
|
147
|
-
});
|
|
130
|
+
async list(filter) {
|
|
131
|
+
const page = await this.page(filter);
|
|
132
|
+
return page.records;
|
|
148
133
|
}
|
|
149
134
|
/**
|
|
150
135
|
* Bounded cursor pagination, newest-updated first. On a store whose
|
|
@@ -166,22 +151,19 @@ export class ArtifactsStore {
|
|
|
166
151
|
* the caller received, and continues only while more *visible* records
|
|
167
152
|
* remain, at the bounded cost of hydrating the full set.
|
|
168
153
|
*/
|
|
169
|
-
page(options) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if ((
|
|
178
|
-
|
|
179
|
-
if (metas.some(meta => meta.mtimeMs !== undefined)) {
|
|
180
|
-
return this.pageFromMetadata(metas, limit, cursor, matches, (options === null || options === void 0 ? void 0 : options.kind) !== undefined || (options === null || options === void 0 ? void 0 : options.sessionId) !== undefined);
|
|
181
|
-
}
|
|
154
|
+
async page(options) {
|
|
155
|
+
const limit = Math.min(Math.max(options?.limit ?? ARTIFACTS_PAGE_DEFAULT_LIMIT, 1), ARTIFACTS_PAGE_MAX_LIMIT);
|
|
156
|
+
const cursor = options?.cursor === undefined ? undefined : decodeArtifactPageCursor(options.cursor);
|
|
157
|
+
const matches = (record) => (options?.kind === undefined || record.kind === options.kind) &&
|
|
158
|
+
(options?.sessionId === undefined || record.sessionId === options.sessionId) &&
|
|
159
|
+
(options?.matches === undefined || options.matches(record));
|
|
160
|
+
if (options?.matches === undefined) {
|
|
161
|
+
const metas = await this.rows.listMeta();
|
|
162
|
+
if (metas.some(meta => meta.mtimeMs !== undefined)) {
|
|
163
|
+
return this.pageFromMetadata(metas, limit, cursor, matches, options?.kind !== undefined || options?.sessionId !== undefined);
|
|
182
164
|
}
|
|
183
|
-
|
|
184
|
-
|
|
165
|
+
}
|
|
166
|
+
return this.pageFromRecords(limit, cursor, matches);
|
|
185
167
|
}
|
|
186
168
|
/**
|
|
187
169
|
* Metadata-ordered page: sort metas newest first, resume after the
|
|
@@ -189,85 +171,81 @@ export class ArtifactsStore {
|
|
|
189
171
|
* budget runs out, or the metas do. The cursor marks the last *examined*
|
|
190
172
|
* meta, so a budget-limited call still makes progress.
|
|
191
173
|
*/
|
|
192
|
-
pageFromMetadata(metas, limit, cursor, matches, filtered) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
start = newestFirst.findIndex(meta => { var _a; return ((_a = meta.mtimeMs) !== null && _a !== void 0 ? _a : 0) <= cursor.m; });
|
|
203
|
-
if (start === -1) {
|
|
204
|
-
return { records: [] };
|
|
205
|
-
}
|
|
206
|
-
let skipped = 0;
|
|
207
|
-
while (start < newestFirst.length &&
|
|
208
|
-
((_c = (_a = newestFirst[start]) === null || _a === void 0 ? void 0 : _a.mtimeMs) !== null && _c !== void 0 ? _c : 0) === cursor.m &&
|
|
209
|
-
skipped < cursor.s) {
|
|
210
|
-
start += 1;
|
|
211
|
-
skipped += 1;
|
|
212
|
-
}
|
|
213
|
-
if (start >= newestFirst.length) {
|
|
214
|
-
return { records: [] };
|
|
215
|
-
}
|
|
174
|
+
async pageFromMetadata(metas, limit, cursor, matches, filtered) {
|
|
175
|
+
const newestFirst = metas.sort((a, b) => byOldestModified(b, a));
|
|
176
|
+
let start = 0;
|
|
177
|
+
if (cursor !== undefined && cursor.kind === "mtime") {
|
|
178
|
+
// Resume after (boundary stamp, rows of that cohort already
|
|
179
|
+
// examined). Same-stamp rows sit contiguously in the sort, so the
|
|
180
|
+
// pair names an exact position without identifying any row.
|
|
181
|
+
start = newestFirst.findIndex(meta => (meta.mtimeMs ?? 0) <= cursor.m);
|
|
182
|
+
if (start === -1) {
|
|
183
|
+
return { records: [] };
|
|
216
184
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
let lastExamined = start - 1;
|
|
224
|
-
// A batched row store hydrates a bigger slice per round trip. Without
|
|
225
|
-
// one, keep the slice at the per-row fan-out bound. An unfiltered
|
|
226
|
-
// page needs exactly the rows it returns — every hydrated row matches —
|
|
227
|
-
// so cap its slice at the remaining page instead of over-hydrating a
|
|
228
|
-
// full batch for a small `limit`.
|
|
229
|
-
const scanBatchSize = this.rows.getMany !== undefined ? ARTIFACTS_SCAN_BATCH_ROWS : ROW_HYDRATION_CONCURRENCY;
|
|
230
|
-
scan: while (lastExamined + 1 < newestFirst.length &&
|
|
231
|
-
records.length < limit &&
|
|
232
|
-
examined < budget) {
|
|
233
|
-
const from = lastExamined + 1;
|
|
234
|
-
const sliceCap = filtered ? scanBatchSize : Math.min(scanBatchSize, limit - records.length);
|
|
235
|
-
const batch = newestFirst.slice(from, from + Math.min(sliceCap, budget - examined));
|
|
236
|
-
const bodies = this.rows.getMany !== undefined
|
|
237
|
-
? yield this.rows.getMany(batch.map(meta => meta.id))
|
|
238
|
-
: yield mapBounded(batch, ROW_HYDRATION_CONCURRENCY, meta => this.rows.get(meta.id));
|
|
239
|
-
for (let i = 0; i < batch.length; i += 1) {
|
|
240
|
-
lastExamined = from + i;
|
|
241
|
-
examined += 1;
|
|
242
|
-
const record = bodies[i];
|
|
243
|
-
if (record !== undefined && matches(record)) {
|
|
244
|
-
records.push(record);
|
|
245
|
-
if (records.length === limit) {
|
|
246
|
-
break scan;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
185
|
+
let skipped = 0;
|
|
186
|
+
while (start < newestFirst.length &&
|
|
187
|
+
(newestFirst[start]?.mtimeMs ?? 0) === cursor.m &&
|
|
188
|
+
skipped < cursor.s) {
|
|
189
|
+
start += 1;
|
|
190
|
+
skipped += 1;
|
|
250
191
|
}
|
|
251
|
-
if (
|
|
252
|
-
return { records };
|
|
192
|
+
if (start >= newestFirst.length) {
|
|
193
|
+
return { records: [] };
|
|
253
194
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
195
|
+
}
|
|
196
|
+
// A cursor of the other kind means the store's listing gained mtimes
|
|
197
|
+
// between pages (a mode flip, not caller error): restart from the top
|
|
198
|
+
// rather than fail the walk.
|
|
199
|
+
const budget = Math.max(limit, ARTIFACTS_PAGE_SCAN_MIN);
|
|
200
|
+
const records = [];
|
|
201
|
+
let examined = 0;
|
|
202
|
+
let lastExamined = start - 1;
|
|
203
|
+
// A batched row store hydrates a bigger slice per round trip. Without
|
|
204
|
+
// one, keep the slice at the per-row fan-out bound. An unfiltered
|
|
205
|
+
// page needs exactly the rows it returns — every hydrated row matches —
|
|
206
|
+
// so cap its slice at the remaining page instead of over-hydrating a
|
|
207
|
+
// full batch for a small `limit`.
|
|
208
|
+
const scanBatchSize = this.rows.getMany !== undefined ? ARTIFACTS_SCAN_BATCH_ROWS : ROW_HYDRATION_CONCURRENCY;
|
|
209
|
+
scan: while (lastExamined + 1 < newestFirst.length &&
|
|
210
|
+
records.length < limit &&
|
|
211
|
+
examined < budget) {
|
|
212
|
+
const from = lastExamined + 1;
|
|
213
|
+
const sliceCap = filtered ? scanBatchSize : Math.min(scanBatchSize, limit - records.length);
|
|
214
|
+
const batch = newestFirst.slice(from, from + Math.min(sliceCap, budget - examined));
|
|
215
|
+
const bodies = this.rows.getMany !== undefined
|
|
216
|
+
? await this.rows.getMany(batch.map(meta => meta.id))
|
|
217
|
+
: await mapBounded(batch, ROW_HYDRATION_CONCURRENCY, meta => this.rows.get(meta.id));
|
|
218
|
+
for (let i = 0; i < batch.length; i += 1) {
|
|
219
|
+
lastExamined = from + i;
|
|
220
|
+
examined += 1;
|
|
221
|
+
const record = bodies[i];
|
|
222
|
+
if (record !== undefined && matches(record)) {
|
|
223
|
+
records.push(record);
|
|
224
|
+
if (records.length === limit) {
|
|
225
|
+
break scan;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
260
228
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
229
|
+
}
|
|
230
|
+
if (lastExamined >= newestFirst.length - 1) {
|
|
231
|
+
return { records };
|
|
232
|
+
}
|
|
233
|
+
const boundary = newestFirst[lastExamined].mtimeMs ?? 0;
|
|
234
|
+
// How deep into the boundary's same-stamp cohort the scan got —
|
|
235
|
+
// cohorts are contiguous, so count back from the last examined row.
|
|
236
|
+
let cohortExamined = 0;
|
|
237
|
+
for (let i = lastExamined; i >= 0 && (newestFirst[i]?.mtimeMs ?? 0) === boundary; i -= 1) {
|
|
238
|
+
cohortExamined += 1;
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
records,
|
|
242
|
+
nextCursor: encodeArtifactPageCursor({
|
|
243
|
+
v: 1,
|
|
244
|
+
kind: "mtime",
|
|
245
|
+
m: boundary,
|
|
246
|
+
s: cohortExamined,
|
|
247
|
+
}),
|
|
248
|
+
};
|
|
271
249
|
}
|
|
272
250
|
/**
|
|
273
251
|
* Hydrate-everything page: exact `updatedAt` order, cursor = the last
|
|
@@ -276,37 +254,35 @@ export class ArtifactsStore {
|
|
|
276
254
|
* {@link ArtifactsStore.page} for why filtered callers must not receive
|
|
277
255
|
* metadata-lane cursors.
|
|
278
256
|
*/
|
|
279
|
-
pageFromRecords(limit, cursor, matches) {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
id: cursor.id,
|
|
288
|
-
};
|
|
289
|
-
start = records.findIndex(record => byNewestUpdated(record, position) > 0);
|
|
290
|
-
if (start === -1) {
|
|
291
|
-
return { records: [] };
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
const page = records.slice(start, start + limit);
|
|
295
|
-
const last = page[page.length - 1];
|
|
296
|
-
if (last === undefined || start + page.length >= records.length) {
|
|
297
|
-
return { records: page };
|
|
298
|
-
}
|
|
299
|
-
return {
|
|
300
|
-
records: page,
|
|
301
|
-
nextCursor: encodeArtifactPageCursor({
|
|
302
|
-
v: 1,
|
|
303
|
-
kind: "updated",
|
|
304
|
-
u: last.updatedAt,
|
|
305
|
-
c: last.createdAt,
|
|
306
|
-
id: last.id,
|
|
307
|
-
}),
|
|
257
|
+
async pageFromRecords(limit, cursor, matches) {
|
|
258
|
+
const records = (await this.rows.list()).filter(matches).sort(byNewestUpdated);
|
|
259
|
+
let start = 0;
|
|
260
|
+
if (cursor !== undefined && cursor.kind === "updated") {
|
|
261
|
+
const position = {
|
|
262
|
+
updatedAt: cursor.u,
|
|
263
|
+
createdAt: cursor.c,
|
|
264
|
+
id: cursor.id,
|
|
308
265
|
};
|
|
309
|
-
|
|
266
|
+
start = records.findIndex(record => byNewestUpdated(record, position) > 0);
|
|
267
|
+
if (start === -1) {
|
|
268
|
+
return { records: [] };
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const page = records.slice(start, start + limit);
|
|
272
|
+
const last = page[page.length - 1];
|
|
273
|
+
if (last === undefined || start + page.length >= records.length) {
|
|
274
|
+
return { records: page };
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
records: page,
|
|
278
|
+
nextCursor: encodeArtifactPageCursor({
|
|
279
|
+
v: 1,
|
|
280
|
+
kind: "updated",
|
|
281
|
+
u: last.updatedAt,
|
|
282
|
+
c: last.createdAt,
|
|
283
|
+
id: last.id,
|
|
284
|
+
}),
|
|
285
|
+
};
|
|
310
286
|
}
|
|
311
287
|
/**
|
|
312
288
|
* Resolve the effective kind (freeform when no kinds are declared) and
|
|
@@ -315,13 +291,11 @@ export class ArtifactsStore {
|
|
|
315
291
|
* parsed output — defaults and coercions applied — is what gets stored.
|
|
316
292
|
*/
|
|
317
293
|
resolveKindAndData(input) {
|
|
318
|
-
|
|
319
|
-
var _b;
|
|
320
|
-
const kind = (_b = input.kind) !== null && _b !== void 0 ? _b : ARTIFACT_DEFAULT_KIND;
|
|
294
|
+
const kind = input.kind ?? ARTIFACT_DEFAULT_KIND;
|
|
321
295
|
if (kind.trim() === "") {
|
|
322
296
|
throw new Error("artifacts.tag: kind must be a non-empty string");
|
|
323
297
|
}
|
|
324
|
-
const kinds =
|
|
298
|
+
const kinds = this.config?.kinds;
|
|
325
299
|
if (kinds === undefined || Object.keys(kinds).length === 0) {
|
|
326
300
|
return { kind, data: input.data };
|
|
327
301
|
}
|
|
@@ -347,44 +321,40 @@ export class ArtifactsStore {
|
|
|
347
321
|
* Deletes are capped per pass so a store far past the cap drains across
|
|
348
322
|
* inserts instead of delaying one insert for the entire backlog.
|
|
349
323
|
*/
|
|
350
|
-
evictPastCap() {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
yield this.content.delete(id);
|
|
362
|
-
}));
|
|
324
|
+
async evictPastCap() {
|
|
325
|
+
const metas = await this.rows.listMeta();
|
|
326
|
+
const excess = Math.min(metas.length - this.max, ARTIFACTS_EVICT_MAX_PER_PASS);
|
|
327
|
+
if (excess <= 0) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
await mapBounded(await this.oldestRowIds(metas, excess), ROW_HYDRATION_CONCURRENCY, async (id) => {
|
|
331
|
+
await this.rows.delete(id);
|
|
332
|
+
// Without the row body there is no `content` flag to consult;
|
|
333
|
+
// delete the payload unconditionally — absent ones are a no-op.
|
|
334
|
+
await this.content.delete(id);
|
|
363
335
|
});
|
|
364
336
|
}
|
|
365
337
|
/** The `excess` oldest row ids, cheapest available ordering first. */
|
|
366
|
-
oldestRowIds(metas, excess) {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
.map(record => record.id);
|
|
387
|
-
});
|
|
338
|
+
async oldestRowIds(metas, excess) {
|
|
339
|
+
if (metas.some(meta => meta.mtimeMs !== undefined)) {
|
|
340
|
+
// A store that tracks mtimes must never regress to per-insert
|
|
341
|
+
// hydration. An entry missing one sorts oldest via the comparator's
|
|
342
|
+
// `?? 0` and is evicted first, avoiding a full hydration on each insert.
|
|
343
|
+
return metas
|
|
344
|
+
.sort(byOldestModified)
|
|
345
|
+
.slice(0, excess)
|
|
346
|
+
.map(meta => meta.id);
|
|
347
|
+
}
|
|
348
|
+
// A store that tracks no modification times at all (the local
|
|
349
|
+
// filesystem store, deliberately) leaves only the rows' own
|
|
350
|
+
// `updatedAt`: hydrate — bounded — and order exactly. Corrupt rows
|
|
351
|
+
// drop out of `list()`, so recompute the excess against the rows that
|
|
352
|
+
// actually parsed.
|
|
353
|
+
const records = await this.rows.list();
|
|
354
|
+
return records
|
|
355
|
+
.sort((a, b) => byNewestUpdated(b, a))
|
|
356
|
+
.slice(0, Math.min(excess, Math.max(0, records.length - this.max)))
|
|
357
|
+
.map(record => record.id);
|
|
388
358
|
}
|
|
389
359
|
}
|
|
390
360
|
/** A syntactically invalid {@link ArtifactPageOptions.cursor}. */
|
|
@@ -403,7 +373,7 @@ function decodeArtifactPageCursor(raw) {
|
|
|
403
373
|
try {
|
|
404
374
|
value = JSON.parse(Buffer.from(raw, "base64url").toString("utf8"));
|
|
405
375
|
}
|
|
406
|
-
catch
|
|
376
|
+
catch {
|
|
407
377
|
throw new InvalidArtifactCursorError();
|
|
408
378
|
}
|
|
409
379
|
if (typeof value !== "object" || value === null) {
|
|
@@ -441,9 +411,8 @@ export function artifactIdForKey(key) {
|
|
|
441
411
|
* the retention cap.
|
|
442
412
|
*/
|
|
443
413
|
function byOldestModified(a, b) {
|
|
444
|
-
var _a, _b;
|
|
445
414
|
if (a.mtimeMs !== b.mtimeMs) {
|
|
446
|
-
return (
|
|
415
|
+
return (a.mtimeMs ?? 0) - (b.mtimeMs ?? 0);
|
|
447
416
|
}
|
|
448
417
|
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
449
418
|
}
|
|
@@ -484,7 +453,7 @@ function parseRecordBytes(bytes) {
|
|
|
484
453
|
try {
|
|
485
454
|
value = JSON.parse(Buffer.from(bytes).toString("utf8"));
|
|
486
455
|
}
|
|
487
|
-
catch
|
|
456
|
+
catch {
|
|
488
457
|
// A corrupt row must not poison list().
|
|
489
458
|
return undefined;
|
|
490
459
|
}
|
|
@@ -500,58 +469,46 @@ function sinkBody(found) {
|
|
|
500
469
|
function createSinkRowStore(sink, agentName) {
|
|
501
470
|
const key = (id) => agentStoreKeys.artifactRow(agentName, id);
|
|
502
471
|
return {
|
|
503
|
-
get(id) {
|
|
504
|
-
return
|
|
505
|
-
return parseRecordBytes(sinkBody(yield sink.get(key(id))));
|
|
506
|
-
});
|
|
472
|
+
async get(id) {
|
|
473
|
+
return parseRecordBytes(sinkBody(await sink.get(key(id))));
|
|
507
474
|
},
|
|
508
|
-
put(record) {
|
|
509
|
-
|
|
510
|
-
yield sink.put(key(record.id), Buffer.from(JSON.stringify(record), "utf8"));
|
|
511
|
-
});
|
|
475
|
+
async put(record) {
|
|
476
|
+
await sink.put(key(record.id), Buffer.from(JSON.stringify(record), "utf8"));
|
|
512
477
|
},
|
|
513
|
-
delete(id) {
|
|
514
|
-
|
|
515
|
-
yield sink.delete(key(id));
|
|
516
|
-
});
|
|
478
|
+
async delete(id) {
|
|
479
|
+
await sink.delete(key(id));
|
|
517
480
|
},
|
|
518
|
-
getMany(ids) {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
return bodies.map(body => parseRecordBytes(sinkBody(body)));
|
|
525
|
-
});
|
|
481
|
+
async getMany(ids) {
|
|
482
|
+
const keys = ids.map(id => key(id));
|
|
483
|
+
const bodies = sink.getMany !== undefined
|
|
484
|
+
? await sink.getMany(keys)
|
|
485
|
+
: await mapBounded(keys, ROW_HYDRATION_CONCURRENCY, rowKey => sink.get(rowKey));
|
|
486
|
+
return bodies.map(body => parseRecordBytes(sinkBody(body)));
|
|
526
487
|
},
|
|
527
|
-
list() {
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
records.push(record);
|
|
538
|
-
}
|
|
488
|
+
async list() {
|
|
489
|
+
const entries = await sink.list(agentStoreKeys.artifactRowPrefix(agentName));
|
|
490
|
+
const bodies = sink.getMany !== undefined
|
|
491
|
+
? await sink.getMany(entries.map(entry => entry.key))
|
|
492
|
+
: await mapBounded(entries, ROW_HYDRATION_CONCURRENCY, entry => sink.get(entry.key));
|
|
493
|
+
const records = [];
|
|
494
|
+
for (const body of bodies) {
|
|
495
|
+
const record = parseRecordBytes(sinkBody(body));
|
|
496
|
+
if (record !== undefined) {
|
|
497
|
+
records.push(record);
|
|
539
498
|
}
|
|
540
|
-
|
|
541
|
-
|
|
499
|
+
}
|
|
500
|
+
return records;
|
|
542
501
|
},
|
|
543
|
-
listMeta() {
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
metas.push({ id, mtimeMs: entry.mtimeMs });
|
|
551
|
-
}
|
|
502
|
+
async listMeta() {
|
|
503
|
+
const prefix = agentStoreKeys.artifactRowPrefix(agentName);
|
|
504
|
+
const metas = [];
|
|
505
|
+
for (const entry of await sink.list(prefix)) {
|
|
506
|
+
const id = rowIdFromName(entry.key.slice(prefix.length));
|
|
507
|
+
if (id !== undefined) {
|
|
508
|
+
metas.push({ id, mtimeMs: entry.mtimeMs });
|
|
552
509
|
}
|
|
553
|
-
|
|
554
|
-
|
|
510
|
+
}
|
|
511
|
+
return metas;
|
|
555
512
|
},
|
|
556
513
|
};
|
|
557
514
|
}
|
|
@@ -573,27 +530,21 @@ function rowIdFromName(name) {
|
|
|
573
530
|
const id = decodeURIComponent(encoded);
|
|
574
531
|
return encodeURIComponent(id) === encoded ? id : undefined;
|
|
575
532
|
}
|
|
576
|
-
catch
|
|
533
|
+
catch {
|
|
577
534
|
return undefined;
|
|
578
535
|
}
|
|
579
536
|
}
|
|
580
537
|
function createSinkContentStore(sink, agentName) {
|
|
581
538
|
const key = (id) => agentStoreKeys.artifactContent(agentName, id);
|
|
582
539
|
return {
|
|
583
|
-
get(id) {
|
|
584
|
-
return
|
|
585
|
-
return sinkBody(yield sink.get(key(id)));
|
|
586
|
-
});
|
|
540
|
+
async get(id) {
|
|
541
|
+
return sinkBody(await sink.get(key(id)));
|
|
587
542
|
},
|
|
588
|
-
put(id, body) {
|
|
589
|
-
|
|
590
|
-
yield sink.put(key(id), body);
|
|
591
|
-
});
|
|
543
|
+
async put(id, body) {
|
|
544
|
+
await sink.put(key(id), body);
|
|
592
545
|
},
|
|
593
|
-
delete(id) {
|
|
594
|
-
|
|
595
|
-
yield sink.delete(key(id));
|
|
596
|
-
});
|
|
546
|
+
async delete(id) {
|
|
547
|
+
await sink.delete(key(id));
|
|
597
548
|
},
|
|
598
549
|
};
|
|
599
550
|
}
|
|
@@ -602,9 +553,9 @@ function createFilesystemRowStore(stateRoot) {
|
|
|
602
553
|
const filePath = (id) => join(dir, `${encodeURIComponent(id)}.json`);
|
|
603
554
|
// Missing and corrupt rows both read as absent — a truncated/garbled
|
|
604
555
|
// file must not poison list() (and with it every insert's eviction).
|
|
605
|
-
const readRecord = (path) =>
|
|
556
|
+
const readRecord = async (path) => {
|
|
606
557
|
try {
|
|
607
|
-
const value = JSON.parse(
|
|
558
|
+
const value = JSON.parse(await readFile(path, "utf8"));
|
|
608
559
|
return isArtifactRecord(value) ? value : undefined;
|
|
609
560
|
}
|
|
610
561
|
catch (error) {
|
|
@@ -613,76 +564,68 @@ function createFilesystemRowStore(stateRoot) {
|
|
|
613
564
|
}
|
|
614
565
|
throw error;
|
|
615
566
|
}
|
|
616
|
-
}
|
|
567
|
+
};
|
|
617
568
|
return {
|
|
618
569
|
get(id) {
|
|
619
570
|
return readRecord(filePath(id));
|
|
620
571
|
},
|
|
621
|
-
put(record) {
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
yield rename(tmp, filePath(record.id));
|
|
627
|
-
});
|
|
572
|
+
async put(record) {
|
|
573
|
+
await mkdir(dir, { recursive: true });
|
|
574
|
+
const tmp = join(dir, `.tmp-${randomUUID()}`);
|
|
575
|
+
await writeFile(tmp, JSON.stringify(record), "utf8");
|
|
576
|
+
await rename(tmp, filePath(record.id));
|
|
628
577
|
},
|
|
629
|
-
delete(id) {
|
|
630
|
-
|
|
631
|
-
yield rm(filePath(id), { force: true });
|
|
632
|
-
});
|
|
578
|
+
async delete(id) {
|
|
579
|
+
await rm(filePath(id), { force: true });
|
|
633
580
|
},
|
|
634
|
-
list() {
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
581
|
+
async list() {
|
|
582
|
+
let names;
|
|
583
|
+
try {
|
|
584
|
+
names = await readdir(dir);
|
|
585
|
+
}
|
|
586
|
+
catch (error) {
|
|
587
|
+
if (error.code === "ENOENT") {
|
|
588
|
+
return [];
|
|
639
589
|
}
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
590
|
+
throw error;
|
|
591
|
+
}
|
|
592
|
+
const records = [];
|
|
593
|
+
for (const name of names.sort()) {
|
|
594
|
+
if (name.startsWith(".") || !name.endsWith(".json")) {
|
|
595
|
+
continue;
|
|
645
596
|
}
|
|
646
|
-
const
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
continue;
|
|
650
|
-
}
|
|
651
|
-
const record = yield readRecord(join(dir, name));
|
|
652
|
-
if (record !== undefined) {
|
|
653
|
-
records.push(record);
|
|
654
|
-
}
|
|
597
|
+
const record = await readRecord(join(dir, name));
|
|
598
|
+
if (record !== undefined) {
|
|
599
|
+
records.push(record);
|
|
655
600
|
}
|
|
656
|
-
|
|
657
|
-
|
|
601
|
+
}
|
|
602
|
+
return records;
|
|
658
603
|
},
|
|
659
|
-
listMeta() {
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
604
|
+
async listMeta() {
|
|
605
|
+
// No mtimes on purpose: local rows are cheap to hydrate, and the
|
|
606
|
+
// rows' own `updatedAt` orders eviction exactly, immune to coarse
|
|
607
|
+
// filesystem timestamp granularity.
|
|
608
|
+
let names;
|
|
609
|
+
try {
|
|
610
|
+
names = await readdir(dir);
|
|
611
|
+
}
|
|
612
|
+
catch (error) {
|
|
613
|
+
if (error.code === "ENOENT") {
|
|
614
|
+
return [];
|
|
667
615
|
}
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
616
|
+
throw error;
|
|
617
|
+
}
|
|
618
|
+
const metas = [];
|
|
619
|
+
for (const name of names) {
|
|
620
|
+
if (name.startsWith(".")) {
|
|
621
|
+
continue;
|
|
673
622
|
}
|
|
674
|
-
const
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
continue;
|
|
678
|
-
}
|
|
679
|
-
const id = rowIdFromName(name);
|
|
680
|
-
if (id !== undefined) {
|
|
681
|
-
metas.push({ id });
|
|
682
|
-
}
|
|
623
|
+
const id = rowIdFromName(name);
|
|
624
|
+
if (id !== undefined) {
|
|
625
|
+
metas.push({ id });
|
|
683
626
|
}
|
|
684
|
-
|
|
685
|
-
|
|
627
|
+
}
|
|
628
|
+
return metas;
|
|
686
629
|
},
|
|
687
630
|
};
|
|
688
631
|
}
|
|
@@ -690,31 +633,25 @@ function createFilesystemContentStore(stateRoot) {
|
|
|
690
633
|
const dir = join(stateRoot, "artifacts", "content");
|
|
691
634
|
const filePath = (id) => join(dir, encodeURIComponent(id));
|
|
692
635
|
return {
|
|
693
|
-
get(id) {
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
return undefined;
|
|
701
|
-
}
|
|
702
|
-
throw error;
|
|
636
|
+
async get(id) {
|
|
637
|
+
try {
|
|
638
|
+
return new Uint8Array(await readFile(filePath(id)));
|
|
639
|
+
}
|
|
640
|
+
catch (error) {
|
|
641
|
+
if (error.code === "ENOENT") {
|
|
642
|
+
return undefined;
|
|
703
643
|
}
|
|
704
|
-
|
|
644
|
+
throw error;
|
|
645
|
+
}
|
|
705
646
|
},
|
|
706
|
-
put(id, body) {
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
yield rename(tmp, filePath(id));
|
|
712
|
-
});
|
|
647
|
+
async put(id, body) {
|
|
648
|
+
await mkdir(dir, { recursive: true });
|
|
649
|
+
const tmp = join(dir, `.tmp-${randomUUID()}`);
|
|
650
|
+
await writeFile(tmp, body);
|
|
651
|
+
await rename(tmp, filePath(id));
|
|
713
652
|
},
|
|
714
|
-
delete(id) {
|
|
715
|
-
|
|
716
|
-
yield rm(filePath(id), { force: true });
|
|
717
|
-
});
|
|
653
|
+
async delete(id) {
|
|
654
|
+
await rm(filePath(id), { force: true });
|
|
718
655
|
},
|
|
719
656
|
};
|
|
720
657
|
}
|