@cursor/bdk 0.2.5 → 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 +55 -54
- package/dist/channels/github/github-channel.d.ts +4 -4
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +39 -13
- 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/eval-directive.js +1 -1
- 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.94Iu5dyD.js → app.oyjtOr3W.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DTKFDlBr.js → VPLocalSearchBox.D0P6J_UJ.js} +1 -1
- package/dist/docs/assets/chunks/{arc.DuzwHEeg.js → arc.B0LY1J1h.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.C6lyhLs0.js → architectureDiagram-Q4EWVU46.dPduLUxY.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.DUNEWlY8.js → baseUniq.B_Ohm21h.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CXOQGI0O.js → blockDiagram-DXYQGD6D.B4zcanaJ.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BYdPE-Oe.js → c4Diagram-AHTNJAMY.D9Iw21nx.js} +1 -1
- package/dist/docs/assets/chunks/channel.CRUyWDV-.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.YIV9HeX0.js → chunk-4BX2VUAB.DDVwRShI.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.BG80DEOc.js → chunk-4TB4RGXK.DsYcdn1i.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BDKJSZQc.js → chunk-55IACEB6.BzzQvcYp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.CtYnQqts.js → chunk-EDXVE4YY.BMiXZ7FX.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CityOth-.js → chunk-FMBD7UC4.D_mBcLoc.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMD22CQX.js → chunk-OYMX7WX6.CMVjWVMx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.WWpc3ND0.js → chunk-QZHKN3VN.BG-FrPv9.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.BMg-yhj3.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.Buu_LC5q.js → cose-bilkent-S5V4N54A.BVNnCTvY.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.DW7onj6E.js → dagre-KV5264BT.CDN5PR9l.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.B3NxIbEV.js → diagram-5BDNPKRD.DQRUlT-i.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BJvN6Vkv.js → diagram-G4DWMVQ6.CoeblYQT.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.wfRWrexs.js → diagram-MMDJMWI5.DW3ymjl0.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.7QtjSYio.js → diagram-TYMM5635.BP0uN4Jw.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.jxPgDH1t.js → erDiagram-SMLLAGMA.DVFUWEn4.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BhDWA-TO.js → flowDiagram-DWJPFMVM.HU-eHspv.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.Ijq8iYKv.js → ganttDiagram-T4ZO3ILL.DHNhXijY.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DXpfW4YG.js → gitGraphDiagram-UUTBAWPF.DkISXcO3.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CoPlssRl.js → graph.CCV0fuRR.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.eJuv_EOz.js → infoDiagram-42DDH7IO.bgILzOoc.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A._OEzenCR.js → ishikawaDiagram-UXIWVN3A.CuryXC0F.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CwlTjirB.js → journeyDiagram-VCZTEJTY.BL1Pr-wu.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.DSp_C8cZ.js → kanban-definition-6JOO6SKY.BbGjvk4l.js} +1 -1
- package/dist/docs/assets/chunks/{layout.Bms9s7uB.js → layout.C4PfdldS.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BjnmB4je.js → linear.C3xD1T6X.js} +1 -1
- package/dist/docs/assets/chunks/{min.CKkYlMsn.js → min.CzgRAQ9c.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.T2d0vJ7X.js → mindmap-definition-QFDTVHPH.CA9rSWum.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DU0RoCvx.js → pieDiagram-DEJITSTG.B8MprgJu.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.9QZjM-x0.js → quadrantDiagram-34T5L4WZ.DndDwbKT.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CZpylJMd.js → requirementDiagram-MS252O5E.Zhfgwlnn.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.CnFdfW95.js → sankeyDiagram-XADWPNL6.B6RRm6N5.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.-jC0PP1t.js → sequenceDiagram-FGHM5R23.Bfmz-1PN.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.DG7yBRUU.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.B3O9koXV.js → theme.gpWjytMh.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bf9u4Ebb.js → timeline-definition-GMOUNBTQ.Bl1l7M1f.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BjhbbYE6.js → vennDiagram-DHZGUBPP.Dfle4U0d.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.8fRb4Nb5.js → wardleyDiagram-NUSXRM2D.CM_4lmvZ.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.DoOP3zZM.js → xychartDiagram-5P7HB3ND.CHT5X28R.js} +1 -1
- package/dist/docs/assets/{evals.md.LRCSn6Ik.js → evals.md.C851kViu.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/{templates_agentic-owners.md.vtjfwxbf.js → templates_agentic-owners.md.CvmABtia.js} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.vtjfwxbf.lean.js → templates_agentic-owners.md.CvmABtia.lean.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.CX9l9bcg.js → templates_security-reviewer.md.Gh6EF9Us.js} +3 -2
- package/dist/docs/assets/{templates_security-reviewer.md.CX9l9bcg.lean.js → templates_security-reviewer.md.Gh6EF9Us.lean.js} +1 -1
- package/dist/docs/assets/{templates_thermo-quality-review.md.95qmTmr1.js → templates_thermo-quality-review.md.B77UyTrX.js} +1 -1
- package/dist/docs/assets/{templates_thermo-review.md.DQh6Q0C-.js → templates_thermo-review.md.DRJ7mC5U.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.BFlQhWXf.js → templates_triage.md.CNN6b0JZ.js} +3 -3
- package/dist/docs/assets/{templates_triage.md.BFlQhWXf.lean.js → templates_triage.md.CNN6b0JZ.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +35 -35
- package/dist/docs/evals.html +37 -37
- package/dist/docs/evals.md +2 -2
- 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 +41 -24
- 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 +35 -35
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +37 -37
- package/dist/docs/templates/agentic-owners.md +2 -0
- package/dist/docs/templates/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +38 -37
- package/dist/docs/templates/security-reviewer.md +7 -8
- package/dist/docs/templates/thermo-quality-review.html +37 -37
- package/dist/docs/templates/thermo-quality-review.md +2 -2
- package/dist/docs/templates/thermo-review.html +37 -37
- package/dist/docs/templates/thermo-review.md +2 -2
- package/dist/docs/templates/triage.html +38 -38
- package/dist/docs/templates/triage.md +6 -1
- package/dist/docs/troubleshooting.html +35 -35
- package/dist/evals.d.ts +2 -2
- 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 +92 -153
- 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/eval-runner.js +7 -4
- 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/init-interview.d.ts +0 -1
- package/dist/internal/init-interview.d.ts.map +1 -1
- package/dist/internal/init-interview.js +15 -24
- 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/platform-timers.d.ts +8 -1
- package/dist/internal/platform-timers.d.ts.map +1 -1
- package/dist/internal/platform-timers.js +10 -2
- package/dist/internal/playground/toolchain.js +6 -6
- package/dist/internal/process-memory-telemetry.js +2 -2
- package/dist/internal/reminder-control-plane-protocol.d.ts +8 -1
- package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -1
- package/dist/internal/reminder-runner.d.ts +13 -3
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +78 -53
- package/dist/internal/resolve-prod-target.d.ts +1 -9
- package/dist/internal/resolve-prod-target.d.ts.map +1 -1
- package/dist/internal/resolve-prod-target.js +1 -30
- package/dist/internal/resolved-connections.js +8 -8
- package/dist/internal/run-client.d.ts +11 -1
- package/dist/internal/run-client.d.ts.map +1 -1
- package/dist/internal/run-client.js +197 -59
- 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 +8 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +58 -45
- 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-links.d.ts.map +1 -1
- package/dist/internal/session-links.js +8 -7
- 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 +1 -0
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +8 -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/evals.md +2 -2
- package/docs/reference/cli.md +20 -9
- package/docs/templates/agentic-owners.md +2 -0
- package/docs/templates/security-reviewer.md +7 -8
- package/docs/templates/thermo-quality-review.md +2 -2
- package/docs/templates/thermo-review.md +2 -2
- package/docs/templates/triage.md +6 -1
- package/package.json +1 -1
- package/templates/agents-md/evals/agents.eval.ts +1 -0
- package/templates/code-wiki/bot/instructions.md +4 -4
- package/templates/pr-autofixer/bot/instructions.md +3 -3
- package/templates/security-reviewer/README.md +5 -3
- package/templates/security-reviewer/bot/tools/post_findings.ts +8 -8
- package/templates/thermo-quality-review/bot/tools/post_findings.ts +8 -8
- package/templates/thermo-review/bot/tools/post_findings.ts +8 -8
- package/dist/docs/assets/chunks/@localSearchIndexroot.BITLoOQa.js +0 -1
- package/dist/docs/assets/chunks/channel.B46uXH41.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.0cmCFsSf.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.0cmCFsSf.js +0 -1
- package/dist/docs/assets/chunks/clone.1vTOFZT1.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CbsZcOOu.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.DEA21akR.js +0 -162
- 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/{evals.md.LRCSn6Ik.lean.js → evals.md.C851kViu.lean.js} +0 -0
- /package/dist/docs/assets/{templates_thermo-quality-review.md.95qmTmr1.lean.js → templates_thermo-quality-review.md.B77UyTrX.lean.js} +0 -0
- /package/dist/docs/assets/{templates_thermo-review.md.DQh6Q0C-.lean.js → templates_thermo-review.md.DRJ7mC5U.lean.js} +0 -0
|
@@ -14,7 +14,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
14
14
|
};
|
|
15
15
|
import { randomBytes } from "node:crypto";
|
|
16
16
|
import { channelContinuationIdentity, httpContinuationIdentity } from "./continuation-channel.js";
|
|
17
|
-
import { continuationSource } from "./continuation-identity.js";
|
|
17
|
+
import { continuationSource, isOneShotContinuationKey } from "./continuation-identity.js";
|
|
18
18
|
import { NAME_PATTERN } from "./discovery/names.js";
|
|
19
19
|
import { parseDuration } from "./duration.js";
|
|
20
20
|
import { REMINDER_CP_PROTOCOL_VERSION, scheduleSpecFromCreateInput, toWireReschedule, } from "./reminder-control-plane-protocol.js";
|
|
@@ -181,7 +181,7 @@ export class ReminderRunner {
|
|
|
181
181
|
return;
|
|
182
182
|
}
|
|
183
183
|
this.controlPlaneReadFailureLogged = true;
|
|
184
|
-
this.logger(`[
|
|
184
|
+
this.logger(`[bdk] reminders: control-plane ${what} failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
185
185
|
}
|
|
186
186
|
/**
|
|
187
187
|
* Load reminder documents from the control plane into memory. Does not
|
|
@@ -210,7 +210,7 @@ export class ReminderRunner {
|
|
|
210
210
|
// The CP owns status; a fire whose handler is missing reports `stop`
|
|
211
211
|
// from executeFire instead of the guest writing a disarm.
|
|
212
212
|
if (remote.length > 0) {
|
|
213
|
-
this.logger(`[
|
|
213
|
+
this.logger(`[bdk] reminders: hydrated ${remote.length} reminder(s) from control plane`);
|
|
214
214
|
}
|
|
215
215
|
return;
|
|
216
216
|
}
|
|
@@ -233,7 +233,7 @@ export class ReminderRunner {
|
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
if (remote.length > 0 || disarmedOrphan > 0) {
|
|
236
|
-
this.logger(`[
|
|
236
|
+
this.logger(`[bdk] reminders: hydrated ${remote.length} reminder(s) from control plane` +
|
|
237
237
|
(disarmedOrphan > 0 ? `; disarmed ${disarmedOrphan} without live handlers` : ""));
|
|
238
238
|
}
|
|
239
239
|
});
|
|
@@ -272,7 +272,7 @@ export class ReminderRunner {
|
|
|
272
272
|
restored += 1;
|
|
273
273
|
}
|
|
274
274
|
if (restored > 0 || disarmedOrphan > 0) {
|
|
275
|
-
this.logger(`[
|
|
275
|
+
this.logger(`[bdk] reminders: restored ${restored} armed reminder(s)` +
|
|
276
276
|
(disarmedOrphan > 0 ? `; disarmed ${disarmedOrphan} without live handlers` : ""));
|
|
277
277
|
}
|
|
278
278
|
});
|
|
@@ -334,6 +334,32 @@ export class ReminderRunner {
|
|
|
334
334
|
return [...this.records.values()];
|
|
335
335
|
});
|
|
336
336
|
}
|
|
337
|
+
/**
|
|
338
|
+
* A keyed list asks the control plane for that key. An unfiltered list
|
|
339
|
+
* still uses allRecords. Do not replace the in-memory map with the keyed page.
|
|
340
|
+
*/
|
|
341
|
+
recordsForList(filter) {
|
|
342
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
343
|
+
if (this.usesControlPlaneProtocol &&
|
|
344
|
+
((filter === null || filter === void 0 ? void 0 : filter.purpose) !== undefined || (filter === null || filter === void 0 ? void 0 : filter.continuationToken) !== undefined)) {
|
|
345
|
+
try {
|
|
346
|
+
const remote = yield this.controlPlane.listReminders(Object.assign(Object.assign({}, (filter.purpose === undefined ? {} : { purpose: filter.purpose })), (filter.continuationToken === undefined
|
|
347
|
+
? {}
|
|
348
|
+
: { continuationToken: filter.continuationToken })));
|
|
349
|
+
this.controlPlaneReadFailureLogged = false;
|
|
350
|
+
for (const record of remote) {
|
|
351
|
+
this.records.set(record.id, record);
|
|
352
|
+
}
|
|
353
|
+
return remote;
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
this.logControlPlaneReadFailure("list", error);
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return this.allRecords();
|
|
361
|
+
});
|
|
362
|
+
}
|
|
337
363
|
stop() {
|
|
338
364
|
this.started = false;
|
|
339
365
|
for (const timer of this.timers.values()) {
|
|
@@ -385,12 +411,15 @@ export class ReminderRunner {
|
|
|
385
411
|
if (name === "") {
|
|
386
412
|
throw new ReminderValidationError("handler name is required");
|
|
387
413
|
}
|
|
388
|
-
|
|
414
|
+
// A mounted extension's handler registers as `<ns>__<name>`, a name no
|
|
415
|
+
// authored stem may take.
|
|
416
|
+
const registered = this.namedHandlers.has(name);
|
|
417
|
+
if (!registered && !isValidReminderHandlerName(name)) {
|
|
389
418
|
throw new ReminderValidationError(name.includes("__")
|
|
390
|
-
? `Invalid reminder handler name "${name}": may not contain "__"`
|
|
419
|
+
? `Invalid reminder handler name "${name}": may not contain "__" (reserved for mounted extensions' <ns>__<name> handlers)`
|
|
391
420
|
: `Invalid reminder handler name "${name}": must match ${NAME_PATTERN}`);
|
|
392
421
|
}
|
|
393
|
-
if (
|
|
422
|
+
if (!registered) {
|
|
394
423
|
throw new ReminderValidationError(`Unknown reminder handler "${name}" (expected reminders/${name}.ts under the project root)`);
|
|
395
424
|
}
|
|
396
425
|
if (input.args !== undefined && !isJsonObject(input.args)) {
|
|
@@ -469,7 +498,7 @@ export class ReminderRunner {
|
|
|
469
498
|
}
|
|
470
499
|
list(filter) {
|
|
471
500
|
return __awaiter(this, void 0, void 0, function* () {
|
|
472
|
-
const all = yield this.
|
|
501
|
+
const all = yield this.recordsForList(filter);
|
|
473
502
|
return all
|
|
474
503
|
.filter(r => {
|
|
475
504
|
if ((filter === null || filter === void 0 ? void 0 : filter.status) !== undefined) {
|
|
@@ -634,7 +663,7 @@ export class ReminderRunner {
|
|
|
634
663
|
}
|
|
635
664
|
}
|
|
636
665
|
catch (error) {
|
|
637
|
-
this.logger(`[
|
|
666
|
+
this.logger(`[bdk] reminder "${record.id}" until() failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
638
667
|
}
|
|
639
668
|
}
|
|
640
669
|
if (yield this.isSessionBusy(record.channelId, record.continuationToken)) {
|
|
@@ -688,7 +717,7 @@ export class ReminderRunner {
|
|
|
688
717
|
* beside the control plane's `timed_work.fire` count.
|
|
689
718
|
*/
|
|
690
719
|
recordFireOutcome(record, fire) {
|
|
691
|
-
this.logger(`[
|
|
720
|
+
this.logger(`[bdk] reminder fire_outcome kind=${fire.kind} reason=${fire.reason}` +
|
|
692
721
|
` reminderId=${record.id} purpose=${record.purpose}` +
|
|
693
722
|
` channelId=${record.channelId} fireCount=${record.fireCount}` +
|
|
694
723
|
(fire.turnStatus === undefined ? "" : ` turn=${fire.turnStatus}`) +
|
|
@@ -706,7 +735,7 @@ export class ReminderRunner {
|
|
|
706
735
|
});
|
|
707
736
|
}
|
|
708
737
|
catch (error) {
|
|
709
|
-
this.logger(`[
|
|
738
|
+
this.logger(`[bdk] reminder fire_outcome metric failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
710
739
|
}
|
|
711
740
|
}
|
|
712
741
|
recordFromDescriptor(descriptor) {
|
|
@@ -745,7 +774,7 @@ export class ReminderRunner {
|
|
|
745
774
|
const delay = Math.min(MAX_TIMER_MS, Math.max(0, nextFireAtMs - Date.now()));
|
|
746
775
|
const timer = setTimeout(() => {
|
|
747
776
|
void this.fire(record.id).catch((error) => __awaiter(this, void 0, void 0, function* () {
|
|
748
|
-
this.logger(`[
|
|
777
|
+
this.logger(`[bdk] reminder "${record.id}" fire failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
749
778
|
// Keep recurring reminders alive after unexpected throws.
|
|
750
779
|
// One-shots stay armed so a failed wake can be retried / dispatched.
|
|
751
780
|
try {
|
|
@@ -760,7 +789,7 @@ export class ReminderRunner {
|
|
|
760
789
|
yield this.afterFire(current, "skip");
|
|
761
790
|
}
|
|
762
791
|
catch (rescheduleError) {
|
|
763
|
-
this.logger(`[
|
|
792
|
+
this.logger(`[bdk] reminder "${record.id}" reschedule after failure failed: ${rescheduleError instanceof Error ? rescheduleError.message : String(rescheduleError)}`);
|
|
764
793
|
}
|
|
765
794
|
}));
|
|
766
795
|
}, delay);
|
|
@@ -818,13 +847,13 @@ export class ReminderRunner {
|
|
|
818
847
|
}
|
|
819
848
|
}
|
|
820
849
|
catch (error) {
|
|
821
|
-
this.logger(`[
|
|
850
|
+
this.logger(`[bdk] reminder "${id}" until() failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
822
851
|
}
|
|
823
852
|
}
|
|
824
853
|
if (yield this.isSessionBusy(record.channelId, record.continuationToken)) {
|
|
825
854
|
if (record.busyPolicy === "skipIfBusy") {
|
|
826
855
|
yield this.afterFire(record, "skip");
|
|
827
|
-
this.logger(`[
|
|
856
|
+
this.logger(`[bdk] reminder "${id}" (${record.purpose}) skipped: session busy`);
|
|
828
857
|
return { outcome: "fired", reason: "skipped_busy" };
|
|
829
858
|
}
|
|
830
859
|
yield this.whenSessionIdle(record.channelId, record.continuationToken);
|
|
@@ -857,7 +886,7 @@ export class ReminderRunner {
|
|
|
857
886
|
if (result.action === "stop") {
|
|
858
887
|
if (latest !== undefined && latest.status === "armed") {
|
|
859
888
|
yield this.disarm(latest, "run_stop");
|
|
860
|
-
this.logger(`[
|
|
889
|
+
this.logger(`[bdk] reminder "${id}" (${record.purpose}) disarmed: run_stop`);
|
|
861
890
|
return { outcome: "fired", reason: "run_stop" };
|
|
862
891
|
}
|
|
863
892
|
return {
|
|
@@ -870,11 +899,11 @@ export class ReminderRunner {
|
|
|
870
899
|
}
|
|
871
900
|
if (result.action === "skip") {
|
|
872
901
|
yield this.afterFire(latest, "skip", result.reschedule);
|
|
873
|
-
this.logger(`[
|
|
902
|
+
this.logger(`[bdk] reminder "${id}" (${record.purpose}) skipped`);
|
|
874
903
|
return { outcome: "fired", reason: "skipped" };
|
|
875
904
|
}
|
|
876
905
|
yield this.afterFire(latest, "delivered", result.reschedule);
|
|
877
|
-
this.logger(`[
|
|
906
|
+
this.logger(`[bdk] reminder "${id}" (${record.purpose}) fired`);
|
|
878
907
|
return { outcome: "fired", reason: "delivered" };
|
|
879
908
|
}
|
|
880
909
|
finally {
|
|
@@ -910,14 +939,8 @@ export class ReminderRunner {
|
|
|
910
939
|
* Follow-ups must use the bound session's principal. If the session is gone,
|
|
911
940
|
* disarm rather than creating a fresh APP_AUTH conversation.
|
|
912
941
|
*/
|
|
913
|
-
|
|
914
|
-
return
|
|
915
|
-
const existing = yield this.engine.sessions.findByContinuation(channelId, continuationToken);
|
|
916
|
-
if (existing !== undefined) {
|
|
917
|
-
return existing.auth;
|
|
918
|
-
}
|
|
919
|
-
return undefined;
|
|
920
|
-
});
|
|
942
|
+
boundSession(record) {
|
|
943
|
+
return this.engine.sessions.findByContinuation(record.channelId, record.continuationToken);
|
|
921
944
|
}
|
|
922
945
|
deliverPrompt(record) {
|
|
923
946
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -933,9 +956,9 @@ export class ReminderRunner {
|
|
|
933
956
|
*/
|
|
934
957
|
resolveFollowupTarget(record) {
|
|
935
958
|
return __awaiter(this, void 0, void 0, function* () {
|
|
936
|
-
const local = yield this.
|
|
959
|
+
const local = yield this.boundSession(record);
|
|
937
960
|
if (local !== undefined) {
|
|
938
|
-
return { auth: local, reached: "session_joined" };
|
|
961
|
+
return { auth: local.auth, sessionId: local.sessionId, reached: "session_joined" };
|
|
939
962
|
}
|
|
940
963
|
if (this.hostedGuest === undefined) {
|
|
941
964
|
return { auth: undefined, reached: "session_gone" };
|
|
@@ -946,20 +969,20 @@ export class ReminderRunner {
|
|
|
946
969
|
if (!restored) {
|
|
947
970
|
return { auth: undefined, reached: "session_gone" };
|
|
948
971
|
}
|
|
949
|
-
const
|
|
950
|
-
return
|
|
972
|
+
const session = yield this.boundSession(record);
|
|
973
|
+
return session === undefined
|
|
951
974
|
? { auth: undefined, reached: "session_unreadable" }
|
|
952
|
-
: { auth, reached: "session_restored" };
|
|
975
|
+
: { auth: session.auth, sessionId: session.sessionId, reached: "session_restored" };
|
|
953
976
|
});
|
|
954
977
|
}
|
|
955
978
|
deliverPromptFire(record) {
|
|
956
979
|
return __awaiter(this, void 0, void 0, function* () {
|
|
957
980
|
const target = yield this.resolveFollowupTarget(record);
|
|
958
981
|
if (target.auth !== undefined) {
|
|
959
|
-
return this.promptDelivery(record, target
|
|
982
|
+
return this.promptDelivery(record, target, target.reached);
|
|
960
983
|
}
|
|
961
984
|
if (target.reached === "session_unreadable") {
|
|
962
|
-
this.logger(`[
|
|
985
|
+
this.logger(`[bdk] reminder "${record.id}" (${record.purpose}) durable session did not materialize locally; not opening a new one`);
|
|
963
986
|
return { result: { action: "stop" }, reason: "session_gone" };
|
|
964
987
|
}
|
|
965
988
|
if (this.hostedGuest !== undefined &&
|
|
@@ -978,7 +1001,7 @@ export class ReminderRunner {
|
|
|
978
1001
|
};
|
|
979
1002
|
}
|
|
980
1003
|
try {
|
|
981
|
-
return yield this.promptDelivery(record, fireAuth, "session_opened");
|
|
1004
|
+
return yield this.promptDelivery(record, { auth: fireAuth }, "session_opened");
|
|
982
1005
|
}
|
|
983
1006
|
catch (error) {
|
|
984
1007
|
if (!(error instanceof SessionAuthError)) {
|
|
@@ -987,7 +1010,7 @@ export class ReminderRunner {
|
|
|
987
1010
|
// A session landed on this key under another principal between the
|
|
988
1011
|
// lookup and the send. That does not change on retry, so stop
|
|
989
1012
|
// rather than let the control plane re-admit until its attempt cap.
|
|
990
|
-
this.logger(`[
|
|
1013
|
+
this.logger(`[bdk] reminder "${record.id}" (${record.purpose}) cannot join session on its continuation: ${error.message}`);
|
|
991
1014
|
return { result: { action: "stop" }, reason: "session_gone" };
|
|
992
1015
|
}
|
|
993
1016
|
}
|
|
@@ -999,11 +1022,11 @@ export class ReminderRunner {
|
|
|
999
1022
|
return { result: { action: "stop" }, reason: "session_gone" };
|
|
1000
1023
|
});
|
|
1001
1024
|
}
|
|
1002
|
-
promptDelivery(record,
|
|
1025
|
+
promptDelivery(record, address, delivered) {
|
|
1003
1026
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1004
1027
|
var _a;
|
|
1005
1028
|
const settle = {};
|
|
1006
|
-
const result = yield this.sendFollowup(record, buildFirePrompt(record),
|
|
1029
|
+
const result = yield this.sendFollowup(record, buildFirePrompt(record), address, settle);
|
|
1007
1030
|
return {
|
|
1008
1031
|
result,
|
|
1009
1032
|
reason: result.action === "skip" ? ((_a = settle.skipReason) !== null && _a !== void 0 ? _a : "busy") : delivered,
|
|
@@ -1015,14 +1038,16 @@ export class ReminderRunner {
|
|
|
1015
1038
|
* Join the reminder's existing session. Control-plane (`/v2`) channels
|
|
1016
1039
|
* refuse authored `continuationToken`; pass the stored key as
|
|
1017
1040
|
* {@link EngineSendOptions.mailboxContinuation} so the engine reuses the
|
|
1018
|
-
* CP-selected identity without channel admission.
|
|
1041
|
+
* CP-selected identity without channel admission. A one-shot key (an HTTP
|
|
1042
|
+
* session's) names the event that opened the session and never joins, so
|
|
1043
|
+
* the follow-up names the bound session itself.
|
|
1019
1044
|
*/
|
|
1020
|
-
followupSendOptions(record,
|
|
1045
|
+
followupSendOptions(record, address) {
|
|
1046
|
+
const { auth, sessionId } = address;
|
|
1021
1047
|
if (this.channelUsesControlPlaneContinuation(record.channelId)) {
|
|
1022
|
-
return {
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
};
|
|
1048
|
+
return Object.assign({ auth, mailboxContinuation: { key: record.continuationToken } }, (sessionId !== undefined && isOneShotContinuationKey(record.continuationToken)
|
|
1049
|
+
? { hostedSessionId: sessionId }
|
|
1050
|
+
: {}));
|
|
1026
1051
|
}
|
|
1027
1052
|
return {
|
|
1028
1053
|
auth,
|
|
@@ -1061,9 +1086,9 @@ export class ReminderRunner {
|
|
|
1061
1086
|
}
|
|
1062
1087
|
});
|
|
1063
1088
|
}
|
|
1064
|
-
sendFollowup(record, message,
|
|
1089
|
+
sendFollowup(record, message, address, settle, extra) {
|
|
1065
1090
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1066
|
-
const sendOptions = Object.assign(Object.assign({}, this.followupSendOptions(record,
|
|
1091
|
+
const sendOptions = Object.assign(Object.assign({}, this.followupSendOptions(record, address)), { state: extra === null || extra === void 0 ? void 0 : extra.state, refreshState: extra === null || extra === void 0 ? void 0 : extra.refreshState, title: extra === null || extra === void 0 ? void 0 : extra.title, clearCloudOverride: extra === null || extra === void 0 ? void 0 : extra.clearCloudOverride });
|
|
1067
1092
|
try {
|
|
1068
1093
|
const session = yield this.engine.send(record.channelId, message, sendOptions);
|
|
1069
1094
|
yield this.settleFollowup(session, settle);
|
|
@@ -1084,7 +1109,7 @@ export class ReminderRunner {
|
|
|
1084
1109
|
return { action: "delivered" };
|
|
1085
1110
|
}
|
|
1086
1111
|
catch (retryError) {
|
|
1087
|
-
this.logger(`[
|
|
1112
|
+
this.logger(`[bdk] reminder "${record.id}" followup failed after wait: ${retryError instanceof Error ? retryError.message : String(retryError)}`);
|
|
1088
1113
|
if (settle !== undefined) {
|
|
1089
1114
|
settle.skipReason = "followup_failed";
|
|
1090
1115
|
}
|
|
@@ -1111,16 +1136,16 @@ export class ReminderRunner {
|
|
|
1111
1136
|
followup(args) {
|
|
1112
1137
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1113
1138
|
const target = yield self.resolveFollowupTarget(record);
|
|
1114
|
-
let
|
|
1139
|
+
let address = target.auth === undefined ? undefined : target;
|
|
1115
1140
|
// `openAuth` opens only when nothing exists anywhere: an unreadable
|
|
1116
1141
|
// durable session must not be shadowed by a second one on the same
|
|
1117
1142
|
// key (prompt-fire parity).
|
|
1118
|
-
if (
|
|
1143
|
+
if (address === undefined &&
|
|
1119
1144
|
target.reached === "session_gone" &&
|
|
1120
1145
|
args.openAuth !== undefined) {
|
|
1121
|
-
|
|
1146
|
+
address = { auth: args.openAuth };
|
|
1122
1147
|
}
|
|
1123
|
-
if (
|
|
1148
|
+
if (address === undefined) {
|
|
1124
1149
|
// Under the CP protocol the guest never writes reminder status;
|
|
1125
1150
|
// the fire's `stop` outcome carries the reason instead.
|
|
1126
1151
|
if (!self.usesControlPlaneProtocol) {
|
|
@@ -1128,11 +1153,11 @@ export class ReminderRunner {
|
|
|
1128
1153
|
}
|
|
1129
1154
|
throw new Error(`Reminder "${record.id}" followup: session gone for continuation`);
|
|
1130
1155
|
}
|
|
1131
|
-
const result = yield self.sendFollowup(record, args.message,
|
|
1156
|
+
const result = yield self.sendFollowup(record, args.message, address, undefined, args);
|
|
1132
1157
|
if (result.action === "skip") {
|
|
1133
1158
|
throw new Error(`Reminder "${record.id}" followup skipped: session busy`);
|
|
1134
1159
|
}
|
|
1135
|
-
const existing = yield self.
|
|
1160
|
+
const existing = yield self.boundSession(record);
|
|
1136
1161
|
if (existing === undefined) {
|
|
1137
1162
|
throw new Error(`Reminder "${record.id}" followup: session not found for continuation`);
|
|
1138
1163
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolve a hosted (managed) agent-sdk deployment into a base URL +
|
|
3
|
-
* request headers for chat/run/call
|
|
3
|
+
* request headers for chat/run/call `--prod`.
|
|
4
4
|
*
|
|
5
5
|
* Uses short-lived `engineAccess` from the deployment status route
|
|
6
6
|
* (Cursor API key on the management API; `X-Anyrun-Port-Token` on the
|
|
@@ -67,14 +67,6 @@ export interface ResolvedProdPlayground {
|
|
|
67
67
|
export declare function resolveProdPlaygroundUrl(options: ResolveProdTargetOptions & {
|
|
68
68
|
sessionId?: string;
|
|
69
69
|
}): Promise<ResolvedProdPlayground>;
|
|
70
|
-
/**
|
|
71
|
-
* Look up a running deployment and return its stable alias playground URL.
|
|
72
|
-
* Does not mint `engineAccess` — the browser signs in with the alias token.
|
|
73
|
-
* Throws {@link Error} with a CLI-ready message on failure.
|
|
74
|
-
*/
|
|
75
|
-
export declare function resolveProdAliasPlaygroundUrl(options: ResolveProdTargetOptions & {
|
|
76
|
-
sessionId?: string;
|
|
77
|
-
}): Promise<ResolvedProdAliasPlayground>;
|
|
78
70
|
/** Resolve the deployment slug the same way `deploy` does for a single dir. */
|
|
79
71
|
export declare function resolveProdSlug(options: {
|
|
80
72
|
dir: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-prod-target.d.ts","sourceRoot":"","sources":["../../src/internal/resolve-prod-target.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGrE,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,yEAAyE;IACzE,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,gDAAgD;IAChD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAGtC,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE;IAFxD,YACE,OAAO,EAAE,MAAM,EACN,OAAO,GAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAiB,EAItE;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;CACF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"resolve-prod-target.d.ts","sourceRoot":"","sources":["../../src/internal/resolve-prod-target.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGrE,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,yEAAyE;IACzE,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,gDAAgD;IAChD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAGtC,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE;IAFxD,YACE,OAAO,EAAE,MAAM,EACN,OAAO,GAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAiB,EAItE;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;CACF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA2F7B;AAED,MAAM,WAAW,2BAA2B;IAC1C,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,wBAAwB,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,sBAAsB,CAAC,CAsCjC;AAwDD,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAgB7F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolve a hosted (managed) agent-sdk deployment into a base URL +
|
|
3
|
-
* request headers for chat/run/call
|
|
3
|
+
* request headers for chat/run/call `--prod`.
|
|
4
4
|
*
|
|
5
5
|
* Uses short-lived `engineAccess` from the deployment status route
|
|
6
6
|
* (Cursor API key on the management API; `X-Anyrun-Port-Token` on the
|
|
@@ -66,8 +66,6 @@ export function resolveProdTarget(options) {
|
|
|
66
66
|
err,
|
|
67
67
|
});
|
|
68
68
|
if (typeof auth === "number") {
|
|
69
|
-
// Not "--prod": `eval` resolves the hosted deployment by default,
|
|
70
|
-
// without any flag.
|
|
71
69
|
throw new Error(`Could not resolve Cursor credentials/team for the hosted deployment (see above).`);
|
|
72
70
|
}
|
|
73
71
|
if (options.skipLegacyArchitectureCheck !== true) {
|
|
@@ -172,33 +170,6 @@ export function resolveProdPlaygroundUrl(options) {
|
|
|
172
170
|
return Object.assign(Object.assign({}, resolved), { architecture });
|
|
173
171
|
});
|
|
174
172
|
}
|
|
175
|
-
/**
|
|
176
|
-
* Look up a running deployment and return its stable alias playground URL.
|
|
177
|
-
* Does not mint `engineAccess` — the browser signs in with the alias token.
|
|
178
|
-
* Throws {@link Error} with a CLI-ready message on failure.
|
|
179
|
-
*/
|
|
180
|
-
export function resolveProdAliasPlaygroundUrl(options) {
|
|
181
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
182
|
-
var _a;
|
|
183
|
-
const err = (_a = options.err) !== null && _a !== void 0 ? _a : ((text) => void process.stderr.write(text));
|
|
184
|
-
const slug = resolveProdSlug(options);
|
|
185
|
-
const auth = yield resolveDeployAuth({
|
|
186
|
-
team: options.team,
|
|
187
|
-
apiKey: options.apiKey,
|
|
188
|
-
fetchImpl: options.fetchImpl,
|
|
189
|
-
err,
|
|
190
|
-
});
|
|
191
|
-
if (typeof auth === "number") {
|
|
192
|
-
throw new Error(`Could not resolve Cursor credentials/team for the hosted deployment (see above).`);
|
|
193
|
-
}
|
|
194
|
-
yield rejectV2ForLegacyCommand({
|
|
195
|
-
client: auth.client,
|
|
196
|
-
teamId: auth.teamId,
|
|
197
|
-
slug,
|
|
198
|
-
});
|
|
199
|
-
return resolveProdAliasPlaygroundUrlWithAuth(options, auth, slug, err);
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
173
|
function resolveProdAliasPlaygroundUrlWithAuth(options, auth, slug, err) {
|
|
203
174
|
return __awaiter(this, void 0, void 0, function* () {
|
|
204
175
|
let detail;
|
|
@@ -26,7 +26,7 @@ export function validateMountConnectionsConfig(args) {
|
|
|
26
26
|
if (filteredRefs.length === 0) {
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
-
throw new Error(`[
|
|
29
|
+
throw new Error(`[bdk] agent "${label}" has Cursor account MCP connections with \`servers\` filters (${filteredRefs
|
|
30
30
|
.map(ref => ref.name)
|
|
31
31
|
.join(", ")}) but no --public-url; cloud-runtime turns cannot honor those filters without a public bridge URL. Set --public-url or remove the \`servers\` filter.`);
|
|
32
32
|
}
|
|
@@ -41,7 +41,7 @@ export function assertCloudCanHonorAccountServersFilters(args) {
|
|
|
41
41
|
if (blocked.length === 0) {
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
|
-
throw new Error(`[
|
|
44
|
+
throw new Error(`[bdk] cloud turn cannot honor Cursor account \`servers\` filters (${blocked
|
|
45
45
|
.map(connection => connection.name)
|
|
46
46
|
.join(", ")}) without --public-url; set --public-url so cloud turns reach the filtered account bridge instead of falling back to native connectors.`);
|
|
47
47
|
}
|
|
@@ -53,7 +53,7 @@ export function assertAccountConnectionsNotAnonymous(args) {
|
|
|
53
53
|
if (args.allowAnonymousCursorAccountMcp === true) {
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
|
-
throw new Error("[
|
|
56
|
+
throw new Error("[bdk] --allow-anonymous cannot be used with Cursor account MCP connections (defineConnection({ cursorAccount: true })); use --bearer-token, or opt in with --allow-anonymous-cursor-account-mcp behind a trusted boundary.");
|
|
57
57
|
}
|
|
58
58
|
export function resolveMountConnections(args) {
|
|
59
59
|
const agent = args.project.agent;
|
|
@@ -66,15 +66,15 @@ export function resolveMountConnections(args) {
|
|
|
66
66
|
.map(connection => connection.name);
|
|
67
67
|
if (hostOauthNames.length > 0) {
|
|
68
68
|
args.logger(args.cloudToolsBridge === true
|
|
69
|
-
? `[
|
|
70
|
-
: `[
|
|
69
|
+
? `[bdk] agent "${label}": host-OAuth MCP connections (${hostOauthNames.join(", ")}) reach cloud turns through the host connection bridge; their tokens stay on this serve host.`
|
|
70
|
+
: `[bdk] warning: agent "${label}" has host-OAuth MCP connections (${hostOauthNames.join(", ")}) whose tokens live on this serve host; cloud-runtime turns omit them. Serve with a cloud tools URL so they reach turns through the host connection bridge, or drop \`oauth\` and authorize the server another way.`);
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
if (args.peerRefs !== undefined && args.peerRefs.length > 0) {
|
|
74
74
|
const peers = resolvePeerConnections(Object.assign(Object.assign({ refs: args.peerRefs, serverUrl: args.serverUrl }, (args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl })), (args.authToken === undefined ? {} : { authToken: args.authToken })));
|
|
75
75
|
resolved.push(...peers);
|
|
76
76
|
if (cloudCapable && args.publicUrl === undefined) {
|
|
77
|
-
args.logger(`[
|
|
77
|
+
args.logger(`[bdk] warning: agent "${label}" has peer MCP connections (${peers
|
|
78
78
|
.map(peer => peer.name)
|
|
79
79
|
.join(", ")}) but no --public-url; cloud-runtime turns cannot reach this host's loopback address, so peers are omitted from cloud turns.`);
|
|
80
80
|
}
|
|
@@ -85,8 +85,8 @@ export function resolveMountConnections(args) {
|
|
|
85
85
|
args.accountBridge.logPreflight(args.accountRefs);
|
|
86
86
|
if (cloudCapable && args.publicUrl === undefined) {
|
|
87
87
|
args.logger(args.cloudToolsBridge === true
|
|
88
|
-
? `[
|
|
89
|
-
: `[
|
|
88
|
+
? `[bdk] agent "${label}": cloud-runtime turns reach filtered account connections through the host connection bridge (unfiltered ones fall back to the account's native connectors).`
|
|
89
|
+
: `[bdk] agent "${label}": cloud-runtime turns omit the account bridge without --public-url (cloud agents fall back to the account's native connectors).`);
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
return resolved;
|
|
@@ -11,12 +11,22 @@ import { type Trajectory } from "./trajectory.js";
|
|
|
11
11
|
/** Thrown when a turn stream exceeds `timeoutMs`; carries the session id. */
|
|
12
12
|
export declare class RunSessionTimeoutError extends Error {
|
|
13
13
|
readonly sessionId: string;
|
|
14
|
-
|
|
14
|
+
/** Events the turn recorded before the deadline. */
|
|
15
|
+
readonly events: SessionEvent[];
|
|
16
|
+
constructor(message: string, sessionId: string,
|
|
17
|
+
/** Events the turn recorded before the deadline. */
|
|
18
|
+
events: SessionEvent[]);
|
|
15
19
|
}
|
|
16
20
|
export interface RunClientOptions extends RequestAuth {
|
|
17
21
|
baseUrl: string;
|
|
18
22
|
/** Abort a hung turn. */
|
|
19
23
|
timeoutMs?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Longest any single read may stay silent: a quiet stream connection ends
|
|
26
|
+
* so the session's durable log can settle the turn, and each log read is
|
|
27
|
+
* bounded. Default 5s.
|
|
28
|
+
*/
|
|
29
|
+
stallMs?: number;
|
|
20
30
|
/** External cancel (combined with {@link timeoutMs} when both are set). */
|
|
21
31
|
signal?: AbortSignal;
|
|
22
32
|
/** Called for each stream event as it arrives (for CLI progress). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-client.d.ts","sourceRoot":"","sources":["../../src/internal/run-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"run-client.d.ts","sourceRoot":"","sources":["../../src/internal/run-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEtF,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE;IAJjC,YACE,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,MAAM;IAC1B,oDAAoD;IAC3C,MAAM,EAAE,YAAY,EAAE,EAIhC;CACF;AACD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAcD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,gBAAgB,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,GACA,OAAO,CAAC,gBAAgB,CAAC,CA0D3B"}
|