@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
package/dist/internal/cli-ax.js
CHANGED
|
@@ -29,7 +29,7 @@ import { startPlaygroundProxy } from "./playground-proxy.js";
|
|
|
29
29
|
import { resolveProdPlaygroundUrl, resolveProdSlug, resolveProdTarget, } from "./resolve-prod-target.js";
|
|
30
30
|
import { runSession } from "./run-client.js";
|
|
31
31
|
import { buildSessionCostReport, formatSessionCostText, formatSessionsCostText, } from "./session-cost.js";
|
|
32
|
-
import { fetchSessionEvents, formatSessionsTable, listSessionsWithSource, resolvePreviousSessionId, } from "./sessions-client.js";
|
|
32
|
+
import { fetchSessionCost, fetchSessionEvents, formatSessionsTable, listSessionsWithSource, resolvePreviousSessionId, } from "./sessions-client.js";
|
|
33
33
|
import { createStreamProgress } from "./stream-progress.js";
|
|
34
34
|
import { buildTrajectory, formatTrajectoryText, loadTrajectoryFromEventsFile, } from "./trajectory.js";
|
|
35
35
|
function shouldStreamProgress(options) {
|
|
@@ -363,6 +363,8 @@ export async function cmdChat(options) {
|
|
|
363
363
|
return 1;
|
|
364
364
|
}
|
|
365
365
|
}
|
|
366
|
+
/** Covers the server's billed lookup plus its catalog retry; `run` reports no cost past it. */
|
|
367
|
+
const RUN_SESSION_COST_TIMEOUT_MS = 15_000;
|
|
366
368
|
export async function cmdRun(options) {
|
|
367
369
|
// Only a v2-shaped request tries the control plane; every v1 `run --prod`
|
|
368
370
|
// form (multi-turn, continuation token, local session id, --url) keeps its
|
|
@@ -394,6 +396,17 @@ export async function cmdRun(options) {
|
|
|
394
396
|
timeoutMs: options.timeoutMs,
|
|
395
397
|
onEvent: progress === undefined ? undefined : (e) => progress.onEvent(e),
|
|
396
398
|
});
|
|
399
|
+
if (options.prod !== true) {
|
|
400
|
+
const cost = await fetchSessionCost({
|
|
401
|
+
baseUrl: target.agentUrl,
|
|
402
|
+
sessionId: result.sessionId,
|
|
403
|
+
auth: { bearerToken: options.bearerToken, headers: target.headers },
|
|
404
|
+
signal: AbortSignal.timeout(RUN_SESSION_COST_TIMEOUT_MS),
|
|
405
|
+
});
|
|
406
|
+
if (cost !== undefined) {
|
|
407
|
+
result.trajectory.totalCostUsd = cost.costUsd;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
397
410
|
let eventsPath;
|
|
398
411
|
const writeEvents = options.events !== false;
|
|
399
412
|
if (writeEvents) {
|
|
@@ -1614,14 +1627,14 @@ export async function cmdSession(sessionId, options) {
|
|
|
1614
1627
|
/** Sessions fetched concurrently when `cost` aggregates every session. */
|
|
1615
1628
|
const COST_FETCH_CONCURRENCY = 4;
|
|
1616
1629
|
/**
|
|
1617
|
-
* `cost [sessionId]` — pull per-session cost
|
|
1630
|
+
* `cost [sessionId]` — pull per-session usage and cost.
|
|
1618
1631
|
*
|
|
1619
|
-
* With a session id: per-turn token usage
|
|
1620
|
-
*
|
|
1621
|
-
*
|
|
1622
|
-
*
|
|
1623
|
-
*
|
|
1624
|
-
*
|
|
1632
|
+
* With a session id: per-turn token usage plus the whole session's cost from
|
|
1633
|
+
* `GET /v1/session/:id/cost` (billed usage when available, else catalog
|
|
1634
|
+
* pricing of the summed tokens). Without one: token usage per session (all
|
|
1635
|
+
* sessions on the target) plus a total row, unpriced so listing does not run
|
|
1636
|
+
* a billed lookup per session. `--json` prints the underlying report(s);
|
|
1637
|
+
* text is the default.
|
|
1625
1638
|
*/
|
|
1626
1639
|
export async function cmdCost(sessionId, options) {
|
|
1627
1640
|
const target = await resolveSessionTarget(options);
|
|
@@ -1635,13 +1648,21 @@ export async function cmdCost(sessionId, options) {
|
|
|
1635
1648
|
try {
|
|
1636
1649
|
const resolved = trimNonEmpty(sessionId);
|
|
1637
1650
|
if (resolved !== undefined) {
|
|
1638
|
-
const events = await
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1651
|
+
const [events, cost] = await Promise.all([
|
|
1652
|
+
fetchSessionEvents({
|
|
1653
|
+
baseUrl: target.agentUrl,
|
|
1654
|
+
sessionId: resolved,
|
|
1655
|
+
auth,
|
|
1656
|
+
fetchImpl: options.fetchImpl,
|
|
1657
|
+
}),
|
|
1658
|
+
fetchSessionCost({
|
|
1659
|
+
baseUrl: target.agentUrl,
|
|
1660
|
+
sessionId: resolved,
|
|
1661
|
+
auth,
|
|
1662
|
+
fetchImpl: options.fetchImpl,
|
|
1663
|
+
}),
|
|
1664
|
+
]);
|
|
1665
|
+
const report = buildSessionCostReport(events, cost);
|
|
1645
1666
|
if (report.sessionId === "") {
|
|
1646
1667
|
report.sessionId = resolved;
|
|
1647
1668
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,OAAO,EAOL,sBAAsB,EAcvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EACL,KAAK,aAAa,EAMnB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,6 @@ import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
|
25
25
|
import { isReservedSecretName, isValidCursorEventRepo, validateSettableSecretName, } from "./hosting.js";
|
|
26
26
|
import { deploymentArchitecture, rejectV2ForLegacyCommand } from "./legacy-command-guard.js";
|
|
27
27
|
import { deployProgressLabel, sanitizeCustomerError } from "./logs-client.js";
|
|
28
|
-
import { peerConnectionRefs } from "./peer-connections.js";
|
|
29
28
|
import { sleep } from "./sleep.js";
|
|
30
29
|
import { slugFromDirectoryName } from "./slug.js";
|
|
31
30
|
import { stderrPalette } from "./terminal-style.js";
|
|
@@ -148,9 +147,6 @@ export async function cmdDeploy(options) {
|
|
|
148
147
|
manifests.push(await readDeployManifest(target.dir));
|
|
149
148
|
}
|
|
150
149
|
if (manifests.every((manifest) => manifest.architecture === "v2")) {
|
|
151
|
-
for (const [index, target] of targets.entries()) {
|
|
152
|
-
warnPeerConnections(ctx, target.slug, manifests[index]?.peerConnections ?? []);
|
|
153
|
-
}
|
|
154
150
|
return deployAgentsdkApplication(ctx, options, targets, {
|
|
155
151
|
// `persistent` is per child agent, like `agentPath`: each release
|
|
156
152
|
// component carries its own.
|
|
@@ -492,7 +488,6 @@ async function deployOne(ctx, options, target, extras) {
|
|
|
492
488
|
.map((channelId) => `/v1/channels/${channelId}`)
|
|
493
489
|
.join(", ")}: publicEndpoint() sits beside sharedSecretAuth()/hmacSignatureAuth() — auth chains are any-of, so every request is admitted and those secret policies never run. Drop publicEndpoint() to enforce them, or drop them to make the intent explicit.\n`);
|
|
494
490
|
}
|
|
495
|
-
warnPeerConnections(ctx, slug, manifest?.peerConnections ?? []);
|
|
496
491
|
if (manifest?.architecture === "v2") {
|
|
497
492
|
if (!ctx.json) {
|
|
498
493
|
ctx.err(` architecture: v2${manifest.persistent ? " (persistent)" : ""}${manifest.image === undefined ? "" : `\n image: ${manifest.image}`}\n`);
|
|
@@ -853,7 +848,6 @@ async function readDeployManifest(dir) {
|
|
|
853
848
|
cursorAccountConnections: project.agent.connections.flatMap((connection) => isCursorAccountTransport(connection.transport)
|
|
854
849
|
? [{ name: connection.name, servers: connection.transport.servers }]
|
|
855
850
|
: []),
|
|
856
|
-
peerConnections: peerConnectionRefs(project).map(({ name }) => name),
|
|
857
851
|
publicChannelIds: project.channels
|
|
858
852
|
.filter((channel) => (channel.definition.auth ?? []).some(isPublicEndpointPolicy))
|
|
859
853
|
.map((channel) => channel.id),
|
|
@@ -901,14 +895,6 @@ function declaredSecretNames(manifests) {
|
|
|
901
895
|
])),
|
|
902
896
|
];
|
|
903
897
|
}
|
|
904
|
-
/** Hosting serves each agent on its own, so its peer connections never resolve there. */
|
|
905
|
-
function warnPeerConnections(ctx, slug, peers) {
|
|
906
|
-
if (ctx.json || peers.length === 0) {
|
|
907
|
-
return;
|
|
908
|
-
}
|
|
909
|
-
ctx.err(`warning: ${slug} has peer connections (${peers.join(", ")}); hosted deploys run without peer tools today.\n` +
|
|
910
|
-
` Use a subagent, drop the connection, or self-host both agents in one multi-agent \`${CLI} serve\`.\n`);
|
|
911
|
-
}
|
|
912
898
|
/**
|
|
913
899
|
* Friendly post-deploy nudge: the manifest declares secrets the agent
|
|
914
900
|
* expects, but the deployment does not have them all set yet.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recover token usage for cloud turns that finished without it on
|
|
3
|
+
* `turn.completed`.
|
|
4
|
+
*
|
|
5
|
+
* Cloud `run.wait()` often drops streamed usage after SSE reconnect. The
|
|
6
|
+
* playground Trace tab only renders what is on the event, so those turns
|
|
7
|
+
* stay blank unless usage is backfilled from `Agent.getUsage` when the
|
|
8
|
+
* stream is read.
|
|
9
|
+
*/
|
|
10
|
+
import type { SessionEvent, TurnUsage } from "../types.js";
|
|
11
|
+
export interface CloudRunUsage {
|
|
12
|
+
runId: string;
|
|
13
|
+
usage: TurnUsage;
|
|
14
|
+
}
|
|
15
|
+
export interface CloudAgentUsage {
|
|
16
|
+
usage: TurnUsage;
|
|
17
|
+
runs: CloudRunUsage[];
|
|
18
|
+
}
|
|
19
|
+
export declare function usageTokenSum(usage: TurnUsage | undefined): number;
|
|
20
|
+
export declare function isUsageMissingCompletedTurn(event: SessionEvent): boolean;
|
|
21
|
+
export declare function cloudSdkAgentIdFromEvents(events: ReadonlyArray<SessionEvent>): string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Copy usage onto `turn.completed` events that have none. Returns undefined
|
|
24
|
+
* when the snapshot cannot be attributed safely (multiple unmatched turns).
|
|
25
|
+
*/
|
|
26
|
+
export declare function applyCloudUsageToEvents(events: ReadonlyArray<SessionEvent>, billed: CloudAgentUsage): SessionEvent[] | undefined;
|
|
27
|
+
export declare function mapSdkTokenUsage(usage: {
|
|
28
|
+
inputTokens: number;
|
|
29
|
+
outputTokens: number;
|
|
30
|
+
cacheReadTokens: number;
|
|
31
|
+
cacheWriteTokens: number;
|
|
32
|
+
reasoningTokens?: number;
|
|
33
|
+
}): TurnUsage;
|
|
34
|
+
//# sourceMappingURL=cloud-turn-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-turn-usage.d.ts","sourceRoot":"","sources":["../../src/internal/cloud-turn-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAKlE;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAExE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,MAAM,GAAG,SAAS,CAYjG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EACnC,MAAM,EAAE,eAAe,GACtB,YAAY,EAAE,GAAG,SAAS,CAkD5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,SAAS,CAWZ"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recover token usage for cloud turns that finished without it on
|
|
3
|
+
* `turn.completed`.
|
|
4
|
+
*
|
|
5
|
+
* Cloud `run.wait()` often drops streamed usage after SSE reconnect. The
|
|
6
|
+
* playground Trace tab only renders what is on the event, so those turns
|
|
7
|
+
* stay blank unless usage is backfilled from `Agent.getUsage` when the
|
|
8
|
+
* stream is read.
|
|
9
|
+
*/
|
|
10
|
+
export function usageTokenSum(usage) {
|
|
11
|
+
if (usage === undefined) {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
return usage.inputTokens + usage.outputTokens + usage.cacheReadTokens + usage.cacheWriteTokens;
|
|
15
|
+
}
|
|
16
|
+
export function isUsageMissingCompletedTurn(event) {
|
|
17
|
+
return event.type === "turn.completed" && usageTokenSum(event.data.usage) <= 0;
|
|
18
|
+
}
|
|
19
|
+
export function cloudSdkAgentIdFromEvents(events) {
|
|
20
|
+
let sdkAgentId;
|
|
21
|
+
for (const event of events) {
|
|
22
|
+
if (event.type !== "agent.bound") {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const id = event.data.sdkAgentId.trim();
|
|
26
|
+
if (id.startsWith("bc-")) {
|
|
27
|
+
sdkAgentId = id;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return sdkAgentId;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Copy usage onto `turn.completed` events that have none. Returns undefined
|
|
34
|
+
* when the snapshot cannot be attributed safely (multiple unmatched turns).
|
|
35
|
+
*/
|
|
36
|
+
export function applyCloudUsageToEvents(events, billed) {
|
|
37
|
+
const completedIndexes = [];
|
|
38
|
+
const missingIndexes = [];
|
|
39
|
+
for (let i = 0; i < events.length; i++) {
|
|
40
|
+
const event = events[i];
|
|
41
|
+
if (event === undefined || event.type !== "turn.completed") {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
completedIndexes.push(i);
|
|
45
|
+
if (isUsageMissingCompletedTurn(event)) {
|
|
46
|
+
missingIndexes.push(i);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (missingIndexes.length === 0) {
|
|
50
|
+
return [...events];
|
|
51
|
+
}
|
|
52
|
+
const patches = new Map();
|
|
53
|
+
if (missingIndexes.length === 1 &&
|
|
54
|
+
completedIndexes.length === 1 &&
|
|
55
|
+
usageTokenSum(billed.usage) > 0) {
|
|
56
|
+
const index = missingIndexes[0];
|
|
57
|
+
if (index !== undefined) {
|
|
58
|
+
patches.set(index, billed.usage);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (billed.runs.length === missingIndexes.length &&
|
|
62
|
+
billed.runs.every((run) => usageTokenSum(run.usage) > 0)) {
|
|
63
|
+
for (let i = 0; i < missingIndexes.length; i++) {
|
|
64
|
+
const index = missingIndexes[i];
|
|
65
|
+
const run = billed.runs[i];
|
|
66
|
+
if (index === undefined || run === undefined) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
patches.set(index, run.usage);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
return events.map((event, index) => {
|
|
76
|
+
const usage = patches.get(index);
|
|
77
|
+
if (usage === undefined || event.type !== "turn.completed") {
|
|
78
|
+
return event;
|
|
79
|
+
}
|
|
80
|
+
return { ...event, data: { ...event.data, usage } };
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export function mapSdkTokenUsage(usage) {
|
|
84
|
+
const mapped = {
|
|
85
|
+
inputTokens: usage.inputTokens,
|
|
86
|
+
outputTokens: usage.outputTokens,
|
|
87
|
+
cacheReadTokens: usage.cacheReadTokens,
|
|
88
|
+
cacheWriteTokens: usage.cacheWriteTokens,
|
|
89
|
+
};
|
|
90
|
+
if (usage.reasoningTokens !== undefined) {
|
|
91
|
+
mapped.reasoningTokens = usage.reasoningTokens;
|
|
92
|
+
}
|
|
93
|
+
return mapped;
|
|
94
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuation-channel.d.ts","sourceRoot":"","sources":["../../src/internal/continuation-channel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"continuation-channel.d.ts","sourceRoot":"","sources":["../../src/internal/continuation-channel.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,oBAAoB,EAO1B,MAAM,4BAA4B,CAAC;AAmEpC,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAWhG;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,qBAAqB,GAAG,SAAS,GAC7C,oBAAoB,CAEtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,KAAK,EAAE;QAAE,YAAY,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAC5C,QAAQ,EAAE,aAAa,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,WAAW,EAAE,qBAAqB,CAAC;CACpC,GAAG,IAAI,CAUP;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,QAAQ,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,GAAG,IAAI,CAwBP;AAyCD,iFAAiF;AACjF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B,SAAS,MAAM,EAAE,GAAG,SAAS,CAU/B;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,iBAAiB,CAAC;CAC/B,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAY9C"}
|
|
@@ -4,6 +4,7 @@ import { getDeploymentsChannelOptions } from "../channels/deployments/deployment
|
|
|
4
4
|
import { getGitHubChannelOptions } from "../channels/github/github-channel.js";
|
|
5
5
|
import { getGitLabChannelOptions } from "../channels/gitlab/gitlab-channel.js";
|
|
6
6
|
import { getIssuesChannelOptions } from "../channels/issues/issues-channel.js";
|
|
7
|
+
import { getRunsChannelOptions } from "../channels/runs/runs-channel.js";
|
|
7
8
|
import { getOriginChannelOptions } from "../channels/origin/origin-channel.js";
|
|
8
9
|
import { getSlackChannelOptions } from "../channels/slack/slack-channel.js";
|
|
9
10
|
import { defaultContinuationSelector, handshakeContinuation, normalizeIdentity, omittedV2MembershipDowngrade, omittedV2TypedType, } from "./continuation-identity.js";
|
|
@@ -48,6 +49,11 @@ const CONTINUATION_CHANNEL_PACKS = [
|
|
|
48
49
|
getOptions: getIssuesChannelOptions,
|
|
49
50
|
usesDeclaredEvents: true,
|
|
50
51
|
},
|
|
52
|
+
{
|
|
53
|
+
kind: "runs",
|
|
54
|
+
getOptions: getRunsChannelOptions,
|
|
55
|
+
usesDeclaredEvents: true,
|
|
56
|
+
},
|
|
51
57
|
];
|
|
52
58
|
export function channelContinuationIdentity(definition) {
|
|
53
59
|
if (definition === undefined) {
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* selector. An explicit per-channel selector still overrides. JSONPath
|
|
17
17
|
* and per-agent format strings are rejected.
|
|
18
18
|
*/
|
|
19
|
-
export type ConversationType = "pr" | "issue" | "thread" | "origin-pr" | "gitlab-mr" | "bitbucket-pr" | "deployment" | "change-monitor-checkpoint" | "factory-issue";
|
|
20
|
-
export type ContinuationKind = "github" | "slack" | "origin" | "gitlab" | "bitbucket" | "deployments" | "change_monitors" | "issues" | "http";
|
|
21
|
-
export declare const CONTINUATION_SELECTORS: readonly ["github.pr/v1", "github.pr/v2", "github.issue/v1", "github.issue/v2", "github.none/v2", "slack.thread/v1", "slack.thread/v2", "slack.none/v2", "origin.pr/v1", "origin.pr/v2", "origin.none/v2", "gitlab.mr/v2", "gitlab.none/v2", "bitbucket.pr/v2", "bitbucket.none/v2", "deployments.none/v1", "deployments.none/v2", "deployments.deployment/v2", "change_monitors.checkpoint/v2", "issues.issue/v2", "none/v1", "none/v2"];
|
|
19
|
+
export type ConversationType = "pr" | "issue" | "thread" | "origin-pr" | "gitlab-mr" | "bitbucket-pr" | "deployment" | "change-monitor-checkpoint" | "factory-issue" | "run";
|
|
20
|
+
export type ContinuationKind = "github" | "slack" | "origin" | "gitlab" | "bitbucket" | "deployments" | "change_monitors" | "issues" | "runs" | "http";
|
|
21
|
+
export declare const CONTINUATION_SELECTORS: readonly ["github.pr/v1", "github.pr/v2", "github.issue/v1", "github.issue/v2", "github.none/v2", "slack.thread/v1", "slack.thread/v2", "slack.none/v2", "origin.pr/v1", "origin.pr/v2", "origin.none/v2", "gitlab.mr/v2", "gitlab.none/v2", "bitbucket.pr/v2", "bitbucket.none/v2", "deployments.none/v1", "deployments.none/v2", "deployments.deployment/v2", "change_monitors.checkpoint/v2", "issues.issue/v2", "runs.run/v2", "none/v1", "none/v2"];
|
|
22
22
|
export type ContinuationSelector = (typeof CONTINUATION_SELECTORS)[number];
|
|
23
23
|
export type ContinuationIdentity = ContinuationSelector;
|
|
24
24
|
/** Agent-root protocol version. Omit / `"v1"` keeps engine minting. */
|
|
@@ -47,6 +47,9 @@ export type ContinuationClaim = {
|
|
|
47
47
|
checkpointName: string;
|
|
48
48
|
} | {
|
|
49
49
|
issueName: string;
|
|
50
|
+
} | {
|
|
51
|
+
monitorId: string;
|
|
52
|
+
runId: string;
|
|
50
53
|
};
|
|
51
54
|
};
|
|
52
55
|
export type MailboxContinuation = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuation-identity.d.ts","sourceRoot":"","sources":["../../src/internal/continuation-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,MAAM,gBAAgB,GACxB,IAAI,GACJ,OAAO,GACP,QAAQ,GACR,WAAW,GACX,WAAW,GACX,cAAc,GACd,YAAY,GACZ,2BAA2B,GAC3B,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"continuation-identity.d.ts","sourceRoot":"","sources":["../../src/internal/continuation-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ export const CONTINUATION_SELECTORS = [
|
|
|
39
39
|
"deployments.deployment/v2",
|
|
40
40
|
"change_monitors.checkpoint/v2",
|
|
41
41
|
"issues.issue/v2",
|
|
42
|
+
"runs.run/v2",
|
|
42
43
|
"none/v1",
|
|
43
44
|
"none/v2",
|
|
44
45
|
];
|
|
@@ -132,6 +133,12 @@ export const BUILTINS = [
|
|
|
132
133
|
events: ["issue.created"],
|
|
133
134
|
format: "issues:{issueName}",
|
|
134
135
|
},
|
|
136
|
+
{
|
|
137
|
+
type: "run",
|
|
138
|
+
kind: "runs",
|
|
139
|
+
events: ["run.created"],
|
|
140
|
+
format: "runs:{monitorId}:{runId}",
|
|
141
|
+
},
|
|
135
142
|
];
|
|
136
143
|
export class V2EngineError extends Error {
|
|
137
144
|
constructor(message) {
|
|
@@ -172,6 +179,11 @@ const SELECTOR_FIELDS = {
|
|
|
172
179
|
type: "factory-issue",
|
|
173
180
|
kind: "issues",
|
|
174
181
|
},
|
|
182
|
+
"runs.run/v2": {
|
|
183
|
+
version: 2,
|
|
184
|
+
type: "run",
|
|
185
|
+
kind: "runs",
|
|
186
|
+
},
|
|
175
187
|
"none/v1": { version: 1, type: "none", kind: "http" },
|
|
176
188
|
"none/v2": { version: 2, type: "none", kind: "http" },
|
|
177
189
|
};
|
|
@@ -210,6 +222,8 @@ export function defaultContinuationSelector(kind, version = "v1", eventTypes) {
|
|
|
210
222
|
return membershipOrNone(eventTypes, "change-monitor-checkpoint", "change_monitors.checkpoint/v2", "none/v2");
|
|
211
223
|
case "issues":
|
|
212
224
|
return membershipOrNone(eventTypes, "factory-issue", "issues.issue/v2", "none/v2");
|
|
225
|
+
case "runs":
|
|
226
|
+
return membershipOrNone(eventTypes, "run", "runs.run/v2", "none/v2");
|
|
213
227
|
default:
|
|
214
228
|
return "none/v2";
|
|
215
229
|
}
|
|
@@ -240,6 +254,7 @@ const OMITTED_V2_TYPED_TYPE = {
|
|
|
240
254
|
deployments: "deployment",
|
|
241
255
|
change_monitors: "change-monitor-checkpoint",
|
|
242
256
|
issues: "factory-issue",
|
|
257
|
+
runs: "run",
|
|
243
258
|
};
|
|
244
259
|
/** Typed membership used when an omitted `/v2` selector becomes type `none`. */
|
|
245
260
|
export function omittedV2TypedType(kind) {
|
|
@@ -325,6 +340,8 @@ function formatConversationKey(type, fields) {
|
|
|
325
340
|
return `change_monitors:${fields.checkpointName}`;
|
|
326
341
|
case "factory-issue":
|
|
327
342
|
return `issues:${fields.issueName}`;
|
|
343
|
+
case "run":
|
|
344
|
+
return `runs:${fields.monitorId}:${fields.runId}`;
|
|
328
345
|
}
|
|
329
346
|
}
|
|
330
347
|
export function mintClaim(claim) {
|
|
@@ -357,6 +374,13 @@ export function mintClaim(claim) {
|
|
|
357
374
|
}
|
|
358
375
|
return `cont:${formatConversationKey("factory-issue", resource)}`;
|
|
359
376
|
}
|
|
377
|
+
case "run": {
|
|
378
|
+
const resource = claim.resource;
|
|
379
|
+
if (!("monitorId" in resource && "runId" in resource)) {
|
|
380
|
+
throw new V2EngineError("v2: run claim requires monitorId and runId");
|
|
381
|
+
}
|
|
382
|
+
return `cont:${formatConversationKey("run", resource)}`;
|
|
383
|
+
}
|
|
360
384
|
case "pr":
|
|
361
385
|
case "issue":
|
|
362
386
|
case "origin-pr":
|
|
@@ -454,6 +478,8 @@ export function extractContinuation(type, eventName, payload) {
|
|
|
454
478
|
return extractNamedResource("change-monitor-checkpoint", "checkpointName", payload, "checkpoint");
|
|
455
479
|
case "factory-issue":
|
|
456
480
|
return extractNamedResource("factory-issue", "issueName", payload, "issue");
|
|
481
|
+
case "run":
|
|
482
|
+
return extractRun(payload);
|
|
457
483
|
}
|
|
458
484
|
}
|
|
459
485
|
/**
|
|
@@ -718,6 +744,23 @@ function bitbucketFullName(repository) {
|
|
|
718
744
|
}
|
|
719
745
|
return `${projectKey}/${slug}`.toLowerCase();
|
|
720
746
|
}
|
|
747
|
+
const RUN_NAME = /^changeMonitors\/([^/]+)\/runs\/([^/]+)$/;
|
|
748
|
+
function extractRun(payload) {
|
|
749
|
+
const record = asRecord(payload);
|
|
750
|
+
const run = asRecord(record?.run);
|
|
751
|
+
const name = nonEmpty(run?.name);
|
|
752
|
+
if (name === undefined) {
|
|
753
|
+
return undefined;
|
|
754
|
+
}
|
|
755
|
+
const match = RUN_NAME.exec(name);
|
|
756
|
+
if (match === null) {
|
|
757
|
+
return undefined;
|
|
758
|
+
}
|
|
759
|
+
return `cont:${formatConversationKey("run", {
|
|
760
|
+
monitorId: match[1],
|
|
761
|
+
runId: match[2],
|
|
762
|
+
})}`;
|
|
763
|
+
}
|
|
721
764
|
function extractNamedResource(type, field, payload, wrapper) {
|
|
722
765
|
const record = asRecord(payload);
|
|
723
766
|
const source = wrapper === undefined ? record : asRecord(record?.[wrapper]);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dollar cost for a whole session, computed by the Cloud Agents
|
|
3
|
+
* `POST /v1/models/estimate-cost` endpoint: billed usage events for the
|
|
4
|
+
* conversation when they can be read, otherwise live catalog pricing of the
|
|
5
|
+
* session's summed tokens.
|
|
6
|
+
*
|
|
7
|
+
* The billed lookup scans the owning team's usage history, so it runs only
|
|
8
|
+
* when something asks for a session's cost, never once per turn.
|
|
9
|
+
*/
|
|
10
|
+
import type { ModelSetting, TurnUsage } from "../types.js";
|
|
11
|
+
export interface UsageCostCents {
|
|
12
|
+
rawCostCents: number;
|
|
13
|
+
chargedCents: number;
|
|
14
|
+
}
|
|
15
|
+
export interface EstimateCostInput {
|
|
16
|
+
model: ModelSetting;
|
|
17
|
+
/** Summed token usage, for the catalog fallback when billed events are unavailable. */
|
|
18
|
+
usage?: TurnUsage;
|
|
19
|
+
agentId?: string;
|
|
20
|
+
conversationId?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface EstimatedCost {
|
|
23
|
+
/** Charged total, in USD. */
|
|
24
|
+
totalUsd: number;
|
|
25
|
+
/** Model id the cost was priced against. */
|
|
26
|
+
model: string;
|
|
27
|
+
/** `"usage"` is billed events; `"catalog"` is live list pricing. */
|
|
28
|
+
source: "usage" | "catalog";
|
|
29
|
+
rawCostCents: number;
|
|
30
|
+
chargedCents: number;
|
|
31
|
+
}
|
|
32
|
+
export type EstimateCostFn = (input: EstimateCostInput) => Promise<EstimatedCost | undefined>;
|
|
33
|
+
export declare function modelSettingId(model: ModelSetting): string;
|
|
34
|
+
/**
|
|
35
|
+
* This estimate-cost client treats OpenAI-compat usage as **provider-gross**
|
|
36
|
+
* (local playground: `prompt_tokens` includes `cachedPromptTokens`). Catalog
|
|
37
|
+
* `costForBaseTier` assumes Anthropic / billing-style disjoint nets and ADDs
|
|
38
|
+
* `cacheRead × cachedRate` on top of `input × inputRate`, so we send
|
|
39
|
+
* `input − cache` for Grok / xAI / GPT / o-series.
|
|
40
|
+
*
|
|
41
|
+
* Non-OpenAI-compat models are left alone. `input < cache` is only a
|
|
42
|
+
* defensive clamp (avoid a negative uncached count), not a detector for
|
|
43
|
+
* billed / openaiProxy-shaped tokens. Cloud catalog fallback with already-
|
|
44
|
+
* netted OpenAI-compat usage is out of scope here.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isOpenAiCompatGrossCacheModel(model: ModelSetting): boolean;
|
|
47
|
+
export declare function toCatalogDisjointUsage(usage: TurnUsage, model?: ModelSetting): TurnUsage;
|
|
48
|
+
export declare function roundCostUsd(usd: number): number;
|
|
49
|
+
export declare function estimatedCostFromCents(args: {
|
|
50
|
+
model: ModelSetting;
|
|
51
|
+
cost: UsageCostCents;
|
|
52
|
+
source: EstimatedCost["source"];
|
|
53
|
+
}): EstimatedCost;
|
|
54
|
+
export declare function estimateCostFromApi(input: EstimateCostInput): Promise<EstimatedCost | undefined>;
|
|
55
|
+
//# sourceMappingURL=estimate-cost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimate-cost.d.ts","sourceRoot":"","sources":["../../src/internal/estimate-cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG3D,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,YAAY,CAAC;IACpB,uFAAuF;IACvF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;AAE9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAE1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAK1E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAYxF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CACjC,GAAG,aAAa,CAQhB;AAWD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAgBpC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dollar cost for
|
|
3
|
-
* `POST /v1/models/estimate-cost` endpoint
|
|
4
|
-
*
|
|
2
|
+
* Dollar cost for a whole session, computed by the Cloud Agents
|
|
3
|
+
* `POST /v1/models/estimate-cost` endpoint: billed usage events for the
|
|
4
|
+
* conversation when they can be read, otherwise live catalog pricing of the
|
|
5
|
+
* session's summed tokens.
|
|
6
|
+
*
|
|
7
|
+
* The billed lookup scans the owning team's usage history, so it runs only
|
|
8
|
+
* when something asks for a session's cost, never once per turn.
|
|
5
9
|
*/
|
|
6
10
|
import { cursorExternalApiUrl, resolveApiKey } from "./cursor/credentials.js";
|
|
7
11
|
export function modelSettingId(model) {
|
|
@@ -39,28 +43,18 @@ export function toCatalogDisjointUsage(usage, model) {
|
|
|
39
43
|
export function roundCostUsd(usd) {
|
|
40
44
|
return Math.round(usd * 1e6) / 1e6;
|
|
41
45
|
}
|
|
42
|
-
export function
|
|
43
|
-
const totalUsd = roundCostUsd(args.cost.chargedCents / 100);
|
|
44
|
-
const model = typeof args.model === "string" ? args.model : modelSettingId(args.model);
|
|
46
|
+
export function estimatedCostFromCents(args) {
|
|
45
47
|
return {
|
|
46
|
-
totalUsd,
|
|
47
|
-
|
|
48
|
-
outputUsd: 0,
|
|
49
|
-
cacheReadUsd: 0,
|
|
50
|
-
cacheWriteUsd: 0,
|
|
51
|
-
model,
|
|
48
|
+
totalUsd: roundCostUsd(args.cost.chargedCents / 100),
|
|
49
|
+
model: modelSettingId(args.model),
|
|
52
50
|
source: args.source,
|
|
53
51
|
rawCostCents: args.cost.rawCostCents,
|
|
54
52
|
chargedCents: args.cost.chargedCents,
|
|
55
53
|
};
|
|
56
54
|
}
|
|
57
|
-
/**
|
|
58
|
-
* A session holds its delivery lease until `turn.completed`, and this request
|
|
59
|
-
* is the last thing in front of that event, so an unbounded wait here queues
|
|
60
|
-
* the next message behind the endpoint's billed-usage lookup.
|
|
61
|
-
*/
|
|
55
|
+
/** The endpoint keeps scanning after this client gives up, so the bound only caps the caller's wait. */
|
|
62
56
|
const ESTIMATE_COST_TIMEOUT_MS = 5_000;
|
|
63
|
-
export async function
|
|
57
|
+
export async function estimateCostFromApi(input) {
|
|
64
58
|
const resolved = await resolveApiKey();
|
|
65
59
|
if (resolved === undefined) {
|
|
66
60
|
return undefined;
|
|
@@ -69,11 +63,10 @@ export async function estimateTurnCostFromApi(input) {
|
|
|
69
63
|
if (priced !== undefined) {
|
|
70
64
|
return priced;
|
|
71
65
|
}
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (!askedForBilledRun || input.usage === undefined) {
|
|
66
|
+
// The billed lookup can time out or miss. Catalog-price the summed usage
|
|
67
|
+
// instead; omitting the ids keeps the retry from asking for billed events
|
|
68
|
+
// again.
|
|
69
|
+
if (input.usage === undefined) {
|
|
77
70
|
return undefined;
|
|
78
71
|
}
|
|
79
72
|
return requestEstimate(resolved.apiKey, { model: input.model, usage: input.usage });
|
|
@@ -97,7 +90,6 @@ async function requestEstimate(apiKey, input) {
|
|
|
97
90
|
cacheWriteTokens: catalogUsage?.cacheWriteTokens,
|
|
98
91
|
agentId: input.agentId,
|
|
99
92
|
conversationId: input.conversationId,
|
|
100
|
-
runId: input.runId,
|
|
101
93
|
}),
|
|
102
94
|
signal: AbortSignal.timeout(ESTIMATE_COST_TIMEOUT_MS),
|
|
103
95
|
});
|
|
@@ -118,8 +110,8 @@ async function requestEstimate(apiKey, input) {
|
|
|
118
110
|
if (typeof body.cost?.rawCostCents !== "number" || typeof body.cost.chargedCents !== "number") {
|
|
119
111
|
return undefined;
|
|
120
112
|
}
|
|
121
|
-
return
|
|
122
|
-
model:
|
|
113
|
+
return estimatedCostFromCents({
|
|
114
|
+
model: input.model,
|
|
123
115
|
cost: body.cost,
|
|
124
116
|
source: body.source === "usage" ? "usage" : "catalog",
|
|
125
117
|
});
|
|
@@ -22,7 +22,7 @@ export declare class SessionEventLog {
|
|
|
22
22
|
/** Appended events whose `appendFile` has not finished. */
|
|
23
23
|
private readonly inflight;
|
|
24
24
|
/**
|
|
25
|
-
* In-process patches (cloud
|
|
25
|
+
* In-process patches (cloud usage backfill) that are not rewritten to
|
|
26
26
|
* `events.ndjson`. Applied on read.
|
|
27
27
|
*/
|
|
28
28
|
private readonly replacements;
|
|
@@ -59,7 +59,7 @@ export declare class SessionEventLog {
|
|
|
59
59
|
snapshot(startIndex?: number): Promise<SessionEvent[]>;
|
|
60
60
|
/**
|
|
61
61
|
* Replace one already-recorded event in this process. Used to backfill
|
|
62
|
-
* usage
|
|
62
|
+
* usage onto historical `turn.completed` rows without rewriting
|
|
63
63
|
* `events.ndjson`. Live subscribers are not notified — patch before
|
|
64
64
|
* opening a replay stream.
|
|
65
65
|
*/
|