@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
@@ -356,6 +356,15 @@ function prepareProvision(options) {
356
356
  };
357
357
  });
358
358
  }
359
+ /**
360
+ * Slack's team-scoped admin page listing pending app-install requests.
361
+ * Provisioned apps have no OAuth flow (no redirect URLs, install-from-Slack
362
+ * disabled), so the oauth_authorize_url Slack returns from
363
+ * apps.manifest.create dead-ends; approval happens here instead.
364
+ */
365
+ function slackAppRequestsUrl(slackTeamId) {
366
+ return `https://app.slack.com/apps-manage/${encodeURIComponent(slackTeamId)}/integrations/requests`;
367
+ }
359
368
  /** "Name (T0123ABCD)", or the bare id when the backend has no name. */
360
369
  function formatWorkspace(workspace) {
361
370
  var _a;
@@ -432,7 +441,7 @@ function runConnectFlow(ctx, wait) {
432
441
  }
433
442
  export function cmdSlackCreate(options) {
434
443
  return __awaiter(this, void 0, void 0, function* () {
435
- var _a, _b;
444
+ var _a;
436
445
  const target = resolveSlackAppTarget(options, errStream(options));
437
446
  if (typeof target === "number") {
438
447
  return target;
@@ -553,6 +562,7 @@ export function cmdSlackCreate(options) {
553
562
  }
554
563
  const iconStatus = yield applySlackCreateIcon(ctx, iconSource, result);
555
564
  if (result.status === "pending_admin_approval") {
565
+ const approveUrl = slackAppRequestsUrl(workspace.slackTeamId);
556
566
  if (ctx.json) {
557
567
  ctx.out(`${JSON.stringify({
558
568
  ok: false,
@@ -561,15 +571,13 @@ export function cmdSlackCreate(options) {
561
571
  slackTeamId: workspace.slackTeamId,
562
572
  envKeys: target.envKeys,
563
573
  wrote,
564
- oauthAuthorizeUrl: (_a = result.oauthAuthorizeUrl) !== null && _a !== void 0 ? _a : null,
574
+ approveUrl,
565
575
  iconStatus,
566
576
  }, null, 2)}\n`);
567
577
  }
568
578
  else {
569
579
  ctx.err(`The Slack app was created (app ${result.appId}), but installing it needs a Slack workspace-admin approval.\n` +
570
- (result.oauthAuthorizeUrl === undefined
571
- ? ""
572
- : `\n Approve it (or send this to a workspace admin):\n\n ${result.oauthAuthorizeUrl}\n\n`) +
580
+ `\n A workspace admin can approve it here:\n\n ${approveUrl}\n\n` +
573
581
  `Once an admin approves the app, re-run \`${CLI} slack create\` to finish the install and mint the tokens.\n`);
574
582
  }
575
583
  return 1;
@@ -611,7 +619,7 @@ export function cmdSlackCreate(options) {
611
619
  }
612
620
  ctx.out(`Provisioned the ${target.env} Slack app for ${target.slug} (app ${result.appId}) in workspace ${workspace.slackTeamId}.\n` +
613
621
  ` wrote ${envEntries.map((entry) => entry.key).join(" + ")} to ${envFile}\n\n`);
614
- const doctor = (_b = options.doctorImpl) !== null && _b !== void 0 ? _b : runSlackDoctor;
622
+ const doctor = (_a = options.doctorImpl) !== null && _a !== void 0 ? _a : runSlackDoctor;
615
623
  const doctorResult = yield doctor(target.envPrefix === undefined ? {} : { envPrefix: target.envPrefix });
616
624
  ctx.out(renderDoctorReport(doctorResult));
617
625
  ctx.out(`\nNext steps:\n` +
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/internal/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAQrB,KAAK,UAAU,EAqBhB,MAAM,aAAa,CAAC;AAsBrB,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3E;AAmBD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,EAAE,CAAC,CA2B1B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAoBzD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAAuB,GAAG;IACjC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACtB,GACL,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAgBzD;AAWD,iFAAiF;AACjF,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAIrC,CAAC;AAEH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,YAAY,CAAC,CA8DvB;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAElE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAOnE;AAuoBD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB3E;AAwoBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,CAoInE"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/internal/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EASrB,KAAK,UAAU,EAqBhB,MAAM,aAAa,CAAC;AA0BrB,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3E;AAmBD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,EAAE,CAAC,CA2B1B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAoBzD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAAuB,GAAG;IACjC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACtB,GACL,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAgBzD;AAWD,iFAAiF;AACjF,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAIrC,CAAC;AAEH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,YAAY,CAAC,CAiEvB;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAElE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAOnE;AA+oBD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB3E;AAmtBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,CA4InE"}
@@ -29,12 +29,13 @@ import { readdir, readFile, stat } from "node:fs/promises";
29
29
  import { basename, extname, isAbsolute, join, relative, resolve, } from "node:path";
30
30
  import { pathToFileURL } from "node:url";
31
31
  import { resolveABMaxPlaygroundSessions } from "../ab.js";
32
+ import { resolveArtifactsMax } from "../artifacts.js";
32
33
  import { httpChannel } from "../channels.js";
33
34
  import { cursorAccountServersHasMixedWildcard, DEFAULT_MODEL, MAX_RUNNING_TURNS_LIMIT, normalizeCursorAccountServers, toPublicCloudInfo, } from "../types.js";
34
35
  import { registerAuthoredModuleLoaders } from "./authored-loaders.js";
35
36
  import { normalizePositiveInt } from "./bounded-int.js";
36
37
  import { getDefinitionKind } from "./brand.js";
37
- import { builtinTools } from "./builtin-tools/index.js";
38
+ import { artifactBuiltinTool, builtinTools, TAG_ARTIFACT_TOOL_NAME, } from "./builtin-tools/index.js";
38
39
  import { isValidCron } from "./cron.js";
39
40
  import { parseFrontmatter } from "./frontmatter.js";
40
41
  import { isReservedSecretName, MAX_EGRESS_DOMAINS, validateEgressDomain, validateSecretName, } from "./hosting.js";
@@ -203,6 +204,8 @@ export function loadAgentProject(dir_1) {
203
204
  const abs = yield loadABs(ctx, agentDir);
204
205
  const abConfig = yield loadABConfig(ctx, agentDir);
205
206
  const storage = yield loadStorage(ctx, agentDir);
207
+ const artifacts = yield loadArtifacts(ctx, agentDir);
208
+ yield appendArtifactTool(ctx, agentDir, agent, artifacts);
206
209
  if (agentDir !== rootDir) {
207
210
  yield warnUnknownSlots(ctx, agentDir);
208
211
  }
@@ -218,6 +221,7 @@ export function loadAgentProject(dir_1) {
218
221
  abs,
219
222
  abConfig,
220
223
  storage,
224
+ artifacts,
221
225
  diagnostics,
222
226
  };
223
227
  });
@@ -261,6 +265,14 @@ function loadAgent(ctx, agentDir, options) {
261
265
  message: "builtinTools is not supported on subagents; ignoring.",
262
266
  });
263
267
  }
268
+ const artifactsPath = yield findModuleFile(agentDir, "artifacts");
269
+ if (artifactsPath !== undefined) {
270
+ ctx.diagnostics.push({
271
+ severity: "warning",
272
+ path: displayPath(ctx, artifactsPath),
273
+ message: "artifacts are not supported on subagents; ignoring.",
274
+ });
275
+ }
264
276
  return Object.assign(Object.assign(Object.assign(Object.assign({ name }, ((config === null || config === void 0 ? void 0 : config.description) === undefined
265
277
  ? {}
266
278
  : { description: config.description })), ((config === null || config === void 0 ? void 0 : config.model) === undefined ? {} : { model: config.model })), (instructions === undefined ? {} : { instructions })), { runtime: "local", tools: [], skills: [], connections: [], subagents: [], seedFiles: [] });
@@ -1297,6 +1309,68 @@ function loadStorage(ctx, agentDir) {
1297
1309
  return definition;
1298
1310
  });
1299
1311
  }
1312
+ // ============================================================================
1313
+ // Artifacts (agent/artifacts.ts)
1314
+ // ============================================================================
1315
+ function loadArtifacts(ctx, agentDir) {
1316
+ return __awaiter(this, void 0, void 0, function* () {
1317
+ var _a;
1318
+ const path = yield findModuleFile(agentDir, "artifacts");
1319
+ if (path === undefined) {
1320
+ return undefined;
1321
+ }
1322
+ const imported = yield importDefault(ctx, path, "artifacts");
1323
+ if (imported === undefined) {
1324
+ return undefined;
1325
+ }
1326
+ const definition = imported;
1327
+ if (definition.agentTool === true &&
1328
+ Object.keys((_a = definition.kinds) !== null && _a !== void 0 ? _a : {}).length === 0) {
1329
+ ctx.diagnostics.push({
1330
+ severity: "error",
1331
+ path: displayPath(ctx, path),
1332
+ message: "artifacts.agentTool requires kinds: the tag_artifact tool needs at least one declared kind; its descriptions are the tool prompt.",
1333
+ });
1334
+ }
1335
+ return definition;
1336
+ });
1337
+ }
1338
+ /**
1339
+ * Materialize the `tag_artifact` built-in when `defineArtifacts` set
1340
+ * `agentTool: true`. Appended after `loadAgent` because the tool is
1341
+ * generated from the artifacts kinds registry, not `AgentConfig.builtinTools`.
1342
+ */
1343
+ function appendArtifactTool(ctx, agentDir, agent, artifacts) {
1344
+ return __awaiter(this, void 0, void 0, function* () {
1345
+ var _a;
1346
+ const tool = artifactBuiltinTool(artifacts);
1347
+ if (tool === undefined) {
1348
+ return;
1349
+ }
1350
+ const artifactsPath = displayPath(ctx, (_a = (yield findModuleFile(agentDir, "artifacts"))) !== null && _a !== void 0 ? _a : join(agentDir, "artifacts.ts"));
1351
+ // TODO(artifacts-cloud): on cloud runtimes, ship tag_artifact as an
1352
+ // execution: "agent" script and have the host fold its action.result
1353
+ // stream events into artifact records — agent-tool calls already surface
1354
+ // durably in the session stream.
1355
+ if (agent.runtime === "cloud") {
1356
+ ctx.diagnostics.push({
1357
+ severity: "warning",
1358
+ path: artifactsPath,
1359
+ message: "tag_artifact is an in-process server tool (like builtinTools) and is not available on cloud agents; it is skipped.",
1360
+ });
1361
+ return;
1362
+ }
1363
+ if (agent.tools.some((t) => t.name === TAG_ARTIFACT_TOOL_NAME)) {
1364
+ ctx.diagnostics.push({
1365
+ severity: "warning",
1366
+ path: artifactsPath,
1367
+ message: `Authored tool "${TAG_ARTIFACT_TOOL_NAME}" shadows the built-in tool of the same name; the authored tool wins.`,
1368
+ });
1369
+ return;
1370
+ }
1371
+ agent.tools.push(tool);
1372
+ });
1373
+ }
1300
1374
  function resolveABName(definition, fallback) {
1301
1375
  if (typeof definition === "object" &&
1302
1376
  definition !== null &&
@@ -1341,6 +1415,7 @@ function loadSeedFiles(ctx, agentDir) {
1341
1415
  // ============================================================================
1342
1416
  export function projectInfo(project) {
1343
1417
  var _a, _b, _c, _d;
1418
+ var _e;
1344
1419
  const agent = project.agent;
1345
1420
  const httpRoutes = [
1346
1421
  { method: "POST", path: "/v1/session", url: "/v1/session" },
@@ -1444,7 +1519,13 @@ export function projectInfo(project) {
1444
1519
  },
1445
1520
  })), { storage: project.storage === undefined
1446
1521
  ? undefined
1447
- : { name: project.storage.name }, diagnostics: project.diagnostics });
1522
+ : { name: project.storage.name }, artifacts: project.artifacts === undefined
1523
+ ? undefined
1524
+ : {
1525
+ kinds: Object.keys((_e = project.artifacts.kinds) !== null && _e !== void 0 ? _e : {}),
1526
+ agentTool: project.artifacts.agentTool === true,
1527
+ max: resolveArtifactsMax(project.artifacts),
1528
+ }, diagnostics: project.diagnostics });
1448
1529
  }
1449
1530
  // ============================================================================
1450
1531
  // Shared helpers
@@ -1 +1 @@
1
- {"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../../src/internal/distribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,qEAAqE;AACrE,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,WAAW,aAAa,CAAC;AACtC,eAAO,MAAM,UAAU,EAAE,MAA2B,CAAC;AACrD,eAAO,MAAM,gBAAgB,EAAE,MAAiC,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAA+B,CAAC;AAc/D;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAGhD;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAC/C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAsBzC,CAAC"}
1
+ {"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../../src/internal/distribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,qEAAqE;AACrE,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,WAAW,aAAa,CAAC;AACtC,eAAO,MAAM,UAAU,EAAE,MAA2B,CAAC;AACrD,eAAO,MAAM,gBAAgB,EAAE,MAAiC,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAA+B,CAAC;AAc/D;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAGhD;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAC/C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAuBzC,CAAC"}
@@ -91,6 +91,7 @@ export const AUTHORING_ENTRY_FILES = [
91
91
  ["evals/reporters", "evals/reporters.js"],
92
92
  ["evals/loaders", "evals/loaders.js"],
93
93
  ["ab", "ab.js"],
94
+ ["artifacts", "artifacts.js"],
94
95
  ["storage", "storage.js"],
95
96
  ["storage/file-kv", "storage-backends/file-kv.js"],
96
97
  ["storage/postgres-kv", "storage-backends/postgres-kv.js"],
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Best-effort dollar-cost estimation for agent turns.
3
+ *
4
+ * The Cursor harness streams token usage (`turn-ended`) but no dollar cost,
5
+ * and server-billed cost is only queryable for cloud agents — so the
6
+ * framework prices token usage against a built-in snapshot of Cursor's
7
+ * published per-model API rates. Estimates are marked `source: "estimate"`
8
+ * everywhere they surface (traces, playground, A/B metrics, CLI); the billed
9
+ * amount on the Cursor dashboard remains the source of truth.
10
+ *
11
+ * Unknown models produce no estimate rather than a wrong one. Deployments
12
+ * can extend or correct the table without a package upgrade via the
13
+ * `AGENT_SERVE_MODEL_PRICING` environment variable (a JSON object merged
14
+ * over the defaults, keyed by model id).
15
+ */
16
+ import type { ModelSetting, TurnCost, TurnUsage } from "../types.js";
17
+ /** USD per million tokens for one pricing tier. */
18
+ export interface ModelPricingTier {
19
+ inputUsdPerMTok: number;
20
+ outputUsdPerMTok: number;
21
+ cacheReadUsdPerMTok: number;
22
+ /** Defaults to {@link inputUsdPerMTok} when omitted (provider convention). */
23
+ cacheWriteUsdPerMTok?: number;
24
+ }
25
+ export interface ModelPricing extends ModelPricingTier {
26
+ /** Rates when the model's `fast` parameter is `"true"`. */
27
+ fast?: ModelPricingTier;
28
+ }
29
+ /**
30
+ * Snapshot of Cursor API per-model token rates (USD per million tokens).
31
+ * Keyed by normalized model id; family aliases (`sonnet`, `gpt`, …) point at
32
+ * the model they currently resolve to.
33
+ */
34
+ export declare const DEFAULT_MODEL_PRICING: Readonly<Record<string, ModelPricing>>;
35
+ /** Env var holding a JSON pricing override merged over the defaults. */
36
+ export declare const MODEL_PRICING_ENV_VAR = "AGENT_SERVE_MODEL_PRICING";
37
+ export declare function normalizeModelId(id: string): string;
38
+ /**
39
+ * Rates for a model selection, honoring its `fast` parameter. `undefined`
40
+ * when the model is not in the table (no estimate is better than a wrong
41
+ * one).
42
+ */
43
+ export declare function resolveModelPricing(model: ModelSetting): ModelPricingTier | undefined;
44
+ /**
45
+ * Estimate the dollar cost of one turn's token usage. `undefined` when the
46
+ * model has no known rates.
47
+ */
48
+ export declare function estimateTurnCost(model: ModelSetting, usage: TurnUsage): TurnCost | undefined;
49
+ //# sourceMappingURL=model-pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-pricing.d.ts","sourceRoot":"","sources":["../../src/internal/model-pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErE,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,2DAA2D;IAC3D,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAID;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAgNxE,CAAC;AAkCF,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAoEjE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD;AAiBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,GAClB,gBAAgB,GAAG,SAAS,CAgB9B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,SAAS,GACf,QAAQ,GAAG,SAAS,CAmBtB"}
@@ -0,0 +1,377 @@
1
+ /**
2
+ * Best-effort dollar-cost estimation for agent turns.
3
+ *
4
+ * The Cursor harness streams token usage (`turn-ended`) but no dollar cost,
5
+ * and server-billed cost is only queryable for cloud agents — so the
6
+ * framework prices token usage against a built-in snapshot of Cursor's
7
+ * published per-model API rates. Estimates are marked `source: "estimate"`
8
+ * everywhere they surface (traces, playground, A/B metrics, CLI); the billed
9
+ * amount on the Cursor dashboard remains the source of truth.
10
+ *
11
+ * Unknown models produce no estimate rather than a wrong one. Deployments
12
+ * can extend or correct the table without a package upgrade via the
13
+ * `AGENT_SERVE_MODEL_PRICING` environment variable (a JSON object merged
14
+ * over the defaults, keyed by model id).
15
+ */
16
+ const M = 1000000;
17
+ /**
18
+ * Snapshot of Cursor API per-model token rates (USD per million tokens).
19
+ * Keyed by normalized model id; family aliases (`sonnet`, `gpt`, …) point at
20
+ * the model they currently resolve to.
21
+ */
22
+ export const DEFAULT_MODEL_PRICING = {
23
+ // xAI / Cursor-served Grok
24
+ "grok-4.5": {
25
+ inputUsdPerMTok: 2,
26
+ outputUsdPerMTok: 6,
27
+ cacheReadUsdPerMTok: 0.5,
28
+ fast: { inputUsdPerMTok: 4, outputUsdPerMTok: 18, cacheReadUsdPerMTok: 1 },
29
+ },
30
+ "grok-4.20": {
31
+ inputUsdPerMTok: 2,
32
+ outputUsdPerMTok: 6,
33
+ cacheReadUsdPerMTok: 0.2,
34
+ },
35
+ "grok-4.3": {
36
+ inputUsdPerMTok: 1.25,
37
+ outputUsdPerMTok: 2.5,
38
+ cacheReadUsdPerMTok: 0.125,
39
+ },
40
+ "grok-code": {
41
+ inputUsdPerMTok: 0.2,
42
+ outputUsdPerMTok: 1.5,
43
+ cacheReadUsdPerMTok: 0.02,
44
+ },
45
+ // Anthropic
46
+ "opus-5": {
47
+ inputUsdPerMTok: 5,
48
+ outputUsdPerMTok: 25,
49
+ cacheReadUsdPerMTok: 0.5,
50
+ cacheWriteUsdPerMTok: 6.25,
51
+ fast: {
52
+ inputUsdPerMTok: 10,
53
+ outputUsdPerMTok: 50,
54
+ cacheReadUsdPerMTok: 1,
55
+ cacheWriteUsdPerMTok: 12.5,
56
+ },
57
+ },
58
+ "opus-4.8": {
59
+ inputUsdPerMTok: 5,
60
+ outputUsdPerMTok: 25,
61
+ cacheReadUsdPerMTok: 0.5,
62
+ cacheWriteUsdPerMTok: 6.25,
63
+ fast: {
64
+ inputUsdPerMTok: 10,
65
+ outputUsdPerMTok: 50,
66
+ cacheReadUsdPerMTok: 1,
67
+ cacheWriteUsdPerMTok: 12.5,
68
+ },
69
+ },
70
+ "opus-4.7": {
71
+ inputUsdPerMTok: 5,
72
+ outputUsdPerMTok: 25,
73
+ cacheReadUsdPerMTok: 0.5,
74
+ cacheWriteUsdPerMTok: 6.25,
75
+ fast: {
76
+ inputUsdPerMTok: 30,
77
+ outputUsdPerMTok: 150,
78
+ cacheReadUsdPerMTok: 3,
79
+ cacheWriteUsdPerMTok: 37.5,
80
+ },
81
+ },
82
+ "opus-4.6": {
83
+ inputUsdPerMTok: 5,
84
+ outputUsdPerMTok: 25,
85
+ cacheReadUsdPerMTok: 0.5,
86
+ cacheWriteUsdPerMTok: 6.25,
87
+ },
88
+ "opus-4.5": {
89
+ inputUsdPerMTok: 5,
90
+ outputUsdPerMTok: 25,
91
+ cacheReadUsdPerMTok: 0.5,
92
+ cacheWriteUsdPerMTok: 6.25,
93
+ },
94
+ "sonnet-5": {
95
+ inputUsdPerMTok: 3,
96
+ outputUsdPerMTok: 15,
97
+ cacheReadUsdPerMTok: 0.3,
98
+ cacheWriteUsdPerMTok: 3.75,
99
+ },
100
+ "sonnet-4.6": {
101
+ inputUsdPerMTok: 3,
102
+ outputUsdPerMTok: 15,
103
+ cacheReadUsdPerMTok: 0.3,
104
+ cacheWriteUsdPerMTok: 3.75,
105
+ },
106
+ "sonnet-4.5": {
107
+ inputUsdPerMTok: 3,
108
+ outputUsdPerMTok: 15,
109
+ cacheReadUsdPerMTok: 0.3,
110
+ cacheWriteUsdPerMTok: 3.75,
111
+ },
112
+ "haiku-4.5": {
113
+ inputUsdPerMTok: 1,
114
+ outputUsdPerMTok: 5,
115
+ cacheReadUsdPerMTok: 0.1,
116
+ cacheWriteUsdPerMTok: 1.25,
117
+ },
118
+ "fable-5": {
119
+ inputUsdPerMTok: 10,
120
+ outputUsdPerMTok: 50,
121
+ cacheReadUsdPerMTok: 1,
122
+ cacheWriteUsdPerMTok: 12.5,
123
+ },
124
+ // OpenAI
125
+ "gpt-5.6": {
126
+ inputUsdPerMTok: 5,
127
+ outputUsdPerMTok: 30,
128
+ cacheReadUsdPerMTok: 0.5,
129
+ cacheWriteUsdPerMTok: 6.25,
130
+ fast: {
131
+ inputUsdPerMTok: 10,
132
+ outputUsdPerMTok: 60,
133
+ cacheReadUsdPerMTok: 1,
134
+ cacheWriteUsdPerMTok: 12.5,
135
+ },
136
+ },
137
+ "gpt-5.5": {
138
+ inputUsdPerMTok: 5,
139
+ outputUsdPerMTok: 30,
140
+ cacheReadUsdPerMTok: 0.5,
141
+ },
142
+ "gpt-5.4": {
143
+ inputUsdPerMTok: 2.5,
144
+ outputUsdPerMTok: 15,
145
+ cacheReadUsdPerMTok: 0.25,
146
+ },
147
+ "gpt-5.2": {
148
+ inputUsdPerMTok: 1.75,
149
+ outputUsdPerMTok: 14,
150
+ cacheReadUsdPerMTok: 0.175,
151
+ },
152
+ "gpt-mini": {
153
+ inputUsdPerMTok: 0.75,
154
+ outputUsdPerMTok: 4.5,
155
+ cacheReadUsdPerMTok: 0.075,
156
+ },
157
+ "codex-5.3": {
158
+ inputUsdPerMTok: 1.75,
159
+ outputUsdPerMTok: 14,
160
+ cacheReadUsdPerMTok: 0.175,
161
+ },
162
+ "codex-5.2": {
163
+ inputUsdPerMTok: 1.75,
164
+ outputUsdPerMTok: 14,
165
+ cacheReadUsdPerMTok: 0.175,
166
+ },
167
+ // Google
168
+ "gemini-3.1-pro": {
169
+ inputUsdPerMTok: 2,
170
+ outputUsdPerMTok: 12,
171
+ cacheReadUsdPerMTok: 0.2,
172
+ },
173
+ "gemini-3-pro": {
174
+ inputUsdPerMTok: 2,
175
+ outputUsdPerMTok: 12,
176
+ cacheReadUsdPerMTok: 0.2,
177
+ },
178
+ "gemini-3.6-flash": {
179
+ inputUsdPerMTok: 1.5,
180
+ outputUsdPerMTok: 7.5,
181
+ cacheReadUsdPerMTok: 0.15,
182
+ },
183
+ "gemini-3.5-flash": {
184
+ inputUsdPerMTok: 1.5,
185
+ outputUsdPerMTok: 9,
186
+ cacheReadUsdPerMTok: 0.15,
187
+ },
188
+ // Cursor Composer
189
+ "composer-2.5": {
190
+ inputUsdPerMTok: 0.5,
191
+ outputUsdPerMTok: 2.5,
192
+ cacheReadUsdPerMTok: 0.2,
193
+ fast: {
194
+ inputUsdPerMTok: 3,
195
+ outputUsdPerMTok: 15,
196
+ cacheReadUsdPerMTok: 0.5,
197
+ },
198
+ },
199
+ "composer-2": {
200
+ inputUsdPerMTok: 0.5,
201
+ outputUsdPerMTok: 2.5,
202
+ cacheReadUsdPerMTok: 0.2,
203
+ },
204
+ // Moonshot / Zhipu
205
+ "kimi-k3": {
206
+ inputUsdPerMTok: 3,
207
+ outputUsdPerMTok: 15,
208
+ cacheReadUsdPerMTok: 0.3,
209
+ },
210
+ "kimi-k2.7": {
211
+ inputUsdPerMTok: 0.95,
212
+ outputUsdPerMTok: 4,
213
+ cacheReadUsdPerMTok: 0.19,
214
+ },
215
+ "kimi-k2.5": {
216
+ inputUsdPerMTok: 0.6,
217
+ outputUsdPerMTok: 3,
218
+ cacheReadUsdPerMTok: 0.1,
219
+ },
220
+ "glm-5.2": {
221
+ inputUsdPerMTok: 1.4,
222
+ outputUsdPerMTok: 4.4,
223
+ cacheReadUsdPerMTok: 0.26,
224
+ },
225
+ };
226
+ /** Family aliases → the model id they currently resolve to. */
227
+ const MODEL_ID_ALIASES = {
228
+ grok: "grok-4.20",
229
+ "grok-latest": "grok-4.3",
230
+ "grok-code-latest": "grok-code",
231
+ opus: "opus-5",
232
+ "opus-latest": "opus-5",
233
+ sonnet: "sonnet-4.6",
234
+ "sonnet-latest": "sonnet-5",
235
+ haiku: "haiku-4.5",
236
+ "haiku-latest": "haiku-4.5",
237
+ fable: "fable-5",
238
+ gpt: "gpt-5.6",
239
+ "gpt-latest": "gpt-5.6",
240
+ "gpt-5-6-sol": "gpt-5.6",
241
+ "gpt-5-5": "gpt-5.5",
242
+ "gpt-mini-latest": "gpt-mini",
243
+ codex: "codex-5.3",
244
+ "codex-latest": "codex-5.3",
245
+ gemini: "gemini-3.1-pro",
246
+ "gemini-latest": "gemini-3.1-pro",
247
+ "gemini-pro": "gemini-3.1-pro",
248
+ "gemini-pro-latest": "gemini-3.1-pro",
249
+ "gemini-flash": "gemini-3.6-flash",
250
+ "gemini-flash-latest": "gemini-3.6-flash",
251
+ composer: "composer-2.5",
252
+ "composer-latest": "composer-2.5",
253
+ "composer-2-5": "composer-2.5",
254
+ kimi: "kimi-k2.7",
255
+ "kimi-latest": "kimi-k2.7",
256
+ };
257
+ /** Env var holding a JSON pricing override merged over the defaults. */
258
+ export const MODEL_PRICING_ENV_VAR = "AGENT_SERVE_MODEL_PRICING";
259
+ let cachedEnvOverride;
260
+ function envOverrideTable() {
261
+ const raw = process.env[MODEL_PRICING_ENV_VAR];
262
+ if (cachedEnvOverride !== undefined && cachedEnvOverride.raw === raw) {
263
+ return cachedEnvOverride.table;
264
+ }
265
+ let table = {};
266
+ if (raw !== undefined && raw.trim() !== "") {
267
+ try {
268
+ const parsed = JSON.parse(raw);
269
+ if (typeof parsed === "object" && parsed !== null) {
270
+ for (const [key, value] of Object.entries(parsed)) {
271
+ const tier = parsePricing(value);
272
+ if (tier !== undefined) {
273
+ table[normalizeModelId(key)] = tier;
274
+ }
275
+ }
276
+ }
277
+ }
278
+ catch (_a) {
279
+ table = {};
280
+ }
281
+ }
282
+ cachedEnvOverride = { raw, table };
283
+ return table;
284
+ }
285
+ function parseTier(value) {
286
+ if (typeof value !== "object" || value === null) {
287
+ return undefined;
288
+ }
289
+ const row = value;
290
+ const input = row.inputUsdPerMTok;
291
+ const output = row.outputUsdPerMTok;
292
+ const cacheRead = row.cacheReadUsdPerMTok;
293
+ if (!isRate(input) ||
294
+ !isRate(output) ||
295
+ (cacheRead !== undefined && !isRate(cacheRead))) {
296
+ return undefined;
297
+ }
298
+ const cacheWrite = row.cacheWriteUsdPerMTok;
299
+ return {
300
+ inputUsdPerMTok: input,
301
+ outputUsdPerMTok: output,
302
+ cacheReadUsdPerMTok: isRate(cacheRead) ? cacheRead : input,
303
+ cacheWriteUsdPerMTok: isRate(cacheWrite) ? cacheWrite : undefined,
304
+ };
305
+ }
306
+ function parsePricing(value) {
307
+ const base = parseTier(value);
308
+ if (base === undefined) {
309
+ return undefined;
310
+ }
311
+ const fast = parseTier(value.fast);
312
+ return Object.assign(Object.assign({}, base), { fast });
313
+ }
314
+ function isRate(value) {
315
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
316
+ }
317
+ export function normalizeModelId(id) {
318
+ return id.trim().toLowerCase();
319
+ }
320
+ function modelId(model) {
321
+ return typeof model === "string" ? model : model.id;
322
+ }
323
+ function modelHasFastParam(model) {
324
+ var _a;
325
+ if (typeof model === "string") {
326
+ return false;
327
+ }
328
+ return (((_a = model.params) === null || _a === void 0 ? void 0 : _a.some((param) => param.id === "fast" && param.value === "true")) === true);
329
+ }
330
+ /**
331
+ * Rates for a model selection, honoring its `fast` parameter. `undefined`
332
+ * when the model is not in the table (no estimate is better than a wrong
333
+ * one).
334
+ */
335
+ export function resolveModelPricing(model) {
336
+ var _a, _b, _c, _d;
337
+ const overrides = envOverrideTable();
338
+ const rawId = normalizeModelId(modelId(model));
339
+ const canonicalId = (_a = MODEL_ID_ALIASES[rawId]) !== null && _a !== void 0 ? _a : rawId;
340
+ const pricing = (_d = (_c = (_b = overrides[rawId]) !== null && _b !== void 0 ? _b : overrides[canonicalId]) !== null && _c !== void 0 ? _c : DEFAULT_MODEL_PRICING[rawId]) !== null && _d !== void 0 ? _d : DEFAULT_MODEL_PRICING[canonicalId];
341
+ if (pricing === undefined) {
342
+ return undefined;
343
+ }
344
+ if (modelHasFastParam(model) && pricing.fast !== undefined) {
345
+ return pricing.fast;
346
+ }
347
+ return pricing;
348
+ }
349
+ /**
350
+ * Estimate the dollar cost of one turn's token usage. `undefined` when the
351
+ * model has no known rates.
352
+ */
353
+ export function estimateTurnCost(model, usage) {
354
+ var _a;
355
+ const tier = resolveModelPricing(model);
356
+ if (tier === undefined) {
357
+ return undefined;
358
+ }
359
+ const cacheWriteRate = (_a = tier.cacheWriteUsdPerMTok) !== null && _a !== void 0 ? _a : tier.inputUsdPerMTok;
360
+ const inputUsd = (usage.inputTokens / M) * tier.inputUsdPerMTok;
361
+ const outputUsd = (usage.outputTokens / M) * tier.outputUsdPerMTok;
362
+ const cacheReadUsd = (usage.cacheReadTokens / M) * tier.cacheReadUsdPerMTok;
363
+ const cacheWriteUsd = (usage.cacheWriteTokens / M) * cacheWriteRate;
364
+ return {
365
+ totalUsd: roundUsd(inputUsd + outputUsd + cacheReadUsd + cacheWriteUsd),
366
+ inputUsd: roundUsd(inputUsd),
367
+ outputUsd: roundUsd(outputUsd),
368
+ cacheReadUsd: roundUsd(cacheReadUsd),
369
+ cacheWriteUsd: roundUsd(cacheWriteUsd),
370
+ model: normalizeModelId(modelId(model)),
371
+ source: "estimate",
372
+ };
373
+ }
374
+ /** Keep persisted estimates readable: micro-dollar precision. */
375
+ function roundUsd(usd) {
376
+ return Math.round(usd * 1e6) / 1e6;
377
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"reminder-runner.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAEV,mBAAmB,EAGnB,YAAY,EAEb,MAAM,aAAa,CAAC;AASrB,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,qBAAa,oBAAqB,SAAQ,KAAK;IAG3C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE;IAFzC,YACE,UAAU,EAAE,MAAM,EACT,oBAAoB,EAAE,MAAM,EAAE,EAIxC;CACF;AAyDD,qBAAa,cAAc;IAUvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,OAAO,CAAS;IAExB,YACmB,MAAM,EAAE,aAAa,EACrB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAe,EAG3D;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,sEAAsE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B3B;IAED;;;OAGG;YACW,kBAAkB;IA6BhC,8EAA8E;YAChE,OAAO;IAKrB,IAAI,IAAI,IAAI,CAOX;IAEK,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8D9D;IAEK,IAAI,CAAC,MAAM,CAAC,EAAE;QAClB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA4B1B;IAEK,MAAM,CACV,EAAE,EAAE,MAAM,EACV,MAAM,SAAoB,GACzB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAkBnC;IAED,iFAAiF;IAC3E,qBAAqB,CACzB,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAUjB;IAED;;;;;OAKG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAkBjB;IAED,uDAAuD;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1C,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAQD;IAED,OAAO,CAAC,QAAQ;IA4ChB,OAAO,CAAC,UAAU;YAQJ,IAAI;YA6GJ,aAAa;IAY3B,OAAO,CAAC,eAAe;IAsBvB;;;OAGG;YACW,mBAAmB;YAcnB,aAAa;YAcb,YAAY;IA0C1B,OAAO,CAAC,gBAAgB;IAyDxB,OAAO,CAAC,iBAAiB;YAeX,MAAM;YAYN,SAAS;CAoFxB;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"reminder-runner.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAEV,mBAAmB,EAGnB,YAAY,EAEb,MAAM,aAAa,CAAC;AASrB,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,qBAAa,oBAAqB,SAAQ,KAAK;IAG3C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE;IAFzC,YACE,UAAU,EAAE,MAAM,EACT,oBAAoB,EAAE,MAAM,EAAE,EAIxC;CACF;AAyDD,qBAAa,cAAc;IAUvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,OAAO,CAAS;IAExB,YACmB,MAAM,EAAE,aAAa,EACrB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAe,EAG3D;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,sEAAsE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B3B;IAED;;;OAGG;YACW,kBAAkB;IA6BhC,8EAA8E;YAChE,OAAO;IAKrB,IAAI,IAAI,IAAI,CAOX;IAEK,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8D9D;IAEK,IAAI,CAAC,MAAM,CAAC,EAAE;QAClB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA4B1B;IAEK,MAAM,CACV,EAAE,EAAE,MAAM,EACV,MAAM,SAAoB,GACzB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAkBnC;IAED,iFAAiF;IAC3E,qBAAqB,CACzB,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAUjB;IAED;;;;;OAKG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAkBjB;IAED,uDAAuD;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1C,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAQD;IAED,OAAO,CAAC,QAAQ;IA4ChB,OAAO,CAAC,UAAU;YAQJ,IAAI;YA6GJ,aAAa;IAY3B,OAAO,CAAC,eAAe;IAsBvB;;;OAGG;YACW,mBAAmB;YAcnB,aAAa;YAcb,YAAY;IA0C1B,OAAO,CAAC,gBAAgB;IA0DxB,OAAO,CAAC,iBAAiB;YAeX,MAAM;YAYN,SAAS;CAoFxB;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -539,6 +539,7 @@ export class ReminderRunner {
539
539
  host: this.engine.host,
540
540
  mcp: this.engine.host.mcp,
541
541
  appAuth: APP_AUTH,
542
+ artifacts: this.engine.artifacts,
542
543
  followup(args) {
543
544
  return __awaiter(this, void 0, void 0, function* () {
544
545
  const auth = yield self.resolveFollowupAuth(record.channelId, record.continuationToken);