@cursor/bdk 0.2.17 → 0.2.20
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/AGENTS.md +16 -6
- package/dist/bin/agent-serve.js +7 -0
- package/dist/channels/runs/index.d.ts +4 -0
- package/dist/channels/runs/index.d.ts.map +1 -0
- package/dist/channels/runs/index.js +2 -0
- package/dist/channels/runs/runs-channel.d.ts +5 -0
- package/dist/channels/runs/runs-channel.d.ts.map +1 -0
- package/dist/channels/runs/runs-channel.js +34 -0
- package/dist/channels/runs/types.d.ts +34 -0
- package/dist/channels/runs/types.d.ts.map +1 -0
- package/dist/channels/runs/types.js +1 -0
- package/dist/channels/slack/slack-channel.d.ts +3 -2
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +9 -2
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.CUNuFTSm.js → app.BzgJFr_T.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.gGwBYU3d.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.Dez74k0W.js → VPLocalSearchBox.Bn5QyUDM.js} +1 -1
- package/dist/docs/assets/chunks/{arc.CJ3FhK7H.js → arc.D734Gm5d.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CfUdbHsa.js → architectureDiagram-Q4EWVU46.NX1jj-YX.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.D93LawU9.js → baseUniq.nd8dxdeO.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.Zvsd6UHP.js → blockDiagram-DXYQGD6D.DG8faTim.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.CGX5xZ9d.js → c4Diagram-AHTNJAMY.zD31AJ3b.js} +1 -1
- package/dist/docs/assets/chunks/channel.DQLJQMi3.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CCIf0QCo.js → chunk-4BX2VUAB.BHQj6Rko.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.D_N1RPyi.js → chunk-4TB4RGXK.Cs38Yh16.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.B1oecjzx.js → chunk-55IACEB6.CFUR21JO.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BzUNVPGX.js → chunk-EDXVE4YY.C80-Sneg.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DheI8WSO.js → chunk-FMBD7UC4.CdT1MGza.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Bg4iL0sM.js → chunk-OYMX7WX6.BctEzab0.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.CSQjDhAD.js → chunk-QZHKN3VN.DTneeX3k.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.BDdxnPU4.js → chunk-YZCP3GAM.Cz47F_-o.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.j55aerUT.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.j55aerUT.js +1 -0
- package/dist/docs/assets/chunks/clone.XimRS84I.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.AT0weO8r.js → cose-bilkent-S5V4N54A.BPYgB-_O.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CJ30TxV0.js → dagre-KV5264BT.Cu6hECod.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.KtE--1fW.js → diagram-5BDNPKRD.BMgp95Tz.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BFGygSUQ.js → diagram-G4DWMVQ6.towWdhDi.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BLU-79eb.js → diagram-MMDJMWI5.D9IfOvE9.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.CdjfJdVG.js → diagram-TYMM5635.NTX57RPu.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.Dj1Iwypl.js → erDiagram-SMLLAGMA.DIQLqDqu.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BXqj_Su2.js → flowDiagram-DWJPFMVM.DhqpItRe.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.CNfgGSst.js → ganttDiagram-T4ZO3ILL.B998R3Ps.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.2tgvFDBr.js → gitGraphDiagram-UUTBAWPF.B45nTn8-.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CWHZMxx6.js → graph.DPseWzzM.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.DhLIK8m1.js → infoDiagram-42DDH7IO._GhhBBai.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.BIN11n1G.js → ishikawaDiagram-UXIWVN3A.CTUMcaMM.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BARmNJ0n.js → journeyDiagram-VCZTEJTY.DkJBUddC.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BrTJYFyF.js → kanban-definition-6JOO6SKY.B5Q3uwhy.js} +1 -1
- package/dist/docs/assets/chunks/{layout.CPZIIywK.js → layout.CDY13IKh.js} +1 -1
- package/dist/docs/assets/chunks/{linear.DTpmzI5S.js → linear.BPd1ql9p.js} +1 -1
- package/dist/docs/assets/chunks/{min.BBLQmXwZ.js → min.dlGuqIBP.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.5qkWJvdl.js → mindmap-definition-QFDTVHPH.Cp7zCtmb.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.-4wufv_f.js → pieDiagram-DEJITSTG.CRH034nu.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.C0jrp1-8.js → quadrantDiagram-34T5L4WZ.BspgZ-pX.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DUDpANfe.js → requirementDiagram-MS252O5E.CQZqZ0nZ.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.74Lvg6Gu.js → sankeyDiagram-XADWPNL6.DllwFU3k.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.BHDIH286.js → sequenceDiagram-FGHM5R23.B5fTXycf.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.Dr-HIuLb.js → stateDiagram-FHFEXIEX.12GQjmbD.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.Ctv5WEMu.js +1 -0
- package/dist/docs/assets/chunks/{theme.H8zSBhlM.js → theme.BgocqONV.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.GtyCaSiL.js → timeline-definition-GMOUNBTQ.DXKUL5rH.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.DLId0rxH.js → vennDiagram-DHZGUBPP.BrsjYCjp.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.DZDndEXQ.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CI6mGYNG.js → wardleyDiagram-NUSXRM2D.C4oM69gv.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CG1n865F.js → xychartDiagram-5P7HB3ND.qzHH9efW.js} +1 -1
- package/dist/docs/assets/{deployment.md.ajc3VM0m.js → deployment.md.D0uprX2p.js} +3 -3
- package/dist/docs/assets/{deployment.md.ajc3VM0m.lean.js → deployment.md.D0uprX2p.lean.js} +1 -1
- package/dist/docs/assets/{guides_agent-to-agent.md.Cps5NiCV.js → guides_agent-to-agent.md.CwL5cwuE.js} +6 -5
- package/dist/docs/assets/{guides_agent-to-agent.md.Cps5NiCV.lean.js → guides_agent-to-agent.md.CwL5cwuE.lean.js} +1 -1
- package/dist/docs/assets/guides_export-grokbot.md.qo5bxi4h.js +55 -0
- package/dist/docs/assets/guides_export-grokbot.md.qo5bxi4h.lean.js +1 -0
- package/dist/docs/assets/{guides_opentelemetry.md.jcPNrQbH.js → guides_opentelemetry.md.BHPm32OR.js} +3 -3
- package/dist/docs/assets/{guides_opentelemetry.md.jcPNrQbH.lean.js → guides_opentelemetry.md.BHPm32OR.lean.js} +1 -1
- package/dist/docs/assets/{index.md.CHAFTf6m.js → index.md.CAnsLl8D.js} +2 -2
- package/dist/docs/assets/{index.md.CHAFTf6m.lean.js → index.md.CAnsLl8D.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.Bt3sAfat.js → reference_cli.md.Bkrsce22.js} +7 -4
- package/dist/docs/assets/{reference_cli.md.Bt3sAfat.lean.js → reference_cli.md.Bkrsce22.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.CxbLpaaP.js → reference_connections.md.BJE2Zllp.js} +4 -4
- package/dist/docs/assets/{reference_connections.md.CxbLpaaP.lean.js → reference_connections.md.BJE2Zllp.lean.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.DbJC8mcZ.js → reference_hooks.md.CP3FENFJ.js} +1 -1
- package/dist/docs/assets/reference_memory.md.BwyJXYZe.js +4 -0
- package/dist/docs/assets/reference_memory.md.BwyJXYZe.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.Ckddg6KX.js → reference_skills.md.C2GWh7g8.js} +3 -3
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +38 -38
- package/dist/docs/deployment.md +17 -0
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +41 -40
- package/dist/docs/guides/agent-to-agent.md +34 -21
- 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/export-grokbot.html +114 -0
- package/dist/docs/guides/export-grokbot.md +239 -0
- 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/migrate.html +36 -36
- package/dist/docs/guides/opentelemetry.html +37 -37
- package/dist/docs/guides/opentelemetry.md +19 -0
- 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 +37 -37
- package/dist/docs/index.md +3 -0
- package/dist/docs/llms-full.txt +493 -29
- package/dist/docs/llms.txt +2 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +41 -38
- package/dist/docs/reference/cli.md +39 -1
- package/dist/docs/reference/connections.html +38 -38
- package/dist/docs/reference/connections.md +16 -6
- package/dist/docs/reference/evals.html +36 -36
- package/dist/docs/reference/extensions.html +35 -35
- package/dist/docs/reference/hooks.html +38 -38
- package/dist/docs/reference/hooks.md +2 -1
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/memory.html +63 -0
- package/dist/docs/reference/memory.md +114 -0
- 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/evals.d.ts +1 -1
- package/dist/evals.js +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.d.ts +2 -2
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts +8 -1
- package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/launch-agent.js +10 -1
- package/dist/internal/cli-ax.d.ts +7 -7
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +36 -15
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +0 -14
- package/dist/internal/cloud-turn-usage.d.ts +34 -0
- package/dist/internal/cloud-turn-usage.d.ts.map +1 -0
- package/dist/internal/cloud-turn-usage.js +94 -0
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +6 -0
- package/dist/internal/continuation-identity.d.ts +6 -3
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +43 -0
- package/dist/internal/estimate-cost.d.ts +55 -0
- package/dist/internal/estimate-cost.d.ts.map +1 -0
- package/dist/internal/{turn-cost.js → estimate-cost.js} +18 -26
- package/dist/internal/event-log.d.ts +2 -2
- package/dist/internal/event-log.js +2 -2
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +21 -2
- package/dist/internal/http-control-plane-session.d.ts +5 -2
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +38 -2
- package/dist/internal/init-scaffold.d.ts.map +1 -1
- package/dist/internal/init-scaffold.js +3 -4
- package/dist/internal/model-config.d.ts +7 -0
- package/dist/internal/model-config.d.ts.map +1 -0
- package/dist/internal/model-config.js +67 -0
- package/dist/internal/otel/collector.d.ts +3 -3
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +8 -21
- package/dist/internal/otel/computer-use-attrs.d.ts +13 -0
- package/dist/internal/otel/computer-use-attrs.d.ts.map +1 -0
- package/dist/internal/otel/computer-use-attrs.js +29 -0
- package/dist/internal/peer-connections.d.ts +17 -8
- package/dist/internal/peer-connections.d.ts.map +1 -1
- package/dist/internal/peer-connections.js +41 -10
- package/dist/internal/request-error-status.d.ts.map +1 -1
- package/dist/internal/request-error-status.js +4 -1
- package/dist/internal/resolved-connections.d.ts +4 -1
- package/dist/internal/resolved-connections.d.ts.map +1 -1
- package/dist/internal/resolved-connections.js +9 -4
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +16 -14
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +2 -1
- package/dist/internal/session-cost.d.ts +21 -22
- package/dist/internal/session-cost.d.ts.map +1 -1
- package/dist/internal/session-cost.js +38 -46
- package/dist/internal/session-engine.d.ts +25 -41
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +130 -122
- package/dist/internal/sessions-client.d.ts +13 -1
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +24 -0
- package/dist/internal/storage-coordinator.d.ts +9 -9
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +116 -36
- package/dist/internal/testing/factory-resource-fixtures.d.ts +16 -0
- package/dist/internal/testing/factory-resource-fixtures.d.ts.map +1 -1
- package/dist/internal/testing/factory-resource-fixtures.js +14 -0
- package/dist/internal/trajectory.d.ts +5 -6
- package/dist/internal/trajectory.d.ts.map +1 -1
- package/dist/internal/trajectory.js +1 -13
- package/dist/memory.d.ts +5 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +1 -1
- package/dist/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
- package/dist/playground/assets/index-C77_FdOx.css +1 -0
- package/dist/playground/assets/index-CvzI2lhj.js +71 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +57 -22
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +3 -0
- package/docs/deployment.md +17 -0
- package/docs/guides/agent-to-agent.md +34 -21
- package/docs/guides/export-grokbot.md +244 -0
- package/docs/guides/opentelemetry.md +19 -0
- package/docs/reference/cli.md +39 -1
- package/docs/reference/connections.md +16 -6
- package/docs/reference/hooks.md +2 -1
- package/docs/reference/memory.md +119 -0
- package/package.json +13 -5
- package/templates/agentic-owners/bot/lib/owners/matching.ts +57 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.3c56VHUt.js +0 -1
- package/dist/docs/assets/chunks/channel.S8-FFjmE.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BB98tFjZ.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BB98tFjZ.js +0 -1
- package/dist/docs/assets/chunks/clone.B98w8OEv.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DW_lwpZY.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.CSlECTHi.js +0 -162
- package/dist/internal/cloud-turn-cost.d.ts +0 -42
- package/dist/internal/cloud-turn-cost.d.ts.map +0 -1
- package/dist/internal/cloud-turn-cost.js +0 -120
- package/dist/internal/turn-cost.d.ts +0 -41
- package/dist/internal/turn-cost.d.ts.map +0 -1
- package/dist/playground/assets/cursor-icons-16-4RnoYH3n.woff2 +0 -0
- package/dist/playground/assets/index-7fVUOA5l.css +0 -1
- package/dist/playground/assets/index-U3TRnwAP.js +0 -71
- /package/dist/docs/assets/{reference_hooks.md.DbJC8mcZ.lean.js → reference_hooks.md.CP3FENFJ.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.Ckddg6KX.lean.js → reference_skills.md.C2GWh7g8.lean.js} +0 -0
|
@@ -3,6 +3,7 @@ import { InvalidAsOfError, VacuousTimeArgsError } from "./as-of.js";
|
|
|
3
3
|
import { V2EngineError } from "./continuation-identity.js";
|
|
4
4
|
import { GUEST_CONNECT_STALLED, GUEST_NETWORK_UNAVAILABLE, GuestNetworkUnavailableError, hasGuestNetworkErrno, isQuietGuestConnectStall, } from "./guest-network.js";
|
|
5
5
|
import { HOSTED_GUEST_RETRY_TERMINAL, HOSTED_GUEST_RETRY_TRANSIENT, } from "./hosted-delivery-protocol.js";
|
|
6
|
+
import { InvalidModelConfigError } from "./model-config.js";
|
|
6
7
|
import { SessionAuthError, SessionBusyError } from "./session-engine.js";
|
|
7
8
|
/**
|
|
8
9
|
* Expected throw → HTTP mapping used by `handleRequest` and hosted flush.
|
|
@@ -41,7 +42,9 @@ export function mapThrownRequestError(error) {
|
|
|
41
42
|
retry: HOSTED_GUEST_RETRY_TERMINAL,
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
|
-
if (error instanceof InvalidAsOfError ||
|
|
45
|
+
if (error instanceof InvalidAsOfError ||
|
|
46
|
+
error instanceof VacuousTimeArgsError ||
|
|
47
|
+
error instanceof InvalidModelConfigError) {
|
|
45
48
|
return {
|
|
46
49
|
status: 400,
|
|
47
50
|
code: "invalid_request",
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* account bridge — resolve to concrete URLs and join the engine's
|
|
5
5
|
* resolved-connection set. Local turns call both over loopback; cloud
|
|
6
6
|
* turns use the serve `publicUrl` for peers and the account's native
|
|
7
|
-
* connectors instead of the bridge.
|
|
7
|
+
* connectors instead of the bridge. A single-agent serve with a peers URL
|
|
8
|
+
* reaches its peers there from both runtimes.
|
|
8
9
|
*/
|
|
9
10
|
import { type AgentProject } from "../types.js";
|
|
10
11
|
import { type CursorAccountConnectionRef, type CursorAccountMcpBridge } from "./cursor/account-mcp.js";
|
|
@@ -55,6 +56,8 @@ export declare function resolveMountConnections(args: {
|
|
|
55
56
|
accountBridge?: CursorAccountMcpBridge;
|
|
56
57
|
publicUrl?: string;
|
|
57
58
|
authToken?: string;
|
|
59
|
+
/** Resolves `peerRefs` on another host; see `resolveHostedPeerConnections`. */
|
|
60
|
+
peersUrl?: string;
|
|
58
61
|
/** See {@link validateMountConnectionsConfig}. */
|
|
59
62
|
cloudToolsBridge?: boolean;
|
|
60
63
|
logger: (line: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolved-connections.d.ts","sourceRoot":"","sources":["../../src/internal/resolved-connections.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"resolved-connections.d.ts","sourceRoot":"","sources":["../../src/internal/resolved-connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAkC,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAE5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,IAAI,CA0BP;AAED,qEAAqE;AACrE,wBAAgB,wCAAwC,CAAC,IAAI,EAAE;IAC7D,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,mBAAmB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACzD;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC,GAAG,IAAI,CAoBP;AAED,iFAAiF;AACjF,wBAAgB,oCAAoC,CAAC,IAAI,EAAE;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,qBAAqB,EAAE,OAAO,CAAC;CAChC,GAAG,IAAI,CAUP;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,GAAG,wBAAwB,EAAE,CAmE7B"}
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
* account bridge — resolve to concrete URLs and join the engine's
|
|
5
5
|
* resolved-connection set. Local turns call both over loopback; cloud
|
|
6
6
|
* turns use the serve `publicUrl` for peers and the account's native
|
|
7
|
-
* connectors instead of the bridge.
|
|
7
|
+
* connectors instead of the bridge. A single-agent serve with a peers URL
|
|
8
|
+
* reaches its peers there from both runtimes.
|
|
8
9
|
*/
|
|
9
10
|
import { isHostOauthConnectionTransport } from "../types.js";
|
|
10
11
|
import { resolveCursorAccountConnections, } from "./cursor/account-mcp.js";
|
|
11
|
-
import { resolvePeerConnections } from "./peer-connections.js";
|
|
12
|
+
import { resolveHostedPeerConnections, resolvePeerConnections, } from "./peer-connections.js";
|
|
12
13
|
/** Fail fast before listen when static cloud config cannot honor `servers`. */
|
|
13
14
|
export function validateMountConnectionsConfig(args) {
|
|
14
15
|
if (args.accountRefs === undefined || args.accountRefs.length === 0) {
|
|
@@ -69,9 +70,13 @@ export function resolveMountConnections(args) {
|
|
|
69
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.`);
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
+
const peerRefs = args.peerRefs ?? [];
|
|
74
|
+
if (args.peersUrl !== undefined) {
|
|
75
|
+
resolved.push(...resolveHostedPeerConnections({ refs: peerRefs, peersUrl: args.peersUrl }));
|
|
76
|
+
}
|
|
77
|
+
else if (peerRefs.length > 0) {
|
|
73
78
|
const peers = resolvePeerConnections({
|
|
74
|
-
refs:
|
|
79
|
+
refs: peerRefs,
|
|
75
80
|
serverUrl: args.serverUrl,
|
|
76
81
|
...(args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl }),
|
|
77
82
|
...(args.authToken === undefined ? {} : { authToken: args.authToken }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../src/internal/sdk-runner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../src/internal/sdk-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { mkdir } from "node:fs/promises";
|
|
|
9
9
|
import { Agent, Cursor, createAgentPlatform, } from "@cursor/sdk";
|
|
10
10
|
import { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
|
|
11
11
|
import { DEFAULT_MODEL, } from "../types.js";
|
|
12
|
-
import { mapSdkTokenUsage, usageTokenSum } from "./cloud-turn-
|
|
12
|
+
import { mapSdkTokenUsage, usageTokenSum } from "./cloud-turn-usage.js";
|
|
13
13
|
import { resolveApiKeySync, SIGN_IN_HINT } from "./cursor/credentials.js";
|
|
14
14
|
import { describeError } from "./describe-error.js";
|
|
15
15
|
import { installedSdkAppliesSubagentInherit } from "./sdk-subagent-inherit-support.js";
|
|
@@ -262,6 +262,7 @@ export class CursorSdkRunner {
|
|
|
262
262
|
*/
|
|
263
263
|
async runTurnWithTransportRetry(request, onStreamed) {
|
|
264
264
|
let sawUpdate = false;
|
|
265
|
+
let mintedSdkAgentId;
|
|
265
266
|
const tracked = {
|
|
266
267
|
...request,
|
|
267
268
|
onUpdate: (update) => {
|
|
@@ -269,6 +270,10 @@ export class CursorSdkRunner {
|
|
|
269
270
|
onStreamed();
|
|
270
271
|
return request.onUpdate(update);
|
|
271
272
|
},
|
|
273
|
+
onSdkAgentId: async (sdkAgentId) => {
|
|
274
|
+
mintedSdkAgentId = sdkAgentId;
|
|
275
|
+
await request.onSdkAgentId?.(sdkAgentId);
|
|
276
|
+
},
|
|
272
277
|
};
|
|
273
278
|
const outcome = await this.runTurnAttempt(tracked);
|
|
274
279
|
if (outcome.status !== "error" || sawUpdate || request.signal?.aborted === true) {
|
|
@@ -281,8 +286,13 @@ export class CursorSdkRunner {
|
|
|
281
286
|
// Log the original error even when the retry succeeds so the expiry
|
|
282
287
|
// still shows up in Datadog.
|
|
283
288
|
this.log(`[bdk] session ${request.sessionId}: ${reason}: ${outcome.errorMessage}; retrying the turn`);
|
|
289
|
+
// The failed attempt already minted this cloud agent; resuming it is what
|
|
290
|
+
// keeps one trigger from leaving two `bc-…` agents behind.
|
|
291
|
+
const retried = mintedSdkAgentId !== undefined && isServerMintedCloudAgentId(mintedSdkAgentId)
|
|
292
|
+
? { ...tracked, sdkAgentId: mintedSdkAgentId }
|
|
293
|
+
: tracked;
|
|
284
294
|
try {
|
|
285
|
-
return await this.runTurnAttempt(
|
|
295
|
+
return await this.runTurnAttempt(retried);
|
|
286
296
|
}
|
|
287
297
|
catch {
|
|
288
298
|
return outcome;
|
|
@@ -366,11 +376,6 @@ export class CursorSdkRunner {
|
|
|
366
376
|
try {
|
|
367
377
|
const result = await run.wait();
|
|
368
378
|
let outcome = toTurnOutcome(result);
|
|
369
|
-
if (request.runtime === "cloud" && isCloudRunId(result.id)) {
|
|
370
|
-
// The cost endpoint prices billed usage per run only when told
|
|
371
|
-
// which run; a local run label is not resolvable there.
|
|
372
|
-
outcome = { ...outcome, runId: result.id };
|
|
373
|
-
}
|
|
374
379
|
if (outcome.status === "error") {
|
|
375
380
|
// An error result usually means the handle's transport is poisoned
|
|
376
381
|
// — most often a cached access token that aged past its 60-minute
|
|
@@ -386,7 +391,7 @@ export class CursorSdkRunner {
|
|
|
386
391
|
result.id !== "") {
|
|
387
392
|
// Cloud `wait()` drops usage after stream reconnect / getRun replay,
|
|
388
393
|
// or returns an all-zero stub. `getUsage` still has the run's tokens
|
|
389
|
-
// (eventually); without them traces never record
|
|
394
|
+
// (eventually); without them traces never record the turn's tokens.
|
|
390
395
|
outcome = await fillMissingCloudUsage(agent, result.id, outcome);
|
|
391
396
|
}
|
|
392
397
|
return outcome;
|
|
@@ -770,15 +775,12 @@ function toTurnOutcome(result) {
|
|
|
770
775
|
...(usage === undefined ? {} : { usage }),
|
|
771
776
|
};
|
|
772
777
|
}
|
|
773
|
-
|
|
774
|
-
return typeof id === "string" && id.startsWith("run-");
|
|
775
|
-
}
|
|
776
|
-
/** Billing can lag briefly after `wait()`; retry before giving up on cost. */
|
|
778
|
+
/** Billing can lag briefly after `wait()`; retry before giving up on usage. */
|
|
777
779
|
const CLOUD_USAGE_RETRY_DELAYS_MS = [0, 400, 1200];
|
|
778
780
|
/**
|
|
779
781
|
* Cloud `wait()` often omits usage after a stream drop. Pull the run's
|
|
780
|
-
* tokens from the usage API so the
|
|
781
|
-
* Failures are ignored:
|
|
782
|
+
* tokens from the usage API so the turn still records them.
|
|
783
|
+
* Failures are ignored: missing usage is better than failing the turn.
|
|
782
784
|
*/
|
|
783
785
|
async function fillMissingCloudUsage(agent, runId, outcome) {
|
|
784
786
|
for (const delayMs of CLOUD_USAGE_RETRY_DELAYS_MS) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAsC,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AA6CpF,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAQhB,YAAY,EACb,MAAM,aAAa,CAAC;AA6FrB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAgDpE,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAUpE,OAAO,EAEL,wBAAwB,EAEzB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAAsB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAW/E,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAuCD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,yEAAyE;IACzE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;IAC5D,wEAAwE;IACxE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IACvD;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAsC,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AA6CpF,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAQhB,YAAY,EACb,MAAM,aAAa,CAAC;AA6FrB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAgDpE,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAUpE,OAAO,EAEL,wBAAwB,EAEzB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAAsB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAW/E,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAuCD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,yEAAyE;IACzE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;IAC5D,wEAAwE;IACxE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IACvD;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,CA2nC3B;AAkmDD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,cAAc,EACnB,MAAM,SAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAkDf"}
|
package/dist/internal/server.js
CHANGED
|
@@ -481,7 +481,7 @@ export async function startServer(mounts, options = {}) {
|
|
|
481
481
|
// Validate peer MCP connections (defineConnection({ agent })) against the
|
|
482
482
|
// mount set before anything starts. URLs resolve after listen, once the
|
|
483
483
|
// port is known.
|
|
484
|
-
const peerRefsBySlug = collectPeerConnections(mounts, logger);
|
|
484
|
+
const peerRefsBySlug = collectPeerConnections(mounts, logger, options.peersUrl);
|
|
485
485
|
// Cursor account MCP connections (defineConnection({ cursorAccount: true }))
|
|
486
486
|
// need a signed-in host: their tools execute on the Cursor backend with
|
|
487
487
|
// the account's stored OAuth credentials. Fail fast at serve start instead
|
|
@@ -929,6 +929,7 @@ export async function startServer(mounts, options = {}) {
|
|
|
929
929
|
: {}),
|
|
930
930
|
...(options.publicUrl === undefined ? {} : { publicUrl: options.publicUrl }),
|
|
931
931
|
...(options.authToken === undefined ? {} : { authToken: options.authToken }),
|
|
932
|
+
peersUrl: options.peersUrl,
|
|
932
933
|
cloudToolsBridge: options.cloudToolsUrl !== undefined,
|
|
933
934
|
logger,
|
|
934
935
|
});
|
|
@@ -1,50 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-session
|
|
2
|
+
* Per-session usage and cost report for `bdk cost [sessionId]`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* pure fold over its `events.ndjson`. `GET /v1/session/:id/cost` is the
|
|
8
|
-
* live billed total.
|
|
4
|
+
* Token usage is a pure fold over the session's `turn.completed` events.
|
|
5
|
+
* Dollars are priced for the whole session by `GET /v1/session/:id/cost`;
|
|
6
|
+
* turns are never priced on their own.
|
|
9
7
|
*/
|
|
10
|
-
import type {
|
|
11
|
-
/** One agent loop pass (turn) with its usage
|
|
8
|
+
import type { SessionCost, SessionEvent, TurnUsage } from "../types.js";
|
|
9
|
+
/** One agent loop pass (turn) with its token usage. */
|
|
12
10
|
export interface SessionCostTurn {
|
|
13
11
|
turnId: string;
|
|
14
12
|
failed: boolean;
|
|
15
13
|
usage?: TurnUsage;
|
|
16
|
-
cost?: TurnCost;
|
|
17
14
|
}
|
|
18
|
-
export interface
|
|
15
|
+
export interface SessionUsageTotals {
|
|
19
16
|
turns: number;
|
|
20
17
|
turnFailures: number;
|
|
21
18
|
inputTokens: number;
|
|
22
19
|
outputTokens: number;
|
|
23
20
|
cacheReadTokens: number;
|
|
24
21
|
cacheWriteTokens: number;
|
|
25
|
-
/** Sum of per-turn estimated costs (USD). */
|
|
26
|
-
costUsd: number;
|
|
27
|
-
/** Turns that reported usage but had no known model rates. */
|
|
28
|
-
unpricedTurns: number;
|
|
29
22
|
}
|
|
30
23
|
export interface SessionCostReport {
|
|
31
24
|
sessionId: string;
|
|
32
25
|
turns: SessionCostTurn[];
|
|
33
|
-
totals:
|
|
26
|
+
totals: SessionUsageTotals;
|
|
27
|
+
/** Whole-session cost; absent when the server could not price it. */
|
|
28
|
+
cost?: SessionCost;
|
|
34
29
|
}
|
|
35
|
-
export declare function
|
|
36
|
-
export declare function
|
|
37
|
-
/** Fold a session event stream into per-turn and total
|
|
38
|
-
export declare function buildSessionCostReport(events: readonly SessionEvent[]): SessionCostReport;
|
|
39
|
-
/** Per-turn table for `
|
|
30
|
+
export declare function emptySessionUsageTotals(): SessionUsageTotals;
|
|
31
|
+
export declare function addSessionUsageTotals(target: SessionUsageTotals, delta: SessionUsageTotals): void;
|
|
32
|
+
/** Fold a session event stream into per-turn and total token usage. */
|
|
33
|
+
export declare function buildSessionCostReport(events: readonly SessionEvent[], cost?: SessionCost): SessionCostReport;
|
|
34
|
+
/** Per-turn token table plus the session cost for `bdk cost <sessionId>`. */
|
|
40
35
|
export declare function formatSessionCostText(report: SessionCostReport): string;
|
|
41
36
|
export interface SessionCostRow {
|
|
42
37
|
sessionId: string;
|
|
43
38
|
channelId: string;
|
|
44
39
|
title?: string;
|
|
45
40
|
updatedAt?: string;
|
|
46
|
-
totals:
|
|
41
|
+
totals: SessionUsageTotals;
|
|
47
42
|
}
|
|
48
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* All-sessions token table for `bdk cost` (no session id). Pricing every
|
|
45
|
+
* session would run one billed lookup per session, so dollars are left to
|
|
46
|
+
* `bdk cost <sessionId>`.
|
|
47
|
+
*/
|
|
49
48
|
export declare function formatSessionsCostText(rows: SessionCostRow[]): string;
|
|
50
49
|
//# sourceMappingURL=session-cost.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-cost.d.ts","sourceRoot":"","sources":["../../src/internal/session-cost.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-cost.d.ts","sourceRoot":"","sources":["../../src/internal/session-cost.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxE,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,qEAAqE;IACrE,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,CAS5D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAOjG;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,IAAI,CAAC,EAAE,WAAW,GACjB,iBAAiB,CAsCnB;AAcD,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA0BvE;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,CA8BrE"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-session
|
|
2
|
+
* Per-session usage and cost report for `bdk cost [sessionId]`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* pure fold over its `events.ndjson`. `GET /v1/session/:id/cost` is the
|
|
8
|
-
* live billed total.
|
|
4
|
+
* Token usage is a pure fold over the session's `turn.completed` events.
|
|
5
|
+
* Dollars are priced for the whole session by `GET /v1/session/:id/cost`;
|
|
6
|
+
* turns are never priced on their own.
|
|
9
7
|
*/
|
|
10
|
-
import {
|
|
11
|
-
|
|
8
|
+
import { CLI_COMMAND_NAME } from "./distribution.js";
|
|
9
|
+
import { formatCostUsd } from "./trajectory.js";
|
|
10
|
+
export function emptySessionUsageTotals() {
|
|
12
11
|
return {
|
|
13
12
|
turns: 0,
|
|
14
13
|
turnFailures: 0,
|
|
@@ -16,25 +15,21 @@ export function emptySessionCostTotals() {
|
|
|
16
15
|
outputTokens: 0,
|
|
17
16
|
cacheReadTokens: 0,
|
|
18
17
|
cacheWriteTokens: 0,
|
|
19
|
-
costUsd: 0,
|
|
20
|
-
unpricedTurns: 0,
|
|
21
18
|
};
|
|
22
19
|
}
|
|
23
|
-
export function
|
|
20
|
+
export function addSessionUsageTotals(target, delta) {
|
|
24
21
|
target.turns += delta.turns;
|
|
25
22
|
target.turnFailures += delta.turnFailures;
|
|
26
23
|
target.inputTokens += delta.inputTokens;
|
|
27
24
|
target.outputTokens += delta.outputTokens;
|
|
28
25
|
target.cacheReadTokens += delta.cacheReadTokens;
|
|
29
26
|
target.cacheWriteTokens += delta.cacheWriteTokens;
|
|
30
|
-
target.costUsd = roundCostUsd(target.costUsd + delta.costUsd);
|
|
31
|
-
target.unpricedTurns += delta.unpricedTurns;
|
|
32
27
|
}
|
|
33
|
-
/** Fold a session event stream into per-turn and total
|
|
34
|
-
export function buildSessionCostReport(events) {
|
|
28
|
+
/** Fold a session event stream into per-turn and total token usage. */
|
|
29
|
+
export function buildSessionCostReport(events, cost) {
|
|
35
30
|
let sessionId = "";
|
|
36
31
|
const turns = [];
|
|
37
|
-
const totals =
|
|
32
|
+
const totals = emptySessionUsageTotals();
|
|
38
33
|
for (const event of events) {
|
|
39
34
|
if (sessionId === "" && typeof event.sessionId === "string") {
|
|
40
35
|
sessionId = event.sessionId;
|
|
@@ -60,38 +55,39 @@ export function buildSessionCostReport(events) {
|
|
|
60
55
|
totals.cacheReadTokens += usage.cacheReadTokens;
|
|
61
56
|
totals.cacheWriteTokens += usage.cacheWriteTokens;
|
|
62
57
|
}
|
|
63
|
-
const cost = event.data.cost;
|
|
64
|
-
if (cost !== undefined) {
|
|
65
|
-
turn.cost = cost;
|
|
66
|
-
totals.costUsd = roundCostUsd(totals.costUsd + cost.totalUsd);
|
|
67
|
-
}
|
|
68
|
-
else if (usage !== undefined) {
|
|
69
|
-
totals.unpricedTurns += 1;
|
|
70
|
-
}
|
|
71
58
|
turns.push(turn);
|
|
72
59
|
}
|
|
73
|
-
|
|
60
|
+
const report = { sessionId, turns, totals };
|
|
61
|
+
if (cost !== undefined && cost.source !== "unavailable") {
|
|
62
|
+
report.cost = cost;
|
|
63
|
+
}
|
|
64
|
+
return report;
|
|
74
65
|
}
|
|
75
66
|
function formatCount(value) {
|
|
76
67
|
return String(value);
|
|
77
68
|
}
|
|
78
|
-
|
|
69
|
+
function formatSessionCost(cost) {
|
|
70
|
+
if (cost === undefined) {
|
|
71
|
+
return "unavailable";
|
|
72
|
+
}
|
|
73
|
+
const model = cost.model === undefined ? "" : `, ${cost.model}`;
|
|
74
|
+
return `${formatCostUsd(cost.costUsd)} (${cost.source}${model})`;
|
|
75
|
+
}
|
|
76
|
+
/** Per-turn token table plus the session cost for `bdk cost <sessionId>`. */
|
|
79
77
|
export function formatSessionCostText(report) {
|
|
80
78
|
const lines = [];
|
|
81
|
-
lines.push(`session ${report.sessionId || "(unknown)"} cost: ${
|
|
79
|
+
lines.push(`session ${report.sessionId || "(unknown)"} cost: ${formatSessionCost(report.cost)}`);
|
|
82
80
|
if (report.turns.length === 0) {
|
|
83
81
|
lines.push("No turns recorded.");
|
|
84
82
|
return `${lines.join("\n")}\n`;
|
|
85
83
|
}
|
|
86
|
-
const header = ["TURN", "IN", "OUT", "CACHE R", "CACHE W", "
|
|
84
|
+
const header = ["TURN", "IN", "OUT", "CACHE R", "CACHE W", "STATUS"];
|
|
87
85
|
const rows = report.turns.map((turn) => [
|
|
88
86
|
turn.turnId,
|
|
89
87
|
turn.usage === undefined ? "—" : formatCount(turn.usage.inputTokens),
|
|
90
88
|
turn.usage === undefined ? "—" : formatCount(turn.usage.outputTokens),
|
|
91
89
|
turn.usage === undefined ? "—" : formatCount(turn.usage.cacheReadTokens),
|
|
92
90
|
turn.usage === undefined ? "—" : formatCount(turn.usage.cacheWriteTokens),
|
|
93
|
-
turn.cost === undefined ? "—" : formatCostUsd(turn.cost.totalUsd),
|
|
94
|
-
turn.cost?.model ?? "—",
|
|
95
91
|
turn.failed ? "failed" : "ok",
|
|
96
92
|
]);
|
|
97
93
|
rows.push([
|
|
@@ -100,30 +96,30 @@ export function formatSessionCostText(report) {
|
|
|
100
96
|
formatCount(report.totals.outputTokens),
|
|
101
97
|
formatCount(report.totals.cacheReadTokens),
|
|
102
98
|
formatCount(report.totals.cacheWriteTokens),
|
|
103
|
-
formatCostUsd(report.totals.costUsd),
|
|
104
|
-
"",
|
|
105
99
|
report.totals.turnFailures > 0 ? `${report.totals.turnFailures} failed` : "",
|
|
106
100
|
]);
|
|
107
101
|
lines.push(renderTable(header, rows));
|
|
108
|
-
appendUnpricedNote(lines, report.totals.unpricedTurns);
|
|
109
102
|
return `${lines.join("\n")}\n`;
|
|
110
103
|
}
|
|
111
|
-
/**
|
|
104
|
+
/**
|
|
105
|
+
* All-sessions token table for `bdk cost` (no session id). Pricing every
|
|
106
|
+
* session would run one billed lookup per session, so dollars are left to
|
|
107
|
+
* `bdk cost <sessionId>`.
|
|
108
|
+
*/
|
|
112
109
|
export function formatSessionsCostText(rows) {
|
|
113
110
|
if (rows.length === 0) {
|
|
114
111
|
return "No sessions.\n";
|
|
115
112
|
}
|
|
116
|
-
const header = ["SESSION", "CHANNEL", "TURNS", "IN", "OUT", "
|
|
117
|
-
const totals =
|
|
113
|
+
const header = ["SESSION", "CHANNEL", "TURNS", "IN", "OUT", "UPDATED"];
|
|
114
|
+
const totals = emptySessionUsageTotals();
|
|
118
115
|
const body = rows.map((row) => {
|
|
119
|
-
|
|
116
|
+
addSessionUsageTotals(totals, row.totals);
|
|
120
117
|
return [
|
|
121
118
|
row.sessionId,
|
|
122
119
|
row.channelId,
|
|
123
120
|
formatCount(row.totals.turns),
|
|
124
121
|
formatCount(row.totals.inputTokens),
|
|
125
122
|
formatCount(row.totals.outputTokens),
|
|
126
|
-
formatCostUsd(row.totals.costUsd),
|
|
127
123
|
row.updatedAt ?? "",
|
|
128
124
|
];
|
|
129
125
|
});
|
|
@@ -133,18 +129,14 @@ export function formatSessionsCostText(rows) {
|
|
|
133
129
|
formatCount(totals.turns),
|
|
134
130
|
formatCount(totals.inputTokens),
|
|
135
131
|
formatCount(totals.outputTokens),
|
|
136
|
-
formatCostUsd(totals.costUsd),
|
|
137
132
|
"",
|
|
138
133
|
]);
|
|
139
|
-
const lines = [
|
|
140
|
-
|
|
134
|
+
const lines = [
|
|
135
|
+
renderTable(header, body),
|
|
136
|
+
`Run \`${CLI_COMMAND_NAME} cost <sessionId>\` for a session's cost.`,
|
|
137
|
+
];
|
|
141
138
|
return `${lines.join("\n")}\n`;
|
|
142
139
|
}
|
|
143
|
-
function appendUnpricedNote(lines, unpricedTurns) {
|
|
144
|
-
if (unpricedTurns > 0) {
|
|
145
|
-
lines.push(`note: ${unpricedTurns} turn(s) reported usage with no priced cost; cost totals exclude them.`);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
140
|
function renderTable(header, rows) {
|
|
149
141
|
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((row) => (row[i] ?? "").length)));
|
|
150
142
|
const renderRow = (row) => row
|
|
@@ -14,8 +14,8 @@ declare module "@cursor/sdk" {
|
|
|
14
14
|
}
|
|
15
15
|
import type { Meter } from "@opentelemetry/api";
|
|
16
16
|
import { SlackAskDedupeStore, SlackNudgeStore } from "../channels/slack/nudge-store.js";
|
|
17
|
-
import { type AgentProject, type ApprovalDecision, type ArtifactListFilter, type ArtifactPage, type ArtifactRecord, type ArtifactsApi, type AuthContext, type CallToolOptions, type ChannelDefinition, type ChannelSession, type ConnectionTransport, type DiscoveredTool, type EvalCaseResultEventData, type HostContext, type HttpChannelDefinition, type PendingApproval, type PendingAuth, type ReceiveInput, type SendMessageOptions, type SessionEvent, type SessionInfo, type SessionListSource, type SessionRecord, type SessionSummary, type ToolCallOutcome, type TurnOutcome } from "../types.js";
|
|
18
|
-
import { type CloudAgentUsage } from "./cloud-turn-
|
|
17
|
+
import { type AgentProject, type ApprovalDecision, type ArtifactListFilter, type ArtifactPage, type ArtifactRecord, type ArtifactsApi, type AuthContext, type CallToolOptions, type ChannelDefinition, type ChannelSession, type ConnectionTransport, type DiscoveredTool, type EvalCaseResultEventData, type HostContext, type HttpChannelDefinition, type PendingApproval, type PendingAuth, type ReceiveInput, type SendMessageOptions, type SessionCost, type SessionEvent, type SessionInfo, type SessionListSource, type SessionRecord, type SessionSummary, type ToolCallOutcome, type TurnOutcome } from "../types.js";
|
|
18
|
+
import { type CloudAgentUsage } from "./cloud-turn-usage.js";
|
|
19
19
|
import { type EventLogMemoryStats } from "./event-log.js";
|
|
20
20
|
import { type HostPlatforms } from "./host-platforms.js";
|
|
21
21
|
import { McpOauthOnDemandHub } from "./mcp-oauth-on-demand.js";
|
|
@@ -23,7 +23,7 @@ import type { OtelCollector } from "./otel/collector.js";
|
|
|
23
23
|
import type { AgentRunner } from "./sdk-runner.js";
|
|
24
24
|
import { SessionStore } from "./session-store.js";
|
|
25
25
|
import { StorageCoordinator } from "./storage-coordinator.js";
|
|
26
|
-
import { type
|
|
26
|
+
import { type EstimateCostFn } from "./estimate-cost.js";
|
|
27
27
|
import { TurnLeaseStore } from "./turn-lease-store.js";
|
|
28
28
|
import { TurnOutbox } from "./turn-outbox.js";
|
|
29
29
|
export declare const HTTP_CHANNEL_ID = "http";
|
|
@@ -91,15 +91,15 @@ export interface SessionEngineOptions {
|
|
|
91
91
|
platforms?: HostPlatforms;
|
|
92
92
|
/**
|
|
93
93
|
* Test seam / override for cloud billed usage (`Agent.getUsage`). Used to
|
|
94
|
-
* backfill `turn.completed` rows that
|
|
95
|
-
*
|
|
94
|
+
* backfill `turn.completed` rows that finished without usage so the
|
|
95
|
+
* playground Trace tab can still show their tokens.
|
|
96
96
|
*/
|
|
97
97
|
getCloudUsage?: (sdkAgentId: string) => Promise<CloudAgentUsage | undefined>;
|
|
98
98
|
/**
|
|
99
|
-
*
|
|
99
|
+
* Price a whole session via `POST /v1/models/estimate-cost`. Tests inject a
|
|
100
100
|
* stub; production uses billed usage events when an agent id is known.
|
|
101
101
|
*/
|
|
102
|
-
|
|
102
|
+
estimateSessionCost?: EstimateCostFn;
|
|
103
103
|
/** Process-level OTel collector; observe-only, never fatal. */
|
|
104
104
|
otel?: OtelCollector;
|
|
105
105
|
/** Process-level meter for {@link HostContext.otel}. Absent → no-op counters. */
|
|
@@ -254,11 +254,11 @@ export declare class SessionEngine {
|
|
|
254
254
|
/** Lazily resolved Cursor credential for managed cloud tools. */
|
|
255
255
|
private cloudServerToolsHeaders;
|
|
256
256
|
private readonly getCloudUsage;
|
|
257
|
-
private readonly
|
|
258
|
-
/** Sessions whose completed turns
|
|
259
|
-
private readonly
|
|
260
|
-
/** Deduped in-flight cloud
|
|
261
|
-
private readonly
|
|
257
|
+
private readonly estimateSessionCost;
|
|
258
|
+
/** Sessions whose completed turns all carry usage (no further backfill). */
|
|
259
|
+
private readonly cloudUsageBackfillDone;
|
|
260
|
+
/** Deduped in-flight cloud usage backfills, keyed by session id. */
|
|
261
|
+
private readonly cloudUsageBackfill;
|
|
262
262
|
/** Per-session FileSystem handle cache (not a tree snapshot). */
|
|
263
263
|
private readonly sessionRoots;
|
|
264
264
|
/** In-flight factory resolves, so the first turn and a racing callTool share one handle. */
|
|
@@ -364,6 +364,7 @@ export declare class SessionEngine {
|
|
|
364
364
|
* up `(agentId, cKey)` from a mailbox stamp or structured claim.
|
|
365
365
|
*/
|
|
366
366
|
send(channelId: string, message: string, options?: EngineSendOptions): Promise<ChannelSession>;
|
|
367
|
+
private rejectMismatchedModelConfig;
|
|
367
368
|
/**
|
|
368
369
|
* Atomically validate and rotate an HTTP follow-up credential, then admit
|
|
369
370
|
* the message to its exact session without changing the owning channel key.
|
|
@@ -371,7 +372,7 @@ export declare class SessionEngine {
|
|
|
371
372
|
followUpHttp(sessionId: string, token: {
|
|
372
373
|
channelId: string;
|
|
373
374
|
key: string;
|
|
374
|
-
}, message: string): Promise<string | undefined>;
|
|
375
|
+
}, message: string, modelConfig?: unknown): Promise<string | undefined>;
|
|
375
376
|
/** Whether a continuation token already maps to a session on this channel. */
|
|
376
377
|
hasContinuationSession(channelId: string, continuationToken: string): Promise<boolean>;
|
|
377
378
|
/** Look up a session as a channel-scoped handle. */
|
|
@@ -515,6 +516,7 @@ export declare class SessionEngine {
|
|
|
515
516
|
* durable state directory instead.
|
|
516
517
|
*/
|
|
517
518
|
private cloudStore;
|
|
519
|
+
private turnModel;
|
|
518
520
|
private buildTurnRequest;
|
|
519
521
|
/**
|
|
520
522
|
* Connection names a cloud turn can only reach through the host connection
|
|
@@ -827,40 +829,22 @@ export declare class SessionEngine {
|
|
|
827
829
|
/** Append a hosted eval case's verdict to its session log, after its last turn. */
|
|
828
830
|
recordEvalCaseResult(sessionId: string, data: EvalCaseResultEventData): Promise<void>;
|
|
829
831
|
/**
|
|
830
|
-
*
|
|
831
|
-
*
|
|
832
|
-
*
|
|
833
|
-
* stops before the estimate lands leaves the turn unpriced; `sessionCost`
|
|
834
|
-
* prices the session on read.
|
|
832
|
+
* Billed/catalog cost of the whole session, priced once per call. Powers
|
|
833
|
+
* the playground, `bdk run`, and `bdk cost` via `GET /v1/session/:id/cost`.
|
|
834
|
+
* The billed lookup is expensive, so nothing on the turn path calls this.
|
|
835
835
|
*/
|
|
836
|
-
|
|
837
|
-
private priceTurn;
|
|
838
|
-
/**
|
|
839
|
-
* Billed/catalog cost for a session. Powers playground, traces, and
|
|
840
|
-
* `agent-sdk cost` via `GET /v1/session/:id/cost`.
|
|
841
|
-
*/
|
|
842
|
-
sessionCost(sessionId: string): Promise<{
|
|
843
|
-
sessionId: string;
|
|
844
|
-
source: "usage" | "catalog" | "unavailable";
|
|
845
|
-
cost: {
|
|
846
|
-
rawCostCents: number;
|
|
847
|
-
chargedCents: number;
|
|
848
|
-
};
|
|
849
|
-
costUsd: number;
|
|
850
|
-
rawCostUsd: number;
|
|
851
|
-
model?: string;
|
|
852
|
-
}>;
|
|
836
|
+
sessionCost(sessionId: string): Promise<SessionCost>;
|
|
853
837
|
/** Snapshot of recorded events (for download / offline trace). */
|
|
854
838
|
listEvents(sessionId: string, startIndex?: number, options?: {
|
|
855
|
-
|
|
839
|
+
backfillCloudUsage?: boolean;
|
|
856
840
|
}): Promise<SessionEvent[]>;
|
|
857
841
|
/**
|
|
858
|
-
*
|
|
859
|
-
*
|
|
860
|
-
*
|
|
842
|
+
* Cloud turns may lack usage on `turn.completed` (pre-0.1.29 engines, or
|
|
843
|
+
* getUsage still zero at turn end). Fill them from billed usage before the
|
|
844
|
+
* playground replays the stream so Trace can show their tokens.
|
|
861
845
|
*/
|
|
862
|
-
private
|
|
863
|
-
private
|
|
846
|
+
private backfillCloudTurnUsage;
|
|
847
|
+
private runCloudTurnUsageBackfill;
|
|
864
848
|
setContinuationToken(sessionId: string, token: string | null): Promise<void>;
|
|
865
849
|
isTurnRunning(sessionId: string): boolean;
|
|
866
850
|
sessionInfo(record: SessionRecord): SessionInfo;
|