@cursor/bdk 0.2.6 → 0.2.7
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/bin/agent-serve.js +52 -57
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +34 -8
- package/dist/channels/github/types.d.ts +6 -0
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +37 -29
- package/dist/channels/slack/external-policy.d.ts.map +1 -1
- package/dist/channels/slack/external-policy.js +6 -6
- package/dist/channels/slack/inbound.d.ts +5 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +13 -0
- package/dist/channels/slack/index.d.ts +3 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +3 -0
- package/dist/channels/slack/log.d.ts +1 -1
- package/dist/channels/slack/log.js +1 -1
- package/dist/channels/slack/self-identity.d.ts +15 -0
- package/dist/channels/slack/self-identity.d.ts.map +1 -0
- package/dist/channels/slack/self-identity.js +48 -0
- package/dist/channels/slack/sender-name.d.ts +17 -0
- package/dist/channels/slack/sender-name.d.ts.map +1 -0
- package/dist/channels/slack/sender-name.js +87 -0
- package/dist/channels/slack/setup.js +1 -1
- package/dist/channels/slack/user-info.d.ts +15 -0
- package/dist/channels/slack/user-info.d.ts.map +1 -0
- package/dist/channels/slack/user-info.js +57 -0
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.CJLKDVza.js → app.oyjtOr3W.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BW9mrQmq.js → VPLocalSearchBox.D0P6J_UJ.js} +1 -1
- package/dist/docs/assets/chunks/{arc.D8ZOvM1m.js → arc.B0LY1J1h.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CXEKhLW-.js → architectureDiagram-Q4EWVU46.dPduLUxY.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.BJkVKblr.js → baseUniq.B_Ohm21h.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DQDbHxor.js → blockDiagram-DXYQGD6D.B4zcanaJ.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.ByMD6LYM.js → c4Diagram-AHTNJAMY.D9Iw21nx.js} +1 -1
- package/dist/docs/assets/chunks/channel.CRUyWDV-.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.Dtq1aVI9.js → chunk-4BX2VUAB.DDVwRShI.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.BL_XrkoQ.js → chunk-4TB4RGXK.DsYcdn1i.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BDPXu94_.js → chunk-55IACEB6.BzzQvcYp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DhGOQj4k.js → chunk-EDXVE4YY.BMiXZ7FX.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DSF5nr8v.js → chunk-FMBD7UC4.D_mBcLoc.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Day7wayw.js → chunk-OYMX7WX6.CMVjWVMx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.CpBEC0zA.js → chunk-QZHKN3VN.BG-FrPv9.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.X_7rY1rx.js → chunk-YZCP3GAM.CkFE1ap3.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +1 -0
- package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BVRmi2ko.js → cose-bilkent-S5V4N54A.BVNnCTvY.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Dei9oslB.js → dagre-KV5264BT.CDN5PR9l.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD._M-efGt7.js → diagram-5BDNPKRD.DQRUlT-i.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.D1Vmhfsj.js → diagram-G4DWMVQ6.CoeblYQT.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.cE1bmvAC.js → diagram-MMDJMWI5.DW3ymjl0.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.DkXAfznP.js → diagram-TYMM5635.BP0uN4Jw.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DH_pSwPg.js → erDiagram-SMLLAGMA.DVFUWEn4.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.kAWVN9j1.js → flowDiagram-DWJPFMVM.HU-eHspv.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.8r0w49-p.js → ganttDiagram-T4ZO3ILL.DHNhXijY.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.BDa7Bi1i.js → gitGraphDiagram-UUTBAWPF.DkISXcO3.js} +1 -1
- package/dist/docs/assets/chunks/{graph.BMPXHz_B.js → graph.CCV0fuRR.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.BmlcqewS.js → infoDiagram-42DDH7IO.bgILzOoc.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CVSEQSul.js → ishikawaDiagram-UXIWVN3A.CuryXC0F.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BpeWJ5n-.js → journeyDiagram-VCZTEJTY.BL1Pr-wu.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.DHbDXuxB.js → kanban-definition-6JOO6SKY.BbGjvk4l.js} +1 -1
- package/dist/docs/assets/chunks/{layout.CzrCDgkP.js → layout.C4PfdldS.js} +1 -1
- package/dist/docs/assets/chunks/{linear.HwBsflwN.js → linear.C3xD1T6X.js} +1 -1
- package/dist/docs/assets/chunks/{min.DqGHolT3.js → min.CzgRAQ9c.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.ZYGlOawh.js → mindmap-definition-QFDTVHPH.CA9rSWum.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.C2KRXlNR.js → pieDiagram-DEJITSTG.B8MprgJu.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CHj3Qefp.js → quadrantDiagram-34T5L4WZ.DndDwbKT.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.B1L4Tf7k.js → requirementDiagram-MS252O5E.Zhfgwlnn.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.dNR2yi1B.js → sankeyDiagram-XADWPNL6.B6RRm6N5.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.BrvQ3C6m.js → sequenceDiagram-FGHM5R23.Bfmz-1PN.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BtehEykA.js → stateDiagram-FHFEXIEX.gbrdNqgj.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +1 -0
- package/dist/docs/assets/chunks/{theme.BDHBZUkP.js → theme.gpWjytMh.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bn7nhqEN.js → timeline-definition-GMOUNBTQ.Bl1l7M1f.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.DKhc38sz.js → vennDiagram-DHZGUBPP.Dfle4U0d.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.DOXQ0w8J.js → wardley-RL74JXVD.BJrCW6xc.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.Bbq5B2Ic.js → wardleyDiagram-NUSXRM2D.CM_4lmvZ.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.B77HE1K8.js → xychartDiagram-5P7HB3ND.CHT5X28R.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.BsgDqYPh.js → reference_cli.md.GwugN3n-.js} +5 -5
- package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +35 -35
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +35 -35
- package/dist/docs/guides/gitlab.html +35 -35
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +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 +20 -9
- 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 -39
- package/dist/docs/reference/cli.md +20 -9
- 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 +35 -35
- package/dist/extensions/cursor-cloud-agents/extension.d.ts +14 -0
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.js +5 -0
- package/dist/extensions/cursor-cloud-agents/lib/watch.d.ts +17 -0
- package/dist/extensions/cursor-cloud-agents/lib/watch.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +99 -0
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.d.ts +19 -0
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +71 -0
- package/dist/extensions/cursor-cloud-agents/skills/handoff.md +9 -5
- package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +3 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +3 -2
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +1 -1
- package/dist/files-backends/cursor-hosted.d.ts +22 -83
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +46 -160
- package/dist/files.d.ts +9 -32
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +7 -32
- package/dist/internal/artifacts-store.d.ts +13 -25
- package/dist/internal/artifacts-store.d.ts.map +1 -1
- package/dist/internal/artifacts-store.js +25 -46
- package/dist/internal/cli-ax.d.ts +10 -17
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +87 -155
- package/dist/internal/cli-bitbucket.js +5 -5
- package/dist/internal/cli-deploy.d.ts +4 -1
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +117 -20
- package/dist/internal/cli-github.js +13 -13
- package/dist/internal/cli-gitlab.js +5 -5
- package/dist/internal/continuation-identity.d.ts +2 -0
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +4 -0
- package/dist/internal/conversation-mirror.d.ts +9 -38
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +62 -68
- package/dist/internal/cursor/account-mcp.d.ts +1 -1
- package/dist/internal/cursor/account-mcp.js +1 -1
- package/dist/internal/cursor/backend-client.js +1 -1
- package/dist/internal/cursor/github-credentials.js +3 -3
- package/dist/internal/cursor/hosted-bound-secrets.d.ts +6 -2
- package/dist/internal/cursor/hosted-bound-secrets.d.ts.map +1 -1
- package/dist/internal/cursor/hosted-bound-secrets.js +13 -2
- package/dist/internal/cursor/hosted-store-secrets.d.ts +13 -37
- package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +13 -37
- package/dist/internal/cursor/store-api-client.d.ts +17 -39
- package/dist/internal/cursor/store-api-client.d.ts.map +1 -1
- package/dist/internal/cursor/store-api-client.js +15 -37
- package/dist/internal/cursor-deployment-relay.js +3 -3
- package/dist/internal/cursor-event-relay.js +1 -1
- package/dist/internal/cursor-relay-core.d.ts +1 -1
- package/dist/internal/cursor-relay-core.d.ts.map +1 -1
- package/dist/internal/deploy-client.d.ts +55 -63
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +48 -28
- package/dist/internal/discovery/agent.d.ts +1 -1
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +4 -0
- package/dist/internal/discovery/extensions.d.ts +2 -1
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +11 -1
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +1 -0
- package/dist/internal/distribution.d.ts +2 -2
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +2 -2
- package/dist/internal/docs-site.js +3 -3
- package/dist/internal/eval-run-store.js +8 -8
- package/dist/internal/framework-file-storage.d.ts +10 -34
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +12 -39
- package/dist/internal/framework-storage-selection.d.ts +10 -46
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +15 -64
- package/dist/internal/github-fanout.js +2 -2
- package/dist/internal/handleAgentServeTrigger.d.ts +5 -8
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
- package/dist/internal/handleAgentServeTrigger.js +5 -8
- package/dist/internal/host-files.js +6 -9
- package/dist/internal/host-platforms.js +5 -5
- package/dist/internal/hosted-catch.d.ts +3 -2
- package/dist/internal/hosted-catch.d.ts.map +1 -1
- package/dist/internal/hosted-catch.js +27 -9
- package/dist/internal/hosted-delivery-protocol.d.ts +31 -8
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +102 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +32 -12
- package/dist/internal/hosted-execution-diag.d.ts +13 -24
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
- package/dist/internal/hosted-execution-diag.js +11 -20
- package/dist/internal/hosted-execution-flush.d.ts +22 -10
- package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
- package/dist/internal/hosted-execution-flush.js +45 -9
- package/dist/internal/hosted-managed-automation.js +5 -5
- package/dist/internal/hosting.d.ts +5 -10
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +5 -10
- package/dist/internal/legacy-command-guard.d.ts +1 -4
- package/dist/internal/legacy-command-guard.d.ts.map +1 -1
- package/dist/internal/legacy-command-guard.js +2 -11
- package/dist/internal/listen-port.js +1 -1
- package/dist/internal/local-control-plane.js +6 -6
- package/dist/internal/logs-client.d.ts +20 -1
- package/dist/internal/logs-client.d.ts.map +1 -1
- package/dist/internal/logs-client.js +89 -1
- package/dist/internal/mcp-endpoint.js +1 -1
- package/dist/internal/otel/collector.js +1 -1
- package/dist/internal/otel/runtime.js +13 -13
- package/dist/internal/platform-schedule-sync.js +2 -2
- package/dist/internal/playground/toolchain.js +6 -6
- package/dist/internal/process-memory-telemetry.js +2 -2
- package/dist/internal/reminder-runner.d.ts +8 -3
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +51 -52
- package/dist/internal/resolve-prod-target.d.ts +1 -12
- package/dist/internal/resolve-prod-target.d.ts.map +1 -1
- package/dist/internal/resolve-prod-target.js +2 -32
- package/dist/internal/resolved-connections.js +8 -8
- package/dist/internal/run-client.d.ts +4 -3
- package/dist/internal/run-client.d.ts.map +1 -1
- package/dist/internal/run-client.js +98 -61
- package/dist/internal/runtime-dispatch-runner.d.ts +1 -0
- package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
- package/dist/internal/runtime-dispatch-runner.js +7 -1
- package/dist/internal/schedule-runner.js +1 -1
- package/dist/internal/sdk-runner.d.ts +4 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +37 -22
- package/dist/internal/server.d.ts +2 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +39 -38
- package/dist/internal/session-engine.d.ts +31 -44
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +67 -83
- package/dist/internal/session-run-log.d.ts +10 -24
- package/dist/internal/session-run-log.d.ts.map +1 -1
- package/dist/internal/session-run-log.js +13 -27
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +6 -3
- package/dist/internal/skills-sync.d.ts +3 -5
- package/dist/internal/skills-sync.d.ts.map +1 -1
- package/dist/internal/skills-sync.js +3 -5
- package/dist/internal/start-log-store.d.ts +7 -18
- package/dist/internal/start-log-store.d.ts.map +1 -1
- package/dist/internal/start-log-store.js +47 -24
- package/dist/internal/storage-coordinator.d.ts +7 -10
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +18 -20
- package/dist/internal/storage-roles.d.ts +5 -0
- package/dist/internal/storage-roles.d.ts.map +1 -1
- package/dist/internal/store-api-protocol.d.ts +12 -33
- package/dist/internal/store-api-protocol.d.ts.map +1 -1
- package/dist/internal/store-api-protocol.js +6 -22
- package/dist/internal/store-mirror.d.ts +4 -5
- package/dist/internal/store-mirror.d.ts.map +1 -1
- package/dist/internal/store-mirror.js +6 -8
- package/dist/internal/turn-lease-store.d.ts +12 -5
- package/dist/internal/turn-lease-store.d.ts.map +1 -1
- package/dist/internal/turn-lease-store.js +61 -8
- package/dist/internal/v2-hosting.d.ts +4 -7
- package/dist/internal/v2-hosting.d.ts.map +1 -1
- package/dist/internal/v2-hosting.js +4 -7
- package/dist/internal/workspace-sync.d.ts +3 -6
- package/dist/internal/workspace-sync.d.ts.map +1 -1
- package/dist/internal/workspace-sync.js +3 -6
- package/dist/internal/workspace.d.ts +10 -16
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +9 -14
- package/dist/memory.d.ts +17 -43
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +34 -80
- package/dist/playground/assets/index-DPKLl4C_.css +1 -0
- package/dist/playground/assets/index-MijLHTbB.js +71 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted-v2.d.ts +8 -36
- package/dist/storage-backends/cursor-hosted-v2.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted-v2.js +9 -37
- package/dist/storage-backends/cursor-hosted.d.ts +17 -30
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +14 -27
- package/dist/storage-protocol.d.ts +13 -38
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +14 -39
- package/dist/types.d.ts +29 -30
- package/dist/types.d.ts.map +1 -1
- package/docs/reference/cli.md +20 -9
- package/package.json +1 -1
- package/templates/pr-autofixer/bot/instructions.md +3 -3
- package/dist/docs/assets/chunks/@localSearchIndexroot.Bq-pxRXm.js +0 -1
- package/dist/docs/assets/chunks/channel.DCU8W1RP.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DwpXsM06.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DwpXsM06.js +0 -1
- package/dist/docs/assets/chunks/clone.DH6Mx2zB.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.kzD0-U89.js +0 -1
- package/dist/docs/assets/reference_cli.md.BsgDqYPh.lean.js +0 -1
- package/dist/playground/assets/index-6BbTPnaT.css +0 -1
- package/dist/playground/assets/index-CI7FAmOP.js +0 -71
- /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -1,39 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Durable mirror for the SDK runner's conversation store.
|
|
3
3
|
*
|
|
4
|
-
* The
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* event chunks survive replacement through the control-plane storage mirror
|
|
8
|
-
* (framework-storage-selection.ts), but the conversation itself was never
|
|
9
|
-
* hydrated anywhere — a replacement pod resumed every thread as a fresh
|
|
10
|
-
* conversation.
|
|
4
|
+
* The mirror restores checkpoint state before a conversation resumes and
|
|
5
|
+
* persists it after each local turn. Conversation data uses framework-owned
|
|
6
|
+
* storage, isolated from author-facing files and KV.
|
|
11
7
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* checkpoint blobs — into the deployment's **framework-level** file store
|
|
16
|
-
* (`AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID`), alongside session records and
|
|
17
|
-
* transcripts and apart from the author-facing user store. The store is an
|
|
18
|
-
* Agent Store reached over `/v0/agent-serve-files` presigned URLs — **not
|
|
19
|
-
* mounted** as a filesystem in the engine VM (the FUSE mount at
|
|
20
|
-
* {@link DEPLOYMENT_STORE_MOUNT_PATH} exists only on cloud-runtime VMs) —
|
|
21
|
-
* so the mirror moves bytes through the {@link FileSink} contract instead.
|
|
22
|
-
*
|
|
23
|
-
* Going through the store APIs rather than copying `store.db` files sidesteps
|
|
24
|
-
* WAL consistency and the shared `index.db` (per-session raw copies would
|
|
25
|
-
* clobber other sessions' rows); checkpoint blobs are content-addressed, so
|
|
26
|
-
* repeat persists upload only what is new.
|
|
27
|
-
*
|
|
28
|
-
* Timing: the runner hydrates before `Agent.resume` (so a follow-up landing
|
|
29
|
-
* on a fresh pod — including a v2 hosted-execution delivery — finds the
|
|
30
|
-
* conversation before the turn runs) and persists after each local turn
|
|
31
|
-
* settles, **awaited**, because a hosted pod can be parked immediately after
|
|
32
|
-
* the execution reply.
|
|
33
|
-
*
|
|
34
|
-
* Run rows and run events are deliberately not mirrored: they are per-pod
|
|
35
|
-
* bookkeeping (turn numbers, stream offsets), and the durable session event
|
|
36
|
-
* stream already lives in the control-plane storage mirror.
|
|
8
|
+
* Restore failures propagate so a temporary storage outage cannot fork an
|
|
9
|
+
* existing thread into a fresh conversation. Run bookkeeping remains local;
|
|
10
|
+
* the durable session event stream already records user-visible history.
|
|
37
11
|
*/
|
|
38
12
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
39
13
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -117,7 +91,7 @@ export function createConversationMirror(options) {
|
|
|
117
91
|
if (cached !== undefined) {
|
|
118
92
|
return cached;
|
|
119
93
|
}
|
|
120
|
-
// Seed from the previous manifest so a
|
|
94
|
+
// Seed from the previous manifest so a new process does not re-upload the
|
|
121
95
|
// whole history on its first persist. A miss, an unusable manifest, or
|
|
122
96
|
// a failed read seeds empty — re-uploading is wasteful, never wrong.
|
|
123
97
|
const seeded = new Set();
|
|
@@ -130,12 +104,52 @@ export function createConversationMirror(options) {
|
|
|
130
104
|
}
|
|
131
105
|
}
|
|
132
106
|
catch (error) {
|
|
133
|
-
logger(`[
|
|
107
|
+
logger(`[bdk] conversation mirror: could not read the prior manifest for ${sdkAgentId} (${describeError(error)}); re-uploading blobs`);
|
|
134
108
|
}
|
|
135
109
|
rememberMirrored(sdkAgentId, seeded);
|
|
136
110
|
return seeded;
|
|
137
111
|
});
|
|
138
112
|
}
|
|
113
|
+
function uploadBlobs(store, sdkAgentId, blobIds, uploaded) {
|
|
114
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
var _a;
|
|
116
|
+
const entries = [];
|
|
117
|
+
for (const blobId of blobIds) {
|
|
118
|
+
const body = yield store.checkpoints.get({ agentId: sdkAgentId, blobId });
|
|
119
|
+
if (body !== null) {
|
|
120
|
+
entries.push({
|
|
121
|
+
blobId,
|
|
122
|
+
key: agentSdkAgentStoreKeys.conversationBlob(agentName, sdkAgentId, blobId),
|
|
123
|
+
body,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (entries.length === 0) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (sink.putMany === undefined) {
|
|
131
|
+
for (const entry of entries) {
|
|
132
|
+
yield sink.put(entry.key, entry.body);
|
|
133
|
+
uploaded.add(entry.blobId);
|
|
134
|
+
}
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const settled = yield sink.putMany(entries.map(({ key, body }) => ({ key, body })));
|
|
138
|
+
let failure;
|
|
139
|
+
for (const [index, entry] of entries.entries()) {
|
|
140
|
+
const outcome = settled[index];
|
|
141
|
+
if ((outcome === null || outcome === void 0 ? void 0 : outcome.status) === "fulfilled") {
|
|
142
|
+
uploaded.add(entry.blobId);
|
|
143
|
+
}
|
|
144
|
+
else if (failure === undefined) {
|
|
145
|
+
failure = (_a = outcome === null || outcome === void 0 ? void 0 : outcome.reason) !== null && _a !== void 0 ? _a : new Error(`conversation mirror: batched upload of "${entry.key}" returned no outcome`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (failure !== undefined) {
|
|
149
|
+
throw failure;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
139
153
|
return {
|
|
140
154
|
persist(store, sdkAgentId) {
|
|
141
155
|
return serialize(sdkAgentId, () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -146,24 +160,13 @@ export function createConversationMirror(options) {
|
|
|
146
160
|
}
|
|
147
161
|
const uploaded = yield mirroredBlobIds(sdkAgentId);
|
|
148
162
|
const blobIds = yield listCheckpointBlobIds(store, sdkAgentId);
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
const bytes = yield store.checkpoints.get({
|
|
154
|
-
agentId: sdkAgentId,
|
|
155
|
-
blobId,
|
|
156
|
-
});
|
|
157
|
-
if (bytes === null) {
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
yield sink.put(agentSdkAgentStoreKeys.conversationBlob(agentName, sdkAgentId, blobId), bytes);
|
|
161
|
-
// Content-addressed: once in the sink, never re-uploaded.
|
|
162
|
-
uploaded.add(blobId);
|
|
163
|
+
const pending = blobIds.filter(blobId => !uploaded.has(blobId));
|
|
164
|
+
for (let start = 0; start < pending.length; start += PERSIST_UPLOAD_BATCH_SIZE) {
|
|
165
|
+
yield uploadBlobs(store, sdkAgentId, pending.slice(start, start + PERSIST_UPLOAD_BATCH_SIZE), uploaded);
|
|
163
166
|
}
|
|
164
167
|
const manifest = {
|
|
165
168
|
v: 1,
|
|
166
|
-
// The referenced run is
|
|
169
|
+
// The referenced run is process-local bookkeeping and is not mirrored;
|
|
167
170
|
// a hydrated store must not point at a run row it does not hold.
|
|
168
171
|
agent: Object.assign(Object.assign({}, document), { activeRunId: null }),
|
|
169
172
|
blobIds: blobIds.filter(blobId => uploaded.has(blobId)),
|
|
@@ -201,20 +204,17 @@ export function createConversationMirror(options) {
|
|
|
201
204
|
// during a rolling redeploy, or corruption): retrying would fail
|
|
202
205
|
// identically forever, so fall through to the caller's
|
|
203
206
|
// fresh-conversation path instead of wedging the session.
|
|
204
|
-
logger(`[
|
|
207
|
+
logger(`[bdk] conversation mirror: the manifest for ${sdkAgentId} is unusable (${read.reason}); treating the conversation as unrestorable`);
|
|
205
208
|
return false;
|
|
206
209
|
}
|
|
207
210
|
const manifest = read.manifest;
|
|
208
211
|
const rootBlobId = (_a = manifest.agent.latestCheckpoint) === null || _a === void 0 ? void 0 : _a.rootBlobId;
|
|
209
212
|
if (rootBlobId === undefined || !manifest.blobIds.includes(rootBlobId)) {
|
|
210
|
-
logger(`[
|
|
213
|
+
logger(`[bdk] conversation mirror: the manifest for ${sdkAgentId} does not list its root checkpoint blob; treating the conversation as unrestorable`);
|
|
211
214
|
return false;
|
|
212
215
|
}
|
|
213
|
-
// This sits on the resume critical path. Prefer
|
|
214
|
-
//
|
|
215
|
-
// instead of one per blob, keeping a checkpoint-heavy restore under
|
|
216
|
-
// the store's per-deployment rate budget — and fall back to
|
|
217
|
-
// bounded-parallel per-blob gets elsewhere.
|
|
216
|
+
// This sits on the resume critical path. Prefer a batched read and
|
|
217
|
+
// fall back to bounded parallel reads when the sink has no batch API.
|
|
218
218
|
const blobKeys = manifest.blobIds.map(blobId => agentSdkAgentStoreKeys.conversationBlob(agentName, sdkAgentId, blobId));
|
|
219
219
|
const blobBodies = sink.getMany !== undefined
|
|
220
220
|
? yield sink.getMany(blobKeys)
|
|
@@ -230,7 +230,7 @@ export function createConversationMirror(options) {
|
|
|
230
230
|
// may reach any listed blob, not just the root. Restoring a
|
|
231
231
|
// partial graph would create an agent row whose resume succeeds
|
|
232
232
|
// and whose checkpoint walk then fails unrecoverably.
|
|
233
|
-
logger(`[
|
|
233
|
+
logger(`[bdk] conversation mirror: ${missing.length} checkpoint blob(s) for ${sdkAgentId} are missing from the sink; treating the conversation as unrestorable`);
|
|
234
234
|
return false;
|
|
235
235
|
}
|
|
236
236
|
const restored = new Set();
|
|
@@ -253,7 +253,7 @@ export function createConversationMirror(options) {
|
|
|
253
253
|
agent: Object.assign(Object.assign({}, manifest.agent), { activeRunId: null }),
|
|
254
254
|
});
|
|
255
255
|
rememberMirrored(sdkAgentId, restored);
|
|
256
|
-
logger(`[
|
|
256
|
+
logger(`[bdk] conversation mirror: restored the conversation for ${sdkAgentId} (${restored.size} checkpoint blob(s))`);
|
|
257
257
|
return true;
|
|
258
258
|
}));
|
|
259
259
|
},
|
|
@@ -263,6 +263,7 @@ export function createConversationMirror(options) {
|
|
|
263
263
|
const MAX_TRACKED_CONVERSATIONS = 1000;
|
|
264
264
|
/** Parallel blob downloads during hydrate (resume critical path). */
|
|
265
265
|
const HYDRATE_DOWNLOAD_CONCURRENCY = 8;
|
|
266
|
+
const PERSIST_UPLOAD_BATCH_SIZE = 50;
|
|
266
267
|
/**
|
|
267
268
|
* Read the persisted manifest. Sink transport failures propagate (an
|
|
268
269
|
* outage must fail the follow-up, not fork the thread); everything the
|
|
@@ -312,12 +313,9 @@ function listCheckpointBlobIds(store, sdkAgentId) {
|
|
|
312
313
|
/**
|
|
313
314
|
* Whether (and over which sink) this serve process mirrors conversations.
|
|
314
315
|
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
* lives with session records and transcripts, never on the author-facing
|
|
319
|
-
* user store. Self-hosted v2 keeps everything on the state root (the
|
|
320
|
-
* operator owns the disk), and v1 keeps today's behavior while it runs.
|
|
316
|
+
* Enabled for architecture-v2 agents on Cursor-managed hosting.
|
|
317
|
+
* Conversation state is framework-owned and never uses author-facing
|
|
318
|
+
* storage. Self-hosted and architecture-v1 agents keep local behavior.
|
|
321
319
|
*/
|
|
322
320
|
export function selectConversationMirror(input) {
|
|
323
321
|
const hosting = resolveAgentV2Hosting({
|
|
@@ -330,10 +328,6 @@ export function selectConversationMirror(input) {
|
|
|
330
328
|
return createConversationMirror({
|
|
331
329
|
sink: cursorHostedFiles({
|
|
332
330
|
resolveStoreSourceId: () => hosting.resolveStoreIds().frameworkStoreSourceId,
|
|
333
|
-
// Full chain (env → key file → stored login), resolved lazily: frozen
|
|
334
|
-
// engines listen unsigned and only gain a credential at task time,
|
|
335
|
-
// after this sink is constructed. Hosted deliveries have consumed the
|
|
336
|
-
// bind file into CURSOR_API_KEY by then, so this resolves from env.
|
|
337
331
|
resolveApiKey: () => { var _a; return (_a = resolveApiKeySync()) === null || _a === void 0 ? void 0 : _a.apiKey; },
|
|
338
332
|
}),
|
|
339
333
|
agentName: input.project.name,
|
|
@@ -116,7 +116,7 @@ export interface CursorAccountMcpWarningServer {
|
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
118
|
* Yellow warning panel for unhealthy / missing Cursor-account connectors.
|
|
119
|
-
* One box replaces the old stacked `[
|
|
119
|
+
* One box replaces the old stacked `[bdk]` log lines.
|
|
120
120
|
*/
|
|
121
121
|
export declare function formatCursorAccountMcpWarningBox(args: {
|
|
122
122
|
connectionName: string;
|
|
@@ -413,7 +413,7 @@ function connectUrl(authUrl) {
|
|
|
413
413
|
}
|
|
414
414
|
/**
|
|
415
415
|
* Yellow warning panel for unhealthy / missing Cursor-account connectors.
|
|
416
|
-
* One box replaces the old stacked `[
|
|
416
|
+
* One box replaces the old stacked `[bdk]` log lines.
|
|
417
417
|
*/
|
|
418
418
|
export function formatCursorAccountMcpWarningBox(args) {
|
|
419
419
|
var _a, _b;
|
|
@@ -481,7 +481,7 @@ export class CursorBackendClient {
|
|
|
481
481
|
}
|
|
482
482
|
this.token = { value: session.token, expiresAtMs: session.expiresAtMs };
|
|
483
483
|
this.lastExchangedApiKey = apiKey;
|
|
484
|
-
this.logger("[
|
|
484
|
+
this.logger("[bdk] cursor account: minted a fresh access token");
|
|
485
485
|
return session.token;
|
|
486
486
|
});
|
|
487
487
|
}
|
|
@@ -112,13 +112,13 @@ export class CursorGithubCredentialProvider {
|
|
|
112
112
|
this.installGhToken(result.token);
|
|
113
113
|
this.scheduleRefresh();
|
|
114
114
|
}
|
|
115
|
-
this.logger(`[
|
|
115
|
+
this.logger(`[bdk] GitHub auth: refreshed Cursor account credential for ${this.repos.length} repo(s)`);
|
|
116
116
|
return result.token;
|
|
117
117
|
}
|
|
118
118
|
catch (error) {
|
|
119
119
|
const message = error instanceof Error ? error.message : String(error);
|
|
120
120
|
if (this.cached !== undefined && this.now() < this.cached.expiresAtMs) {
|
|
121
|
-
this.logger(`[
|
|
121
|
+
this.logger(`[bdk] GitHub auth: Cursor account credential refresh failed; using the current lease: ${message}`);
|
|
122
122
|
this.cached.refreshAtMs = Math.min(this.cached.expiresAtMs, this.now() + REFRESH_RETRY_MS);
|
|
123
123
|
if (this.started) {
|
|
124
124
|
this.scheduleRetry();
|
|
@@ -161,7 +161,7 @@ export class CursorGithubCredentialProvider {
|
|
|
161
161
|
}
|
|
162
162
|
this.refreshTimer = setTimeout(() => {
|
|
163
163
|
void this.getToken().catch((error) => {
|
|
164
|
-
this.logger(`[
|
|
164
|
+
this.logger(`[bdk] GitHub auth: Cursor account credential refresh failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
165
165
|
this.scheduleRetry();
|
|
166
166
|
});
|
|
167
167
|
}, delayMs);
|
|
@@ -12,15 +12,19 @@
|
|
|
12
12
|
* It fails closed. A secret that survives the consume would sit world-readable
|
|
13
13
|
* next to authored agent code for the length of a turn, so the caller returns
|
|
14
14
|
* a retryable error instead of dispatching. The next request re-binds and
|
|
15
|
-
* consumes again.
|
|
15
|
+
* consumes again. So does a request that ends up with no Cursor API key at
|
|
16
|
+
* all: the control plane skips the bind while it believes this process holds
|
|
17
|
+
* one, and a process that restarted in place lost it.
|
|
16
18
|
*/
|
|
17
19
|
/** Wire error code for a bind file that outlived its consume. */
|
|
18
20
|
export declare const BOUND_SECRETS_NOT_CONSUMED = "bound_secrets_not_consumed";
|
|
21
|
+
/** Wire error code for a request that reached authored code with no API key bound. */
|
|
22
|
+
export declare const BOUND_SECRETS_MISSING = "bound_secrets_missing";
|
|
19
23
|
export type HostedBoundSecretsResult = {
|
|
20
24
|
ok: true;
|
|
21
25
|
} | {
|
|
22
26
|
ok: false;
|
|
23
|
-
code: typeof BOUND_SECRETS_NOT_CONSUMED;
|
|
27
|
+
code: typeof BOUND_SECRETS_NOT_CONSUMED | typeof BOUND_SECRETS_MISSING;
|
|
24
28
|
message: string;
|
|
25
29
|
};
|
|
26
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-bound-secrets.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/hosted-bound-secrets.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hosted-bound-secrets.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/hosted-bound-secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,iEAAiE;AACjE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,sFAAsF;AACtF,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAE7D,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,OAAO,0BAA0B,GAAG,OAAO,qBAAqB,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,GAAG,wBAAwB,CAiC3B"}
|
|
@@ -12,12 +12,16 @@
|
|
|
12
12
|
* It fails closed. A secret that survives the consume would sit world-readable
|
|
13
13
|
* next to authored agent code for the length of a turn, so the caller returns
|
|
14
14
|
* a retryable error instead of dispatching. The next request re-binds and
|
|
15
|
-
* consumes again.
|
|
15
|
+
* consumes again. So does a request that ends up with no Cursor API key at
|
|
16
|
+
* all: the control plane skips the bind while it believes this process holds
|
|
17
|
+
* one, and a process that restarted in place lost it.
|
|
16
18
|
*/
|
|
17
19
|
import { consumeBoundCursorApiKey, DEFAULT_CURSOR_API_KEY_FILE } from "./credentials.js";
|
|
18
20
|
import { consumeBoundDeploymentSecrets, DEFAULT_AGENT_SERVE_DEPLOYMENT_SECRETS_FILE, } from "./hosted-deployment-secrets.js";
|
|
19
21
|
/** Wire error code for a bind file that outlived its consume. */
|
|
20
22
|
export const BOUND_SECRETS_NOT_CONSUMED = "bound_secrets_not_consumed";
|
|
23
|
+
/** Wire error code for a request that reached authored code with no API key bound. */
|
|
24
|
+
export const BOUND_SECRETS_MISSING = "bound_secrets_missing";
|
|
21
25
|
/**
|
|
22
26
|
* Hydrate `process.env` from both bind files and remove them from disk.
|
|
23
27
|
* Returns a failure when either secret is still readable afterwards.
|
|
@@ -30,7 +34,7 @@ export const BOUND_SECRETS_NOT_CONSUMED = "bound_secrets_not_consumed";
|
|
|
30
34
|
* file on a surface that points the variable at one.
|
|
31
35
|
*/
|
|
32
36
|
export function consumeHostedBoundSecrets(options) {
|
|
33
|
-
var _a, _b;
|
|
37
|
+
var _a, _b, _c;
|
|
34
38
|
const survivors = [];
|
|
35
39
|
const secretsPath = (_a = options === null || options === void 0 ? void 0 : options.deploymentSecretsFilePath) !== null && _a !== void 0 ? _a : DEFAULT_AGENT_SERVE_DEPLOYMENT_SECRETS_FILE;
|
|
36
40
|
const secrets = consumeBoundDeploymentSecrets(secretsPath);
|
|
@@ -43,6 +47,13 @@ export function consumeHostedBoundSecrets(options) {
|
|
|
43
47
|
survivors.push(`${apiKeyPath} (${apiKey.disposal.reason})`);
|
|
44
48
|
}
|
|
45
49
|
if (survivors.length === 0) {
|
|
50
|
+
if (((_c = process.env.CURSOR_API_KEY) !== null && _c !== void 0 ? _c : "").trim() === "") {
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
code: BOUND_SECRETS_MISSING,
|
|
54
|
+
message: "No Cursor API key is bound to this process, so authored work did not run.",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
46
57
|
return { ok: true };
|
|
47
58
|
}
|
|
48
59
|
return {
|
|
@@ -1,52 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Freeze v2 snapshots start `agent-sdk serve` at bake time without a service
|
|
5
|
-
* account, so neither store id is in process env. Execute-from-freeze binds
|
|
6
|
-
* the deployment credential and store ids into `/run/cursor/secrets/` without
|
|
7
|
-
* restarting July — the same pattern as {@link DEFAULT_CURSOR_API_KEY_FILE}.
|
|
2
|
+
* Resolves platform-managed storage bindings for hosted deployments.
|
|
8
3
|
*/
|
|
9
4
|
export declare const DEFAULT_AGENT_SERVE_STORE_SOURCE_ID_FILE = "/run/cursor/secrets/AGENT_SERVE_STORE_SOURCE_ID";
|
|
10
5
|
export declare const DEFAULT_AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_FILE = "/run/cursor/secrets/AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID";
|
|
11
6
|
export declare const DEFAULT_AGENT_SERVE_STORE_PROTOCOL_FILE = "/run/cursor/secrets/AGENT_SERVE_STORE_PROTOCOL";
|
|
12
7
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* runtime does not know — falls back to `/v0`, so the pin fails safe in both
|
|
16
|
-
* directions.
|
|
8
|
+
* Transport mode that enables batched file operations. Unknown values use
|
|
9
|
+
* the compatibility transport.
|
|
17
10
|
*/
|
|
18
11
|
export declare const AGENT_SERVE_FACTORY_FLUSH_PROTOCOL = "factory-flush-v1";
|
|
19
12
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* storage pattern for framework state — starting with `memory.append`. A
|
|
23
|
-
* strict superset of {@link AGENT_SERVE_FACTORY_FLUSH_PROTOCOL}: verbs keep
|
|
24
|
-
* riding the factory flush wire under this pin too. The same fail-safe
|
|
25
|
-
* applies in both directions — an unknown value keeps today's behavior, and
|
|
26
|
-
* re-pinning to `factory-flush-v1` turns the domain lane back off without a
|
|
27
|
-
* client change.
|
|
13
|
+
* Transport mode that adds managed domain operations to
|
|
14
|
+
* {@link AGENT_SERVE_FACTORY_FLUSH_PROTOCOL}.
|
|
28
15
|
*/
|
|
29
16
|
export declare const AGENT_SERVE_FACTORY_API_PROTOCOL = "factory-api-v1";
|
|
30
|
-
/**
|
|
31
|
-
* Does this pin select the factory flush wire for the store verbs? True for
|
|
32
|
-
* the flush pin and for the domain-API superset pin.
|
|
33
|
-
*/
|
|
17
|
+
/** True when the transport supports batched file operations. */
|
|
34
18
|
export declare function storeProtocolEnablesFactoryFlush(protocol: string | undefined): boolean;
|
|
35
|
-
/**
|
|
36
|
-
* Does this pin enable the domain-call lane (server-owned storage patterns)?
|
|
37
|
-
* Only its exact value does; everything else keeps the client-side patterns.
|
|
38
|
-
*/
|
|
19
|
+
/** True when the transport supports managed domain operations. */
|
|
39
20
|
export declare function storeProtocolEnablesStoreApi(protocol: string | undefined): boolean;
|
|
40
|
-
/**
|
|
21
|
+
/** Resolve the author-facing managed file store. */
|
|
41
22
|
export declare function resolveDeploymentStoreSourceIdSync(env?: NodeJS.ProcessEnv): string | undefined;
|
|
42
|
-
/**
|
|
23
|
+
/** Resolve the framework-only managed file store. */
|
|
43
24
|
export declare function resolveFrameworkStoreSourceIdSync(env?: NodeJS.ProcessEnv): string | undefined;
|
|
44
25
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* still means `/v0/agent-serve-files`. Resolved lazily per operation like
|
|
48
|
-
* the store ids, so a pod bound after serve start takes effect without a
|
|
49
|
-
* restart.
|
|
26
|
+
* Resolve the managed-storage transport mode. Callers resolve it lazily so
|
|
27
|
+
* platform updates take effect without recreating the storage client.
|
|
50
28
|
*/
|
|
51
29
|
export declare function resolveStoreProtocolSync(env?: NodeJS.ProcessEnv): string | undefined;
|
|
52
30
|
export type CursorManagedV2StoreIds = {
|
|
@@ -54,10 +32,8 @@ export type CursorManagedV2StoreIds = {
|
|
|
54
32
|
frameworkStoreSourceId: string;
|
|
55
33
|
};
|
|
56
34
|
/**
|
|
57
|
-
* Resolve
|
|
58
|
-
*
|
|
59
|
-
* Freeze snapshots construct storage before task bind, so callers keep this
|
|
60
|
-
* resolver lazy. Once an operation needs storage, both ids are mandatory.
|
|
35
|
+
* Resolve both managed architecture-v2 storage identities. Callers keep this
|
|
36
|
+
* resolver lazy, and both identities are mandatory once storage is used.
|
|
61
37
|
*/
|
|
62
38
|
export declare function requireCursorManagedV2StoreIdsSync(env?: NodeJS.ProcessEnv): CursorManagedV2StoreIds;
|
|
63
39
|
//# sourceMappingURL=hosted-store-secrets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-store-secrets.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/hosted-store-secrets.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hosted-store-secrets.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/hosted-store-secrets.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,wCAAwC,oDACF,CAAC;AAEpD,eAAO,MAAM,kDAAkD,8DACF,CAAC;AAE9D,eAAO,MAAM,uCAAuC,mDACF,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,kCAAkC,qBAAqB,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,gCAAgC,mBAAmB,CAAC;AAEjE,gEAAgE;AAChE,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAItF;AAED,kEAAkE;AAClE,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElF;AA4BD,oDAAoD;AACpD,wBAAgB,kCAAkC,CAChD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAUpB;AAED,qDAAqD;AACrD,wBAAgB,iCAAiC,CAC/C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAUpB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAMjG;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,uBAAuB,EAAE,MAAM,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,uBAAuB,CASzB"}
|
|
@@ -1,44 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Freeze v2 snapshots start `agent-sdk serve` at bake time without a service
|
|
5
|
-
* account, so neither store id is in process env. Execute-from-freeze binds
|
|
6
|
-
* the deployment credential and store ids into `/run/cursor/secrets/` without
|
|
7
|
-
* restarting July — the same pattern as {@link DEFAULT_CURSOR_API_KEY_FILE}.
|
|
2
|
+
* Resolves platform-managed storage bindings for hosted deployments.
|
|
8
3
|
*/
|
|
9
4
|
import { readFileSync } from "node:fs";
|
|
10
5
|
export const DEFAULT_AGENT_SERVE_STORE_SOURCE_ID_FILE = "/run/cursor/secrets/AGENT_SERVE_STORE_SOURCE_ID";
|
|
11
6
|
export const DEFAULT_AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_FILE = "/run/cursor/secrets/AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID";
|
|
12
7
|
export const DEFAULT_AGENT_SERVE_STORE_PROTOCOL_FILE = "/run/cursor/secrets/AGENT_SERVE_STORE_PROTOCOL";
|
|
13
8
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* runtime does not know — falls back to `/v0`, so the pin fails safe in both
|
|
17
|
-
* directions.
|
|
9
|
+
* Transport mode that enables batched file operations. Unknown values use
|
|
10
|
+
* the compatibility transport.
|
|
18
11
|
*/
|
|
19
12
|
export const AGENT_SERVE_FACTORY_FLUSH_PROTOCOL = "factory-flush-v1";
|
|
20
13
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* storage pattern for framework state — starting with `memory.append`. A
|
|
24
|
-
* strict superset of {@link AGENT_SERVE_FACTORY_FLUSH_PROTOCOL}: verbs keep
|
|
25
|
-
* riding the factory flush wire under this pin too. The same fail-safe
|
|
26
|
-
* applies in both directions — an unknown value keeps today's behavior, and
|
|
27
|
-
* re-pinning to `factory-flush-v1` turns the domain lane back off without a
|
|
28
|
-
* client change.
|
|
14
|
+
* Transport mode that adds managed domain operations to
|
|
15
|
+
* {@link AGENT_SERVE_FACTORY_FLUSH_PROTOCOL}.
|
|
29
16
|
*/
|
|
30
17
|
export const AGENT_SERVE_FACTORY_API_PROTOCOL = "factory-api-v1";
|
|
31
|
-
/**
|
|
32
|
-
* Does this pin select the factory flush wire for the store verbs? True for
|
|
33
|
-
* the flush pin and for the domain-API superset pin.
|
|
34
|
-
*/
|
|
18
|
+
/** True when the transport supports batched file operations. */
|
|
35
19
|
export function storeProtocolEnablesFactoryFlush(protocol) {
|
|
36
20
|
return (protocol === AGENT_SERVE_FACTORY_FLUSH_PROTOCOL || protocol === AGENT_SERVE_FACTORY_API_PROTOCOL);
|
|
37
21
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Does this pin enable the domain-call lane (server-owned storage patterns)?
|
|
40
|
-
* Only its exact value does; everything else keeps the client-side patterns.
|
|
41
|
-
*/
|
|
22
|
+
/** True when the transport supports managed domain operations. */
|
|
42
23
|
export function storeProtocolEnablesStoreApi(protocol) {
|
|
43
24
|
return protocol === AGENT_SERVE_FACTORY_API_PROTOCOL;
|
|
44
25
|
}
|
|
@@ -63,7 +44,7 @@ function readBoundSecretFile(fileEnvVar, defaultPath, env) {
|
|
|
63
44
|
const path = configured !== undefined && configured !== "" ? configured : defaultPath;
|
|
64
45
|
return readTrimmedFile(path);
|
|
65
46
|
}
|
|
66
|
-
/**
|
|
47
|
+
/** Resolve the author-facing managed file store. */
|
|
67
48
|
export function resolveDeploymentStoreSourceIdSync(env = process.env) {
|
|
68
49
|
var _a;
|
|
69
50
|
const fromEnv = (_a = env[STORE_SOURCE_ID_ENV]) === null || _a === void 0 ? void 0 : _a.trim();
|
|
@@ -72,7 +53,7 @@ export function resolveDeploymentStoreSourceIdSync(env = process.env) {
|
|
|
72
53
|
}
|
|
73
54
|
return readBoundSecretFile(STORE_SOURCE_ID_FILE_ENV, DEFAULT_AGENT_SERVE_STORE_SOURCE_ID_FILE, env);
|
|
74
55
|
}
|
|
75
|
-
/**
|
|
56
|
+
/** Resolve the framework-only managed file store. */
|
|
76
57
|
export function resolveFrameworkStoreSourceIdSync(env = process.env) {
|
|
77
58
|
var _a;
|
|
78
59
|
const fromEnv = (_a = env[FRAMEWORK_STORE_SOURCE_ID_ENV]) === null || _a === void 0 ? void 0 : _a.trim();
|
|
@@ -82,11 +63,8 @@ export function resolveFrameworkStoreSourceIdSync(env = process.env) {
|
|
|
82
63
|
return readBoundSecretFile(FRAMEWORK_STORE_SOURCE_ID_FILE_ENV, DEFAULT_AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_FILE, env);
|
|
83
64
|
}
|
|
84
65
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* still means `/v0/agent-serve-files`. Resolved lazily per operation like
|
|
88
|
-
* the store ids, so a pod bound after serve start takes effect without a
|
|
89
|
-
* restart.
|
|
66
|
+
* Resolve the managed-storage transport mode. Callers resolve it lazily so
|
|
67
|
+
* platform updates take effect without recreating the storage client.
|
|
90
68
|
*/
|
|
91
69
|
export function resolveStoreProtocolSync(env = process.env) {
|
|
92
70
|
var _a;
|
|
@@ -97,10 +75,8 @@ export function resolveStoreProtocolSync(env = process.env) {
|
|
|
97
75
|
return readBoundSecretFile(STORE_PROTOCOL_FILE_ENV, DEFAULT_AGENT_SERVE_STORE_PROTOCOL_FILE, env);
|
|
98
76
|
}
|
|
99
77
|
/**
|
|
100
|
-
* Resolve
|
|
101
|
-
*
|
|
102
|
-
* Freeze snapshots construct storage before task bind, so callers keep this
|
|
103
|
-
* resolver lazy. Once an operation needs storage, both ids are mandatory.
|
|
78
|
+
* Resolve both managed architecture-v2 storage identities. Callers keep this
|
|
79
|
+
* resolver lazy, and both identities are mandatory once storage is used.
|
|
104
80
|
*/
|
|
105
81
|
export function requireCursorManagedV2StoreIdsSync(env = process.env) {
|
|
106
82
|
const deploymentStoreSourceId = resolveDeploymentStoreSourceIdSync(env);
|
|
@@ -1,29 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* `POST /internal/agentsdk/store/api/<call>`. This module owns the whole
|
|
4
|
-
* transport — base URL and deployment credential (the same resolution the
|
|
5
|
-
* files sink uses, via `cursor-api-transport.ts`), envelope encoding,
|
|
6
|
-
* response validation, typed error mapping, and the bounded backoff policy.
|
|
7
|
-
* Feature modules (`memory.ts`, later `session-run-log.ts`, …) call typed
|
|
8
|
-
* methods like {@link StoreApiClient.memoryAppend} and never hand-roll
|
|
9
|
-
* fetch; future domain calls (`sessionRun.report`, `startLog.flush`, …) are
|
|
10
|
-
* added here as new methods on this one client.
|
|
2
|
+
* Client for versioned Cursor-managed store operations.
|
|
11
3
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* availability check is not redundant: the pin file is written by the hosted
|
|
16
|
-
* task bind, but a local-dev env var could name the pin without any store to
|
|
17
|
-
* serve reads — appending into the void. Both resolve lazily per call, so a
|
|
18
|
-
* pin bound after serve start takes effect without a restart.
|
|
4
|
+
* This module owns transport, envelope encoding, response validation, typed
|
|
5
|
+
* errors, and bounded retries. Availability requires both a compatible
|
|
6
|
+
* transport and a managed store, resolved lazily for each call.
|
|
19
7
|
*/
|
|
20
8
|
import { type CursorApiTransportOptions } from "./cursor-api-transport.js";
|
|
21
9
|
export interface StoreApiClientOptions extends CursorApiTransportOptions {
|
|
22
|
-
/**
|
|
10
|
+
/** Managed store binding override. */
|
|
23
11
|
storeSourceId?: string;
|
|
24
12
|
/** Lazy store source id, preferred over {@link storeSourceId}. */
|
|
25
13
|
resolveStoreSourceId?: () => string | undefined;
|
|
26
|
-
/** Lazy
|
|
14
|
+
/** Lazy transport selection override. */
|
|
27
15
|
resolveStoreProtocol?: () => string | undefined;
|
|
28
16
|
/** Backoff sleep override (tests). */
|
|
29
17
|
sleep?: (ms: number) => Promise<void>;
|
|
@@ -33,14 +21,13 @@ export interface StoreApiClientOptions extends CursorApiTransportOptions {
|
|
|
33
21
|
/**
|
|
34
22
|
* How one domain call failed, after the client's bounded retries:
|
|
35
23
|
*
|
|
36
|
-
* - `rejected
|
|
24
|
+
* - `rejected`: the server (or the client's own pre-check) refused the
|
|
37
25
|
* payload with a typed 4xx. Deterministic; never retried.
|
|
38
|
-
* - `shed
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* - `unavailable` — 5xx or a network failure, retried up to the attempt
|
|
26
|
+
* - `shed`: a rate-limited request. Retried only within the small
|
|
27
|
+
* Retry-After bound below.
|
|
28
|
+
* - `unavailable`: 5xx or a network failure, retried up to the attempt
|
|
42
29
|
* bound.
|
|
43
|
-
* - `bad_response
|
|
30
|
+
* - `bad_response`: a 2xx whose body failed the response schema; a
|
|
44
31
|
* contract break, not a transient, so never retried.
|
|
45
32
|
*/
|
|
46
33
|
export type StoreApiFailureKind = "rejected" | "shed" | "unavailable" | "bad_response";
|
|
@@ -49,30 +36,21 @@ export declare class StoreApiCallError extends Error {
|
|
|
49
36
|
readonly status?: number | undefined;
|
|
50
37
|
constructor(kind: StoreApiFailureKind, message: string, status?: number | undefined);
|
|
51
38
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Is the domain-call lane on for this pod? Exact pin match plus a
|
|
54
|
-
* provisioned deployment store; anything else keeps the client-side
|
|
55
|
-
* patterns, fail-safe in both directions like the flush pin itself.
|
|
56
|
-
*/
|
|
39
|
+
/** True when managed store operations are available. */
|
|
57
40
|
export declare function isStoreApiLaneEnabled(options?: StoreApiClientOptions): boolean;
|
|
58
41
|
export type StoreApiClient = {
|
|
59
42
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* {@link StoreApiCallError} after the bounded retries. The caller owns the
|
|
63
|
-
* failure policy (memory drops the record — appending is advisory).
|
|
43
|
+
* Append one advisory memory record. Resolves when managed storage accepts
|
|
44
|
+
* it; throws {@link StoreApiCallError} after bounded retries.
|
|
64
45
|
*/
|
|
65
46
|
memoryAppend(payload: {
|
|
66
47
|
agent: string;
|
|
67
48
|
record: Record<string, unknown>;
|
|
68
49
|
}): Promise<void>;
|
|
69
50
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* the agent has no journal. Throws {@link StoreApiCallError} after the
|
|
74
|
-
* bounded retries — the caller owns the failure policy (hydration keeps
|
|
75
|
-
* the existing mirror).
|
|
51
|
+
* Read a best-effort memory snapshot. It may lag accepted appends, so the
|
|
52
|
+
* caller retains a longer local view. Returns `undefined` when no journal
|
|
53
|
+
* exists and throws {@link StoreApiCallError} after bounded retries.
|
|
76
54
|
*/
|
|
77
55
|
memoryReadContent(payload: {
|
|
78
56
|
agent: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-api-client.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/store-api-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"store-api-client.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/store-api-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EACL,KAAK,yBAAyB,EAI/B,MAAM,2BAA2B,CAAC;AAOnC,MAAM,WAAW,qBAAsB,SAAQ,yBAAyB;IACtE,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChD,yCAAyC;IACzC,oBAAoB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChD,sCAAsC;IACtC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,cAAc,CAAC;AAEvF,qBAAa,iBAAkB,SAAQ,KAAK;IAExC,QAAQ,CAAC,IAAI,EAAE,mBAAmB;IAElC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAH1B,YACW,IAAI,EAAE,mBAAmB,EAClC,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA,EAIzB;CACF;AAsBD,wDAAwD;AACxD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAWlF;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CAChF,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAkLxF"}
|