gnhf 0.1.21 → 0.1.22

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 (2) hide show
  1. package/dist/cli.mjs +66 -10
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -1082,6 +1082,20 @@ function buildClaudeArgs(prompt, extraArgs) {
1082
1082
  ...userSpecifiedPermissionMode ? [] : ["--dangerously-skip-permissions"]
1083
1083
  ];
1084
1084
  }
1085
+ function toTokenUsage(usage) {
1086
+ return {
1087
+ inputTokens: (usage.input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0),
1088
+ outputTokens: usage.output_tokens ?? 0,
1089
+ cacheReadTokens: usage.cache_read_input_tokens ?? 0,
1090
+ cacheCreationTokens: usage.cache_creation_input_tokens ?? 0
1091
+ };
1092
+ }
1093
+ function isSameUsage(a, b) {
1094
+ return a.inputTokens === b.inputTokens && a.outputTokens === b.outputTokens && a.cacheReadTokens === b.cacheReadTokens && a.cacheCreationTokens === b.cacheCreationTokens;
1095
+ }
1096
+ function extendsUsage(next, previous) {
1097
+ return next.inputTokens >= previous.inputTokens && next.outputTokens >= previous.outputTokens && next.cacheReadTokens >= previous.cacheReadTokens && next.cacheCreationTokens >= previous.cacheCreationTokens && !isSameUsage(next, previous);
1098
+ }
1085
1099
  var ClaudeAgent = class {
1086
1100
  name = "claude";
1087
1101
  bin;
@@ -1115,13 +1129,60 @@ var ClaudeAgent = class {
1115
1129
  cacheReadTokens: 0,
1116
1130
  cacheCreationTokens: 0
1117
1131
  };
1132
+ const usageByMessageId = /* @__PURE__ */ new Map();
1133
+ let anonymousAssistantCount = 0;
1134
+ let lastAnonymousAssistantId = null;
1135
+ let lastAnonymousAssistantUsage = null;
1136
+ let pendingAnonymousAssistantUsage = null;
1118
1137
  parseJSONLStream(child.stdout, logStream, (event) => {
1119
1138
  if (event.type === "assistant") {
1120
1139
  const msg = event.message;
1121
- cumulative.inputTokens += (msg.usage.input_tokens ?? 0) + (msg.usage.cache_read_input_tokens ?? 0);
1122
- cumulative.outputTokens += msg.usage.output_tokens ?? 0;
1123
- cumulative.cacheReadTokens += msg.usage.cache_read_input_tokens ?? 0;
1124
- cumulative.cacheCreationTokens += msg.usage.cache_creation_input_tokens ?? 0;
1140
+ const nextUsage = toTokenUsage(msg.usage);
1141
+ let messageId = msg.id;
1142
+ let previousUsage;
1143
+ if (messageId) {
1144
+ previousUsage = usageByMessageId.get(messageId);
1145
+ lastAnonymousAssistantId = null;
1146
+ lastAnonymousAssistantUsage = null;
1147
+ pendingAnonymousAssistantUsage = null;
1148
+ } else if (pendingAnonymousAssistantUsage && extendsUsage(nextUsage, pendingAnonymousAssistantUsage)) {
1149
+ messageId = `assistant-${anonymousAssistantCount++}`;
1150
+ previousUsage = pendingAnonymousAssistantUsage;
1151
+ cumulative.inputTokens += pendingAnonymousAssistantUsage.inputTokens;
1152
+ cumulative.outputTokens += pendingAnonymousAssistantUsage.outputTokens;
1153
+ cumulative.cacheReadTokens += pendingAnonymousAssistantUsage.cacheReadTokens;
1154
+ cumulative.cacheCreationTokens += pendingAnonymousAssistantUsage.cacheCreationTokens;
1155
+ usageByMessageId.set(messageId, pendingAnonymousAssistantUsage);
1156
+ pendingAnonymousAssistantUsage = null;
1157
+ lastAnonymousAssistantId = messageId;
1158
+ lastAnonymousAssistantUsage = nextUsage;
1159
+ } else if (lastAnonymousAssistantId && lastAnonymousAssistantUsage && extendsUsage(nextUsage, lastAnonymousAssistantUsage)) {
1160
+ messageId = lastAnonymousAssistantId;
1161
+ previousUsage = usageByMessageId.get(messageId);
1162
+ pendingAnonymousAssistantUsage = null;
1163
+ lastAnonymousAssistantUsage = nextUsage;
1164
+ } else if (lastAnonymousAssistantId && lastAnonymousAssistantUsage && isSameUsage(nextUsage, lastAnonymousAssistantUsage)) {
1165
+ messageId = lastAnonymousAssistantId;
1166
+ previousUsage = usageByMessageId.get(messageId);
1167
+ pendingAnonymousAssistantUsage ??= nextUsage;
1168
+ } else {
1169
+ messageId = `assistant-${anonymousAssistantCount++}`;
1170
+ pendingAnonymousAssistantUsage = null;
1171
+ lastAnonymousAssistantId = messageId;
1172
+ lastAnonymousAssistantUsage = nextUsage;
1173
+ }
1174
+ if (previousUsage) {
1175
+ cumulative.inputTokens += nextUsage.inputTokens - previousUsage.inputTokens;
1176
+ cumulative.outputTokens += nextUsage.outputTokens - previousUsage.outputTokens;
1177
+ cumulative.cacheReadTokens += nextUsage.cacheReadTokens - previousUsage.cacheReadTokens;
1178
+ cumulative.cacheCreationTokens += nextUsage.cacheCreationTokens - previousUsage.cacheCreationTokens;
1179
+ } else {
1180
+ cumulative.inputTokens += nextUsage.inputTokens;
1181
+ cumulative.outputTokens += nextUsage.outputTokens;
1182
+ cumulative.cacheReadTokens += nextUsage.cacheReadTokens;
1183
+ cumulative.cacheCreationTokens += nextUsage.cacheCreationTokens;
1184
+ }
1185
+ usageByMessageId.set(messageId, nextUsage);
1125
1186
  onUsage?.({ ...cumulative });
1126
1187
  if (onMessage) {
1127
1188
  const content = msg.content;
@@ -1146,12 +1207,7 @@ var ClaudeAgent = class {
1146
1207
  return;
1147
1208
  }
1148
1209
  const output = resultEvent.structured_output;
1149
- const usage = {
1150
- inputTokens: (resultEvent.usage.input_tokens ?? 0) + (resultEvent.usage.cache_read_input_tokens ?? 0),
1151
- outputTokens: resultEvent.usage.output_tokens ?? 0,
1152
- cacheReadTokens: resultEvent.usage.cache_read_input_tokens ?? 0,
1153
- cacheCreationTokens: resultEvent.usage.cache_creation_input_tokens ?? 0
1154
- };
1210
+ const usage = toTokenUsage(resultEvent.usage);
1155
1211
  onUsage?.(usage);
1156
1212
  resolve({
1157
1213
  output,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gnhf",
3
- "version": "0.1.21",
3
+ "version": "0.1.22",
4
4
  "description": "Before I go to bed, I tell my agents: good night, have fun",
5
5
  "type": "module",
6
6
  "bin": {