@cursor/july 0.1.26 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ab.d.ts +6 -0
- package/dist/ab.d.ts.map +1 -1
- package/dist/ab.js +1 -0
- package/dist/artifacts.d.ts +34 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +57 -0
- package/dist/bin/agent-serve.js +43 -12
- package/dist/channels/github/github-channel.d.ts +1 -1
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +14 -1
- package/dist/channels/github/types.d.ts +6 -1
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/slack/api.d.ts +2 -1
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +1 -0
- package/dist/channels/slack/auth.d.ts +13 -13
- package/dist/channels/slack/auth.d.ts.map +1 -1
- package/dist/channels/slack/auth.js +19 -10
- package/dist/channels/slack/cursor-account.d.ts +2 -1
- package/dist/channels/slack/cursor-account.d.ts.map +1 -1
- package/dist/channels/slack/cursor-account.js +3 -1
- package/dist/channels/slack/defaults.d.ts +7 -4
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +14 -4
- package/dist/channels/slack/dispatch.d.ts +10 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +59 -21
- package/dist/channels/slack/external-policy.d.ts +27 -0
- package/dist/channels/slack/external-policy.d.ts.map +1 -0
- package/dist/channels/slack/external-policy.js +53 -0
- package/dist/channels/slack/index.d.ts +1 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +1 -0
- package/dist/channels/slack/interactive.d.ts +8 -1
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +43 -15
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +22 -8
- package/dist/channels/slack/types.d.ts +16 -1
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.DYcC9FY-.js → app.CqjrYaT2.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.VWQoPFJ1.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.o4N_knTV.js → VPLocalSearchBox.ag-MwUel.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DQ-njyo0.js → theme.BS-DJWat.js} +2 -2
- package/dist/docs/assets/{guides_slack.md.D_xFKlnF.js → guides_slack.md.CjmJSvZS.js} +8 -4
- package/dist/docs/assets/guides_slack.md.CjmJSvZS.lean.js +1 -0
- package/dist/docs/assets/guides_webhooks.md.wSOYas3X.js +183 -0
- package/dist/docs/assets/{guides_webhooks.md.B1EswtUu.lean.js → guides_webhooks.md.wSOYas3X.lean.js} +1 -1
- package/dist/docs/assets/{index.md.Dfv5ic9t.js → index.md.CH_s5uZe.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.DdmiKgqf.js → reference_channels.md.CDhTRfUz.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.DdmiKgqf.lean.js → reference_channels.md.CDhTRfUz.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +3 -3
- package/dist/docs/concepts.html +3 -3
- package/dist/docs/deployment.html +3 -3
- package/dist/docs/evals.html +3 -3
- package/dist/docs/example-agents/approval-buddy.html +3 -3
- package/dist/docs/example-agents/benny.html +3 -3
- package/dist/docs/example-agents/bugbot.html +3 -3
- package/dist/docs/example-agents/codebase-wiki.html +3 -3
- package/dist/docs/example-agents/codeowners-review.html +3 -3
- package/dist/docs/example-agents/concierge.html +3 -3
- package/dist/docs/example-agents/fsd.html +3 -3
- package/dist/docs/example-agents/index.html +3 -3
- package/dist/docs/example-agents/knowledge-base.html +3 -3
- package/dist/docs/example-agents/oncall.html +3 -3
- package/dist/docs/example-agents/security-reviewer.html +3 -3
- package/dist/docs/example-agents/slack-agent.html +3 -3
- package/dist/docs/example-agents/weather-agent.html +3 -3
- package/dist/docs/guides/agent-to-agent.html +3 -3
- package/dist/docs/guides/cloud-runtime.html +3 -3
- package/dist/docs/guides/github.html +3 -3
- package/dist/docs/guides/human-in-the-loop.html +3 -3
- package/dist/docs/guides/mcp-oauth.html +3 -3
- package/dist/docs/guides/slack.html +11 -7
- package/dist/docs/guides/webhooks.html +138 -5
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +3 -3
- package/dist/docs/index.html +5 -5
- package/dist/docs/quickstart.html +3 -3
- package/dist/docs/reference/agent-config.html +3 -3
- package/dist/docs/reference/channels.html +5 -5
- package/dist/docs/reference/cli.html +3 -3
- package/dist/docs/reference/connections.html +3 -3
- package/dist/docs/reference/hooks.html +3 -3
- package/dist/docs/reference/http-api.html +3 -3
- package/dist/docs/reference/instructions.html +3 -3
- package/dist/docs/reference/playground.html +3 -3
- package/dist/docs/reference/project-layout.html +3 -3
- package/dist/docs/reference/prompt.html +3 -3
- package/dist/docs/reference/schedules.html +3 -3
- package/dist/docs/reference/sessions.html +3 -3
- package/dist/docs/reference/skills.html +3 -3
- package/dist/docs/reference/subagents.html +3 -3
- package/dist/docs/reference/tools.html +3 -3
- package/dist/docs/scaffolding-agents.html +3 -3
- package/dist/docs/storage.html +3 -3
- package/dist/docs/troubleshooting.html +3 -3
- package/dist/evals/assertions.d.ts +10 -1
- package/dist/evals/assertions.d.ts.map +1 -1
- package/dist/evals/assertions.js +12 -0
- package/dist/evals.d.ts +1 -1
- package/dist/evals.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/internal/ab-fold.d.ts.map +1 -1
- package/dist/internal/ab-fold.js +4 -0
- package/dist/internal/ab-snapshot.d.ts.map +1 -1
- package/dist/internal/ab-snapshot.js +1 -0
- package/dist/internal/artifacts-store.d.ts +45 -0
- package/dist/internal/artifacts-store.d.ts.map +1 -0
- package/dist/internal/artifacts-store.js +250 -0
- package/dist/internal/builtin-tools/artifacts.d.ts +10 -0
- package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -0
- package/dist/internal/builtin-tools/artifacts.js +73 -0
- package/dist/internal/builtin-tools/index.d.ts +8 -1
- package/dist/internal/builtin-tools/index.d.ts.map +1 -1
- package/dist/internal/builtin-tools/index.js +15 -0
- package/dist/internal/cli-ax.d.ts +19 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +196 -57
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +14 -6
- package/dist/internal/cursor-slack-relay.d.ts +2 -0
- package/dist/internal/cursor-slack-relay.d.ts.map +1 -1
- package/dist/internal/cursor-slack-relay.js +1 -0
- package/dist/internal/deploy-client.d.ts +2 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +1 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +91 -3
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +1 -0
- package/dist/internal/model-pricing.d.ts +49 -0
- package/dist/internal/model-pricing.d.ts.map +1 -0
- package/dist/internal/model-pricing.js +377 -0
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +1 -0
- package/dist/internal/schedule-runner.d.ts.map +1 -1
- package/dist/internal/schedule-runner.js +1 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +9 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +49 -5
- package/dist/internal/session-cost.d.ts +49 -0
- package/dist/internal/session-cost.d.ts.map +1 -0
- package/dist/internal/session-cost.js +175 -0
- package/dist/internal/session-engine.d.ts +35 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +128 -7
- package/dist/internal/storage-coordinator.d.ts +15 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +52 -0
- package/dist/internal/trajectory.d.ts +9 -1
- package/dist/internal/trajectory.d.ts.map +1 -1
- package/dist/internal/trajectory.js +32 -5
- package/dist/playground/assets/index-Bul1WfrB.css +1 -0
- package/dist/playground/assets/index-CkN74U_L.js +87 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage.d.ts +4 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +4 -0
- package/dist/types.d.ts +164 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +1 -0
- package/docs/guides/slack.md +32 -7
- package/docs/guides/webhooks.md +183 -0
- package/docs/reference/channels.md +2 -1
- package/package.json +26 -26
- package/skills/setup-slack/SKILL.md +3 -0
- package/src/ab.ts +7 -0
- package/src/bin/agent-serve.ts +42 -5
- package/src/channels/slack/auth.ts +29 -22
- package/src/channels/slack/cursor-account.ts +2 -0
- package/src/channels/slack/defaults.ts +24 -4
- package/src/channels/slack/dispatch.ts +42 -1
- package/src/channels/slack/external-policy.ts +62 -0
- package/src/channels/slack/index.ts +1 -0
- package/src/channels/slack/interactive.ts +42 -10
- package/src/channels/slack/slack-channel.ts +20 -3
- package/src/channels/slack/types.ts +12 -0
- package/src/internal/ab-fold.ts +4 -0
- package/src/internal/ab-snapshot.ts +1 -0
- package/src/internal/cli-ax.ts +205 -34
- package/src/internal/cursor-slack-relay.ts +3 -0
- package/src/internal/deploy-client.ts +3 -0
- package/src/internal/discovery.ts +8 -1
- package/src/internal/model-pricing.ts +426 -0
- package/src/internal/sdk-runner.ts +10 -2
- package/src/internal/server.ts +9 -5
- package/src/internal/session-cost.ts +231 -0
- package/src/internal/session-engine.ts +28 -0
- package/src/internal/trajectory.ts +45 -3
- package/src/types.ts +24 -1
- package/dist/channels/github/instrument.d.ts +0 -20
- package/dist/channels/github/instrument.d.ts.map +0 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BQTzJjR_.js +0 -1
- package/dist/docs/assets/guides_slack.md.D_xFKlnF.lean.js +0 -1
- package/dist/docs/assets/guides_webhooks.md.B1EswtUu.js +0 -50
- package/dist/internal/json-dir-store.d.ts +0 -32
- package/dist/internal/json-dir-store.d.ts.map +0 -1
- package/dist/internal/json-dir-store.js +0 -100
- package/dist/playground/assets/index-CjOQ4hN9.css +0 -1
- package/dist/playground/assets/index-DqXdAFGa.js +0 -85
- package/src/bin/agent-serve.version.test.ts +0 -64
- package/src/channels/github/api.test.ts +0 -64
- package/src/channels/github/auth.test.ts +0 -105
- package/src/channels/github/cursor-account.test.ts +0 -204
- package/src/channels/github/forward.test.ts +0 -457
- package/src/channels/github/github.test.ts +0 -985
- package/src/channels/github/replay.test.ts +0 -179
- package/src/channels/slack/api.post-message.test.ts +0 -148
- package/src/channels/slack/approvals.test.ts +0 -328
- package/src/channels/slack/block-actions.test.ts +0 -469
- package/src/channels/slack/bot-mentions.test.ts +0 -267
- package/src/channels/slack/channel-watch.test.ts +0 -363
- package/src/channels/slack/cursor-account.test.ts +0 -301
- package/src/channels/slack/defaults.final-post.test.ts +0 -182
- package/src/channels/slack/dispatch.test.ts +0 -875
- package/src/channels/slack/eval-directive.test.ts +0 -273
- package/src/channels/slack/message-body.test.ts +0 -54
- package/src/channels/slack/nudge-store.test.ts +0 -143
- package/src/channels/slack/slack.test.ts +0 -391
- package/src/channels/slack/stop.test.ts +0 -23
- package/src/channels/slack/thread-context.test.ts +0 -202
- package/src/evals/assertions.test.ts +0 -617
- package/src/evals/expect.test.ts +0 -144
- package/src/evals/judge.test.ts +0 -181
- package/src/evals/loaders.test.ts +0 -132
- package/src/evals/matchers.test.ts +0 -95
- package/src/evals/reporters.test.ts +0 -303
- package/src/evals/run-facts.test.ts +0 -259
- package/src/internal/ab-snapshot.test.ts +0 -325
- package/src/internal/approval-gate.test.ts +0 -49
- package/src/internal/approvals.integration.test.ts +0 -383
- package/src/internal/artifacts-store.test.ts +0 -283
- package/src/internal/authored-loaders.test.ts +0 -31
- package/src/internal/builtin-tools/artifacts.test.ts +0 -247
- package/src/internal/builtin-tools/reminders.test.ts +0 -201
- package/src/internal/channel-route-schema.test.ts +0 -294
- package/src/internal/chat-attach.test.ts +0 -262
- package/src/internal/cli-deploy.test.ts +0 -1991
- package/src/internal/cli-docs.test.ts +0 -161
- package/src/internal/cli-mcp.test.ts +0 -789
- package/src/internal/cli-skills.test.ts +0 -133
- package/src/internal/cli-slack.test.ts +0 -1654
- package/src/internal/cloud-merge.test.ts +0 -74
- package/src/internal/cron.test.ts +0 -22
- package/src/internal/cursor/account-mcp.test.ts +0 -807
- package/src/internal/cursor/backend-client.test.ts +0 -591
- package/src/internal/cursor/credentials.test.ts +0 -351
- package/src/internal/cursor/github-credentials.test.ts +0 -136
- package/src/internal/cursor-account-mcp-auth.test.ts +0 -310
- package/src/internal/cursor-account.integration.test.ts +0 -441
- package/src/internal/cursor-event-relay.test.ts +0 -746
- package/src/internal/cursor-github-credentials.integration.test.ts +0 -271
- package/src/internal/cursor-slack-relay.test.ts +0 -525
- package/src/internal/deploy-source.test.ts +0 -111
- package/src/internal/discovery.artifact-tool.test.ts +0 -136
- package/src/internal/discovery.artifacts.test.ts +0 -119
- package/src/internal/discovery.builtin-tools.test.ts +0 -94
- package/src/internal/discovery.concurrency.test.ts +0 -60
- package/src/internal/discovery.cursor-account.test.ts +0 -133
- package/src/internal/discovery.cwd.test.ts +0 -83
- package/src/internal/discovery.hosting.test.ts +0 -80
- package/src/internal/discovery.identity.test.ts +0 -44
- package/src/internal/docs-site.test.ts +0 -66
- package/src/internal/duration.test.ts +0 -29
- package/src/internal/eval-judge-model.test.ts +0 -187
- package/src/internal/eval-run-store.cancel.test.ts +0 -142
- package/src/internal/eval-run-store.storage.test.ts +0 -211
- package/src/internal/eval-runner.http.test.ts +0 -403
- package/src/internal/eval-runner.run.test.ts +0 -928
- package/src/internal/evals-client.test.ts +0 -307
- package/src/internal/event-mapper.test.ts +0 -243
- package/src/internal/github-fanout.test.ts +0 -213
- package/src/internal/handleAgentServeTrigger.test.ts +0 -185
- package/src/internal/host-kv.test.ts +0 -82
- package/src/internal/host-platforms.test.ts +0 -126
- package/src/internal/http-channel.test.ts +0 -402
- package/src/internal/init-project.test.ts +0 -270
- package/src/internal/install-cursor-skills.test.ts +0 -262
- package/src/internal/local-env.test.ts +0 -120
- package/src/internal/log-ring.test.ts +0 -31
- package/src/internal/logs-client.test.ts +0 -350
- package/src/internal/mcp-endpoint.test.ts +0 -436
- package/src/internal/mcp-host.test.ts +0 -298
- package/src/internal/mcp-oauth.test.ts +0 -148
- package/src/internal/net.test.ts +0 -17
- package/src/internal/peer-connections.test.ts +0 -128
- package/src/internal/peer-mcp.integration.test.ts +0 -289
- package/src/internal/playground/toolchain.test.ts +0 -53
- package/src/internal/playground-cli.test.ts +0 -187
- package/src/internal/playground-proxy.test.ts +0 -376
- package/src/internal/prompt-context.integration.test.ts +0 -232
- package/src/internal/prompt-context.test.ts +0 -127
- package/src/internal/reminder-runner.test.ts +0 -432
- package/src/internal/reminder-store.test.ts +0 -53
- package/src/internal/request-headers.test.ts +0 -27
- package/src/internal/resolve-prod-target.test.ts +0 -787
- package/src/internal/resolved-connections.test.ts +0 -295
- package/src/internal/router.test.ts +0 -57
- package/src/internal/sdk-runner.test.ts +0 -290
- package/src/internal/server.artifacts.test.ts +0 -334
- package/src/internal/session-engine.artifacts.test.ts +0 -293
- package/src/internal/session-engine.coalesce.test.ts +0 -169
- package/src/internal/session-engine.concurrency.test.ts +0 -250
- package/src/internal/session-engine.host-oauth-mcp.test.ts +0 -110
- package/src/internal/session-engine.interrupt.test.ts +0 -577
- package/src/internal/session-engine.storage.test.ts +0 -547
- package/src/internal/session-urls.test.ts +0 -28
- package/src/internal/sessions-client.test.ts +0 -518
- package/src/internal/storage-coordinator.test.ts +0 -517
- package/src/internal/tool-call.test.ts +0 -458
- package/src/internal/tool-result.test.ts +0 -52
- package/src/internal/trajectory.approvals.test.ts +0 -83
- package/src/internal/trajectory.subagents.test.ts +0 -198
- package/src/internal/turn-governor.test.ts +0 -137
- package/src/internal/update-check.test.ts +0 -485
- package/src/internal/workspace.test.ts +0 -207
- package/src/storage-backends/cursor-hosted.test.ts +0 -121
- /package/dist/docs/assets/{index.md.Dfv5ic9t.lean.js → index.md.CH_s5uZe.lean.js} +0 -0
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
type ChannelEventHandler,
|
|
35
35
|
type ChannelSession,
|
|
36
36
|
type ConnectionTransport,
|
|
37
|
+
DEFAULT_MODEL,
|
|
37
38
|
DIRECT_TOOL_CALL_CHANNEL_ID,
|
|
38
39
|
type HookHandler,
|
|
39
40
|
type HostContext,
|
|
@@ -80,6 +81,7 @@ import {
|
|
|
80
81
|
} from "./ids.js";
|
|
81
82
|
import { validateToolInput } from "./json-schema.js";
|
|
82
83
|
import { McpHost } from "./mcp-host.js";
|
|
84
|
+
import { estimateTurnCost } from "./model-pricing.js";
|
|
83
85
|
import {
|
|
84
86
|
buildSessionContextBlock,
|
|
85
87
|
SCHEDULE_CHANNEL_PREFIX,
|
|
@@ -535,6 +537,19 @@ export class SessionEngine {
|
|
|
535
537
|
pendingWorkspaceFiles: options.workspaceFiles,
|
|
536
538
|
}));
|
|
537
539
|
}
|
|
540
|
+
// Refresh the cloud attach the same way: a follow-up send carries the
|
|
541
|
+
// caller's CURRENT cloud options (e.g. a PR attach re-derived per wake),
|
|
542
|
+
// and the first send's snapshot must not pin this session's turns to a
|
|
543
|
+
// stale repo/prUrl for the session's lifetime.
|
|
544
|
+
if (
|
|
545
|
+
options.cloud !== undefined &&
|
|
546
|
+
JSON.stringify(options.cloud) !== JSON.stringify(record.cloudOverride)
|
|
547
|
+
) {
|
|
548
|
+
record = await this.updateRecord(record.sessionId, (current) => ({
|
|
549
|
+
...current,
|
|
550
|
+
cloudOverride: options.cloud,
|
|
551
|
+
}));
|
|
552
|
+
}
|
|
538
553
|
const coalesced = await this.startTurn(record.sessionId, message, {
|
|
539
554
|
admission: options.admission ?? "preempt",
|
|
540
555
|
...(options.coalesceSourceTs === undefined
|
|
@@ -1252,6 +1267,18 @@ export class SessionEngine {
|
|
|
1252
1267
|
|
|
1253
1268
|
const finalResult = outcome.result ?? mapper.finalText;
|
|
1254
1269
|
const finalUsage = outcome.usage ?? mapper.usage;
|
|
1270
|
+
// Estimated dollar cost of this loop pass, persisted alongside usage so
|
|
1271
|
+
// traces / A/B metrics / the CLI can aggregate spend without re-pricing.
|
|
1272
|
+
const finalCost =
|
|
1273
|
+
finalUsage === undefined
|
|
1274
|
+
? undefined
|
|
1275
|
+
: estimateTurnCost(
|
|
1276
|
+
this.project.agent.model ?? DEFAULT_MODEL,
|
|
1277
|
+
finalUsage
|
|
1278
|
+
);
|
|
1279
|
+
if (finalCost !== undefined) {
|
|
1280
|
+
outcome = { ...outcome, cost: finalCost };
|
|
1281
|
+
}
|
|
1255
1282
|
|
|
1256
1283
|
if (outcome.status === "finished") {
|
|
1257
1284
|
await this.appendEvent(sessionId, {
|
|
@@ -1260,6 +1287,7 @@ export class SessionEngine {
|
|
|
1260
1287
|
data: {
|
|
1261
1288
|
...(finalResult === undefined ? {} : { result: finalResult }),
|
|
1262
1289
|
...(finalUsage === undefined ? {} : { usage: finalUsage }),
|
|
1290
|
+
...(finalCost === undefined ? {} : { cost: finalCost }),
|
|
1263
1291
|
},
|
|
1264
1292
|
});
|
|
1265
1293
|
} else {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { readFile } from "node:fs/promises";
|
|
10
|
-
import type { SessionEvent, TurnUsage } from "../types.js";
|
|
10
|
+
import type { SessionEvent, TurnCost, TurnUsage } from "../types.js";
|
|
11
11
|
|
|
12
12
|
export interface TrajectoryToolCall {
|
|
13
13
|
callId: string;
|
|
@@ -37,6 +37,8 @@ export interface TrajectoryTurn {
|
|
|
37
37
|
toolCalls: TrajectoryToolCall[];
|
|
38
38
|
subagents: TrajectorySubagent[];
|
|
39
39
|
usage?: TurnUsage;
|
|
40
|
+
/** Estimated dollar cost of this turn (from the `turn.completed` event). */
|
|
41
|
+
cost?: TurnCost;
|
|
40
42
|
result?: string;
|
|
41
43
|
failed: boolean;
|
|
42
44
|
error?: string;
|
|
@@ -51,6 +53,8 @@ export interface Trajectory {
|
|
|
51
53
|
finalText: string;
|
|
52
54
|
turnsFailed: number;
|
|
53
55
|
toolCallCount: number;
|
|
56
|
+
/** Sum of per-turn estimated costs; present when any turn reported cost. */
|
|
57
|
+
totalCostUsd?: number;
|
|
54
58
|
turns: TrajectoryTurn[];
|
|
55
59
|
}
|
|
56
60
|
|
|
@@ -228,6 +232,9 @@ export function buildTrajectory(events: SessionEvent[]): Trajectory {
|
|
|
228
232
|
if (event.data.usage !== undefined) {
|
|
229
233
|
turn.usage = event.data.usage;
|
|
230
234
|
}
|
|
235
|
+
if (event.data.cost !== undefined) {
|
|
236
|
+
turn.cost = event.data.cost;
|
|
237
|
+
}
|
|
231
238
|
if (event.data.result !== undefined) {
|
|
232
239
|
turn.result = event.data.result;
|
|
233
240
|
if (turn.assistantText === "") {
|
|
@@ -267,6 +274,13 @@ export function buildTrajectory(events: SessionEvent[]): Trajectory {
|
|
|
267
274
|
0
|
|
268
275
|
);
|
|
269
276
|
const lastGood = [...turns].reverse().find((t) => t.assistantText !== "");
|
|
277
|
+
const costedTurns = turns.filter((t) => t.cost !== undefined);
|
|
278
|
+
const totalCostUsd =
|
|
279
|
+
costedTurns.length === 0
|
|
280
|
+
? undefined
|
|
281
|
+
: roundCostUsd(
|
|
282
|
+
costedTurns.reduce((sum, t) => sum + (t.cost?.totalUsd ?? 0), 0)
|
|
283
|
+
);
|
|
270
284
|
return {
|
|
271
285
|
sessionId,
|
|
272
286
|
...(sdkAgentId === undefined ? {} : { sdkAgentId }),
|
|
@@ -276,10 +290,30 @@ export function buildTrajectory(events: SessionEvent[]): Trajectory {
|
|
|
276
290
|
finalText: lastGood?.assistantText ?? "",
|
|
277
291
|
turnsFailed,
|
|
278
292
|
toolCallCount,
|
|
293
|
+
...(totalCostUsd === undefined ? {} : { totalCostUsd }),
|
|
279
294
|
turns,
|
|
280
295
|
};
|
|
281
296
|
}
|
|
282
297
|
|
|
298
|
+
/** Micro-dollar precision so summed floats stay readable in JSON. */
|
|
299
|
+
export function roundCostUsd(usd: number): number {
|
|
300
|
+
return Math.round(usd * 1e6) / 1e6;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** Compact dollar display for estimated costs (`$0.0132`, `$1.25`). */
|
|
304
|
+
export function formatCostUsd(usd: number): string {
|
|
305
|
+
if (!Number.isFinite(usd)) {
|
|
306
|
+
return "—";
|
|
307
|
+
}
|
|
308
|
+
if (usd === 0) {
|
|
309
|
+
return "$0.00";
|
|
310
|
+
}
|
|
311
|
+
if (usd >= 0.1) {
|
|
312
|
+
return `$${usd.toFixed(2)}`;
|
|
313
|
+
}
|
|
314
|
+
return `$${usd.toFixed(4)}`;
|
|
315
|
+
}
|
|
316
|
+
|
|
283
317
|
/** Parse an `events.ndjson` file (or any NDJSON blob of SessionEvents). */
|
|
284
318
|
export function parseEventsNdjson(text: string): SessionEvent[] {
|
|
285
319
|
const events: SessionEvent[] = [];
|
|
@@ -318,7 +352,11 @@ export function formatTrajectoryText(trajectory: Trajectory): string {
|
|
|
318
352
|
lines.push(`url: ${trajectory.agentUrl}`);
|
|
319
353
|
}
|
|
320
354
|
lines.push(
|
|
321
|
-
`turns: ${trajectory.turns.length} tools=${trajectory.toolCallCount} failed: ${trajectory.turnsFailed}
|
|
355
|
+
`turns: ${trajectory.turns.length} tools=${trajectory.toolCallCount} failed: ${trajectory.turnsFailed}${
|
|
356
|
+
trajectory.totalCostUsd === undefined
|
|
357
|
+
? ""
|
|
358
|
+
: ` est. cost: ${formatCostUsd(trajectory.totalCostUsd)}`
|
|
359
|
+
}`
|
|
322
360
|
);
|
|
323
361
|
for (const turn of trajectory.turns) {
|
|
324
362
|
lines.push("");
|
|
@@ -356,7 +394,11 @@ export function formatTrajectoryText(trajectory: Trajectory): string {
|
|
|
356
394
|
}
|
|
357
395
|
if (turn.usage !== undefined) {
|
|
358
396
|
lines.push(
|
|
359
|
-
` usage: in ${turn.usage.inputTokens} out ${turn.usage.outputTokens}
|
|
397
|
+
` usage: in ${turn.usage.inputTokens} out ${turn.usage.outputTokens}${
|
|
398
|
+
turn.cost === undefined
|
|
399
|
+
? ""
|
|
400
|
+
: ` est. cost: ${formatCostUsd(turn.cost.totalUsd)}`
|
|
401
|
+
}`
|
|
360
402
|
);
|
|
361
403
|
}
|
|
362
404
|
}
|
package/src/types.ts
CHANGED
|
@@ -942,7 +942,7 @@ export type SessionEventPayload =
|
|
|
942
942
|
}
|
|
943
943
|
| {
|
|
944
944
|
type: "turn.completed";
|
|
945
|
-
data: { result?: string; usage?: TurnUsage };
|
|
945
|
+
data: { result?: string; usage?: TurnUsage; cost?: TurnCost };
|
|
946
946
|
}
|
|
947
947
|
| { type: "turn.failed"; data: { message: string } }
|
|
948
948
|
| { type: "session.waiting"; data: Record<string, never> }
|
|
@@ -960,6 +960,27 @@ export interface TurnUsage {
|
|
|
960
960
|
reasoningTokens?: number;
|
|
961
961
|
}
|
|
962
962
|
|
|
963
|
+
/**
|
|
964
|
+
* Estimated dollar cost of one turn's token usage (one agent loop pass).
|
|
965
|
+
* Recorded on `turn.completed` events so traces, the playground, A/B
|
|
966
|
+
* metrics, and the CLI can aggregate spend. Estimates price the turn's
|
|
967
|
+
* {@link TurnUsage} against the framework's snapshot of Cursor's published
|
|
968
|
+
* per-model rates — the billed amount on the Cursor dashboard is the source
|
|
969
|
+
* of truth.
|
|
970
|
+
*/
|
|
971
|
+
export interface TurnCost {
|
|
972
|
+
/** Estimated total for the turn, in USD. */
|
|
973
|
+
totalUsd: number;
|
|
974
|
+
inputUsd: number;
|
|
975
|
+
outputUsd: number;
|
|
976
|
+
cacheReadUsd: number;
|
|
977
|
+
cacheWriteUsd: number;
|
|
978
|
+
/** Normalized model id the estimate was priced against. */
|
|
979
|
+
model: string;
|
|
980
|
+
/** Always `"estimate"`: framework rate table, not the billing pipeline. */
|
|
981
|
+
source: "estimate";
|
|
982
|
+
}
|
|
983
|
+
|
|
963
984
|
// ============================================================================
|
|
964
985
|
// Sessions
|
|
965
986
|
// ============================================================================
|
|
@@ -1061,6 +1082,8 @@ export interface TurnOutcome {
|
|
|
1061
1082
|
result?: string;
|
|
1062
1083
|
errorMessage?: string;
|
|
1063
1084
|
usage?: TurnUsage;
|
|
1085
|
+
/** Estimated cost of {@link usage} when the model has known rates. */
|
|
1086
|
+
cost?: TurnCost;
|
|
1064
1087
|
}
|
|
1065
1088
|
|
|
1066
1089
|
/**
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-request observability for GitHub channel Octokit clients.
|
|
3
|
-
*
|
|
4
|
-
* Every Octokit built by `createGitHubOctokit` / `callGitHubApi` gets one
|
|
5
|
-
* structured `[agentkit/github]` line per GitHub API request (REST and
|
|
6
|
-
* GraphQL), including rate-limit headers so installation-quota pressure can
|
|
7
|
-
* be attributed to agentkit deployments from hosted-runtime logs.
|
|
8
|
-
*/
|
|
9
|
-
import type { Octokit } from "@octokit/rest";
|
|
10
|
-
export type GitHubRequestLogWrite = (line: string) => void;
|
|
11
|
-
/** Best-effort GraphQL operation name (`query Foo` / `mutation Bar`). */
|
|
12
|
-
export declare function parseGraphQLOperationName(query: unknown): string | undefined;
|
|
13
|
-
/**
|
|
14
|
-
* Wrap an Octokit so every request emits one structured log line. Returns
|
|
15
|
-
* the same instance for call-through convenience. Idempotent per instance.
|
|
16
|
-
*/
|
|
17
|
-
export declare function instrumentGitHubOctokit(octokit: Octokit, input?: {
|
|
18
|
-
write?: GitHubRequestLogWrite;
|
|
19
|
-
}): Octokit;
|
|
20
|
-
//# sourceMappingURL=instrument.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../../src/channels/github/instrument.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AA4C3D,yEAAyE;AACzE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQ5E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAAE,GACxC,OAAO,CAmDT"}
|