@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.
Files changed (288) hide show
  1. package/dist/ab.d.ts +6 -0
  2. package/dist/ab.d.ts.map +1 -1
  3. package/dist/ab.js +1 -0
  4. package/dist/artifacts.d.ts +34 -0
  5. package/dist/artifacts.d.ts.map +1 -0
  6. package/dist/artifacts.js +57 -0
  7. package/dist/bin/agent-serve.js +31 -9
  8. package/dist/channels/github/github-channel.d.ts +1 -1
  9. package/dist/channels/github/github-channel.d.ts.map +1 -1
  10. package/dist/channels/github/github-channel.js +14 -1
  11. package/dist/channels/github/types.d.ts +6 -1
  12. package/dist/channels/github/types.d.ts.map +1 -1
  13. package/dist/channels/slack/api.d.ts +2 -1
  14. package/dist/channels/slack/api.d.ts.map +1 -1
  15. package/dist/channels/slack/api.js +1 -0
  16. package/dist/channels/slack/cursor-account.d.ts +2 -1
  17. package/dist/channels/slack/cursor-account.d.ts.map +1 -1
  18. package/dist/channels/slack/cursor-account.js +1 -1
  19. package/dist/channels/slack/dispatch.d.ts +4 -1
  20. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  21. package/dist/channels/slack/dispatch.js +3 -3
  22. package/dist/channels/slack/interactive.d.ts +2 -1
  23. package/dist/channels/slack/interactive.d.ts.map +1 -1
  24. package/dist/channels/slack/interactive.js +1 -0
  25. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  26. package/dist/channels/slack/slack-channel.js +4 -3
  27. package/dist/channels/slack/types.d.ts +6 -1
  28. package/dist/channels/slack/types.d.ts.map +1 -1
  29. package/dist/docs/404.html +1 -1
  30. package/dist/docs/ab.html +2 -2
  31. package/dist/docs/assets/{app.DYcC9FY-.js → app.BICLoJYF.js} +1 -1
  32. package/dist/docs/assets/chunks/@localSearchIndexroot.CQJytDwU.js +1 -0
  33. package/dist/docs/assets/chunks/{VPLocalSearchBox.o4N_knTV.js → VPLocalSearchBox.wN4Ko9dT.js} +1 -1
  34. package/dist/docs/assets/chunks/{theme.DQ-njyo0.js → theme.dnnTE-Co.js} +2 -2
  35. package/dist/docs/building-with-agents.html +2 -2
  36. package/dist/docs/concepts.html +2 -2
  37. package/dist/docs/deployment.html +2 -2
  38. package/dist/docs/evals.html +2 -2
  39. package/dist/docs/example-agents/approval-buddy.html +2 -2
  40. package/dist/docs/example-agents/benny.html +2 -2
  41. package/dist/docs/example-agents/bugbot.html +2 -2
  42. package/dist/docs/example-agents/codebase-wiki.html +2 -2
  43. package/dist/docs/example-agents/codeowners-review.html +2 -2
  44. package/dist/docs/example-agents/concierge.html +2 -2
  45. package/dist/docs/example-agents/fsd.html +2 -2
  46. package/dist/docs/example-agents/index.html +2 -2
  47. package/dist/docs/example-agents/knowledge-base.html +2 -2
  48. package/dist/docs/example-agents/oncall.html +2 -2
  49. package/dist/docs/example-agents/security-reviewer.html +2 -2
  50. package/dist/docs/example-agents/slack-agent.html +2 -2
  51. package/dist/docs/example-agents/weather-agent.html +2 -2
  52. package/dist/docs/guides/agent-to-agent.html +2 -2
  53. package/dist/docs/guides/cloud-runtime.html +2 -2
  54. package/dist/docs/guides/github.html +2 -2
  55. package/dist/docs/guides/human-in-the-loop.html +2 -2
  56. package/dist/docs/guides/mcp-oauth.html +2 -2
  57. package/dist/docs/guides/slack.html +2 -2
  58. package/dist/docs/guides/webhooks.html +2 -2
  59. package/dist/docs/hillclimbing.html +2 -2
  60. package/dist/docs/index.html +2 -2
  61. package/dist/docs/quickstart.html +2 -2
  62. package/dist/docs/reference/agent-config.html +2 -2
  63. package/dist/docs/reference/channels.html +2 -2
  64. package/dist/docs/reference/cli.html +2 -2
  65. package/dist/docs/reference/connections.html +2 -2
  66. package/dist/docs/reference/hooks.html +2 -2
  67. package/dist/docs/reference/http-api.html +2 -2
  68. package/dist/docs/reference/instructions.html +2 -2
  69. package/dist/docs/reference/playground.html +2 -2
  70. package/dist/docs/reference/project-layout.html +2 -2
  71. package/dist/docs/reference/prompt.html +2 -2
  72. package/dist/docs/reference/schedules.html +2 -2
  73. package/dist/docs/reference/sessions.html +2 -2
  74. package/dist/docs/reference/skills.html +2 -2
  75. package/dist/docs/reference/subagents.html +2 -2
  76. package/dist/docs/reference/tools.html +2 -2
  77. package/dist/docs/scaffolding-agents.html +2 -2
  78. package/dist/docs/storage.html +2 -2
  79. package/dist/docs/troubleshooting.html +2 -2
  80. package/dist/evals/assertions.d.ts +10 -1
  81. package/dist/evals/assertions.d.ts.map +1 -1
  82. package/dist/evals/assertions.js +12 -0
  83. package/dist/evals.d.ts +1 -1
  84. package/dist/evals.d.ts.map +1 -1
  85. package/dist/index.d.ts +1 -0
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +1 -0
  88. package/dist/internal/ab-fold.d.ts.map +1 -1
  89. package/dist/internal/ab-fold.js +4 -0
  90. package/dist/internal/ab-snapshot.d.ts.map +1 -1
  91. package/dist/internal/ab-snapshot.js +1 -0
  92. package/dist/internal/artifacts-store.d.ts +45 -0
  93. package/dist/internal/artifacts-store.d.ts.map +1 -0
  94. package/dist/internal/artifacts-store.js +250 -0
  95. package/dist/internal/builtin-tools/artifacts.d.ts +10 -0
  96. package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -0
  97. package/dist/internal/builtin-tools/artifacts.js +73 -0
  98. package/dist/internal/builtin-tools/index.d.ts +8 -1
  99. package/dist/internal/builtin-tools/index.d.ts.map +1 -1
  100. package/dist/internal/builtin-tools/index.js +15 -0
  101. package/dist/internal/cli-ax.d.ts +11 -0
  102. package/dist/internal/cli-ax.d.ts.map +1 -1
  103. package/dist/internal/cli-ax.js +80 -0
  104. package/dist/internal/cli-slack.d.ts.map +1 -1
  105. package/dist/internal/cli-slack.js +14 -6
  106. package/dist/internal/discovery.d.ts.map +1 -1
  107. package/dist/internal/discovery.js +83 -2
  108. package/dist/internal/distribution.d.ts.map +1 -1
  109. package/dist/internal/distribution.js +1 -0
  110. package/dist/internal/model-pricing.d.ts +49 -0
  111. package/dist/internal/model-pricing.d.ts.map +1 -0
  112. package/dist/internal/model-pricing.js +377 -0
  113. package/dist/internal/reminder-runner.d.ts.map +1 -1
  114. package/dist/internal/reminder-runner.js +1 -0
  115. package/dist/internal/schedule-runner.d.ts.map +1 -1
  116. package/dist/internal/schedule-runner.js +1 -0
  117. package/dist/internal/sdk-runner.d.ts.map +1 -1
  118. package/dist/internal/sdk-runner.js +9 -1
  119. package/dist/internal/server.d.ts.map +1 -1
  120. package/dist/internal/server.js +39 -0
  121. package/dist/internal/session-cost.d.ts +49 -0
  122. package/dist/internal/session-cost.d.ts.map +1 -0
  123. package/dist/internal/session-cost.js +175 -0
  124. package/dist/internal/session-engine.d.ts +35 -1
  125. package/dist/internal/session-engine.d.ts.map +1 -1
  126. package/dist/internal/session-engine.js +128 -7
  127. package/dist/internal/storage-coordinator.d.ts +15 -0
  128. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  129. package/dist/internal/storage-coordinator.js +52 -0
  130. package/dist/internal/trajectory.d.ts +9 -1
  131. package/dist/internal/trajectory.d.ts.map +1 -1
  132. package/dist/internal/trajectory.js +32 -5
  133. package/dist/playground/assets/index-BDCeW4uc.js +86 -0
  134. package/dist/playground/assets/index-Bul1WfrB.css +1 -0
  135. package/dist/playground/index.html +2 -2
  136. package/dist/storage.d.ts +4 -0
  137. package/dist/storage.d.ts.map +1 -1
  138. package/dist/storage.js +4 -0
  139. package/dist/types.d.ts +164 -1
  140. package/dist/types.d.ts.map +1 -1
  141. package/package.json +26 -26
  142. package/src/ab.ts +7 -0
  143. package/src/bin/agent-serve.ts +30 -2
  144. package/src/channels/github/github-channel.ts +19 -2
  145. package/src/channels/github/types.ts +6 -0
  146. package/src/channels/slack/api.ts +3 -1
  147. package/src/channels/slack/cursor-account.ts +3 -1
  148. package/src/channels/slack/dispatch.ts +12 -1
  149. package/src/channels/slack/interactive.ts +3 -0
  150. package/src/channels/slack/slack-channel.ts +6 -0
  151. package/src/channels/slack/types.ts +6 -0
  152. package/src/internal/ab-fold.ts +4 -0
  153. package/src/internal/ab-snapshot.ts +1 -0
  154. package/src/internal/cli-ax.ts +95 -0
  155. package/src/internal/model-pricing.ts +426 -0
  156. package/src/internal/reminder-runner.ts +1 -0
  157. package/src/internal/schedule-runner.ts +1 -0
  158. package/src/internal/sdk-runner.ts +10 -2
  159. package/src/internal/server.ts +2 -0
  160. package/src/internal/session-cost.ts +231 -0
  161. package/src/internal/session-engine.ts +32 -1
  162. package/src/internal/trajectory.ts +45 -3
  163. package/src/types.ts +42 -2
  164. package/dist/channels/github/instrument.d.ts +0 -20
  165. package/dist/channels/github/instrument.d.ts.map +0 -1
  166. package/dist/docs/assets/chunks/@localSearchIndexroot.BQTzJjR_.js +0 -1
  167. package/dist/internal/json-dir-store.d.ts +0 -32
  168. package/dist/internal/json-dir-store.d.ts.map +0 -1
  169. package/dist/internal/json-dir-store.js +0 -100
  170. package/dist/playground/assets/index-CjOQ4hN9.css +0 -1
  171. package/dist/playground/assets/index-DqXdAFGa.js +0 -85
  172. package/src/bin/agent-serve.version.test.ts +0 -64
  173. package/src/channels/github/api.test.ts +0 -64
  174. package/src/channels/github/auth.test.ts +0 -105
  175. package/src/channels/github/cursor-account.test.ts +0 -204
  176. package/src/channels/github/forward.test.ts +0 -457
  177. package/src/channels/github/github.test.ts +0 -943
  178. package/src/channels/github/replay.test.ts +0 -179
  179. package/src/channels/slack/api.post-message.test.ts +0 -148
  180. package/src/channels/slack/approvals.test.ts +0 -328
  181. package/src/channels/slack/block-actions.test.ts +0 -452
  182. package/src/channels/slack/bot-mentions.test.ts +0 -267
  183. package/src/channels/slack/channel-watch.test.ts +0 -363
  184. package/src/channels/slack/cursor-account.test.ts +0 -253
  185. package/src/channels/slack/defaults.final-post.test.ts +0 -182
  186. package/src/channels/slack/dispatch.test.ts +0 -795
  187. package/src/channels/slack/eval-directive.test.ts +0 -273
  188. package/src/channels/slack/message-body.test.ts +0 -54
  189. package/src/channels/slack/nudge-store.test.ts +0 -143
  190. package/src/channels/slack/slack.test.ts +0 -391
  191. package/src/channels/slack/stop.test.ts +0 -23
  192. package/src/channels/slack/thread-context.test.ts +0 -202
  193. package/src/evals/assertions.test.ts +0 -617
  194. package/src/evals/expect.test.ts +0 -144
  195. package/src/evals/judge.test.ts +0 -181
  196. package/src/evals/loaders.test.ts +0 -132
  197. package/src/evals/matchers.test.ts +0 -95
  198. package/src/evals/reporters.test.ts +0 -303
  199. package/src/evals/run-facts.test.ts +0 -259
  200. package/src/internal/ab-snapshot.test.ts +0 -325
  201. package/src/internal/approval-gate.test.ts +0 -49
  202. package/src/internal/approvals.integration.test.ts +0 -383
  203. package/src/internal/artifacts-store.test.ts +0 -283
  204. package/src/internal/authored-loaders.test.ts +0 -31
  205. package/src/internal/builtin-tools/artifacts.test.ts +0 -247
  206. package/src/internal/builtin-tools/reminders.test.ts +0 -201
  207. package/src/internal/channel-route-schema.test.ts +0 -294
  208. package/src/internal/chat-attach.test.ts +0 -262
  209. package/src/internal/cli-deploy.test.ts +0 -1991
  210. package/src/internal/cli-docs.test.ts +0 -161
  211. package/src/internal/cli-mcp.test.ts +0 -789
  212. package/src/internal/cli-skills.test.ts +0 -133
  213. package/src/internal/cli-slack.test.ts +0 -1654
  214. package/src/internal/cloud-merge.test.ts +0 -74
  215. package/src/internal/cron.test.ts +0 -22
  216. package/src/internal/cursor/account-mcp.test.ts +0 -807
  217. package/src/internal/cursor/backend-client.test.ts +0 -591
  218. package/src/internal/cursor/credentials.test.ts +0 -351
  219. package/src/internal/cursor/github-credentials.test.ts +0 -136
  220. package/src/internal/cursor-account-mcp-auth.test.ts +0 -310
  221. package/src/internal/cursor-account.integration.test.ts +0 -441
  222. package/src/internal/cursor-event-relay.test.ts +0 -746
  223. package/src/internal/cursor-github-credentials.integration.test.ts +0 -271
  224. package/src/internal/cursor-slack-relay.test.ts +0 -525
  225. package/src/internal/deploy-source.test.ts +0 -111
  226. package/src/internal/discovery.artifact-tool.test.ts +0 -136
  227. package/src/internal/discovery.artifacts.test.ts +0 -119
  228. package/src/internal/discovery.builtin-tools.test.ts +0 -94
  229. package/src/internal/discovery.concurrency.test.ts +0 -60
  230. package/src/internal/discovery.cursor-account.test.ts +0 -133
  231. package/src/internal/discovery.cwd.test.ts +0 -83
  232. package/src/internal/discovery.hosting.test.ts +0 -80
  233. package/src/internal/discovery.identity.test.ts +0 -44
  234. package/src/internal/docs-site.test.ts +0 -66
  235. package/src/internal/duration.test.ts +0 -29
  236. package/src/internal/eval-judge-model.test.ts +0 -187
  237. package/src/internal/eval-run-store.cancel.test.ts +0 -142
  238. package/src/internal/eval-run-store.storage.test.ts +0 -211
  239. package/src/internal/eval-runner.http.test.ts +0 -403
  240. package/src/internal/eval-runner.run.test.ts +0 -928
  241. package/src/internal/evals-client.test.ts +0 -307
  242. package/src/internal/event-mapper.test.ts +0 -243
  243. package/src/internal/github-fanout.test.ts +0 -213
  244. package/src/internal/handleAgentServeTrigger.test.ts +0 -185
  245. package/src/internal/host-kv.test.ts +0 -82
  246. package/src/internal/host-platforms.test.ts +0 -126
  247. package/src/internal/http-channel.test.ts +0 -402
  248. package/src/internal/init-project.test.ts +0 -270
  249. package/src/internal/install-cursor-skills.test.ts +0 -262
  250. package/src/internal/local-env.test.ts +0 -120
  251. package/src/internal/log-ring.test.ts +0 -31
  252. package/src/internal/logs-client.test.ts +0 -350
  253. package/src/internal/mcp-endpoint.test.ts +0 -436
  254. package/src/internal/mcp-host.test.ts +0 -298
  255. package/src/internal/mcp-oauth.test.ts +0 -148
  256. package/src/internal/net.test.ts +0 -17
  257. package/src/internal/peer-connections.test.ts +0 -128
  258. package/src/internal/peer-mcp.integration.test.ts +0 -289
  259. package/src/internal/playground/toolchain.test.ts +0 -53
  260. package/src/internal/playground-cli.test.ts +0 -187
  261. package/src/internal/playground-proxy.test.ts +0 -376
  262. package/src/internal/prompt-context.integration.test.ts +0 -232
  263. package/src/internal/prompt-context.test.ts +0 -127
  264. package/src/internal/reminder-runner.test.ts +0 -390
  265. package/src/internal/reminder-store.test.ts +0 -53
  266. package/src/internal/request-headers.test.ts +0 -27
  267. package/src/internal/resolve-prod-target.test.ts +0 -787
  268. package/src/internal/resolved-connections.test.ts +0 -295
  269. package/src/internal/router.test.ts +0 -57
  270. package/src/internal/sdk-runner.test.ts +0 -290
  271. package/src/internal/server.artifacts.test.ts +0 -303
  272. package/src/internal/session-engine.artifacts.test.ts +0 -243
  273. package/src/internal/session-engine.coalesce.test.ts +0 -169
  274. package/src/internal/session-engine.concurrency.test.ts +0 -250
  275. package/src/internal/session-engine.host-oauth-mcp.test.ts +0 -110
  276. package/src/internal/session-engine.interrupt.test.ts +0 -577
  277. package/src/internal/session-engine.storage.test.ts +0 -547
  278. package/src/internal/session-urls.test.ts +0 -28
  279. package/src/internal/sessions-client.test.ts +0 -518
  280. package/src/internal/storage-coordinator.test.ts +0 -517
  281. package/src/internal/tool-call.test.ts +0 -458
  282. package/src/internal/tool-result.test.ts +0 -52
  283. package/src/internal/trajectory.approvals.test.ts +0 -83
  284. package/src/internal/trajectory.subagents.test.ts +0 -198
  285. package/src/internal/turn-governor.test.ts +0 -137
  286. package/src/internal/update-check.test.ts +0 -485
  287. package/src/internal/workspace.test.ts +0 -207
  288. package/src/storage-backends/cursor-hosted.test.ts +0 -121
@@ -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, { send });
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
- : ((_c = outcome.errorMessage) !== null && _c !== void 0 ? _c : (outcome.status === "cancelled"
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 = (_d = current === null || current === void 0 ? void 0 : current.mode) !== null && _d !== void 0 ? _d : record.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: (_e = outcome.errorMessage) !== null && _e !== void 0 ? _e : "task failed" },
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;AAE3D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACtC,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CA4NlE;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,CAuDnE"}
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
- return 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,
226
- toolCallCount,
227
- turns });
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`;