@cursor/bdk 0.2.18 → 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/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.CJ-XZTK5.js → app.BzgJFr_T.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.gGwBYU3d.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CpbYgURZ.js → VPLocalSearchBox.Bn5QyUDM.js} +1 -1
- package/dist/docs/assets/chunks/{arc.B081PemO.js → arc.D734Gm5d.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.DPaT_hi-.js → architectureDiagram-Q4EWVU46.NX1jj-YX.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.Buu61NLg.js → baseUniq.nd8dxdeO.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.C6t63owh.js → blockDiagram-DXYQGD6D.DG8faTim.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BtKabdXR.js → c4Diagram-AHTNJAMY.zD31AJ3b.js} +1 -1
- package/dist/docs/assets/chunks/channel.DQLJQMi3.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DQpNaR8N.js → chunk-4BX2VUAB.BHQj6Rko.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DrhL-6Rv.js → chunk-4TB4RGXK.Cs38Yh16.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.DRLIBfNR.js → chunk-55IACEB6.CFUR21JO.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.kuUuFkIg.js → chunk-EDXVE4YY.C80-Sneg.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BlrVxprw.js → chunk-FMBD7UC4.CdT1MGza.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CZCfYeQA.js → chunk-OYMX7WX6.BctEzab0.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.C7rwVEMV.js → chunk-QZHKN3VN.DTneeX3k.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CGseJtT_.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.BWlczAK4.js → cose-bilkent-S5V4N54A.BPYgB-_O.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Cw0tT0bB.js → dagre-KV5264BT.Cu6hECod.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.Cm96ah9V.js → diagram-5BDNPKRD.BMgp95Tz.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Cl0AoWYM.js → diagram-G4DWMVQ6.towWdhDi.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.Bp7mlzKs.js → diagram-MMDJMWI5.D9IfOvE9.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.ClVeqpcW.js → diagram-TYMM5635.NTX57RPu.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.Bi8dojF9.js → erDiagram-SMLLAGMA.DIQLqDqu.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.Bb4urpfG.js → flowDiagram-DWJPFMVM.DhqpItRe.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.whR4wFze.js → ganttDiagram-T4ZO3ILL.B998R3Ps.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.6oVMi6-3.js → gitGraphDiagram-UUTBAWPF.B45nTn8-.js} +1 -1
- package/dist/docs/assets/chunks/{graph.D8AJDOFK.js → graph.DPseWzzM.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.nTpsf5Vk.js → infoDiagram-42DDH7IO._GhhBBai.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DhYDOwyB.js → ishikawaDiagram-UXIWVN3A.CTUMcaMM.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.Bg7Rudw3.js → journeyDiagram-VCZTEJTY.DkJBUddC.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.D80D_ZAR.js → kanban-definition-6JOO6SKY.B5Q3uwhy.js} +1 -1
- package/dist/docs/assets/chunks/{layout.e9hmuC-K.js → layout.CDY13IKh.js} +1 -1
- package/dist/docs/assets/chunks/{linear.D6hEyqVB.js → linear.BPd1ql9p.js} +1 -1
- package/dist/docs/assets/chunks/{min.BPAdvB9D.js → min.dlGuqIBP.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.tm2Sov2Q.js → mindmap-definition-QFDTVHPH.Cp7zCtmb.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.BKHZ497m.js → pieDiagram-DEJITSTG.CRH034nu.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CPj7gSp6.js → quadrantDiagram-34T5L4WZ.BspgZ-pX.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E._U68yVUd.js → requirementDiagram-MS252O5E.CQZqZ0nZ.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6._6jrIQPb.js → sankeyDiagram-XADWPNL6.DllwFU3k.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.D9UlmB6F.js → sequenceDiagram-FGHM5R23.B5fTXycf.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BQSaiJCe.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.25ZC61Iy.js → theme.BgocqONV.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.d-17NZ3L.js → timeline-definition-GMOUNBTQ.DXKUL5rH.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.DE9AGEjG.js → vennDiagram-DHZGUBPP.BrsjYCjp.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.BcY0KddE.js → wardley-RL74JXVD.DZDndEXQ.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9SDNipV.js → wardleyDiagram-NUSXRM2D.C4oM69gv.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.DM1sIMf8.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/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/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} +15 -23
- package/dist/internal/event-log.d.ts +2 -2
- package/dist/internal/event-log.js +2 -2
- package/dist/internal/http-channel.js +1 -1
- package/dist/internal/init-scaffold.d.ts.map +1 -1
- package/dist/internal/init-scaffold.js +3 -4
- 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/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +5 -13
- 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 +22 -40
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +62 -109
- 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/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 +17 -26
- 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 +4 -3
- package/templates/agentic-owners/bot/lib/owners/matching.ts +57 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.ylB4B_Ud.js +0 -1
- package/dist/docs/assets/chunks/channel.BgjgeSqp.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CIVv63wE.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CIVv63wE.js +0 -1
- package/dist/docs/assets/chunks/clone.HcW7h-70.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.B5d7jT7E.js +0 -1
- 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-DBmD_cqy.woff2 +0 -0
- package/dist/playground/assets/index-BDPd0Sec.css +0 -1
- package/dist/playground/assets/index-BrXDwbrN.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
|
}
|
|
@@ -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
|
+
}
|
|
@@ -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,29 +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 modelParams = typeof args.model === "string" ? undefined : args.model.params;
|
|
46
|
+
export function estimatedCostFromCents(args) {
|
|
45
47
|
return {
|
|
46
|
-
totalUsd,
|
|
47
|
-
inputUsd: 0,
|
|
48
|
-
outputUsd: 0,
|
|
49
|
-
cacheReadUsd: 0,
|
|
50
|
-
cacheWriteUsd: 0,
|
|
48
|
+
totalUsd: roundCostUsd(args.cost.chargedCents / 100),
|
|
51
49
|
model: modelSettingId(args.model),
|
|
52
|
-
modelParams,
|
|
53
50
|
source: args.source,
|
|
54
51
|
rawCostCents: args.cost.rawCostCents,
|
|
55
52
|
chargedCents: args.cost.chargedCents,
|
|
56
53
|
};
|
|
57
54
|
}
|
|
58
|
-
/**
|
|
59
|
-
* A session holds its delivery lease until `turn.completed`, and this request
|
|
60
|
-
* is the last thing in front of that event, so an unbounded wait here queues
|
|
61
|
-
* the next message behind the endpoint's billed-usage lookup.
|
|
62
|
-
*/
|
|
55
|
+
/** The endpoint keeps scanning after this client gives up, so the bound only caps the caller's wait. */
|
|
63
56
|
const ESTIMATE_COST_TIMEOUT_MS = 5_000;
|
|
64
|
-
export async function
|
|
57
|
+
export async function estimateCostFromApi(input) {
|
|
65
58
|
const resolved = await resolveApiKey();
|
|
66
59
|
if (resolved === undefined) {
|
|
67
60
|
return undefined;
|
|
@@ -70,9 +63,9 @@ export async function estimateTurnCostFromApi(input) {
|
|
|
70
63
|
if (priced !== undefined) {
|
|
71
64
|
return priced;
|
|
72
65
|
}
|
|
73
|
-
// The
|
|
74
|
-
//
|
|
75
|
-
//
|
|
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.
|
|
76
69
|
if (input.usage === undefined) {
|
|
77
70
|
return undefined;
|
|
78
71
|
}
|
|
@@ -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,7 +110,7 @@ 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
|
|
113
|
+
return estimatedCostFromCents({
|
|
122
114
|
model: input.model,
|
|
123
115
|
cost: body.cost,
|
|
124
116
|
source: body.source === "usage" ? "usage" : "catalog",
|
|
@@ -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
|
*/
|
|
@@ -68,7 +68,7 @@ export class SessionEventLog {
|
|
|
68
68
|
/** Appended events whose `appendFile` has not finished. */
|
|
69
69
|
this.inflight = [];
|
|
70
70
|
/**
|
|
71
|
-
* In-process patches (cloud
|
|
71
|
+
* In-process patches (cloud usage backfill) that are not rewritten to
|
|
72
72
|
* `events.ndjson`. Applied on read.
|
|
73
73
|
*/
|
|
74
74
|
this.replacements = new Map();
|
|
@@ -174,7 +174,7 @@ export class SessionEventLog {
|
|
|
174
174
|
}
|
|
175
175
|
/**
|
|
176
176
|
* Replace one already-recorded event in this process. Used to backfill
|
|
177
|
-
* usage
|
|
177
|
+
* usage onto historical `turn.completed` rows without rewriting
|
|
178
178
|
* `events.ndjson`. Live subscribers are not notified — patch before
|
|
179
179
|
* opening a replay stream.
|
|
180
180
|
*/
|
|
@@ -191,7 +191,7 @@ export function buildHttpChannelRoutes(args) {
|
|
|
191
191
|
const url = new URL(request.url);
|
|
192
192
|
const asJson = url.searchParams.get("format") === "json";
|
|
193
193
|
const snapshot = await engine.listEvents(sessionId, 0, {
|
|
194
|
-
|
|
194
|
+
backfillCloudUsage: true,
|
|
195
195
|
});
|
|
196
196
|
if (asJson) {
|
|
197
197
|
return jsonResponse({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-scaffold.d.ts","sourceRoot":"","sources":["../../src/internal/init-scaffold.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAkBvE;AAED,eAAO,MAAM,SAAS,EAAE,MAOZ,CAAC;AAgBb,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAgBzD;AAcD,eAAO,MAAM,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"init-scaffold.d.ts","sourceRoot":"","sources":["../../src/internal/init-scaffold.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAkBvE;AAED,eAAO,MAAM,SAAS,EAAE,MAOZ,CAAC;AAgBb,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAgBzD;AAcD,eAAO,MAAM,SAAS,EAAE,MAMvB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAK7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAS3B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,WAAmB,GAAG,MAAM,CA0C/E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAuBtF;AAWD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,EAAE,MAUlC,CAAC;AAWF,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,EACpE,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,WAAmB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -67,10 +67,9 @@ export default defineTool({
|
|
|
67
67
|
},
|
|
68
68
|
});
|
|
69
69
|
`;
|
|
70
|
-
export const MEMORY_TS = `//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
// change where memories live, or delete this file to opt out.
|
|
70
|
+
export const MEMORY_TS = `// Every session and every user of this agent share one memory journal.
|
|
71
|
+
// To turn memory off, delete this file and the "## Memory" section of
|
|
72
|
+
// instructions.md.
|
|
74
73
|
import { memoryHook } from "${PACKAGE_NAME}/memory";
|
|
75
74
|
|
|
76
75
|
export default memoryHook();
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Maps the durable session event stream onto OTel traces / metrics / logs.
|
|
3
3
|
*
|
|
4
4
|
* Attribute names reuse Cursor enterprise wire keys where they overlap
|
|
5
|
-
* (`cursor.conversation.id`, `cursor.token.*`, `cursor.tool
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* (`cursor.conversation.id`, `cursor.token.*`, `cursor.tool.*`) so Agent SDK
|
|
6
|
+
* traces join org metrics/logs in the same collector. Agent-SDK-only fields
|
|
7
|
+
* use `agent_sdk.*`.
|
|
8
8
|
*/
|
|
9
9
|
import type { SessionEvent, SessionInfo } from "../../types.js";
|
|
10
10
|
import { type AttrValue } from "./attrs.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACzD,KAAK,IAAI,IAAI,CAAC;IACd;;;;;OAKG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E;;;;OAIG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,0FAA0F;IAC1F,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC7D,yEAAyE;IACzE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;IACrF,mEAAmE;IACnE,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;CAChF;AAiBD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,aAAa,CA2xBf"}
|
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
* Maps the durable session event stream onto OTel traces / metrics / logs.
|
|
3
3
|
*
|
|
4
4
|
* Attribute names reuse Cursor enterprise wire keys where they overlap
|
|
5
|
-
* (`cursor.conversation.id`, `cursor.token.*`, `cursor.tool
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* (`cursor.conversation.id`, `cursor.token.*`, `cursor.tool.*`) so Agent SDK
|
|
6
|
+
* traces join org metrics/logs in the same collector. Agent-SDK-only fields
|
|
7
|
+
* use `agent_sdk.*`.
|
|
8
8
|
*/
|
|
9
9
|
import { context, ROOT_CONTEXT, SpanKind, SpanStatusCode, trace, } from "@opentelemetry/api";
|
|
10
10
|
import { SeverityNumber } from "@opentelemetry/api-logs";
|
|
11
11
|
import { classifyExpectedDeliveryFailure } from "../expected-delivery-failure.js";
|
|
12
12
|
import { attrs } from "./attrs.js";
|
|
13
|
+
import { computerUseRequestAttrs, computerUseResultAttrs } from "./computer-use-attrs.js";
|
|
13
14
|
const CONTENT_MAX = 2_048;
|
|
14
15
|
export function createOtelCollector(runtime, agentName, log) {
|
|
15
16
|
const sessions = new Map();
|
|
@@ -206,6 +207,7 @@ export function createOtelCollector(runtime, agentName, log) {
|
|
|
206
207
|
const status = event.data.isError ? "failure" : "success";
|
|
207
208
|
if (span !== undefined) {
|
|
208
209
|
span.setAttribute("cursor.tool.status", status);
|
|
210
|
+
span.setAttributes(attrs(computerUseResultAttrs(event.data.toolName, event.data.output)));
|
|
209
211
|
if (logOpts?.toolContent === true && event.data.output !== undefined) {
|
|
210
212
|
span.setAttribute("agent_sdk.tool_output", truncate(json(event.data.output)));
|
|
211
213
|
}
|
|
@@ -300,7 +302,6 @@ export function createOtelCollector(runtime, agentName, log) {
|
|
|
300
302
|
}
|
|
301
303
|
endOpenChildren(turn, startTime);
|
|
302
304
|
const usage = event.data.usage;
|
|
303
|
-
const cost = event.data.cost;
|
|
304
305
|
if (usage !== undefined) {
|
|
305
306
|
turn.span.setAttributes(attrs({
|
|
306
307
|
"agent_sdk.usage.input_tokens": usage.inputTokens,
|
|
@@ -311,17 +312,6 @@ export function createOtelCollector(runtime, agentName, log) {
|
|
|
311
312
|
}));
|
|
312
313
|
recordTokens(event.sessionId, usage);
|
|
313
314
|
}
|
|
314
|
-
if (cost !== undefined) {
|
|
315
|
-
turn.span.setAttributes(attrs({
|
|
316
|
-
"cursor.model.name": cost.model,
|
|
317
|
-
"agent_sdk.cost_usd": cost.totalUsd,
|
|
318
|
-
"agent_sdk.cost_source": cost.source,
|
|
319
|
-
}));
|
|
320
|
-
metrics?.cost.add(cost.totalUsd, join(event.sessionId, {
|
|
321
|
-
"cursor.model.name": cost.model,
|
|
322
|
-
"agent_sdk.agent": agentName,
|
|
323
|
-
}));
|
|
324
|
-
}
|
|
325
315
|
turn.span.setStatus({ code: SpanStatusCode.OK });
|
|
326
316
|
turn.span.end(startTime);
|
|
327
317
|
sessions.get(event.sessionId)?.turns.delete(event.turnId);
|
|
@@ -333,8 +323,6 @@ export function createOtelCollector(runtime, agentName, log) {
|
|
|
333
323
|
...baseLog(event, session),
|
|
334
324
|
"agent_sdk.usage.input_tokens": usage?.inputTokens,
|
|
335
325
|
"agent_sdk.usage.output_tokens": usage?.outputTokens,
|
|
336
|
-
"agent_sdk.cost_usd": cost?.totalUsd,
|
|
337
|
-
"cursor.model.name": cost?.model,
|
|
338
326
|
}));
|
|
339
327
|
return;
|
|
340
328
|
}
|
|
@@ -476,6 +464,7 @@ export function createOtelCollector(runtime, agentName, log) {
|
|
|
476
464
|
return trace.setSpan(context.active(), turn.span);
|
|
477
465
|
}
|
|
478
466
|
function openToolSpan(args) {
|
|
467
|
+
const computerUseAttrs = computerUseRequestAttrs(args.call.toolName, args.call.args);
|
|
479
468
|
const existing = args.turn.tools.get(args.call.callId);
|
|
480
469
|
if (existing !== undefined) {
|
|
481
470
|
// Early `runInCall` opens with callId/toolName only. Fill in
|
|
@@ -483,6 +472,7 @@ export function createOtelCollector(runtime, agentName, log) {
|
|
|
483
472
|
// The OTel parent is fixed at start; `parent_call_id` still records
|
|
484
473
|
// the event-stream hierarchy for nested/subagent calls.
|
|
485
474
|
existing.setAttributes(join(args.sessionId, {
|
|
475
|
+
...computerUseAttrs,
|
|
486
476
|
"agent_sdk.parent_call_id": args.parentCallId ?? args.call.parentCallId,
|
|
487
477
|
"agent_sdk.tool_args": logOpts?.toolContent === true && args.call.args !== undefined
|
|
488
478
|
? truncate(json(args.call.args))
|
|
@@ -504,6 +494,7 @@ export function createOtelCollector(runtime, agentName, log) {
|
|
|
504
494
|
"agent_sdk.tool_args": logOpts?.toolContent === true && args.call.args !== undefined
|
|
505
495
|
? truncate(json(args.call.args))
|
|
506
496
|
: undefined,
|
|
497
|
+
...computerUseAttrs,
|
|
507
498
|
}),
|
|
508
499
|
}, parentCtxFor(args.turn, args.parentCallId ?? args.call.parentCallId));
|
|
509
500
|
args.turn.tools.set(args.call.callId, span);
|
|
@@ -668,10 +659,6 @@ function buildMetrics(meter) {
|
|
|
668
659
|
description: "Token usage by type",
|
|
669
660
|
unit: "{token}",
|
|
670
661
|
}),
|
|
671
|
-
cost: meter.createCounter("cursor.cost.usage", {
|
|
672
|
-
description: "Estimated turn cost in USD",
|
|
673
|
-
unit: "USD",
|
|
674
|
-
}),
|
|
675
662
|
};
|
|
676
663
|
}
|
|
677
664
|
function truncate(value) {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-free span attributes for `computerUse` tool calls.
|
|
3
|
+
*
|
|
4
|
+
* Computer use args hold typed text and screen coordinates, so the collector
|
|
5
|
+
* exports them only under `toolContent`. These attributes keep the batch
|
|
6
|
+
* shape visible without that opt-in.
|
|
7
|
+
*/
|
|
8
|
+
import type { AttrValue } from "./attrs.js";
|
|
9
|
+
type Attrs = Record<string, AttrValue | undefined>;
|
|
10
|
+
export declare function computerUseRequestAttrs(toolName: string, args: unknown): Attrs;
|
|
11
|
+
export declare function computerUseResultAttrs(toolName: string, output: unknown): Attrs;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=computer-use-attrs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer-use-attrs.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/computer-use-attrs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;AAEnD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,CAa9E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,CAU/E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-free span attributes for `computerUse` tool calls.
|
|
3
|
+
*
|
|
4
|
+
* Computer use args hold typed text and screen coordinates, so the collector
|
|
5
|
+
* exports them only under `toolContent`. These attributes keep the batch
|
|
6
|
+
* shape visible without that opt-in.
|
|
7
|
+
*/
|
|
8
|
+
import { isRecord } from "../is-record.js";
|
|
9
|
+
export function computerUseRequestAttrs(toolName, args) {
|
|
10
|
+
if (toolName !== "computerUse" || !isRecord(args) || !Array.isArray(args.actions)) {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
// The SDK adapter emits only known action types, so `type` is a fixed
|
|
14
|
+
// literal and carries no content.
|
|
15
|
+
const types = args.actions.map((action) => isRecord(action) && typeof action.type === "string" ? action.type : "other");
|
|
16
|
+
return {
|
|
17
|
+
"agent_sdk.computer.action_count": types.length,
|
|
18
|
+
"agent_sdk.computer.actions": types.join(","),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function computerUseResultAttrs(toolName, output) {
|
|
22
|
+
if (toolName !== "computerUse" || !isRecord(output)) {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
"agent_sdk.computer.completed_action_count": typeof output.actionCount === "number" ? output.actionCount : undefined,
|
|
27
|
+
"agent_sdk.computer.executor_duration_ms": typeof output.durationMs === "number" ? output.durationMs : undefined,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -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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"}
|