opencode-tps-meter 0.1.6 → 0.1.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAOf,MAAM,YAAY,CAAC;AAoHpB;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EAAE,aAAa,GACrB,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAmwBxC;AAGD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,YAAY,EACZ,MAAM,EACN,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,MAAM,EACN,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAOf,MAAM,YAAY,CAAC;AAoHpB;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EAAE,aAAa,GACrB,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CA0yBxC;AAGD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,YAAY,EACZ,MAAM,EACN,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,MAAM,EACN,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -238,8 +238,21 @@ function createUIManager(client, config) {
238
238
  }
239
239
  function formatAgentLine(agent) {
240
240
  const segments = [];
241
- segments.push(`${agent.instantTps.toFixed(1)} (avg ${agent.avgTps.toFixed(1)})`);
242
- segments.push(`tokens: ${formatNumberWithCommas(agent.totalTokens)}`);
241
+ if (uiConfig.showInstant || uiConfig.showAverage) {
242
+ const tpsParts = [];
243
+ if (uiConfig.showInstant) {
244
+ tpsParts.push(`${agent.instantTps.toFixed(1)}`);
245
+ }
246
+ if (uiConfig.showAverage) {
247
+ tpsParts.push(`(avg ${agent.avgTps.toFixed(1)})`);
248
+ }
249
+ if (tpsParts.length > 0) {
250
+ segments.push(tpsParts.join(" "));
251
+ }
252
+ }
253
+ if (uiConfig.showTotalTokens) {
254
+ segments.push(`tokens: ${formatNumberWithCommas(agent.totalTokens)}`);
255
+ }
243
256
  if (uiConfig.showElapsed) {
244
257
  segments.push(formatElapsedTime(agent.elapsedMs));
245
258
  }
@@ -338,7 +351,11 @@ function createUIManager(client, config) {
338
351
  function flushPendingUpdate() {
339
352
  if (pendingState) {
340
353
  const formatted = formatDisplay(pendingState);
341
- display(formatted, false, pendingState.instantTps);
354
+ let tpsForColor = pendingState.instantTps;
355
+ if (pendingState.totalTokens === 0 && pendingState.agents?.length) {
356
+ tpsForColor = Math.max(...pendingState.agents.map((a) => a.instantTps));
357
+ }
358
+ display(formatted, false, tpsForColor);
342
359
  lastDisplayedState = { ...pendingState };
343
360
  pendingState = null;
344
361
  }
@@ -719,10 +736,10 @@ function TpsMeterPlugin(context) {
719
736
  return `${id.slice(0, 4)}…`;
720
737
  }
721
738
  function buildAgentLabel(messageId, metadata) {
722
- const typeLabel = metadata?.agent?.type?.trim() || metadata?.agentType?.trim() || metadata?.agent?.name?.trim() || metadata?.name?.trim() || "Subagent";
739
+ const typeLabel = metadata?.agent?.type?.trim() || metadata?.agentType?.trim() || metadata?.agent?.name?.trim() || metadata?.name?.trim() || null;
723
740
  const rawId = metadata?.agentId?.trim() || metadata?.agent?.id?.trim() || messageId;
724
741
  const identifier = abbreviateId(rawId);
725
- return `${typeLabel}(${identifier})`;
742
+ return typeLabel ? `${typeLabel}(${identifier})` : identifier;
726
743
  }
727
744
  function buildTrackerKey(sessionId, messageId, partId, metadata) {
728
745
  const agentId = metadata?.agentId?.trim() || metadata?.agent?.id?.trim() || metadata?.agentType?.trim();
@@ -784,6 +801,14 @@ function TpsMeterPlugin(context) {
784
801
  let label = trackerState.label;
785
802
  if (hasAgentMetadata) {
786
803
  isSubagent = true;
804
+ const agentName = trackerState.agent?.type || trackerState.agentType || trackerState.agent?.name || sessionAgentNameCache.get(sessionId);
805
+ if (agentName) {
806
+ const rawId = trackerState.agentId || trackerState.agent?.id || trackerState.messageId;
807
+ const identifier = abbreviateId(rawId);
808
+ label = `${agentName}(${identifier})`;
809
+ } else if (!label.includes("(")) {
810
+ label = `agent(${label})`;
811
+ }
787
812
  } else if (sessionId !== primarySessionId) {
788
813
  isSubagent = true;
789
814
  const agentName = sessionAgentNameCache.get(sessionId) || "bg";
@@ -803,6 +828,9 @@ function TpsMeterPlugin(context) {
803
828
  }
804
829
  }
805
830
  entries.sort((a, b) => b.instantTps - a.instantTps);
831
+ if (entries.length > 0) {
832
+ logger.debug(`[TpsMeter] getAllActiveAgentsGlobally found ${entries.length} agents: ${entries.map((e) => `${e.label}@${e.instantTps.toFixed(1)}`).join(", ")}`);
833
+ }
806
834
  return entries;
807
835
  }
808
836
  function isPrimarySessionActive(now) {
@@ -965,7 +993,9 @@ function TpsMeterPlugin(context) {
965
993
  }
966
994
  const metaLabel = messageTracker.label;
967
995
  const metaInfo = messageTracker.agent || messageTracker.agentId || messageTracker.agentType ? `agent=${messageTracker.agent?.type ?? messageTracker.agentType ?? "?"} id=${messageTracker.agent?.id ?? messageTracker.agentId ?? "?"}` : "agent=none";
968
- logger.info(`[TpsMeter][Debug] tracker initialized ${metaLabel} (${metaInfo}) session=${sessionId} message=${part.messageID} part=${part.id ?? "?"}`);
996
+ const trackerKey = messageTracker.key;
997
+ const isBg = sessionId !== primarySessionId;
998
+ logger.info(`[TpsMeter][Debug] tracker initialized ${metaLabel} (${metaInfo}) session=${sessionId} primary=${primarySessionId} isBg=${isBg} key=${trackerKey} message=${part.messageID} part=${part.id ?? "?"}`);
969
999
  }
970
1000
  messageTracker.lastUpdated = now;
971
1001
  const tokenCount = tokenizer.count(delta);
@@ -1000,8 +1030,12 @@ function TpsMeterPlugin(context) {
1000
1030
  const roleCache = messageRoleCache.get(info.sessionID) || new Map;
1001
1031
  messageRoleCache.set(info.sessionID, roleCache);
1002
1032
  roleCache.set(info.id, info.role);
1003
- if (info.agent && typeof info.agent === "string") {
1004
- sessionAgentNameCache.set(info.sessionID, info.agent);
1033
+ if (info.agent || info.agentType) {
1034
+ const agentName = info.agent?.name || info.agent?.type || info.agentType || info.agent?.id;
1035
+ if (agentName && typeof agentName === "string") {
1036
+ sessionAgentNameCache.set(info.sessionID, agentName);
1037
+ logger.debug(`[TpsMeter] Cached agent name "${agentName}" for session ${info.sessionID}`);
1038
+ }
1005
1039
  }
1006
1040
  if (info.role === "assistant") {
1007
1041
  const sessionId = info.sessionID;
package/dist/index.mjs CHANGED
@@ -191,8 +191,21 @@ function createUIManager(client, config) {
191
191
  }
192
192
  function formatAgentLine(agent) {
193
193
  const segments = [];
194
- segments.push(`${agent.instantTps.toFixed(1)} (avg ${agent.avgTps.toFixed(1)})`);
195
- segments.push(`tokens: ${formatNumberWithCommas(agent.totalTokens)}`);
194
+ if (uiConfig.showInstant || uiConfig.showAverage) {
195
+ const tpsParts = [];
196
+ if (uiConfig.showInstant) {
197
+ tpsParts.push(`${agent.instantTps.toFixed(1)}`);
198
+ }
199
+ if (uiConfig.showAverage) {
200
+ tpsParts.push(`(avg ${agent.avgTps.toFixed(1)})`);
201
+ }
202
+ if (tpsParts.length > 0) {
203
+ segments.push(tpsParts.join(" "));
204
+ }
205
+ }
206
+ if (uiConfig.showTotalTokens) {
207
+ segments.push(`tokens: ${formatNumberWithCommas(agent.totalTokens)}`);
208
+ }
196
209
  if (uiConfig.showElapsed) {
197
210
  segments.push(formatElapsedTime(agent.elapsedMs));
198
211
  }
@@ -291,7 +304,11 @@ function createUIManager(client, config) {
291
304
  function flushPendingUpdate() {
292
305
  if (pendingState) {
293
306
  const formatted = formatDisplay(pendingState);
294
- display(formatted, false, pendingState.instantTps);
307
+ let tpsForColor = pendingState.instantTps;
308
+ if (pendingState.totalTokens === 0 && pendingState.agents?.length) {
309
+ tpsForColor = Math.max(...pendingState.agents.map((a) => a.instantTps));
310
+ }
311
+ display(formatted, false, tpsForColor);
295
312
  lastDisplayedState = { ...pendingState };
296
313
  pendingState = null;
297
314
  }
@@ -672,10 +689,10 @@ function TpsMeterPlugin(context) {
672
689
  return `${id.slice(0, 4)}…`;
673
690
  }
674
691
  function buildAgentLabel(messageId, metadata) {
675
- const typeLabel = metadata?.agent?.type?.trim() || metadata?.agentType?.trim() || metadata?.agent?.name?.trim() || metadata?.name?.trim() || "Subagent";
692
+ const typeLabel = metadata?.agent?.type?.trim() || metadata?.agentType?.trim() || metadata?.agent?.name?.trim() || metadata?.name?.trim() || null;
676
693
  const rawId = metadata?.agentId?.trim() || metadata?.agent?.id?.trim() || messageId;
677
694
  const identifier = abbreviateId(rawId);
678
- return `${typeLabel}(${identifier})`;
695
+ return typeLabel ? `${typeLabel}(${identifier})` : identifier;
679
696
  }
680
697
  function buildTrackerKey(sessionId, messageId, partId, metadata) {
681
698
  const agentId = metadata?.agentId?.trim() || metadata?.agent?.id?.trim() || metadata?.agentType?.trim();
@@ -737,6 +754,14 @@ function TpsMeterPlugin(context) {
737
754
  let label = trackerState.label;
738
755
  if (hasAgentMetadata) {
739
756
  isSubagent = true;
757
+ const agentName = trackerState.agent?.type || trackerState.agentType || trackerState.agent?.name || sessionAgentNameCache.get(sessionId);
758
+ if (agentName) {
759
+ const rawId = trackerState.agentId || trackerState.agent?.id || trackerState.messageId;
760
+ const identifier = abbreviateId(rawId);
761
+ label = `${agentName}(${identifier})`;
762
+ } else if (!label.includes("(")) {
763
+ label = `agent(${label})`;
764
+ }
740
765
  } else if (sessionId !== primarySessionId) {
741
766
  isSubagent = true;
742
767
  const agentName = sessionAgentNameCache.get(sessionId) || "bg";
@@ -756,6 +781,9 @@ function TpsMeterPlugin(context) {
756
781
  }
757
782
  }
758
783
  entries.sort((a, b) => b.instantTps - a.instantTps);
784
+ if (entries.length > 0) {
785
+ logger.debug(`[TpsMeter] getAllActiveAgentsGlobally found ${entries.length} agents: ${entries.map((e) => `${e.label}@${e.instantTps.toFixed(1)}`).join(", ")}`);
786
+ }
759
787
  return entries;
760
788
  }
761
789
  function isPrimarySessionActive(now) {
@@ -918,7 +946,9 @@ function TpsMeterPlugin(context) {
918
946
  }
919
947
  const metaLabel = messageTracker.label;
920
948
  const metaInfo = messageTracker.agent || messageTracker.agentId || messageTracker.agentType ? `agent=${messageTracker.agent?.type ?? messageTracker.agentType ?? "?"} id=${messageTracker.agent?.id ?? messageTracker.agentId ?? "?"}` : "agent=none";
921
- logger.info(`[TpsMeter][Debug] tracker initialized ${metaLabel} (${metaInfo}) session=${sessionId} message=${part.messageID} part=${part.id ?? "?"}`);
949
+ const trackerKey = messageTracker.key;
950
+ const isBg = sessionId !== primarySessionId;
951
+ logger.info(`[TpsMeter][Debug] tracker initialized ${metaLabel} (${metaInfo}) session=${sessionId} primary=${primarySessionId} isBg=${isBg} key=${trackerKey} message=${part.messageID} part=${part.id ?? "?"}`);
922
952
  }
923
953
  messageTracker.lastUpdated = now;
924
954
  const tokenCount = tokenizer.count(delta);
@@ -953,8 +983,12 @@ function TpsMeterPlugin(context) {
953
983
  const roleCache = messageRoleCache.get(info.sessionID) || new Map;
954
984
  messageRoleCache.set(info.sessionID, roleCache);
955
985
  roleCache.set(info.id, info.role);
956
- if (info.agent && typeof info.agent === "string") {
957
- sessionAgentNameCache.set(info.sessionID, info.agent);
986
+ if (info.agent || info.agentType) {
987
+ const agentName = info.agent?.name || info.agent?.type || info.agentType || info.agent?.id;
988
+ if (agentName && typeof agentName === "string") {
989
+ sessionAgentNameCache.set(info.sessionID, agentName);
990
+ logger.debug(`[TpsMeter] Cached agent name "${agentName}" for session ${info.sessionID}`);
991
+ }
958
992
  }
959
993
  if (info.role === "assistant") {
960
994
  const sessionId = info.sessionID;
package/dist/ui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAmC,SAAS,IAAI,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,UAAU,CA2UZ;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAmC,SAAS,IAAI,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,UAAU,CA+VZ;AAED,eAAe,eAAe,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-tps-meter",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Live tokens-per-second meter for OpenCode",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",