@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
|
@@ -31,11 +31,12 @@ import { dirname, join } from "node:path";
|
|
|
31
31
|
import { mergeABInstructions, resolveABMaxPlaygroundSessions, resolveABSplit, } from "../ab.js";
|
|
32
32
|
import { slackThreadPermalink } from "../channels/slack/links.js";
|
|
33
33
|
import { SlackAskDedupeStore, SlackNudgeStore, } from "../channels/slack/nudge-store.js";
|
|
34
|
-
import { DIRECT_TOOL_CALL_CHANNEL_ID, isHostOauthConnectionTransport, isSymbolicConnectionTransport, } from "../types.js";
|
|
34
|
+
import { DEFAULT_MODEL, DIRECT_TOOL_CALL_CHANNEL_ID, isHostOauthConnectionTransport, isSymbolicConnectionTransport, } from "../types.js";
|
|
35
35
|
import { ABCollector } from "./ab-collector.js";
|
|
36
36
|
import { foldABStream } from "./ab-fold.js";
|
|
37
37
|
import { buildABSnapshot } from "./ab-snapshot.js";
|
|
38
38
|
import { ApprovalGate } from "./approval-gate.js";
|
|
39
|
+
import { ArtifactsStore } from "./artifacts-store.js";
|
|
39
40
|
import { samePrincipal } from "./auth.js";
|
|
40
41
|
import { mergeCloudOptions, resolveSessionRuntime } from "./cloud-merge.js";
|
|
41
42
|
import { isDevMode } from "./dev-mode.js";
|
|
@@ -46,6 +47,7 @@ import { createHostPlatforms } from "./host-platforms.js";
|
|
|
46
47
|
import { formatContinuationToken, newContinuationKey, newSessionId, newToolCallId, } from "./ids.js";
|
|
47
48
|
import { validateToolInput } from "./json-schema.js";
|
|
48
49
|
import { McpHost } from "./mcp-host.js";
|
|
50
|
+
import { estimateTurnCost } from "./model-pricing.js";
|
|
49
51
|
import { buildSessionContextBlock, SCHEDULE_CHANNEL_PREFIX, } from "./prompt-context.js";
|
|
50
52
|
import { assertCloudCanHonorAccountServersFilters } from "./resolved-connections.js";
|
|
51
53
|
import { SessionStore } from "./session-store.js";
|
|
@@ -159,6 +161,11 @@ export class SessionEngine {
|
|
|
159
161
|
logger: this.logger,
|
|
160
162
|
});
|
|
161
163
|
this.kvApi = createHostKvApi(Object.assign({ agentName: options.project.name, stateRoot: options.stateRoot }, (this.storage === undefined ? {} : { storage: this.storage })));
|
|
164
|
+
this.artifactsStore = new ArtifactsStore({
|
|
165
|
+
stateRoot: options.stateRoot,
|
|
166
|
+
storage: this.storage,
|
|
167
|
+
config: options.project.artifacts,
|
|
168
|
+
});
|
|
162
169
|
this.abCollector = new ABCollector(options.project.abs, this.logger, (sessionId) => __awaiter(this, void 0, void 0, function* () { return (yield this.logs.get(sessionId)).snapshot(0); }),
|
|
163
170
|
// Samples flow to the defineStorage `abs` table (no-op without one).
|
|
164
171
|
{ persistSample: (sample) => { var _a; return (_a = this.storage) === null || _a === void 0 ? void 0 : _a.abSample(sample); } });
|
|
@@ -200,6 +207,67 @@ export class SessionEngine {
|
|
|
200
207
|
slackNudges: this.slackNudgeHostApi(),
|
|
201
208
|
};
|
|
202
209
|
}
|
|
210
|
+
/** Unbound `ctx.artifacts` facade (channel handlers, scratch tool calls). */
|
|
211
|
+
get artifacts() {
|
|
212
|
+
return this.artifactsApi();
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Build one `ctx.artifacts` facade over the engine-owned artifacts
|
|
216
|
+
* service. With a `binding` (tools, hooks) `tag` auto-fills the bound
|
|
217
|
+
* session (and turn when known) and rejects a conflicting explicit
|
|
218
|
+
* `sessionId`; without one (channel handlers) callers may pass
|
|
219
|
+
* `sessionId` / `turnId` explicitly.
|
|
220
|
+
*/
|
|
221
|
+
artifactsApi(binding) {
|
|
222
|
+
return {
|
|
223
|
+
tag: (input) => __awaiter(this, void 0, void 0, function* () {
|
|
224
|
+
var _a;
|
|
225
|
+
if (binding === undefined) {
|
|
226
|
+
return this.tagArtifact(input);
|
|
227
|
+
}
|
|
228
|
+
if (input.sessionId !== undefined &&
|
|
229
|
+
input.sessionId !== binding.sessionId) {
|
|
230
|
+
throw new Error(`artifacts.tag: this context is bound to session ${binding.sessionId}; cannot tag for ${input.sessionId}`);
|
|
231
|
+
}
|
|
232
|
+
return this.tagArtifact(Object.assign(Object.assign({}, input), { sessionId: binding.sessionId, turnId: (_a = input.turnId) !== null && _a !== void 0 ? _a : binding.turnId }));
|
|
233
|
+
}),
|
|
234
|
+
list: (filter) => this.artifactsStore.list(filter),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Single tag funnel: upsert the row, then — for session-bound tags —
|
|
239
|
+
* append `artifact.tagged` through {@link appendEvent} so persistence
|
|
240
|
+
* flush and hook fan-out are inherited. Session-less tags skip the event.
|
|
241
|
+
* An unknown `sessionId` rejects before the row is written (appending to
|
|
242
|
+
* a session that was never materialized here would mint an orphan local
|
|
243
|
+
* event log, breaking the local-over-sink restore invariant).
|
|
244
|
+
*/
|
|
245
|
+
tagArtifact(input) {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
var _a, _b;
|
|
248
|
+
if (input.sessionId !== undefined &&
|
|
249
|
+
(yield this.getOrRestoreSession(input.sessionId)) === undefined) {
|
|
250
|
+
throw new UnknownSessionError(input.sessionId);
|
|
251
|
+
}
|
|
252
|
+
const record = yield this.artifactsStore.tag(input);
|
|
253
|
+
if (record.sessionId !== undefined) {
|
|
254
|
+
yield this.appendEvent(record.sessionId, {
|
|
255
|
+
type: "artifact.tagged",
|
|
256
|
+
turnId: record.turnId,
|
|
257
|
+
data: {
|
|
258
|
+
id: record.id,
|
|
259
|
+
kind: record.kind,
|
|
260
|
+
key: record.key,
|
|
261
|
+
title: record.title,
|
|
262
|
+
data: record.data,
|
|
263
|
+
source: record.source,
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
this.logger(`[session] artifact tagged kind=${record.kind} id=${record.id} source=${record.source} session=${(_a = record.sessionId) !== null && _a !== void 0 ? _a : "-"} key=${(_b = record.key) !== null && _b !== void 0 ? _b : "-"}`);
|
|
268
|
+
return record;
|
|
269
|
+
});
|
|
270
|
+
}
|
|
203
271
|
slackNudgeHostApi() {
|
|
204
272
|
return {
|
|
205
273
|
append: (input) => this.nudgeStore.append(input),
|
|
@@ -254,6 +322,14 @@ export class SessionEngine {
|
|
|
254
322
|
else if (options.workspaceFiles !== undefined) {
|
|
255
323
|
record = yield this.updateRecord(existing.sessionId, (current) => (Object.assign(Object.assign({}, current), { pendingWorkspaceFiles: options.workspaceFiles })));
|
|
256
324
|
}
|
|
325
|
+
// Refresh the cloud attach the same way: a follow-up send carries the
|
|
326
|
+
// caller's CURRENT cloud options (e.g. a PR attach re-derived per wake),
|
|
327
|
+
// and the first send's snapshot must not pin this session's turns to a
|
|
328
|
+
// stale repo/prUrl for the session's lifetime.
|
|
329
|
+
if (options.cloud !== undefined &&
|
|
330
|
+
JSON.stringify(options.cloud) !== JSON.stringify(record.cloudOverride)) {
|
|
331
|
+
record = yield this.updateRecord(record.sessionId, (current) => (Object.assign(Object.assign({}, current), { cloudOverride: options.cloud })));
|
|
332
|
+
}
|
|
257
333
|
const coalesced = yield this.startTurn(record.sessionId, message, Object.assign({ admission: (_c = options.admission) !== null && _c !== void 0 ? _c : "preempt" }, (options.coalesceSourceTs === undefined
|
|
258
334
|
? {}
|
|
259
335
|
: { sourceTs: options.coalesceSourceTs })));
|
|
@@ -403,7 +479,10 @@ export class SessionEngine {
|
|
|
403
479
|
lastCreated = session;
|
|
404
480
|
return session;
|
|
405
481
|
});
|
|
406
|
-
const returned = yield definition.receive(input, {
|
|
482
|
+
const returned = yield definition.receive(input, {
|
|
483
|
+
send,
|
|
484
|
+
artifacts: this.artifactsApi(),
|
|
485
|
+
});
|
|
407
486
|
const session = returned !== null && returned !== void 0 ? returned : lastCreated;
|
|
408
487
|
if (session === undefined) {
|
|
409
488
|
throw new Error(`Channel "${channelId}" receive hook did not start a session`);
|
|
@@ -738,7 +817,7 @@ export class SessionEngine {
|
|
|
738
817
|
}
|
|
739
818
|
executeTurn(record, turnId, message, isFirstTurn, signal) {
|
|
740
819
|
return __awaiter(this, void 0, void 0, function* () {
|
|
741
|
-
var _a, _b, _c, _d, _e;
|
|
820
|
+
var _a, _b, _c, _d, _e, _f;
|
|
742
821
|
const sessionId = record.sessionId;
|
|
743
822
|
const workspaceDir = this.scaffoldDir(record);
|
|
744
823
|
const harnessCwd = this.harnessCwd(record);
|
|
@@ -836,11 +915,19 @@ export class SessionEngine {
|
|
|
836
915
|
}
|
|
837
916
|
const finalResult = (_a = outcome.result) !== null && _a !== void 0 ? _a : mapper.finalText;
|
|
838
917
|
const finalUsage = (_b = outcome.usage) !== null && _b !== void 0 ? _b : mapper.usage;
|
|
918
|
+
// Estimated dollar cost of this loop pass, persisted alongside usage so
|
|
919
|
+
// traces / A/B metrics / the CLI can aggregate spend without re-pricing.
|
|
920
|
+
const finalCost = finalUsage === undefined
|
|
921
|
+
? undefined
|
|
922
|
+
: estimateTurnCost((_c = this.project.agent.model) !== null && _c !== void 0 ? _c : DEFAULT_MODEL, finalUsage);
|
|
923
|
+
if (finalCost !== undefined) {
|
|
924
|
+
outcome = Object.assign(Object.assign({}, outcome), { cost: finalCost });
|
|
925
|
+
}
|
|
839
926
|
if (outcome.status === "finished") {
|
|
840
927
|
yield this.appendEvent(sessionId, {
|
|
841
928
|
type: "turn.completed",
|
|
842
929
|
turnId,
|
|
843
|
-
data: Object.assign(Object.assign({}, (finalResult === undefined ? {} : { result: finalResult })), (finalUsage === undefined ? {} : { usage: finalUsage })),
|
|
930
|
+
data: Object.assign(Object.assign(Object.assign({}, (finalResult === undefined ? {} : { result: finalResult })), (finalUsage === undefined ? {} : { usage: finalUsage })), (finalCost === undefined ? {} : { cost: finalCost })),
|
|
844
931
|
});
|
|
845
932
|
}
|
|
846
933
|
else {
|
|
@@ -851,21 +938,21 @@ export class SessionEngine {
|
|
|
851
938
|
data: {
|
|
852
939
|
message: interrupted
|
|
853
940
|
? "turn interrupted"
|
|
854
|
-
: ((
|
|
941
|
+
: ((_d = outcome.errorMessage) !== null && _d !== void 0 ? _d : (outcome.status === "cancelled"
|
|
855
942
|
? "turn cancelled"
|
|
856
943
|
: "turn failed")),
|
|
857
944
|
},
|
|
858
945
|
});
|
|
859
946
|
}
|
|
860
947
|
const current = yield this.sessions.get(sessionId);
|
|
861
|
-
const mode = (
|
|
948
|
+
const mode = (_e = current === null || current === void 0 ? void 0 : current.mode) !== null && _e !== void 0 ? _e : record.mode;
|
|
862
949
|
if (mode === "task") {
|
|
863
950
|
yield this.appendEvent(sessionId, outcome.status === "finished"
|
|
864
951
|
? { type: "session.completed", turnId, data: {} }
|
|
865
952
|
: {
|
|
866
953
|
type: "session.failed",
|
|
867
954
|
turnId,
|
|
868
|
-
data: { message: (
|
|
955
|
+
data: { message: (_f = outcome.errorMessage) !== null && _f !== void 0 ? _f : "task failed" },
|
|
869
956
|
});
|
|
870
957
|
}
|
|
871
958
|
else {
|
|
@@ -1019,6 +1106,10 @@ export class SessionEngine {
|
|
|
1019
1106
|
workspaceDir: this.harnessCwd(record),
|
|
1020
1107
|
stateRoot: this.stateRoot,
|
|
1021
1108
|
host: this.host,
|
|
1109
|
+
artifacts: this.artifactsApi({
|
|
1110
|
+
sessionId: record.sessionId,
|
|
1111
|
+
turnId,
|
|
1112
|
+
}),
|
|
1022
1113
|
send: (channelId, message, sendOptions = {}) => this.send(channelId, message, Object.assign(Object.assign({}, sendOptions), { auth: sendOptions.auth !== undefined
|
|
1023
1114
|
? sendOptions.auth
|
|
1024
1115
|
: record.auth })),
|
|
@@ -1273,6 +1364,13 @@ export class SessionEngine {
|
|
|
1273
1364
|
workspaceDir,
|
|
1274
1365
|
stateRoot: this.stateRoot,
|
|
1275
1366
|
host: this.host,
|
|
1367
|
+
// Scratch calls have no real session; their facade stays unbound.
|
|
1368
|
+
artifacts: record === undefined
|
|
1369
|
+
? this.artifactsApi()
|
|
1370
|
+
: this.artifactsApi({
|
|
1371
|
+
sessionId: record.sessionId,
|
|
1372
|
+
turnId: callId,
|
|
1373
|
+
}),
|
|
1276
1374
|
send: (channelId, message, sendOptions = {}) => this.send(channelId, message, Object.assign(Object.assign({}, sendOptions), { auth: sendOptions.auth !== undefined
|
|
1277
1375
|
? sendOptions.auth
|
|
1278
1376
|
: session.auth })),
|
|
@@ -1402,6 +1500,10 @@ export class SessionEngine {
|
|
|
1402
1500
|
},
|
|
1403
1501
|
session: this.sessionInfo(record),
|
|
1404
1502
|
stateRoot: this.stateRoot,
|
|
1503
|
+
artifacts: this.artifactsApi({
|
|
1504
|
+
sessionId: record.sessionId,
|
|
1505
|
+
turnId: event.turnId,
|
|
1506
|
+
}),
|
|
1405
1507
|
});
|
|
1406
1508
|
}
|
|
1407
1509
|
catch (error) {
|
|
@@ -1462,6 +1564,25 @@ export class SessionEngine {
|
|
|
1462
1564
|
return (yield this.listSessionsWithSource(caller, options)).sessions;
|
|
1463
1565
|
});
|
|
1464
1566
|
}
|
|
1567
|
+
/**
|
|
1568
|
+
* Artifacts for `GET /v1/artifacts`, newest-updated first. Without
|
|
1569
|
+
* `includeAll`, the sessions-list ownership rule applies: only artifacts
|
|
1570
|
+
* tagged on a session whose principal matches the caller. Session-less
|
|
1571
|
+
* artifacts are agent-scoped and visible only with `includeAll`.
|
|
1572
|
+
*/
|
|
1573
|
+
listArtifacts(caller, options) {
|
|
1574
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1575
|
+
const records = yield this.artifactsStore.list(options === null || options === void 0 ? void 0 : options.filter);
|
|
1576
|
+
if ((options === null || options === void 0 ? void 0 : options.includeAll) === true) {
|
|
1577
|
+
return records;
|
|
1578
|
+
}
|
|
1579
|
+
const sessions = yield this.sessions.list();
|
|
1580
|
+
const owned = new Set(sessions
|
|
1581
|
+
.filter((record) => samePrincipal(record.auth, caller))
|
|
1582
|
+
.map((record) => record.sessionId));
|
|
1583
|
+
return records.filter((record) => record.sessionId !== undefined && owned.has(record.sessionId));
|
|
1584
|
+
});
|
|
1585
|
+
}
|
|
1465
1586
|
/**
|
|
1466
1587
|
* Same as {@link listSessions}, plus which store answered
|
|
1467
1588
|
* (`cursor-hosted` = durable DB via the control-plane proxy; `local` =
|
|
@@ -141,6 +141,21 @@ export declare class StorageCoordinator {
|
|
|
141
141
|
kvPut(authorKey: string, value: JsonValue): Promise<void>;
|
|
142
142
|
/** Awaited author KV delete. No-op when the sink omits `delete`. */
|
|
143
143
|
kvDelete(authorKey: string): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Whether the sink can serve awaited artifact rows: `get` (upsert
|
|
146
|
+
* read-back), `list` (listing + eviction), and `delete` (`max` cap
|
|
147
|
+
* eviction) are all required — without `delete` the retention cap
|
|
148
|
+
* could never evict, so rows fall back to the filesystem store.
|
|
149
|
+
*/
|
|
150
|
+
get supportsArtifacts(): boolean;
|
|
151
|
+
/** Awaited artifact-row read. Errors propagate (read-after-write). */
|
|
152
|
+
artifactGet(id: string): Promise<JsonValue | undefined>;
|
|
153
|
+
/** Awaited artifact-row write (straight to the sink, like author KV). */
|
|
154
|
+
artifactPut(id: string, value: JsonValue): Promise<void>;
|
|
155
|
+
/** Awaited artifact-row delete. Errors propagate (cap eviction). */
|
|
156
|
+
artifactDelete(id: string): Promise<void>;
|
|
157
|
+
/** All artifact-row values for this agent. Errors propagate. */
|
|
158
|
+
artifactList(): Promise<JsonValue[]>;
|
|
144
159
|
/**
|
|
145
160
|
* Adapter over the sink's dedicated `evals` table for the playground
|
|
146
161
|
* eval-run store. Undefined when the table is not configured — eval
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/storage-coordinator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/storage-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -390,6 +390,58 @@ export class StorageCoordinator {
|
|
|
390
390
|
});
|
|
391
391
|
}
|
|
392
392
|
// ==========================================================================
|
|
393
|
+
// Artifacts (`ctx.artifacts`)
|
|
394
|
+
// ==========================================================================
|
|
395
|
+
/**
|
|
396
|
+
* Whether the sink can serve awaited artifact rows: `get` (upsert
|
|
397
|
+
* read-back), `list` (listing + eviction), and `delete` (`max` cap
|
|
398
|
+
* eviction) are all required — without `delete` the retention cap
|
|
399
|
+
* could never evict, so rows fall back to the filesystem store.
|
|
400
|
+
*/
|
|
401
|
+
get supportsArtifacts() {
|
|
402
|
+
return (this.definition.get !== undefined &&
|
|
403
|
+
this.definition.list !== undefined &&
|
|
404
|
+
this.definition.delete !== undefined);
|
|
405
|
+
}
|
|
406
|
+
/** Awaited artifact-row read. Errors propagate (read-after-write). */
|
|
407
|
+
artifactGet(id) {
|
|
408
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
409
|
+
const get = this.definition.get;
|
|
410
|
+
if (get === undefined) {
|
|
411
|
+
throw new Error("storage get is not configured");
|
|
412
|
+
}
|
|
413
|
+
const value = yield get(storageKeys.artifact(this.agentName, id), this.context("restore"));
|
|
414
|
+
return value !== null && value !== void 0 ? value : undefined;
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
/** Awaited artifact-row write (straight to the sink, like author KV). */
|
|
418
|
+
artifactPut(id, value) {
|
|
419
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
420
|
+
yield this.definition.put(storageKeys.artifact(this.agentName, id), value, this.context("policy"));
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
/** Awaited artifact-row delete. Errors propagate (cap eviction). */
|
|
424
|
+
artifactDelete(id) {
|
|
425
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
426
|
+
const del = this.definition.delete;
|
|
427
|
+
if (del === undefined) {
|
|
428
|
+
throw new Error("storage delete is not configured");
|
|
429
|
+
}
|
|
430
|
+
yield del(storageKeys.artifact(this.agentName, id), this.context("policy"));
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
/** All artifact-row values for this agent. Errors propagate. */
|
|
434
|
+
artifactList() {
|
|
435
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
436
|
+
const list = this.definition.list;
|
|
437
|
+
if (list === undefined) {
|
|
438
|
+
throw new Error("storage list is not configured");
|
|
439
|
+
}
|
|
440
|
+
const entries = yield list(storageKeys.artifactPrefix(this.agentName), this.context("restore"));
|
|
441
|
+
return Array.isArray(entries) ? entries.map((entry) => entry.value) : [];
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
// ==========================================================================
|
|
393
445
|
// Evals (dedicated `evals` table)
|
|
394
446
|
// ==========================================================================
|
|
395
447
|
/**
|
|
@@ -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, TurnUsage } from "../types.js";
|
|
8
|
+
import type { SessionEvent, TurnCost, TurnUsage } from "../types.js";
|
|
9
9
|
export interface TrajectoryToolCall {
|
|
10
10
|
callId: string;
|
|
11
11
|
toolName: string;
|
|
@@ -32,6 +32,8 @@ 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;
|
|
35
37
|
result?: string;
|
|
36
38
|
failed: boolean;
|
|
37
39
|
error?: string;
|
|
@@ -45,6 +47,8 @@ export interface Trajectory {
|
|
|
45
47
|
finalText: string;
|
|
46
48
|
turnsFailed: number;
|
|
47
49
|
toolCallCount: number;
|
|
50
|
+
/** Sum of per-turn estimated costs; present when any turn reported cost. */
|
|
51
|
+
totalCostUsd?: number;
|
|
48
52
|
turns: TrajectoryTurn[];
|
|
49
53
|
}
|
|
50
54
|
/**
|
|
@@ -52,6 +56,10 @@ export interface Trajectory {
|
|
|
52
56
|
* folded into final assistant / reasoning text per turn.
|
|
53
57
|
*/
|
|
54
58
|
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
|
+
/** Compact dollar display for estimated costs (`$0.0132`, `$1.25`). */
|
|
62
|
+
export declare function formatCostUsd(usd: number): string;
|
|
55
63
|
/** Parse an `events.ndjson` file (or any NDJSON blob of SessionEvents). */
|
|
56
64
|
export declare function parseEventsNdjson(text: string): SessionEvent[];
|
|
57
65
|
/** Load and summarize a durable session event log. */
|
|
@@ -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,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/internal/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErE,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,4EAA4E;IAC5E,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,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,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAuOlE;AAED,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;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,CAChD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CA+DnE"}
|
|
@@ -188,6 +188,9 @@ 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
|
+
}
|
|
191
194
|
if (event.data.result !== undefined) {
|
|
192
195
|
turn.result = event.data.result;
|
|
193
196
|
if (turn.assistantText === "") {
|
|
@@ -222,9 +225,29 @@ export function buildTrajectory(events) {
|
|
|
222
225
|
t.toolCalls.length +
|
|
223
226
|
t.subagents.reduce((m, s) => m + s.toolCalls.length, 0), 0);
|
|
224
227
|
const lastGood = [...turns].reverse().find((t) => t.assistantText !== "");
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
+
const costedTurns = turns.filter((t) => t.cost !== undefined);
|
|
229
|
+
const totalCostUsd = costedTurns.length === 0
|
|
230
|
+
? undefined
|
|
231
|
+
: roundCostUsd(costedTurns.reduce((sum, t) => { var _a; var _b; return sum + ((_b = (_a = t.cost) === null || _a === void 0 ? void 0 : _a.totalUsd) !== null && _b !== void 0 ? _b : 0); }, 0));
|
|
232
|
+
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ sessionId }, (sdkAgentId === undefined ? {} : { sdkAgentId })), (agentUrl === undefined ? {} : { agentUrl })), (channelId === undefined ? {} : { channelId })), { ok: turnsFailed === 0 && turns.length > 0, finalText: (_b = lastGood === null || lastGood === void 0 ? void 0 : lastGood.assistantText) !== null && _b !== void 0 ? _b : "", turnsFailed,
|
|
233
|
+
toolCallCount }), (totalCostUsd === undefined ? {} : { totalCostUsd })), { turns });
|
|
234
|
+
}
|
|
235
|
+
/** Micro-dollar precision so summed floats stay readable in JSON. */
|
|
236
|
+
export function roundCostUsd(usd) {
|
|
237
|
+
return Math.round(usd * 1e6) / 1e6;
|
|
238
|
+
}
|
|
239
|
+
/** Compact dollar display for estimated costs (`$0.0132`, `$1.25`). */
|
|
240
|
+
export function formatCostUsd(usd) {
|
|
241
|
+
if (!Number.isFinite(usd)) {
|
|
242
|
+
return "—";
|
|
243
|
+
}
|
|
244
|
+
if (usd === 0) {
|
|
245
|
+
return "$0.00";
|
|
246
|
+
}
|
|
247
|
+
if (usd >= 0.1) {
|
|
248
|
+
return `$${usd.toFixed(2)}`;
|
|
249
|
+
}
|
|
250
|
+
return `$${usd.toFixed(4)}`;
|
|
228
251
|
}
|
|
229
252
|
/** Parse an `events.ndjson` file (or any NDJSON blob of SessionEvents). */
|
|
230
253
|
export function parseEventsNdjson(text) {
|
|
@@ -261,7 +284,9 @@ export function formatTrajectoryText(trajectory) {
|
|
|
261
284
|
if (trajectory.agentUrl !== undefined) {
|
|
262
285
|
lines.push(`url: ${trajectory.agentUrl}`);
|
|
263
286
|
}
|
|
264
|
-
lines.push(`turns: ${trajectory.turns.length} tools=${trajectory.toolCallCount} failed: ${trajectory.turnsFailed}
|
|
287
|
+
lines.push(`turns: ${trajectory.turns.length} tools=${trajectory.toolCallCount} failed: ${trajectory.turnsFailed}${trajectory.totalCostUsd === undefined
|
|
288
|
+
? ""
|
|
289
|
+
: ` est. cost: ${formatCostUsd(trajectory.totalCostUsd)}`}`);
|
|
265
290
|
for (const turn of trajectory.turns) {
|
|
266
291
|
lines.push("");
|
|
267
292
|
lines.push(`── ${turn.turnId}${turn.failed ? " FAILED" : ""} ──`);
|
|
@@ -296,7 +321,9 @@ export function formatTrajectoryText(trajectory) {
|
|
|
296
321
|
lines.push(` error: ${turn.error}`);
|
|
297
322
|
}
|
|
298
323
|
if (turn.usage !== undefined) {
|
|
299
|
-
lines.push(` usage: in ${turn.usage.inputTokens} out ${turn.usage.outputTokens}
|
|
324
|
+
lines.push(` usage: in ${turn.usage.inputTokens} out ${turn.usage.outputTokens}${turn.cost === undefined
|
|
325
|
+
? ""
|
|
326
|
+
: ` est. cost: ${formatCostUsd(turn.cost.totalUsd)}`}`);
|
|
300
327
|
}
|
|
301
328
|
}
|
|
302
329
|
return `${lines.join("\n")}\n`;
|