@cursor/july 0.1.25 → 0.1.27
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 +31 -9
- 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/cursor-account.d.ts +2 -1
- package/dist/channels/slack/cursor-account.d.ts.map +1 -1
- package/dist/channels/slack/cursor-account.js +1 -1
- package/dist/channels/slack/dispatch.d.ts +4 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +3 -3
- package/dist/channels/slack/interactive.d.ts +2 -1
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +1 -0
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +4 -3
- package/dist/channels/slack/types.d.ts +6 -1
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/docs/404.html +1 -1
- package/dist/docs/ab.html +2 -2
- package/dist/docs/assets/{app.DYcC9FY-.js → app.BICLoJYF.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CQJytDwU.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.o4N_knTV.js → VPLocalSearchBox.wN4Ko9dT.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DQ-njyo0.js → theme.dnnTE-Co.js} +2 -2
- package/dist/docs/building-with-agents.html +2 -2
- package/dist/docs/concepts.html +2 -2
- package/dist/docs/deployment.html +2 -2
- package/dist/docs/evals.html +2 -2
- package/dist/docs/example-agents/approval-buddy.html +2 -2
- package/dist/docs/example-agents/benny.html +2 -2
- package/dist/docs/example-agents/bugbot.html +2 -2
- package/dist/docs/example-agents/codebase-wiki.html +2 -2
- package/dist/docs/example-agents/codeowners-review.html +2 -2
- package/dist/docs/example-agents/concierge.html +2 -2
- package/dist/docs/example-agents/fsd.html +2 -2
- package/dist/docs/example-agents/index.html +2 -2
- package/dist/docs/example-agents/knowledge-base.html +2 -2
- package/dist/docs/example-agents/oncall.html +2 -2
- package/dist/docs/example-agents/security-reviewer.html +2 -2
- package/dist/docs/example-agents/slack-agent.html +2 -2
- package/dist/docs/example-agents/weather-agent.html +2 -2
- package/dist/docs/guides/agent-to-agent.html +2 -2
- package/dist/docs/guides/cloud-runtime.html +2 -2
- package/dist/docs/guides/github.html +2 -2
- package/dist/docs/guides/human-in-the-loop.html +2 -2
- package/dist/docs/guides/mcp-oauth.html +2 -2
- package/dist/docs/guides/slack.html +2 -2
- package/dist/docs/guides/webhooks.html +2 -2
- package/dist/docs/hillclimbing.html +2 -2
- package/dist/docs/index.html +2 -2
- package/dist/docs/quickstart.html +2 -2
- package/dist/docs/reference/agent-config.html +2 -2
- package/dist/docs/reference/channels.html +2 -2
- package/dist/docs/reference/cli.html +2 -2
- package/dist/docs/reference/connections.html +2 -2
- package/dist/docs/reference/hooks.html +2 -2
- package/dist/docs/reference/http-api.html +2 -2
- package/dist/docs/reference/instructions.html +2 -2
- package/dist/docs/reference/playground.html +2 -2
- package/dist/docs/reference/project-layout.html +2 -2
- package/dist/docs/reference/prompt.html +2 -2
- package/dist/docs/reference/schedules.html +2 -2
- package/dist/docs/reference/sessions.html +2 -2
- package/dist/docs/reference/skills.html +2 -2
- package/dist/docs/reference/subagents.html +2 -2
- package/dist/docs/reference/tools.html +2 -2
- package/dist/docs/scaffolding-agents.html +2 -2
- package/dist/docs/storage.html +2 -2
- package/dist/docs/troubleshooting.html +2 -2
- 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 +11 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +80 -0
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +14 -6
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +83 -2
- 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 +39 -0
- 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-BDCeW4uc.js +86 -0
- package/dist/playground/assets/index-Bul1WfrB.css +1 -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/package.json +26 -26
- package/src/ab.ts +7 -0
- package/src/bin/agent-serve.ts +30 -2
- package/src/channels/github/github-channel.ts +19 -2
- package/src/channels/github/types.ts +6 -0
- package/src/channels/slack/api.ts +3 -1
- package/src/channels/slack/cursor-account.ts +3 -1
- package/src/channels/slack/dispatch.ts +12 -1
- package/src/channels/slack/interactive.ts +3 -0
- package/src/channels/slack/slack-channel.ts +6 -0
- package/src/channels/slack/types.ts +6 -0
- package/src/internal/ab-fold.ts +4 -0
- package/src/internal/ab-snapshot.ts +1 -0
- package/src/internal/cli-ax.ts +95 -0
- package/src/internal/model-pricing.ts +426 -0
- package/src/internal/reminder-runner.ts +1 -0
- package/src/internal/schedule-runner.ts +1 -0
- package/src/internal/sdk-runner.ts +10 -2
- package/src/internal/server.ts +2 -0
- package/src/internal/session-cost.ts +231 -0
- package/src/internal/session-engine.ts +32 -1
- package/src/internal/trajectory.ts +45 -3
- package/src/types.ts +42 -2
- 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/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 -943
- 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 -452
- 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 -253
- package/src/channels/slack/defaults.final-post.test.ts +0 -182
- package/src/channels/slack/dispatch.test.ts +0 -795
- 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 -390
- 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 -303
- package/src/internal/session-engine.artifacts.test.ts +0 -243
- 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
|
@@ -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
|
|
@@ -716,7 +731,10 @@ export class SessionEngine {
|
|
|
716
731
|
lastCreated = session;
|
|
717
732
|
return session;
|
|
718
733
|
};
|
|
719
|
-
const returned = await definition.receive(input, {
|
|
734
|
+
const returned = await definition.receive(input, {
|
|
735
|
+
send,
|
|
736
|
+
artifacts: this.artifactsApi(),
|
|
737
|
+
});
|
|
720
738
|
const session = returned ?? lastCreated;
|
|
721
739
|
if (session === undefined) {
|
|
722
740
|
throw new Error(
|
|
@@ -1249,6 +1267,18 @@ export class SessionEngine {
|
|
|
1249
1267
|
|
|
1250
1268
|
const finalResult = outcome.result ?? mapper.finalText;
|
|
1251
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
|
+
}
|
|
1252
1282
|
|
|
1253
1283
|
if (outcome.status === "finished") {
|
|
1254
1284
|
await this.appendEvent(sessionId, {
|
|
@@ -1257,6 +1287,7 @@ export class SessionEngine {
|
|
|
1257
1287
|
data: {
|
|
1258
1288
|
...(finalResult === undefined ? {} : { result: finalResult }),
|
|
1259
1289
|
...(finalUsage === undefined ? {} : { usage: finalUsage }),
|
|
1290
|
+
...(finalCost === undefined ? {} : { cost: finalCost }),
|
|
1260
1291
|
},
|
|
1261
1292
|
});
|
|
1262
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
|
/**
|
|
@@ -1505,6 +1528,12 @@ export interface ChannelStartArgs {
|
|
|
1505
1528
|
* should prefer this over `console.*` so CLI/eval hosts can redirect.
|
|
1506
1529
|
*/
|
|
1507
1530
|
logger: (line: string) => void;
|
|
1531
|
+
/**
|
|
1532
|
+
* Durable artifacts (unbound, same facade as
|
|
1533
|
+
* {@link ChannelHandlerArgs.artifacts}) — for host pipelines the channel
|
|
1534
|
+
* drives outside any route handler.
|
|
1535
|
+
*/
|
|
1536
|
+
artifacts: ArtifactsApi;
|
|
1508
1537
|
}
|
|
1509
1538
|
|
|
1510
1539
|
/**
|
|
@@ -1551,7 +1580,7 @@ export interface ChannelConfig<TState = JsonValue> {
|
|
|
1551
1580
|
*/
|
|
1552
1581
|
receive?: (
|
|
1553
1582
|
input: ReceiveInput,
|
|
1554
|
-
args: { send: SendMessageFn }
|
|
1583
|
+
args: { send: SendMessageFn; artifacts: ArtifactsApi }
|
|
1555
1584
|
// biome-ignore lint/suspicious/noConfusingVoidType: hooks may return a session, nothing, or an async nothing
|
|
1556
1585
|
) => Promise<ChannelSession | undefined | void> | ChannelSession | void;
|
|
1557
1586
|
/** Stream-event handlers for sessions owned by this channel. */
|
|
@@ -1742,6 +1771,11 @@ export interface ScheduleHandlerArgs {
|
|
|
1742
1771
|
appAuth: AuthContext;
|
|
1743
1772
|
/** Shared host services (MCP / GitHub / Slack). Same as tool `ctx.host`. */
|
|
1744
1773
|
host: HostContext;
|
|
1774
|
+
/**
|
|
1775
|
+
* Durable artifacts (unbound — schedule handlers have no ambient session;
|
|
1776
|
+
* pass `sessionId` explicitly to attribute).
|
|
1777
|
+
*/
|
|
1778
|
+
artifacts: ArtifactsApi;
|
|
1745
1779
|
}
|
|
1746
1780
|
|
|
1747
1781
|
export interface ScheduleConfig {
|
|
@@ -1795,6 +1829,12 @@ export interface ReminderFireContext extends ReminderUntilContext {
|
|
|
1795
1829
|
/** Wake the reminder's already-bound session (target is implicit). */
|
|
1796
1830
|
followup(args: { message: string }): Promise<ChannelSession>;
|
|
1797
1831
|
cancel(reason?: string): Promise<void>;
|
|
1832
|
+
/**
|
|
1833
|
+
* Durable artifacts (unbound — the reminder is bound to a continuation
|
|
1834
|
+
* token, not a resolved session; pass `sessionId` in `tag` input to
|
|
1835
|
+
* attribute one).
|
|
1836
|
+
*/
|
|
1837
|
+
artifacts: ArtifactsApi;
|
|
1798
1838
|
}
|
|
1799
1839
|
|
|
1800
1840
|
/**
|
|
@@ -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"}
|