@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/dist/index.js CHANGED
@@ -442,7 +442,7 @@ var inboundMessageSchema = z.discriminatedUnion("type", [
442
442
  ]);
443
443
 
444
444
  // src/version.ts
445
- var VERSION = true ? "1.0.116" : "0.0.0-test";
445
+ var VERSION = true ? "1.0.118" : "0.0.0-test";
446
446
 
447
447
  // src/claude-code-harness.ts
448
448
  var CLAUDE_CODE_CLIENT_APP = `ai-sdk/harness-claude-code/${VERSION}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/harness-claude-code",
3
- "version": "1.0.116",
3
+ "version": "1.0.118",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -26,8 +26,8 @@
26
26
  }
27
27
  },
28
28
  "dependencies": {
29
- "@ai-sdk/harness": "1.0.112",
30
- "@ai-sdk/provider-utils": "5.0.41",
29
+ "@ai-sdk/harness": "1.0.114",
30
+ "@ai-sdk/provider-utils": "5.0.43",
31
31
  "ws": "^8.21.0"
32
32
  },
33
33
  "peerDependencies": {
@@ -21,6 +21,7 @@ export type ClaudeMessage = {
21
21
  event?: {
22
22
  type?: string;
23
23
  index?: number;
24
+ usage?: Record<string, unknown>;
24
25
  content_block?: {
25
26
  type?: string;
26
27
  id?: string;
@@ -72,6 +73,8 @@ export type ClaudeStreamEventState = {
72
73
  partialBlocks: Map<number, PartialBlock>;
73
74
  stepUsage: Record<string, unknown> | undefined;
74
75
  pendingStepToolUseIds: Set<string>;
76
+ pendingStepAssistantUsage: Record<string, unknown> | undefined;
77
+ pendingStepDeltaUsage: Record<string, unknown> | undefined;
75
78
  pendingStepUsage: Record<string, unknown> | undefined;
76
79
  stepOpen: boolean;
77
80
  /*
@@ -97,6 +100,8 @@ export function createClaudeStreamEventState(): ClaudeStreamEventState {
97
100
  partialBlocks: new Map(),
98
101
  stepUsage: undefined,
99
102
  pendingStepToolUseIds: new Set(),
103
+ pendingStepAssistantUsage: undefined,
104
+ pendingStepDeltaUsage: undefined,
100
105
  pendingStepUsage: undefined,
101
106
  stepOpen: false,
102
107
  mcpToolUseIds: new Set(),
@@ -228,7 +233,7 @@ export function createEmitStreamEvent({
228
233
  }
229
234
 
230
235
  if (type === 'assistant' && msg.message?.content) {
231
- const usage = mapUsage(msg.message.usage);
236
+ const usage = toUsageRecord(msg.message.usage);
232
237
  const toolUseIds: string[] = [];
233
238
  let opensStep = false;
234
239
  for (const block of msg.message.content) {
@@ -274,7 +279,10 @@ export function createEmitStreamEvent({
274
279
  }
275
280
  if (opensStep || toolUseIds.length === 0) {
276
281
  state.stepOpen = true;
277
- if (usage) state.pendingStepUsage = usage;
282
+ if (usage) {
283
+ state.pendingStepAssistantUsage = usage;
284
+ updatePendingStepUsage(state);
285
+ }
278
286
  }
279
287
  return;
280
288
  }
@@ -360,6 +368,8 @@ export function emitFinishStep({
360
368
  usage: usage ?? defaultUsage(),
361
369
  });
362
370
  state.stepUsage = usage ?? state.stepUsage;
371
+ state.pendingStepAssistantUsage = undefined;
372
+ state.pendingStepDeltaUsage = undefined;
363
373
  state.pendingStepUsage = undefined;
364
374
  state.pendingStepToolUseIds = new Set();
365
375
  state.stepOpen = false;
@@ -412,7 +422,21 @@ function handleStreamEvent({
412
422
  send: Emit;
413
423
  toCommonName: (nativeName: string) => string;
414
424
  }): void {
415
- if (!event || typeof event.index !== 'number') return;
425
+ if (!event) return;
426
+
427
+ if (event.type === 'message_delta') {
428
+ const usage = toUsageRecord(event.usage);
429
+ if (usage) {
430
+ state.pendingStepDeltaUsage = mergeNonNullUsage(
431
+ state.pendingStepDeltaUsage,
432
+ usage,
433
+ );
434
+ updatePendingStepUsage(state);
435
+ }
436
+ return;
437
+ }
438
+
439
+ if (typeof event.index !== 'number') return;
416
440
  const index = event.index;
417
441
  const partialBlocks = state.partialBlocks;
418
442
 
@@ -502,6 +526,35 @@ function handleStreamEvent({
502
526
  }
503
527
  }
504
528
 
529
+ function toUsageRecord(usage: unknown): Record<string, unknown> | undefined {
530
+ return usage != null && typeof usage === 'object'
531
+ ? (usage as Record<string, unknown>)
532
+ : undefined;
533
+ }
534
+
535
+ function mergeNonNullUsage(
536
+ current: Record<string, unknown> | undefined,
537
+ update: Record<string, unknown>,
538
+ ): Record<string, unknown> {
539
+ const merged = { ...current };
540
+ for (const [key, value] of Object.entries(update)) {
541
+ if (value != null) {
542
+ merged[key] = value;
543
+ }
544
+ }
545
+ return merged;
546
+ }
547
+
548
+ function updatePendingStepUsage(state: ClaudeStreamEventState): void {
549
+ const assistantUsage = state.pendingStepAssistantUsage;
550
+ const deltaUsage = state.pendingStepDeltaUsage;
551
+ state.pendingStepUsage = mapUsage(
552
+ assistantUsage || deltaUsage
553
+ ? { ...assistantUsage, ...deltaUsage }
554
+ : undefined,
555
+ );
556
+ }
557
+
505
558
  function isTextEntry(entry: unknown): entry is { text?: unknown } {
506
559
  return entry != null && typeof entry === 'object' && 'text' in entry;
507
560
  }