@unbrained/pm-cli 2026.10.17 → 2026.10.18

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 (188) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +25 -0
  3. package/dist/cli/register-list-query.js +2 -2
  4. package/dist/cli-bundle/bundle-manifest.json +1 -1
  5. package/dist/cli-bundle/chunks/{chunk-3QKI3XNX.js → chunk-4GA4MUTE.js} +2 -2
  6. package/dist/cli-bundle/chunks/{chunk-X2ONXFBP.js → chunk-4V6ONLI6.js} +2 -2
  7. package/dist/cli-bundle/chunks/{chunk-B5QVGCZX.js → chunk-6VZKYJW7.js} +2 -2
  8. package/dist/cli-bundle/chunks/chunk-7PATQWTH.js +20 -0
  9. package/dist/cli-bundle/chunks/{chunk-W3KZ22DW.js → chunk-7WIEAGDS.js} +2 -2
  10. package/dist/cli-bundle/chunks/{chunk-EA2CG7UM.js → chunk-AETP4JEM.js} +2 -2
  11. package/dist/cli-bundle/chunks/{chunk-6ZDKKOKM.js → chunk-FIJOSX2C.js} +2 -2
  12. package/dist/cli-bundle/chunks/{chunk-VMCSTFSO.js → chunk-LUKVNL72.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-J4LPQCET.js → chunk-OJ77ZQN3.js} +2 -2
  14. package/dist/cli-bundle/chunks/{chunk-O4YBC3OM.js → chunk-PYRREEUB.js} +30 -30
  15. package/dist/cli-bundle/chunks/chunk-RHQJ6VWC.js +237 -0
  16. package/dist/cli-bundle/chunks/{chunk-OZCSXX4D.js → chunk-RNABUEFB.js} +2 -2
  17. package/dist/cli-bundle/chunks/{chunk-HY7FQ7QX.js → chunk-TO6CIV4C.js} +2 -2
  18. package/dist/cli-bundle/chunks/{chunk-JS3B2M4D.js → chunk-ZZED447K.js} +2 -2
  19. package/dist/cli-bundle/chunks/{register-list-query-RU3QZSAQ.js → register-list-query-PUCVYYBD.js} +7 -7
  20. package/dist/cli-bundle/chunks/{register-mutation-EQYMT32A.js → register-mutation-GGGVBXD5.js} +2 -2
  21. package/dist/cli-bundle/chunks/{register-operations-VXBGE4XI.js → register-operations-NRZ6Q4QE.js} +2 -2
  22. package/dist/cli-bundle/chunks/{register-setup-UUDEGFRO.js → register-setup-MV3P3YSF.js} +2 -2
  23. package/dist/cli-bundle/focused-chunks/{chunk-LDKX4KYJ.js → chunk-2MPQUMTF.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/{chunk-MBQF6HT6.js → chunk-5UKCSZWT.js} +2 -2
  25. package/dist/cli-bundle/focused-chunks/{chunk-FTUZ3JF2.js → chunk-A4ZHHTEX.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/{chunk-JXR6UKFM.js → chunk-B4YLP5ZB.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/{chunk-NZO7GOXD.js → chunk-BFEMT5U3.js} +16 -16
  28. package/dist/cli-bundle/focused-chunks/{chunk-QOSVJDOO.js → chunk-FW7CSSKL.js} +61 -61
  29. package/dist/cli-bundle/focused-chunks/{chunk-AH6NX6GM.js → chunk-HYPRPSYD.js} +2 -2
  30. package/dist/cli-bundle/focused-chunks/{chunk-RBLSY6ML.js → chunk-IRVL4UXR.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-RHTH5ILM.js → chunk-L55KQ2KT.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-PYC7BF6Z.js → chunk-MASIOFPG.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/chunk-RJ3EIHDU.js +26 -0
  34. package/dist/cli-bundle/focused-chunks/chunk-SEL4Z2OO.js +167 -0
  35. package/dist/cli-bundle/focused-chunks/{chunk-2IOHHNRT.js → chunk-TB7F4FCR.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-UNTQE37U.js → chunk-TZUIBG3P.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/{chunk-E33QA7PK.js → chunk-Z7YIFCNE.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/{chunk-SIGIGZCG.js → chunk-ZDBS2DCT.js} +2 -2
  39. package/dist/cli-bundle/main.js +2 -2
  40. package/dist/cli-bundle/sdk-authoring.js +1 -1
  41. package/dist/cli-bundle/sdk-contracts.js +1 -1
  42. package/dist/cli-bundle/sdk-core.js +16 -16
  43. package/dist/cli-bundle/sdk-governance.js +1 -1
  44. package/dist/cli-bundle/sdk-graph.js +1 -1
  45. package/dist/cli-bundle/sdk-merge.js +50 -49
  46. package/dist/cli-bundle/sdk-query.js +1 -1
  47. package/dist/cli-bundle/sdk-runtime.js +1 -1
  48. package/dist/cli-bundle/sdk-testing.js +1 -1
  49. package/dist/cli-bundle/sdk.js +1 -1
  50. package/dist/core/history/event-index.d.ts +8 -1
  51. package/dist/core/history/event-index.js +19 -18
  52. package/dist/core/item/item-format.js +1 -1
  53. package/dist/core/lock/lock.d.ts +8 -1
  54. package/dist/core/lock/lock.js +3 -3
  55. package/dist/core/output/output.js +2 -2
  56. package/dist/core/store/paths.js +1 -1
  57. package/dist/core/telemetry/policy.d.ts +2 -0
  58. package/dist/core/telemetry/policy.js +1 -1
  59. package/dist/core/telemetry/runtime.d.ts +5 -3
  60. package/dist/core/telemetry/runtime.js +3 -3
  61. package/dist/sdk/governance/health/projection.d.ts +37 -0
  62. package/dist/sdk/governance/health/projection.js +2 -0
  63. package/dist/sdk/governance/health.d.ts +7 -18
  64. package/dist/sdk/governance/health.js +2 -2
  65. package/dist/sdk/mutation-events.js +1 -1
  66. package/dist/sdk/public-surface.json +1 -1
  67. package/dist/sdk/query/list.d.ts +2 -0
  68. package/dist/sdk/query/list.js +1 -1
  69. package/dist/types.d.ts +2 -2
  70. package/dist/types.js +1 -1
  71. package/docs/COMMANDS.md +26 -0
  72. package/docs/CONFIGURATION.md +22 -1
  73. package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +22 -3
  74. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +10 -0
  75. package/docs/RELEASING.md +8 -1
  76. package/docs/SDK_CONTEXT_COORDINATION.md +71 -7
  77. package/docs/SDK_STORAGE_LIFECYCLE.md +24 -2
  78. package/docs/TESTING.md +8 -0
  79. package/docs/examples/ci/github-actions-pm-extension-gate.yml +1 -1
  80. package/docs/examples/ci/gitlab-ci-pm-extension-gate.yml +1 -1
  81. package/docs/examples/ci/jenkins-pm-extension-gate.Jenkinsfile +1 -1
  82. package/marketplace.json +1 -1
  83. package/node_modules/@opentelemetry/core/package.json +2 -1
  84. package/node_modules/@opentelemetry/instrumentation/package.json +2 -1
  85. package/node_modules/@opentelemetry/resources/package.json +2 -1
  86. package/node_modules/@opentelemetry/sdk-trace/package.json +2 -1
  87. package/node_modules/@opentelemetry/sdk-trace-base/package.json +2 -1
  88. package/node_modules/@sentry/core/build/cjs/client.js +5 -4
  89. package/node_modules/@sentry/core/build/cjs/tracing/ai/gen-ai-attributes.js +0 -4
  90. package/node_modules/@sentry/core/build/cjs/tracing/ai/utils.js +33 -23
  91. package/node_modules/@sentry/core/build/cjs/tracing/anthropic-ai/index.js +7 -6
  92. package/node_modules/@sentry/core/build/cjs/tracing/anthropic-ai/streaming.js +3 -1
  93. package/node_modules/@sentry/core/build/cjs/tracing/google-genai/index.js +13 -14
  94. package/node_modules/@sentry/core/build/cjs/tracing/google-genai/streaming.js +6 -1
  95. package/node_modules/@sentry/core/build/cjs/tracing/langchain/utils.js +71 -21
  96. package/node_modules/@sentry/core/build/cjs/tracing/langgraph/utils.js +23 -33
  97. package/node_modules/@sentry/core/build/cjs/tracing/openai/streaming.js +6 -0
  98. package/node_modules/@sentry/core/build/cjs/tracing/openai/utils.js +11 -0
  99. package/node_modules/@sentry/core/build/cjs/tracing/workers-ai/utils.js +1 -1
  100. package/node_modules/@sentry/core/build/cjs/utils/eventUtils.js +4 -0
  101. package/node_modules/@sentry/core/build/cjs/utils/prepareEvent.js +2 -2
  102. package/node_modules/@sentry/core/build/cjs/utils/version.js +1 -1
  103. package/node_modules/@sentry/core/build/esm/client.js +6 -5
  104. package/node_modules/@sentry/core/build/esm/package.json +1 -1
  105. package/node_modules/@sentry/core/build/esm/tracing/ai/gen-ai-attributes.js +1 -3
  106. package/node_modules/@sentry/core/build/esm/tracing/ai/utils.js +34 -24
  107. package/node_modules/@sentry/core/build/esm/tracing/anthropic-ai/index.js +8 -7
  108. package/node_modules/@sentry/core/build/esm/tracing/anthropic-ai/streaming.js +3 -1
  109. package/node_modules/@sentry/core/build/esm/tracing/google-genai/index.js +15 -16
  110. package/node_modules/@sentry/core/build/esm/tracing/google-genai/streaming.js +6 -1
  111. package/node_modules/@sentry/core/build/esm/tracing/langchain/utils.js +73 -24
  112. package/node_modules/@sentry/core/build/esm/tracing/langgraph/utils.js +24 -34
  113. package/node_modules/@sentry/core/build/esm/tracing/openai/streaming.js +6 -0
  114. package/node_modules/@sentry/core/build/esm/tracing/openai/utils.js +11 -0
  115. package/node_modules/@sentry/core/build/esm/tracing/workers-ai/utils.js +2 -2
  116. package/node_modules/@sentry/core/build/esm/utils/eventUtils.js +4 -1
  117. package/node_modules/@sentry/core/build/esm/utils/prepareEvent.js +2 -2
  118. package/node_modules/@sentry/core/build/esm/utils/version.js +1 -1
  119. package/node_modules/@sentry/core/build/types/tracing/ai/utils.d.ts +3 -7
  120. package/node_modules/@sentry/core/build/types/tracing/anthropic-ai/types.d.ts +2 -2
  121. package/node_modules/@sentry/core/build/types/tracing/langchain/types.d.ts +15 -0
  122. package/node_modules/@sentry/core/build/types/tracing/langchain/utils.d.ts +1 -0
  123. package/node_modules/@sentry/core/build/types/tracing/langgraph/utils.d.ts +2 -0
  124. package/node_modules/@sentry/core/build/types/tracing/openai/types.d.ts +2 -0
  125. package/node_modules/@sentry/core/build/types/utils/eventUtils.d.ts +2 -1
  126. package/node_modules/@sentry/core/build/types-ts3.8/tracing/ai/utils.d.ts +3 -7
  127. package/node_modules/@sentry/core/build/types-ts3.8/tracing/anthropic-ai/types.d.ts +2 -2
  128. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langchain/types.d.ts +15 -0
  129. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langchain/utils.d.ts +1 -0
  130. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langgraph/utils.d.ts +2 -0
  131. package/node_modules/@sentry/core/build/types-ts3.8/tracing/openai/types.d.ts +2 -0
  132. package/node_modules/@sentry/core/build/types-ts3.8/utils/eventUtils.d.ts +2 -1
  133. package/node_modules/@sentry/core/package.json +1 -1
  134. package/node_modules/@sentry/node/build/esm/package.json +1 -1
  135. package/node_modules/@sentry/node/package.json +5 -5
  136. package/node_modules/@sentry/node-core/build/cjs/integrations/anr/index.js +1 -1
  137. package/node_modules/@sentry/node-core/build/cjs/integrations/local-variables/local-variables-async.js +1 -1
  138. package/node_modules/@sentry/node-core/build/esm/integrations/anr/index.js +1 -1
  139. package/node_modules/@sentry/node-core/build/esm/integrations/anr/worker-script.js +2 -2
  140. package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/local-variables-async.js +1 -1
  141. package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/worker-script.js +1 -1
  142. package/node_modules/@sentry/node-core/build/esm/package.json +1 -1
  143. package/node_modules/@sentry/node-core/package.json +10 -4
  144. package/node_modules/@sentry/opentelemetry/build/esm/package.json +1 -1
  145. package/node_modules/@sentry/opentelemetry/package.json +5 -2
  146. package/node_modules/@sentry/server-utils/build/THIRD-PARTY-LICENSES.txt +55 -55
  147. package/node_modules/@sentry/server-utils/build/esm/package.json +1 -1
  148. package/node_modules/@sentry/server-utils/package.json +2 -2
  149. package/node_modules/@toon-format/toon/README.md +10 -41
  150. package/node_modules/@toon-format/toon/dist/index.d.mts +12 -36
  151. package/node_modules/@toon-format/toon/dist/index.mjs +134 -202
  152. package/node_modules/@toon-format/toon/package.json +2 -2
  153. package/node_modules/debug/package.json +3 -0
  154. package/node_modules/fdir/package.json +3 -0
  155. package/node_modules/has-flag/index.d.ts +39 -0
  156. package/node_modules/has-flag/index.js +8 -0
  157. package/node_modules/has-flag/license +9 -0
  158. package/node_modules/has-flag/package.json +46 -0
  159. package/node_modules/has-flag/readme.md +89 -0
  160. package/node_modules/supports-color/browser.js +5 -0
  161. package/node_modules/supports-color/index.js +135 -0
  162. package/node_modules/supports-color/license +9 -0
  163. package/node_modules/supports-color/package.json +53 -0
  164. package/node_modules/supports-color/readme.md +76 -0
  165. package/package.json +4 -4
  166. package/packages/pm-beads/package.json +1 -1
  167. package/packages/pm-calendar/package.json +1 -1
  168. package/packages/pm-command-kit/package.json +1 -1
  169. package/packages/pm-digital-twin/package.json +1 -1
  170. package/packages/pm-governance-audit/package.json +1 -1
  171. package/packages/pm-guide-shell/package.json +1 -1
  172. package/packages/pm-kanban/package.json +1 -1
  173. package/packages/pm-lifecycle-hooks/package.json +1 -1
  174. package/packages/pm-linked-test-adapters/package.json +1 -1
  175. package/packages/pm-search-advanced/package.json +1 -1
  176. package/packages/pm-templates/package.json +1 -1
  177. package/packages/pm-todos/package.json +1 -1
  178. package/packages/pm-vcs/package.json +1 -1
  179. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  180. package/plugins/pm-claude/package.json +1 -1
  181. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  182. package/plugins/pm-codex/package.json +1 -1
  183. package/plugins/pm-codex/plugin.json +1 -1
  184. package/runtime-dependencies.json +1 -1
  185. package/dist/cli-bundle/chunks/chunk-4PNPDT2N.js +0 -236
  186. package/dist/cli-bundle/chunks/chunk-X53HM753.js +0 -20
  187. package/dist/cli-bundle/focused-chunks/chunk-5JEFDEL3.js +0 -166
  188. package/dist/cli-bundle/focused-chunks/chunk-TRFVAWF2.js +0 -26
package/marketplace.json CHANGED
@@ -1 +1 @@
1
- {"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.10.17","plugins":[{"name":"pm-claude","source":"./plugins/pm-claude","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.","version":"2026.10.17","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","project-management","mcp","tasks","agents","workflows","git-native","task-tracker","ai"],"category":"productivity"}]}
1
+ {"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.10.18","plugins":[{"name":"pm-claude","source":"./plugins/pm-claude","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.","version":"2026.10.18","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","project-management","mcp","tasks","agents","workflows","git-native","task-tracker","ai"],"category":"productivity"}]}
@@ -86,7 +86,8 @@
86
86
  "@opentelemetry/api": ">=1.0.0 <1.10.0"
87
87
  },
88
88
  "dependencies": {
89
- "@opentelemetry/semantic-conventions": "^1.29.0"
89
+ "@opentelemetry/semantic-conventions": "^1.29.0",
90
+ "@opentelemetry/api": "1.9.1"
90
91
  },
91
92
  "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-core",
92
93
  "sideEffects": false,
@@ -72,7 +72,8 @@
72
72
  "dependencies": {
73
73
  "@opentelemetry/api-logs": "0.220.0",
74
74
  "import-in-the-middle": "^3.0.0",
75
- "require-in-the-middle": "^8.0.0"
75
+ "require-in-the-middle": "^8.0.0",
76
+ "@opentelemetry/api": "1.9.1"
76
77
  },
77
78
  "peerDependencies": {
78
79
  "@opentelemetry/api": "^1.3.0"
@@ -83,7 +83,8 @@
83
83
  },
84
84
  "dependencies": {
85
85
  "@opentelemetry/core": "2.12.0",
86
- "@opentelemetry/semantic-conventions": "^1.29.0"
86
+ "@opentelemetry/semantic-conventions": "^1.29.0",
87
+ "@opentelemetry/api": "1.9.1"
87
88
  },
88
89
  "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-resources",
89
90
  "sideEffects": false,
@@ -92,7 +92,8 @@
92
92
  "dependencies": {
93
93
  "@opentelemetry/core": "2.12.0",
94
94
  "@opentelemetry/resources": "2.12.0",
95
- "@opentelemetry/semantic-conventions": "^1.29.0"
95
+ "@opentelemetry/semantic-conventions": "^1.29.0",
96
+ "@opentelemetry/api": "1.9.1"
96
97
  },
97
98
  "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/sdk-trace",
98
99
  "sideEffects": false,
@@ -92,7 +92,8 @@
92
92
  "@opentelemetry/core": "2.12.0",
93
93
  "@opentelemetry/resources": "2.12.0",
94
94
  "@opentelemetry/sdk-trace": "2.12.0",
95
- "@opentelemetry/semantic-conventions": "^1.29.0"
95
+ "@opentelemetry/semantic-conventions": "^1.29.0",
96
+ "@opentelemetry/api": "1.9.1"
96
97
  },
97
98
  "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-base",
98
99
  "sideEffects": false,
@@ -333,8 +333,10 @@ class Client {
333
333
  this.emit("beforeSendEvent", event, hint);
334
334
  const genAiSpanItem = extractGenAiSpans.extractGenAiSpansFromEvent(event, this);
335
335
  let env = envelope.createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
336
- for (const attachment of hint.attachments || []) {
337
- env = envelope$1.addItemToEnvelope(env, envelope$1.createAttachmentEnvelopeItem(attachment));
336
+ if (!eventUtils.isInternalException(hint)) {
337
+ for (const attachment of hint.attachments || []) {
338
+ env = envelope$1.addItemToEnvelope(env, envelope$1.createAttachmentEnvelopeItem(attachment));
339
+ }
338
340
  }
339
341
  if (genAiSpanItem) {
340
342
  env = envelope$1.addItemToEnvelope(env, genAiSpanItem);
@@ -588,8 +590,7 @@ class Client {
588
590
  this.recordDroppedEvent("event_processor", dataCategory);
589
591
  throw _makeDoNotSendEventError("An event processor returned `null`, will not send event.");
590
592
  }
591
- const isInternalException = hint.data?.__sentry__ === true;
592
- if (isInternalException) {
593
+ if (eventUtils.isInternalException(hint)) {
593
594
  return prepared;
594
595
  }
595
596
  const result = processBeforeSend(this, options, prepared, hint);
@@ -31,8 +31,6 @@ const GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE = "gen_ai.response.tool_calls";
31
31
  const GEN_AI_AGENT_NAME_ATTRIBUTE = "gen_ai.agent.name";
32
32
  const GEN_AI_PIPELINE_NAME_ATTRIBUTE = "gen_ai.pipeline.name";
33
33
  const GEN_AI_CONVERSATION_ID_ATTRIBUTE = "gen_ai.conversation.id";
34
- const GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE = "gen_ai.usage.cache_creation_input_tokens";
35
- const GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE = "gen_ai.usage.cache_read_input_tokens";
36
34
  const GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE = "gen_ai.usage.input_tokens.cache_write";
37
35
  const GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE = "gen_ai.usage.input_tokens.cached";
38
36
  const GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE = "gen_ai.invoke_agent";
@@ -84,8 +82,6 @@ exports.GEN_AI_TOOL_INPUT_ATTRIBUTE = GEN_AI_TOOL_INPUT_ATTRIBUTE;
84
82
  exports.GEN_AI_TOOL_NAME_ATTRIBUTE = GEN_AI_TOOL_NAME_ATTRIBUTE;
85
83
  exports.GEN_AI_TOOL_OUTPUT_ATTRIBUTE = GEN_AI_TOOL_OUTPUT_ATTRIBUTE;
86
84
  exports.GEN_AI_TOOL_TYPE_ATTRIBUTE = GEN_AI_TOOL_TYPE_ATTRIBUTE;
87
- exports.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE = GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE;
88
- exports.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE = GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE;
89
85
  exports.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE = GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE;
90
86
  exports.GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE = GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE;
91
87
  exports.GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE = GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE;
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const attributes = require('@sentry/conventions/attributes');
3
4
  const currentScopes = require('../../currentScopes.js');
4
5
  const hasSpanStreamingEnabled = require('../spans/hasSpanStreamingEnabled.js');
5
6
  const is = require('../../utils/is.js');
@@ -27,23 +28,26 @@ function shouldEnableTruncation(enableTruncation) {
27
28
  function buildMethodPath(currentPath, prop) {
28
29
  return currentPath ? `${currentPath}.${prop}` : prop;
29
30
  }
30
- function setTokenUsageAttributes(span, promptTokens, completionTokens, cachedInputTokens, cachedOutputTokens) {
31
- if (promptTokens !== void 0) {
32
- span.setAttributes({
33
- [genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: promptTokens
34
- });
35
- }
36
- if (completionTokens !== void 0) {
37
- span.setAttributes({
38
- [genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: completionTokens
39
- });
40
- }
41
- if (promptTokens !== void 0 || completionTokens !== void 0 || cachedInputTokens !== void 0 || cachedOutputTokens !== void 0) {
42
- const totalTokens = (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cachedOutputTokens ?? 0);
43
- span.setAttributes({
44
- [genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: totalTokens
45
- });
31
+ function getTokenUsageAttributes(promptTokens, completionTokens, cacheCreationInputTokens, cacheReadInputTokens, totalTokens) {
32
+ const attributes$1 = {};
33
+ if (typeof promptTokens === "number") {
34
+ attributes$1[genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = promptTokens;
46
35
  }
36
+ if (typeof cacheCreationInputTokens === "number") {
37
+ attributes$1[attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = cacheCreationInputTokens;
38
+ }
39
+ if (typeof cacheReadInputTokens === "number") {
40
+ attributes$1[attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = cacheReadInputTokens;
41
+ }
42
+ if (typeof completionTokens === "number") {
43
+ attributes$1[genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = completionTokens;
44
+ }
45
+ if (typeof totalTokens === "number") {
46
+ attributes$1[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = totalTokens;
47
+ } else if (typeof promptTokens === "number" || typeof completionTokens === "number") {
48
+ attributes$1[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = (typeof promptTokens === "number" ? promptTokens : 0) + (typeof completionTokens === "number" ? completionTokens : 0);
49
+ }
50
+ return attributes$1;
47
51
  }
48
52
  function endStreamSpan(span, state, recordOutputs) {
49
53
  if (!span.isRecording()) {
@@ -54,12 +58,18 @@ function endStreamSpan(span, state, recordOutputs) {
54
58
  };
55
59
  if (state.responseId) attrs[genAiAttributes.GEN_AI_RESPONSE_ID_ATTRIBUTE] = state.responseId;
56
60
  if (state.responseModel) attrs[genAiAttributes.GEN_AI_RESPONSE_MODEL_ATTRIBUTE] = state.responseModel;
57
- if (state.promptTokens !== void 0) attrs[genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = state.promptTokens;
58
- if (state.completionTokens !== void 0) attrs[genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = state.completionTokens;
59
- if (state.totalTokens !== void 0) {
60
- attrs[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = state.totalTokens;
61
- } else if (state.promptTokens !== void 0 || state.completionTokens !== void 0 || state.cacheCreationInputTokens !== void 0 || state.cacheReadInputTokens !== void 0) {
62
- attrs[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = (state.promptTokens ?? 0) + (state.completionTokens ?? 0) + (state.cacheCreationInputTokens ?? 0) + (state.cacheReadInputTokens ?? 0);
61
+ Object.assign(
62
+ attrs,
63
+ getTokenUsageAttributes(
64
+ state.promptTokens,
65
+ state.completionTokens,
66
+ state.cacheCreationInputTokens,
67
+ state.cacheReadInputTokens,
68
+ state.totalTokens
69
+ )
70
+ );
71
+ if (typeof state.reasoningOutputTokens === "number") {
72
+ attrs[attributes.GEN_AI_USAGE_REASONING_OUTPUT_TOKENS] = state.reasoningOutputTokens;
63
73
  }
64
74
  if (state.finishReasons.length) {
65
75
  attrs[genAiAttributes.GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE] = JSON.stringify(state.finishReasons);
@@ -135,9 +145,9 @@ function wrapPromiseWithMethods(originalPromiseLike, instrumentedPromise) {
135
145
  exports.buildMethodPath = buildMethodPath;
136
146
  exports.endStreamSpan = endStreamSpan;
137
147
  exports.extractSystemInstructions = extractSystemInstructions;
148
+ exports.getTokenUsageAttributes = getTokenUsageAttributes;
138
149
  exports.getTruncatedJsonString = getTruncatedJsonString;
139
150
  exports.resolveAIRecordingOptions = resolveAIRecordingOptions;
140
- exports.setTokenUsageAttributes = setTokenUsageAttributes;
141
151
  exports.shouldEnableTruncation = shouldEnableTruncation;
142
152
  exports.wrapPromiseWithMethods = wrapPromiseWithMethods;
143
153
  //# sourceMappingURL=utils.js.map
@@ -77,12 +77,13 @@ function addMetadataAttributes(span, response) {
77
77
  [genAiAttributes.GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: response.model
78
78
  });
79
79
  if ("usage" in response && response.usage) {
80
- utils$1.setTokenUsageAttributes(
81
- span,
82
- response.usage.input_tokens,
83
- response.usage.output_tokens,
84
- response.usage.cache_creation_input_tokens,
85
- response.usage.cache_read_input_tokens
80
+ span.setAttributes(
81
+ utils$1.getTokenUsageAttributes(
82
+ response.usage.input_tokens + (response.usage.cache_creation_input_tokens ?? 0) + (response.usage.cache_read_input_tokens ?? 0),
83
+ response.usage.output_tokens,
84
+ response.usage.cache_creation_input_tokens,
85
+ response.usage.cache_read_input_tokens
86
+ )
86
87
  );
87
88
  }
88
89
  }
@@ -28,7 +28,9 @@ function handleMessageMetadata(event, state) {
28
28
  if (message.id) state.responseId = message.id;
29
29
  if (message.model) state.responseModel = message.model;
30
30
  if (message.usage) {
31
- if (typeof message.usage.input_tokens === "number") state.promptTokens = message.usage.input_tokens;
31
+ if (typeof message.usage.input_tokens === "number") {
32
+ state.promptTokens = message.usage.input_tokens + (message.usage.cache_creation_input_tokens ?? 0) + (message.usage.cache_read_input_tokens ?? 0);
33
+ }
32
34
  if (typeof message.usage.cache_creation_input_tokens === "number")
33
35
  state.cacheCreationInputTokens = message.usage.cache_creation_input_tokens;
34
36
  if (typeof message.usage.cache_read_input_tokens === "number")
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const attributes = require('@sentry/conventions/attributes');
3
4
  const semanticAttributes = require('../../semanticAttributes.js');
4
5
  const string = require('../../utils/string.js');
5
6
  const spanstatus = require('../spanstatus.js');
@@ -114,20 +115,18 @@ function addResponseAttributes(span, response, recordOutputs) {
114
115
  }
115
116
  if (response.usageMetadata && typeof response.usageMetadata === "object") {
116
117
  const usage = response.usageMetadata;
117
- if (typeof usage.promptTokenCount === "number") {
118
- span.setAttributes({
119
- [genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: usage.promptTokenCount
120
- });
121
- }
122
- if (typeof usage.candidatesTokenCount === "number") {
123
- span.setAttributes({
124
- [genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: usage.candidatesTokenCount
125
- });
126
- }
127
- if (typeof usage.totalTokenCount === "number") {
128
- span.setAttributes({
129
- [genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: usage.totalTokenCount
130
- });
118
+ const hasOutput = typeof usage.candidatesTokenCount === "number" || typeof usage.thoughtsTokenCount === "number";
119
+ span.setAttributes(
120
+ utils$1.getTokenUsageAttributes(
121
+ usage.promptTokenCount,
122
+ hasOutput ? (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0) : void 0,
123
+ void 0,
124
+ usage.cachedContentTokenCount,
125
+ usage.totalTokenCount
126
+ )
127
+ );
128
+ if (typeof usage.thoughtsTokenCount === "number") {
129
+ span.setAttribute(attributes.GEN_AI_USAGE_REASONING_OUTPUT_TOKENS, usage.thoughtsTokenCount);
131
130
  }
132
131
  }
133
132
  if (recordOutputs && Array.isArray(response.candidates) && response.candidates.length > 0) {
@@ -22,8 +22,13 @@ function handleResponseMetadata(chunk, state) {
22
22
  const usage = chunk.usageMetadata;
23
23
  if (usage) {
24
24
  if (typeof usage.promptTokenCount === "number") state.promptTokens = usage.promptTokenCount;
25
- if (typeof usage.candidatesTokenCount === "number") state.completionTokens = usage.candidatesTokenCount;
25
+ if (typeof usage.candidatesTokenCount === "number") state.candidateTokens = usage.candidatesTokenCount;
26
+ if (typeof usage.thoughtsTokenCount === "number") state.reasoningOutputTokens = usage.thoughtsTokenCount;
27
+ if (state.candidateTokens !== void 0 || state.reasoningOutputTokens !== void 0) {
28
+ state.completionTokens = (state.candidateTokens ?? 0) + (state.reasoningOutputTokens ?? 0);
29
+ }
26
30
  if (typeof usage.totalTokenCount === "number") state.totalTokens = usage.totalTokenCount;
31
+ if (typeof usage.cachedContentTokenCount === "number") state.cacheReadInputTokens = usage.cachedContentTokenCount;
27
32
  }
28
33
  }
29
34
  function handleCandidateContent(chunk, state, recordOutputs) {
@@ -1,7 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const attributes = require('@sentry/conventions/attributes');
3
4
  const semanticAttributes = require('../../semanticAttributes.js');
4
5
  const string = require('../../utils/string.js');
6
+ const is = require('../../utils/is.js');
5
7
  const genAiAttributes = require('../ai/gen-ai-attributes.js');
6
8
  const mediaStripping = require('../ai/mediaStripping.js');
7
9
  const utils = require('../ai/utils.js');
@@ -172,29 +174,76 @@ function addToolCallsAttributes(generations, attrs) {
172
174
  setIfDefined(attrs, genAiAttributes.GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, string.stringify(toolCalls, String));
173
175
  }
174
176
  }
175
- function addTokenUsageAttributes(llmOutput, attrs) {
177
+ function extractMessageTokenUsageAttributes(message) {
178
+ const usage = message.usage_metadata;
179
+ if (is.isObjectLike(usage)) {
180
+ const details = is.isObjectLike(usage.input_token_details) ? usage.input_token_details : void 0;
181
+ return utils.getTokenUsageAttributes(
182
+ usage.input_tokens,
183
+ usage.output_tokens,
184
+ details?.cache_creation,
185
+ details?.cache_read,
186
+ usage.total_tokens
187
+ );
188
+ }
189
+ const metadata = message.response_metadata;
190
+ const tokenUsage = is.isObjectLike(metadata) && is.isObjectLike(metadata.tokenUsage) ? metadata.tokenUsage : void 0;
191
+ return utils.getTokenUsageAttributes(
192
+ tokenUsage?.promptTokens,
193
+ tokenUsage?.completionTokens,
194
+ void 0,
195
+ void 0,
196
+ tokenUsage?.totalTokens
197
+ );
198
+ }
199
+ function addTokenUsageAttributes(llmResult, attrs) {
200
+ const normalizedUsage = {};
201
+ const legacyMessageUsage = {};
202
+ for (const generations of llmResult.generations ?? []) {
203
+ const message = generations[0]?.message;
204
+ if (message) {
205
+ const usage = is.isObjectLike(message.usage_metadata) ? normalizedUsage : legacyMessageUsage;
206
+ for (const [key, value] of Object.entries(extractMessageTokenUsageAttributes(message))) {
207
+ usage[key] = (usage[key] ?? 0) + value;
208
+ }
209
+ }
210
+ }
211
+ Object.assign(attrs, Object.keys(normalizedUsage).length > 0 ? normalizedUsage : legacyMessageUsage);
212
+ const llmOutput = llmResult.llmOutput;
176
213
  if (!llmOutput) return;
177
214
  const tokenUsage = llmOutput.tokenUsage;
178
215
  const anthropicUsage = llmOutput.usage;
179
- if (tokenUsage) {
180
- setNumberIfDefined(attrs, genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, tokenUsage.promptTokens);
181
- setNumberIfDefined(attrs, genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, tokenUsage.completionTokens);
182
- setNumberIfDefined(attrs, genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, tokenUsage.totalTokens);
183
- } else if (anthropicUsage) {
184
- setNumberIfDefined(attrs, genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, anthropicUsage.input_tokens);
185
- setNumberIfDefined(attrs, genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, anthropicUsage.output_tokens);
186
- const input = Number(anthropicUsage.input_tokens);
187
- const output = Number(anthropicUsage.output_tokens);
188
- const total = (Number.isNaN(input) ? 0 : input) + (Number.isNaN(output) ? 0 : output);
189
- if (total > 0) setNumberIfDefined(attrs, genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, total);
190
- if (anthropicUsage.cache_creation_input_tokens !== void 0)
191
- setNumberIfDefined(
192
- attrs,
193
- genAiAttributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE,
194
- anthropicUsage.cache_creation_input_tokens
195
- );
196
- if (anthropicUsage.cache_read_input_tokens !== void 0)
197
- setNumberIfDefined(attrs, genAiAttributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE, anthropicUsage.cache_read_input_tokens);
216
+ if (anthropicUsage && Object.keys(normalizedUsage).length === 0 && Object.keys(legacyMessageUsage).length === 0) {
217
+ const { input_tokens, output_tokens, cache_creation_input_tokens, cache_read_input_tokens } = anthropicUsage;
218
+ const hasInput = input_tokens !== void 0 || cache_creation_input_tokens !== void 0 || cache_read_input_tokens !== void 0;
219
+ Object.assign(
220
+ attrs,
221
+ utils.getTokenUsageAttributes(
222
+ hasInput ? (input_tokens ?? 0) + (cache_creation_input_tokens ?? 0) + (cache_read_input_tokens ?? 0) : void 0,
223
+ output_tokens,
224
+ cache_creation_input_tokens,
225
+ cache_read_input_tokens
226
+ )
227
+ );
228
+ } else if (tokenUsage && Object.keys(normalizedUsage).length === 0 && Object.keys(legacyMessageUsage).length === 0) {
229
+ Object.assign(
230
+ attrs,
231
+ utils.getTokenUsageAttributes(
232
+ tokenUsage.promptTokens,
233
+ tokenUsage.completionTokens,
234
+ void 0,
235
+ void 0,
236
+ tokenUsage.totalTokens
237
+ )
238
+ );
239
+ }
240
+ if (anthropicUsage) {
241
+ if (typeof anthropicUsage.cache_creation_input_tokens === "number" && !(attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS in attrs)) {
242
+ attrs[attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = anthropicUsage.cache_creation_input_tokens;
243
+ }
244
+ if (typeof anthropicUsage.cache_read_input_tokens === "number" && !(attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS in attrs)) {
245
+ attrs[attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = anthropicUsage.cache_read_input_tokens;
246
+ }
198
247
  }
199
248
  }
200
249
  function extractLlmResponseAttributes(llmResult, recordOutputs) {
@@ -221,7 +270,7 @@ function extractLlmResponseAttributes(llmResult, recordOutputs) {
221
270
  }
222
271
  }
223
272
  }
224
- addTokenUsageAttributes(llmResult.llmOutput, attrs);
273
+ addTokenUsageAttributes(llmResult, attrs);
225
274
  const llmOutput = llmResult.llmOutput;
226
275
  const firstGeneration = llmResult.generations?.[0]?.[0];
227
276
  const v1Message = firstGeneration?.message;
@@ -294,6 +343,7 @@ exports._INTERNAL_mergeLangChainCallbackHandler = _INTERNAL_mergeLangChainCallba
294
343
  exports.extractChatModelRequestAttributes = extractChatModelRequestAttributes;
295
344
  exports.extractLLMRequestAttributes = extractLLMRequestAttributes;
296
345
  exports.extractLlmResponseAttributes = extractLlmResponseAttributes;
346
+ exports.extractMessageTokenUsageAttributes = extractMessageTokenUsageAttributes;
297
347
  exports.extractToolDefinitions = extractToolDefinitions;
298
348
  exports.getAgentNameFromMetadata = getAgentNameFromMetadata;
299
349
  exports.getInvocationParams = getInvocationParams;
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const attributes = require('@sentry/conventions/attributes');
3
4
  const semanticAttributes = require('../../semanticAttributes.js');
4
5
  const spanstatus = require('../spanstatus.js');
5
6
  const trace = require('../trace.js');
@@ -118,39 +119,14 @@ function extractToolCalls(messages) {
118
119
  return toolCalls.length > 0 ? toolCalls : null;
119
120
  }
120
121
  function extractTokenUsageFromMessage(message) {
121
- const msg = message;
122
- let inputTokens = 0;
123
- let outputTokens = 0;
124
- let totalTokens = 0;
125
- if (msg.usage_metadata && typeof msg.usage_metadata === "object") {
126
- const usage = msg.usage_metadata;
127
- if (typeof usage.input_tokens === "number") {
128
- inputTokens = usage.input_tokens;
129
- }
130
- if (typeof usage.output_tokens === "number") {
131
- outputTokens = usage.output_tokens;
132
- }
133
- if (typeof usage.total_tokens === "number") {
134
- totalTokens = usage.total_tokens;
135
- }
136
- return { inputTokens, outputTokens, totalTokens };
137
- }
138
- if (msg.response_metadata && typeof msg.response_metadata === "object") {
139
- const metadata = msg.response_metadata;
140
- if (metadata.tokenUsage && typeof metadata.tokenUsage === "object") {
141
- const tokenUsage = metadata.tokenUsage;
142
- if (typeof tokenUsage.promptTokens === "number") {
143
- inputTokens = tokenUsage.promptTokens;
144
- }
145
- if (typeof tokenUsage.completionTokens === "number") {
146
- outputTokens = tokenUsage.completionTokens;
147
- }
148
- if (typeof tokenUsage.totalTokens === "number") {
149
- totalTokens = tokenUsage.totalTokens;
150
- }
151
- }
152
- }
153
- return { inputTokens, outputTokens, totalTokens };
122
+ const attributes$1 = utils.extractMessageTokenUsageAttributes(message);
123
+ return {
124
+ inputTokens: attributes$1[genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] ?? 0,
125
+ outputTokens: attributes$1[genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] ?? 0,
126
+ totalTokens: attributes$1[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] ?? 0,
127
+ cacheCreationInputTokens: attributes$1[attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS],
128
+ cacheReadInputTokens: attributes$1[attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS]
129
+ };
154
130
  }
155
131
  function extractModelMetadata(span, message) {
156
132
  const msg = message;
@@ -198,11 +174,19 @@ function setResponseAttributes(span, inputMessages, result) {
198
174
  let totalInputTokens = 0;
199
175
  let totalOutputTokens = 0;
200
176
  let totalTokens = 0;
177
+ let cacheCreationInputTokens;
178
+ let cacheReadInputTokens;
201
179
  for (const message of newMessages) {
202
180
  const tokens = extractTokenUsageFromMessage(message);
203
181
  totalInputTokens += tokens.inputTokens;
204
182
  totalOutputTokens += tokens.outputTokens;
205
183
  totalTokens += tokens.totalTokens;
184
+ if (tokens.cacheCreationInputTokens !== void 0) {
185
+ cacheCreationInputTokens = (cacheCreationInputTokens ?? 0) + tokens.cacheCreationInputTokens;
186
+ }
187
+ if (tokens.cacheReadInputTokens !== void 0) {
188
+ cacheReadInputTokens = (cacheReadInputTokens ?? 0) + tokens.cacheReadInputTokens;
189
+ }
206
190
  extractModelMetadata(span, message);
207
191
  }
208
192
  if (totalInputTokens > 0) {
@@ -214,6 +198,12 @@ function setResponseAttributes(span, inputMessages, result) {
214
198
  if (totalTokens > 0) {
215
199
  span.setAttribute(genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, totalTokens);
216
200
  }
201
+ if (cacheCreationInputTokens !== void 0) {
202
+ span.setAttribute(attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, cacheCreationInputTokens);
203
+ }
204
+ if (cacheReadInputTokens !== void 0) {
205
+ span.setAttribute(attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, cacheReadInputTokens);
206
+ }
217
207
  }
218
208
 
219
209
  exports.extractAgentNameFromParams = extractAgentNameFromParams;
@@ -33,6 +33,8 @@ function processChatCompletionChunk(chunk, state, recordOutputs) {
33
33
  state.promptTokens = chunk.usage.prompt_tokens;
34
34
  state.completionTokens = chunk.usage.completion_tokens;
35
35
  state.totalTokens = chunk.usage.total_tokens;
36
+ state.cacheReadInputTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? state.cacheReadInputTokens;
37
+ state.cacheCreationInputTokens = chunk.usage.prompt_tokens_details?.cache_write_tokens ?? state.cacheCreationInputTokens;
36
38
  }
37
39
  for (const choice of chunk.choices ?? []) {
38
40
  if (recordOutputs) {
@@ -86,6 +88,8 @@ function processResponsesApiEvent(streamEvent, state, recordOutputs, span) {
86
88
  state.promptTokens = response.usage.input_tokens;
87
89
  state.completionTokens = response.usage.output_tokens;
88
90
  state.totalTokens = response.usage.total_tokens;
91
+ state.cacheReadInputTokens = response.usage.input_tokens_details?.cached_tokens ?? state.cacheReadInputTokens;
92
+ state.cacheCreationInputTokens = response.usage.input_tokens_details?.cache_write_tokens ?? state.cacheCreationInputTokens;
89
93
  }
90
94
  if (response.status) {
91
95
  state.finishReasons.push(response.status);
@@ -105,6 +109,8 @@ async function* instrumentStream(stream, span, recordOutputs) {
105
109
  promptTokens: void 0,
106
110
  completionTokens: void 0,
107
111
  totalTokens: void 0,
112
+ cacheReadInputTokens: void 0,
113
+ cacheCreationInputTokens: void 0,
108
114
  chatCompletionToolCalls: {},
109
115
  responsesApiToolCalls: []
110
116
  };
@@ -1,5 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const attributes = require('@sentry/conventions/attributes');
4
+ const is = require('../../utils/is.js');
3
5
  const genAiAttributes = require('../ai/gen-ai-attributes.js');
4
6
 
5
7
  function isResponsesApiStreamEvent(event) {
@@ -34,6 +36,15 @@ function addResponseAttributes(span, result, recordOutputs) {
34
36
  if (typeof usage.total_tokens === "number") {
35
37
  attrs[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = usage.total_tokens;
36
38
  }
39
+ const inputDetails = usage.prompt_tokens_details ?? usage.input_tokens_details;
40
+ if (is.isObjectLike(inputDetails)) {
41
+ if (typeof inputDetails.cached_tokens === "number") {
42
+ attrs[attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = inputDetails.cached_tokens;
43
+ }
44
+ if (typeof inputDetails.cache_write_tokens === "number") {
45
+ attrs[attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = inputDetails.cache_write_tokens;
46
+ }
47
+ }
37
48
  }
38
49
  if (Array.isArray(response.choices)) {
39
50
  const choices = response.choices;
@@ -113,7 +113,7 @@ function addResponseAttributes(span, result, recordOutputs) {
113
113
  }
114
114
  const response = result;
115
115
  if (response.usage) {
116
- utils.setTokenUsageAttributes(span, response.usage.prompt_tokens, response.usage.completion_tokens);
116
+ span.setAttributes(utils.getTokenUsageAttributes(response.usage.prompt_tokens, response.usage.completion_tokens));
117
117
  }
118
118
  if (recordOutputs) {
119
119
  let responseText;
@@ -1,5 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ function isInternalException(hint) {
4
+ return hint.data?.__sentry__ === true;
5
+ }
3
6
  function getPossibleEventMessages(event) {
4
7
  const possibleMessages = [];
5
8
  if (event.message) {
@@ -19,4 +22,5 @@ function getPossibleEventMessages(event) {
19
22
  }
20
23
 
21
24
  exports.getPossibleEventMessages = getPossibleEventMessages;
25
+ exports.isInternalException = isInternalException;
22
26
  //# sourceMappingURL=eventUtils.js.map
@@ -4,6 +4,7 @@ const constants = require('../constants.js');
4
4
  const eventProcessors = require('../eventProcessors.js');
5
5
  const scope = require('../scope.js');
6
6
  const debugIds = require('./debug-ids.js');
7
+ const eventUtils = require('./eventUtils.js');
7
8
  const misc = require('./misc.js');
8
9
  const normalize = require('./normalize.js');
9
10
  const scopeData = require('./scopeData.js');
@@ -43,8 +44,7 @@ function prepareEvent(options, event, hint, scope, client, isolationScope) {
43
44
  // Run scope event processors _after_ all other processors
44
45
  ...data.eventProcessors
45
46
  ];
46
- const isInternalException = hint.data && hint.data.__sentry__ === true;
47
- const result = isInternalException ? syncpromise.resolvedSyncPromise(prepared) : eventProcessors.notifyEventProcessors(eventProcessors$1, prepared, hint);
47
+ const result = eventUtils.isInternalException(hint) ? syncpromise.resolvedSyncPromise(prepared) : eventProcessors.notifyEventProcessors(eventProcessors$1, prepared, hint);
48
48
  return result.then((evt) => {
49
49
  if (evt) {
50
50
  applyDebugMeta(evt);
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const SDK_VERSION = "10.76.0" ;
3
+ const SDK_VERSION = "10.76.2" ;
4
4
 
5
5
  exports.SDK_VERSION = SDK_VERSION;
6
6
  //# sourceMappingURL=version.js.map
@@ -15,7 +15,7 @@ import { createClientReportEnvelope } from './utils/clientreport.js';
15
15
  import { debug } from './utils/debug-logger.js';
16
16
  import { makeDsn, dsnToString } from './utils/dsn.js';
17
17
  import { addItemToEnvelope, createAttachmentEnvelopeItem } from './utils/envelope.js';
18
- import { getPossibleEventMessages } from './utils/eventUtils.js';
18
+ import { isInternalException, getPossibleEventMessages } from './utils/eventUtils.js';
19
19
  import { isParameterizedString, isPrimitive, isObjectLike, isThenable, isPlainObject } from './utils/is.js';
20
20
  import { merge } from './utils/merge.js';
21
21
  import { uuid4, checkOrSetAlreadyCaught } from './utils/misc.js';
@@ -331,8 +331,10 @@ class Client {
331
331
  this.emit("beforeSendEvent", event, hint);
332
332
  const genAiSpanItem = extractGenAiSpansFromEvent(event, this);
333
333
  let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
334
- for (const attachment of hint.attachments || []) {
335
- env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));
334
+ if (!isInternalException(hint)) {
335
+ for (const attachment of hint.attachments || []) {
336
+ env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));
337
+ }
336
338
  }
337
339
  if (genAiSpanItem) {
338
340
  env = addItemToEnvelope(env, genAiSpanItem);
@@ -586,8 +588,7 @@ class Client {
586
588
  this.recordDroppedEvent("event_processor", dataCategory);
587
589
  throw _makeDoNotSendEventError("An event processor returned `null`, will not send event.");
588
590
  }
589
- const isInternalException = hint.data?.__sentry__ === true;
590
- if (isInternalException) {
591
+ if (isInternalException(hint)) {
591
592
  return prepared;
592
593
  }
593
594
  const result = processBeforeSend(this, options, prepared, hint);
@@ -1 +1 @@
1
- {"type":"module","version":"10.76.0","sideEffects":false}
1
+ {"type":"module","version":"10.76.2","sideEffects":false}