@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
|
@@ -26,7 +26,7 @@ import { assertTimeArgs, normalizeAsOf, schemaTimeWindowKeys, sessionClock } fro
|
|
|
26
26
|
import { SessionAuthError, samePrincipal } from "./auth.js";
|
|
27
27
|
import { mergeChannelStateMutation, mergeChannelStateSkipNull } from "./channel-state.js";
|
|
28
28
|
import { mergeCloudOptions, resolveSessionRuntime } from "./cloud-merge.js";
|
|
29
|
-
import { applyCloudUsageToEvents, cloudSdkAgentIdFromEvents,
|
|
29
|
+
import { applyCloudUsageToEvents, cloudSdkAgentIdFromEvents, isUsageMissingCompletedTurn, mapSdkTokenUsage, } from "./cloud-turn-usage.js";
|
|
30
30
|
import { resolveConnectionEnvTemplates } from "./connection-env.js";
|
|
31
31
|
import { applyAgentContinuationDefaults, channelContinuationIdentity, httpContinuationIdentity, } from "./continuation-channel.js";
|
|
32
32
|
import { continuationSource, isOneShotContinuationKey, resolveV2Key, V2EngineError, } from "./continuation-identity.js";
|
|
@@ -61,7 +61,7 @@ import { StorageCoordinator, isTurnBoundaryEvent } from "./storage-coordinator.j
|
|
|
61
61
|
import { decideToolCall, directCallEffect } from "./tool-policy.js";
|
|
62
62
|
import { retryReadOnlyToolCall } from "./tool-call-retry.js";
|
|
63
63
|
import { normalizeToolResult, toolCallErrorMessage } from "./tool-result.js";
|
|
64
|
-
import {
|
|
64
|
+
import { estimateCostFromApi, roundCostUsd } from "./estimate-cost.js";
|
|
65
65
|
import { TurnGovernor } from "./turn-governor.js";
|
|
66
66
|
import { TurnLeaseStore } from "./turn-lease-store.js";
|
|
67
67
|
import { TurnOutbox } from "./turn-outbox.js";
|
|
@@ -250,10 +250,10 @@ export class SessionEngine {
|
|
|
250
250
|
this.oauthHub = new McpOauthOnDemandHub();
|
|
251
251
|
/** Serve-time resolved connections (see {@link setResolvedConnections}). */
|
|
252
252
|
this.resolvedConnections = [];
|
|
253
|
-
/** Sessions whose completed turns
|
|
254
|
-
this.
|
|
255
|
-
/** Deduped in-flight cloud
|
|
256
|
-
this.
|
|
253
|
+
/** Sessions whose completed turns all carry usage (no further backfill). */
|
|
254
|
+
this.cloudUsageBackfillDone = new Set();
|
|
255
|
+
/** Deduped in-flight cloud usage backfills, keyed by session id. */
|
|
256
|
+
this.cloudUsageBackfill = new Map();
|
|
257
257
|
/** Per-session FileSystem handle cache (not a tree snapshot). */
|
|
258
258
|
this.sessionRoots = new Map();
|
|
259
259
|
/** In-flight factory resolves, so the first turn and a racing callTool share one handle. */
|
|
@@ -266,7 +266,7 @@ export class SessionEngine {
|
|
|
266
266
|
this.runner = options.runner;
|
|
267
267
|
this.logger = options.logger ?? (() => { });
|
|
268
268
|
this.getCloudUsage = options.getCloudUsage ?? defaultGetCloudUsage;
|
|
269
|
-
this.
|
|
269
|
+
this.estimateSessionCost = options.estimateSessionCost ?? estimateCostFromApi;
|
|
270
270
|
this.otel = options.otel;
|
|
271
271
|
this.otelHost = createHostOtelApi({
|
|
272
272
|
agentName: options.project.name,
|
|
@@ -1840,7 +1840,7 @@ export class SessionEngine {
|
|
|
1840
1840
|
const finalUsage = outcome.usage ?? mapper.usage;
|
|
1841
1841
|
const preBoundaryDispatch = this.dispatchChains.get(sessionId);
|
|
1842
1842
|
if (outcome.status === "finished") {
|
|
1843
|
-
|
|
1843
|
+
await this.appendEvent(sessionId, {
|
|
1844
1844
|
type: "turn.completed",
|
|
1845
1845
|
turnId,
|
|
1846
1846
|
data: {
|
|
@@ -1848,15 +1848,6 @@ export class SessionEngine {
|
|
|
1848
1848
|
usage: finalUsage,
|
|
1849
1849
|
},
|
|
1850
1850
|
}, eventContext);
|
|
1851
|
-
if (finalUsage !== undefined) {
|
|
1852
|
-
this.stampTurnCost(sessionId, completed, {
|
|
1853
|
-
model: this.turnModel(record).model ?? DEFAULT_MODEL,
|
|
1854
|
-
usage: finalUsage,
|
|
1855
|
-
agentId: record.sdkAgentId,
|
|
1856
|
-
conversationId: record.sdkAgentId ?? sessionId,
|
|
1857
|
-
runId: outcome.runId,
|
|
1858
|
-
});
|
|
1859
|
-
}
|
|
1860
1851
|
}
|
|
1861
1852
|
else {
|
|
1862
1853
|
const interrupted = signal.aborted && outcome.status === "cancelled";
|
|
@@ -4011,8 +4002,8 @@ export class SessionEngine {
|
|
|
4011
4002
|
}
|
|
4012
4003
|
async eventStream(sessionId, startIndex = 0) {
|
|
4013
4004
|
// Playground Trace replays this stream; backfill before the snapshot
|
|
4014
|
-
// so
|
|
4015
|
-
await this.
|
|
4005
|
+
// so cloud turns that lost their streamed usage still show tokens.
|
|
4006
|
+
await this.backfillCloudTurnUsage(sessionId);
|
|
4016
4007
|
const log = await this.logs.get(sessionId);
|
|
4017
4008
|
return log.stream(startIndex);
|
|
4018
4009
|
}
|
|
@@ -4063,133 +4054,82 @@ export class SessionEngine {
|
|
|
4063
4054
|
await this.appendEvent(sessionId, { type: "eval.case.result", data });
|
|
4064
4055
|
}
|
|
4065
4056
|
/**
|
|
4066
|
-
*
|
|
4067
|
-
*
|
|
4068
|
-
*
|
|
4069
|
-
* stops before the estimate lands leaves the turn unpriced; `sessionCost`
|
|
4070
|
-
* prices the session on read.
|
|
4071
|
-
*/
|
|
4072
|
-
stampTurnCost(sessionId, completed, input) {
|
|
4073
|
-
void this.priceTurn(input)
|
|
4074
|
-
.then(async (cost) => {
|
|
4075
|
-
if (cost === undefined || completed.type !== "turn.completed") {
|
|
4076
|
-
return;
|
|
4077
|
-
}
|
|
4078
|
-
// Same object the turn.completed hook is waiting on.
|
|
4079
|
-
completed.data = { ...completed.data, cost };
|
|
4080
|
-
const log = await this.logs.get(sessionId);
|
|
4081
|
-
log.replace(completed.index, completed);
|
|
4082
|
-
})
|
|
4083
|
-
.catch((error) => {
|
|
4084
|
-
this.logger(`[bdk] turn cost stamp failed for ${sessionId}: ${describeError(error)}`);
|
|
4085
|
-
});
|
|
4086
|
-
}
|
|
4087
|
-
async priceTurn(input) {
|
|
4088
|
-
try {
|
|
4089
|
-
return await this.estimateTurnCost(input);
|
|
4090
|
-
}
|
|
4091
|
-
catch (error) {
|
|
4092
|
-
this.logger(`[bdk] turn cost estimate failed: ${describeError(error)}`);
|
|
4093
|
-
return undefined;
|
|
4094
|
-
}
|
|
4095
|
-
}
|
|
4096
|
-
/**
|
|
4097
|
-
* Billed/catalog cost for a session. Powers playground, traces, and
|
|
4098
|
-
* `agent-sdk cost` via `GET /v1/session/:id/cost`.
|
|
4057
|
+
* Billed/catalog cost of the whole session, priced once per call. Powers
|
|
4058
|
+
* the playground, `bdk run`, and `bdk cost` via `GET /v1/session/:id/cost`.
|
|
4059
|
+
* The billed lookup is expensive, so nothing on the turn path calls this.
|
|
4099
4060
|
*/
|
|
4100
4061
|
async sessionCost(sessionId) {
|
|
4101
4062
|
const record = await this.getOrRestoreSession(sessionId);
|
|
4102
4063
|
if (record === undefined) {
|
|
4103
4064
|
throw new Error(`Unknown session: ${sessionId}`);
|
|
4104
4065
|
}
|
|
4105
|
-
await this.
|
|
4066
|
+
await this.backfillCloudTurnUsage(sessionId);
|
|
4106
4067
|
const events = await this.listEvents(sessionId);
|
|
4107
4068
|
const sdkAgentId = (record.sdkAgentId !== undefined && record.sdkAgentId !== ""
|
|
4108
4069
|
? record.sdkAgentId
|
|
4109
4070
|
: undefined) ?? cloudSdkAgentIdFromEvents(events);
|
|
4110
|
-
const
|
|
4111
|
-
|
|
4112
|
-
|
|
4071
|
+
const priced = await this.estimateSessionCost({
|
|
4072
|
+
model: this.turnModel(record).model ?? DEFAULT_MODEL,
|
|
4073
|
+
usage: sumSessionUsage(events),
|
|
4113
4074
|
agentId: sdkAgentId,
|
|
4114
4075
|
conversationId: sdkAgentId ?? sessionId,
|
|
4115
4076
|
});
|
|
4116
|
-
if (priced
|
|
4077
|
+
if (priced === undefined || (priced.source !== "usage" && priced.totalUsd <= 0)) {
|
|
4117
4078
|
return {
|
|
4118
4079
|
sessionId,
|
|
4119
|
-
source:
|
|
4120
|
-
cost: {
|
|
4121
|
-
|
|
4122
|
-
|
|
4123
|
-
},
|
|
4124
|
-
costUsd: priced.totalUsd,
|
|
4125
|
-
rawCostUsd: roundCostUsd((priced.rawCostCents ?? priced.chargedCents ?? priced.totalUsd * 100) / 100),
|
|
4126
|
-
model: priced.model,
|
|
4080
|
+
source: "unavailable",
|
|
4081
|
+
cost: { rawCostCents: 0, chargedCents: 0 },
|
|
4082
|
+
costUsd: 0,
|
|
4083
|
+
rawCostUsd: 0,
|
|
4127
4084
|
};
|
|
4128
4085
|
}
|
|
4129
|
-
let costUsd = 0;
|
|
4130
|
-
let rawCostUsd = 0;
|
|
4131
|
-
let source = "unavailable";
|
|
4132
|
-
let modelId;
|
|
4133
|
-
for (const event of events) {
|
|
4134
|
-
if (event.type !== "turn.completed" || event.data.cost === undefined) {
|
|
4135
|
-
continue;
|
|
4136
|
-
}
|
|
4137
|
-
costUsd = roundCostUsd(costUsd + event.data.cost.totalUsd);
|
|
4138
|
-
const rawCents = event.data.cost.rawCostCents;
|
|
4139
|
-
rawCostUsd = roundCostUsd(rawCostUsd + (rawCents !== undefined ? rawCents / 100 : event.data.cost.totalUsd));
|
|
4140
|
-
source = event.data.cost.source;
|
|
4141
|
-
modelId = event.data.cost.model;
|
|
4142
|
-
}
|
|
4143
4086
|
return {
|
|
4144
4087
|
sessionId,
|
|
4145
|
-
source,
|
|
4146
|
-
cost: {
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
costUsd,
|
|
4151
|
-
rawCostUsd,
|
|
4152
|
-
model: modelId,
|
|
4088
|
+
source: priced.source,
|
|
4089
|
+
cost: { rawCostCents: priced.rawCostCents, chargedCents: priced.chargedCents },
|
|
4090
|
+
costUsd: priced.totalUsd,
|
|
4091
|
+
rawCostUsd: roundCostUsd(priced.rawCostCents / 100),
|
|
4092
|
+
model: priced.model,
|
|
4153
4093
|
};
|
|
4154
4094
|
}
|
|
4155
4095
|
/** Snapshot of recorded events (for download / offline trace). */
|
|
4156
4096
|
async listEvents(sessionId, startIndex = 0, options) {
|
|
4157
|
-
if (options?.
|
|
4158
|
-
await this.
|
|
4097
|
+
if (options?.backfillCloudUsage === true) {
|
|
4098
|
+
await this.backfillCloudTurnUsage(sessionId);
|
|
4159
4099
|
}
|
|
4160
4100
|
const log = await this.logs.get(sessionId);
|
|
4161
4101
|
return log.snapshot(startIndex);
|
|
4162
4102
|
}
|
|
4163
4103
|
/**
|
|
4164
|
-
*
|
|
4165
|
-
*
|
|
4166
|
-
*
|
|
4104
|
+
* Cloud turns may lack usage on `turn.completed` (pre-0.1.29 engines, or
|
|
4105
|
+
* getUsage still zero at turn end). Fill them from billed usage before the
|
|
4106
|
+
* playground replays the stream so Trace can show their tokens.
|
|
4167
4107
|
*/
|
|
4168
|
-
|
|
4169
|
-
if (this.
|
|
4108
|
+
backfillCloudTurnUsage(sessionId) {
|
|
4109
|
+
if (this.cloudUsageBackfillDone.has(sessionId)) {
|
|
4170
4110
|
return Promise.resolve();
|
|
4171
4111
|
}
|
|
4172
|
-
const pending = this.
|
|
4112
|
+
const pending = this.cloudUsageBackfill.get(sessionId);
|
|
4173
4113
|
if (pending !== undefined) {
|
|
4174
4114
|
return pending;
|
|
4175
4115
|
}
|
|
4176
|
-
const work = this.
|
|
4116
|
+
const work = this.runCloudTurnUsageBackfill(sessionId)
|
|
4177
4117
|
.catch((error) => {
|
|
4178
|
-
this.logger(`[bdk] cloud
|
|
4118
|
+
this.logger(`[bdk] cloud usage backfill failed for ${sessionId}: ${describeError(error)}`);
|
|
4179
4119
|
})
|
|
4180
4120
|
.finally(() => {
|
|
4181
|
-
this.
|
|
4121
|
+
this.cloudUsageBackfill.delete(sessionId);
|
|
4182
4122
|
});
|
|
4183
|
-
this.
|
|
4123
|
+
this.cloudUsageBackfill.set(sessionId, work);
|
|
4184
4124
|
return work;
|
|
4185
4125
|
}
|
|
4186
|
-
async
|
|
4126
|
+
async runCloudTurnUsageBackfill(sessionId) {
|
|
4187
4127
|
const log = await this.logs.get(sessionId);
|
|
4188
4128
|
const events = await log.snapshot(0);
|
|
4189
|
-
if (!events.some((event) =>
|
|
4129
|
+
if (!events.some((event) => isUsageMissingCompletedTurn(event))) {
|
|
4190
4130
|
if (!this.isTurnRunning(sessionId) &&
|
|
4191
4131
|
events.some((event) => event.type === "turn.completed")) {
|
|
4192
|
-
this.
|
|
4132
|
+
this.cloudUsageBackfillDone.add(sessionId);
|
|
4193
4133
|
}
|
|
4194
4134
|
return;
|
|
4195
4135
|
}
|
|
@@ -4203,8 +4143,7 @@ export class SessionEngine {
|
|
|
4203
4143
|
if (billed === undefined) {
|
|
4204
4144
|
return;
|
|
4205
4145
|
}
|
|
4206
|
-
const
|
|
4207
|
-
const patched = applyCloudUsageToEvents(events, billed, model);
|
|
4146
|
+
const patched = applyCloudUsageToEvents(events, billed);
|
|
4208
4147
|
if (patched === undefined) {
|
|
4209
4148
|
return;
|
|
4210
4149
|
}
|
|
@@ -4216,8 +4155,8 @@ export class SessionEngine {
|
|
|
4216
4155
|
}
|
|
4217
4156
|
log.replace(i, next);
|
|
4218
4157
|
}
|
|
4219
|
-
if (!(await log.snapshot(0)).some((event) =>
|
|
4220
|
-
this.
|
|
4158
|
+
if (!(await log.snapshot(0)).some((event) => isUsageMissingCompletedTurn(event))) {
|
|
4159
|
+
this.cloudUsageBackfillDone.add(sessionId);
|
|
4221
4160
|
}
|
|
4222
4161
|
}
|
|
4223
4162
|
async setContinuationToken(sessionId, token) {
|
|
@@ -4495,7 +4434,7 @@ export class SessionEngine {
|
|
|
4495
4434
|
// storage coordinator skips volatile-only record rewrites, bounded).
|
|
4496
4435
|
// New turnIds mint from turnCount, so clamp it to the highest turn the
|
|
4497
4436
|
// stream already used; otherwise a replacement process re-mints turn_N ids
|
|
4498
|
-
// and trajectory/
|
|
4437
|
+
// and trajectory/usage grouping merges unrelated turns.
|
|
4499
4438
|
const restored = withTurnCountClampedToEvents(record, events);
|
|
4500
4439
|
await this.materializeSession(restored, eventsNdjson(events));
|
|
4501
4440
|
this.logger(`[bdk] lazily restored session ${restored.sessionId} from storage`);
|
|
@@ -4645,17 +4584,31 @@ function toolErrorResult(message) {
|
|
|
4645
4584
|
isError: true,
|
|
4646
4585
|
};
|
|
4647
4586
|
}
|
|
4587
|
+
/** Token usage summed over every completed turn; undefined when no turn reported any. */
|
|
4588
|
+
function sumSessionUsage(events) {
|
|
4589
|
+
let total;
|
|
4590
|
+
for (const event of events) {
|
|
4591
|
+
if (event.type !== "turn.completed" || event.data.usage === undefined) {
|
|
4592
|
+
continue;
|
|
4593
|
+
}
|
|
4594
|
+
const usage = event.data.usage;
|
|
4595
|
+
total ??= { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };
|
|
4596
|
+
total.inputTokens += usage.inputTokens;
|
|
4597
|
+
total.outputTokens += usage.outputTokens;
|
|
4598
|
+
total.cacheReadTokens += usage.cacheReadTokens;
|
|
4599
|
+
total.cacheWriteTokens += usage.cacheWriteTokens;
|
|
4600
|
+
}
|
|
4601
|
+
return total;
|
|
4602
|
+
}
|
|
4648
4603
|
async function defaultGetCloudUsage(sdkAgentId) {
|
|
4649
4604
|
try {
|
|
4650
4605
|
const { Agent } = await import("@cursor/sdk");
|
|
4651
4606
|
const billed = await Agent.getUsage(sdkAgentId);
|
|
4652
4607
|
return {
|
|
4653
4608
|
usage: mapSdkTokenUsage(billed.usage),
|
|
4654
|
-
cost: billed.cost,
|
|
4655
4609
|
runs: billed.runs.map((run) => ({
|
|
4656
4610
|
runId: run.runId,
|
|
4657
4611
|
usage: mapSdkTokenUsage(run.usage),
|
|
4658
|
-
cost: run.cost,
|
|
4659
4612
|
})),
|
|
4660
4613
|
};
|
|
4661
4614
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Customer-facing errors never include hosting URLs or infra jargon.
|
|
5
5
|
*/
|
|
6
|
-
import type { SessionEvent, SessionListSource, SessionSummary } from "../types.js";
|
|
6
|
+
import type { SessionCost, SessionEvent, SessionListSource, SessionSummary } from "../types.js";
|
|
7
7
|
import { type RequestAuth } from "./request-headers.js";
|
|
8
8
|
export interface ListedSessions {
|
|
9
9
|
sessions: SessionSummary[];
|
|
@@ -29,6 +29,18 @@ export declare function fetchSessionEvents(args: {
|
|
|
29
29
|
fetchImpl?: typeof fetch;
|
|
30
30
|
signal?: AbortSignal;
|
|
31
31
|
}): Promise<SessionEvent[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Whole-session cost from `GET /v1/session/:id/cost`. Undefined when the
|
|
34
|
+
* server cannot price the session or does not serve the route, so callers
|
|
35
|
+
* can treat cost as optional.
|
|
36
|
+
*/
|
|
37
|
+
export declare function fetchSessionCost(args: {
|
|
38
|
+
baseUrl: string;
|
|
39
|
+
sessionId: string;
|
|
40
|
+
auth?: RequestAuth;
|
|
41
|
+
fetchImpl?: typeof fetch;
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
}): Promise<SessionCost | undefined>;
|
|
32
44
|
/**
|
|
33
45
|
* Pick the previous (most recently updated) followable session for
|
|
34
46
|
* `resume` / `chat --resume` when no session id was passed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions-client.d.ts","sourceRoot":"","sources":["../../src/internal/sessions-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions-client.d.ts","sourceRoot":"","sources":["../../src/internal/sessions-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhG,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAEpF;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8B5F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAqE1B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAsBnC;AAkCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAClC,cAAc,GAAG,SAAS,CAQ5B;AAED,+DAA+D;AAC/D,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO9B;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAIzE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACvC,MAAM,CAgBR"}
|
|
@@ -106,6 +106,30 @@ export async function fetchSessionEvents(args) {
|
|
|
106
106
|
throw new Error(sanitizeCustomerError(error instanceof Error ? error.message : "Could not fetch session events."));
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Whole-session cost from `GET /v1/session/:id/cost`. Undefined when the
|
|
111
|
+
* server cannot price the session or does not serve the route, so callers
|
|
112
|
+
* can treat cost as optional.
|
|
113
|
+
*/
|
|
114
|
+
export async function fetchSessionCost(args) {
|
|
115
|
+
const baseUrl = args.baseUrl.replace(/\/$/, "");
|
|
116
|
+
const fetchImpl = args.fetchImpl ?? fetch;
|
|
117
|
+
try {
|
|
118
|
+
const resp = await fetchImpl(`${baseUrl}/v1/session/${encodeURIComponent(args.sessionId)}/cost`, { headers: mergeRequestHeaders(args.auth), signal: args.signal });
|
|
119
|
+
if (!resp.ok) {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
const body = (await resp.json());
|
|
123
|
+
if (typeof body.costUsd !== "number" ||
|
|
124
|
+
(body.source !== "usage" && body.source !== "catalog")) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
return body;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
109
133
|
/** Lenient parse so partial stubs / older servers still list by sessionId. */
|
|
110
134
|
function parseSessionSummary(value) {
|
|
111
135
|
if (typeof value !== "object" || value === null) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* messages, assistant text, tool calls with args/results, and
|
|
6
6
|
* success/failure — not a firehose of streaming deltas.
|
|
7
7
|
*/
|
|
8
|
-
import type { SessionEvent,
|
|
8
|
+
import type { SessionEvent, TurnUsage } from "../types.js";
|
|
9
9
|
export interface TrajectoryToolCall {
|
|
10
10
|
callId: string;
|
|
11
11
|
toolName: string;
|
|
@@ -32,8 +32,6 @@ export interface TrajectoryTurn {
|
|
|
32
32
|
toolCalls: TrajectoryToolCall[];
|
|
33
33
|
subagents: TrajectorySubagent[];
|
|
34
34
|
usage?: TurnUsage;
|
|
35
|
-
/** Estimated dollar cost of this turn (from the `turn.completed` event). */
|
|
36
|
-
cost?: TurnCost;
|
|
37
35
|
result?: string;
|
|
38
36
|
failed: boolean;
|
|
39
37
|
error?: string;
|
|
@@ -47,7 +45,10 @@ export interface Trajectory {
|
|
|
47
45
|
finalText: string;
|
|
48
46
|
turnsFailed: number;
|
|
49
47
|
toolCallCount: number;
|
|
50
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* The session's cost from `GET /v1/session/:id/cost`, priced once after the
|
|
50
|
+
* last turn. Never derived from events; absent when nobody priced it.
|
|
51
|
+
*/
|
|
51
52
|
totalCostUsd?: number;
|
|
52
53
|
turns: TrajectoryTurn[];
|
|
53
54
|
}
|
|
@@ -56,8 +57,6 @@ export interface Trajectory {
|
|
|
56
57
|
* folded into final assistant / reasoning text per turn.
|
|
57
58
|
*/
|
|
58
59
|
export declare function buildTrajectory(events: SessionEvent[]): Trajectory;
|
|
59
|
-
/** Micro-dollar precision so summed floats stay readable in JSON. */
|
|
60
|
-
export declare function roundCostUsd(usd: number): number;
|
|
61
60
|
/** Compact dollar display for estimated costs (`$0.0132`, `$1.25`). */
|
|
62
61
|
export declare function formatCostUsd(usd: number): string;
|
|
63
62
|
/** Parse an `events.ndjson` file (or any NDJSON blob of SessionEvents). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/internal/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/internal/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACtC,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CA+NlE;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWjD;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAc9D;AAED,sDAAsD;AACtD,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAGpF;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAoDnE"}
|
|
@@ -188,9 +188,6 @@ export function buildTrajectory(events) {
|
|
|
188
188
|
if (event.data.usage !== undefined) {
|
|
189
189
|
turn.usage = event.data.usage;
|
|
190
190
|
}
|
|
191
|
-
if (event.data.cost !== undefined) {
|
|
192
|
-
turn.cost = event.data.cost;
|
|
193
|
-
}
|
|
194
191
|
if (event.data.result !== undefined) {
|
|
195
192
|
turn.result = event.data.result;
|
|
196
193
|
if (turn.assistantText === "") {
|
|
@@ -223,10 +220,6 @@ export function buildTrajectory(events) {
|
|
|
223
220
|
const turnsFailed = turns.filter((t) => t.failed).length;
|
|
224
221
|
const toolCallCount = turns.reduce((n, t) => n + t.toolCalls.length + t.subagents.reduce((m, s) => m + s.toolCalls.length, 0), 0);
|
|
225
222
|
const lastGood = [...turns].reverse().find((t) => t.assistantText !== "");
|
|
226
|
-
const costedTurns = turns.filter((t) => t.cost !== undefined);
|
|
227
|
-
const totalCostUsd = costedTurns.length === 0
|
|
228
|
-
? undefined
|
|
229
|
-
: roundCostUsd(costedTurns.reduce((sum, t) => sum + (t.cost?.totalUsd ?? 0), 0));
|
|
230
223
|
return {
|
|
231
224
|
sessionId,
|
|
232
225
|
...(sdkAgentId === undefined ? {} : { sdkAgentId }),
|
|
@@ -236,14 +229,9 @@ export function buildTrajectory(events) {
|
|
|
236
229
|
finalText: lastGood?.assistantText ?? "",
|
|
237
230
|
turnsFailed,
|
|
238
231
|
toolCallCount,
|
|
239
|
-
...(totalCostUsd === undefined ? {} : { totalCostUsd }),
|
|
240
232
|
turns,
|
|
241
233
|
};
|
|
242
234
|
}
|
|
243
|
-
/** Micro-dollar precision so summed floats stay readable in JSON. */
|
|
244
|
-
export function roundCostUsd(usd) {
|
|
245
|
-
return Math.round(usd * 1e6) / 1e6;
|
|
246
|
-
}
|
|
247
235
|
/** Compact dollar display for estimated costs (`$0.0132`, `$1.25`). */
|
|
248
236
|
export function formatCostUsd(usd) {
|
|
249
237
|
if (!Number.isFinite(usd)) {
|
|
@@ -324,7 +312,7 @@ export function formatTrajectoryText(trajectory) {
|
|
|
324
312
|
lines.push(` error: ${turn.error}`);
|
|
325
313
|
}
|
|
326
314
|
if (turn.usage !== undefined) {
|
|
327
|
-
lines.push(` usage: in ${turn.usage.inputTokens} out ${turn.usage.outputTokens}
|
|
315
|
+
lines.push(` usage: in ${turn.usage.inputTokens} out ${turn.usage.outputTokens}`);
|
|
328
316
|
}
|
|
329
317
|
}
|
|
330
318
|
return `${lines.join("\n")}\n`;
|
package/dist/memory.d.ts
CHANGED
|
@@ -90,14 +90,17 @@ export interface AgentStoreMemoryBackendOptions {
|
|
|
90
90
|
*/
|
|
91
91
|
export declare function agentStoreMemoryBackend(options?: AgentStoreMemoryBackendOptions): MemoryBackend;
|
|
92
92
|
export interface MemoryHookOptions {
|
|
93
|
-
/**
|
|
93
|
+
/**
|
|
94
|
+
* Where records go. Defaults to {@link agentStoreMemoryBackend} on
|
|
95
|
+
* Cursor-managed hosting and {@link fileMemoryBackend} elsewhere.
|
|
96
|
+
*/
|
|
94
97
|
backend?: MemoryBackend;
|
|
95
98
|
/** Truncation cap for stored userMessage / result text. Default 2000. */
|
|
96
99
|
maxTextLength?: number;
|
|
97
100
|
}
|
|
98
101
|
/**
|
|
99
102
|
* Observe-only hook that journals every turn. Author it as
|
|
100
|
-
* `
|
|
103
|
+
* `bot/hooks/memory.ts`:
|
|
101
104
|
*
|
|
102
105
|
* ```ts
|
|
103
106
|
* import { memoryHook } from "@cursor/bdk/memory";
|
package/dist/memory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAe,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzE,sEAAsE;AACtE,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,gDAAgD;AAChD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,UAAU,CACR,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;OAKG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,aAAa,CA6BvF;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,uCAAuC;IACvC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,aAAa,CA6Jf;AAgBD,MAAM,WAAW,iBAAiB;IAChC
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAe,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzE,sEAAsE;AACtE,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,gDAAgD;AAChD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,UAAU,CACR,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;OAKG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,aAAa,CA6BvF;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,uCAAuC;IACvC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,aAAa,CA6Jf;AAgBD,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,cAAc,CAgG1E"}
|
package/dist/memory.js
CHANGED
|
Binary file
|