@ai-sdk/harness-claude-code 1.0.116 → 1.0.118

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @ai-sdk/harness-claude-code
2
2
 
3
+ ## 1.0.118
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [215b25e]
8
+ - Updated dependencies [d4d96bf]
9
+ - Updated dependencies [3456e2c]
10
+ - Updated dependencies [c4e76de]
11
+ - @ai-sdk/provider-utils@5.0.43
12
+ - @ai-sdk/harness@1.0.114
13
+
14
+ ## 1.0.117
15
+
16
+ ### Patch Changes
17
+
18
+ - 5145174: fix(harness-claude-code): use message delta usage for per-step metering
19
+ - Updated dependencies [91c2128]
20
+ - Updated dependencies [2cd80b3]
21
+ - Updated dependencies [2fa5e0e]
22
+ - @ai-sdk/provider-utils@5.0.42
23
+ - @ai-sdk/harness@1.0.113
24
+
3
25
  ## 1.0.116
4
26
 
5
27
  ### Patch Changes
@@ -701,6 +701,8 @@ function createClaudeStreamEventState() {
701
701
  partialBlocks: /* @__PURE__ */ new Map(),
702
702
  stepUsage: void 0,
703
703
  pendingStepToolUseIds: /* @__PURE__ */ new Set(),
704
+ pendingStepAssistantUsage: void 0,
705
+ pendingStepDeltaUsage: void 0,
704
706
  pendingStepUsage: void 0,
705
707
  stepOpen: false,
706
708
  mcpToolUseIds: /* @__PURE__ */ new Set(),
@@ -778,7 +780,7 @@ function createEmitStreamEvent({
778
780
  return;
779
781
  }
780
782
  if (type === "assistant" && msg.message?.content) {
781
- const usage = mapUsage(msg.message.usage);
783
+ const usage = toUsageRecord(msg.message.usage);
782
784
  const toolUseIds = [];
783
785
  let opensStep = false;
784
786
  for (const block of msg.message.content) {
@@ -820,7 +822,10 @@ function createEmitStreamEvent({
820
822
  }
821
823
  if (opensStep || toolUseIds.length === 0) {
822
824
  state.stepOpen = true;
823
- if (usage) state.pendingStepUsage = usage;
825
+ if (usage) {
826
+ state.pendingStepAssistantUsage = usage;
827
+ updatePendingStepUsage(state);
828
+ }
824
829
  }
825
830
  return;
826
831
  }
@@ -886,6 +891,8 @@ function emitFinishStep({
886
891
  usage: usage ?? defaultUsage()
887
892
  });
888
893
  state.stepUsage = usage ?? state.stepUsage;
894
+ state.pendingStepAssistantUsage = void 0;
895
+ state.pendingStepDeltaUsage = void 0;
889
896
  state.pendingStepUsage = void 0;
890
897
  state.pendingStepToolUseIds = /* @__PURE__ */ new Set();
891
898
  state.stepOpen = false;
@@ -920,7 +927,19 @@ function handleStreamEvent({
920
927
  send,
921
928
  toCommonName: toCommonName2
922
929
  }) {
923
- if (!event || typeof event.index !== "number") return;
930
+ if (!event) return;
931
+ if (event.type === "message_delta") {
932
+ const usage = toUsageRecord(event.usage);
933
+ if (usage) {
934
+ state.pendingStepDeltaUsage = mergeNonNullUsage(
935
+ state.pendingStepDeltaUsage,
936
+ usage
937
+ );
938
+ updatePendingStepUsage(state);
939
+ }
940
+ return;
941
+ }
942
+ if (typeof event.index !== "number") return;
924
943
  const index = event.index;
925
944
  const partialBlocks = state.partialBlocks;
926
945
  if (event.type === "content_block_start") {
@@ -988,6 +1007,25 @@ function handleStreamEvent({
988
1007
  }
989
1008
  }
990
1009
  }
1010
+ function toUsageRecord(usage) {
1011
+ return usage != null && typeof usage === "object" ? usage : void 0;
1012
+ }
1013
+ function mergeNonNullUsage(current, update) {
1014
+ const merged = { ...current };
1015
+ for (const [key, value] of Object.entries(update)) {
1016
+ if (value != null) {
1017
+ merged[key] = value;
1018
+ }
1019
+ }
1020
+ return merged;
1021
+ }
1022
+ function updatePendingStepUsage(state) {
1023
+ const assistantUsage = state.pendingStepAssistantUsage;
1024
+ const deltaUsage = state.pendingStepDeltaUsage;
1025
+ state.pendingStepUsage = mapUsage(
1026
+ assistantUsage || deltaUsage ? { ...assistantUsage, ...deltaUsage } : void 0
1027
+ );
1028
+ }
991
1029
  function isTextEntry(entry) {
992
1030
  return entry != null && typeof entry === "object" && "text" in entry;
993
1031
  }