@ashx-j/lunr 0.2.27 → 0.2.28

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 (138) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
  3. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js +5 -2
  4. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
  5. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts +4 -1
  6. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  7. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +2 -0
  8. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  9. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +5 -0
  10. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  11. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +2 -0
  12. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  13. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +5 -1
  14. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +68 -40
  16. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +0 -3
  18. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +28 -4
  20. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +1 -0
  23. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts +7 -1
  25. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js +70 -38
  27. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +9 -0
  29. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  31. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +13 -62
  33. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  37. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-tps.js +10 -2
  39. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  40. package/dist/catalog/models.json +1 -1
  41. package/dist/catalog/providers/google-vertex.json +1 -1
  42. package/dist/catalog/providers/google.json +1 -1
  43. package/dist/catalog/publication.json +3 -3
  44. package/dist/core/agent-session.d.ts +6 -15
  45. package/dist/core/agent-session.d.ts.map +1 -1
  46. package/dist/core/agent-session.js +35 -50
  47. package/dist/core/agent-session.js.map +1 -1
  48. package/dist/core/cache-stats.d.ts +1 -1
  49. package/dist/core/cache-stats.d.ts.map +1 -1
  50. package/dist/core/cache-stats.js +1 -1
  51. package/dist/core/cache-stats.js.map +1 -1
  52. package/dist/core/compaction/branch-summarization.d.ts +2 -1
  53. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  54. package/dist/core/compaction/branch-summarization.js +1 -0
  55. package/dist/core/compaction/branch-summarization.js.map +1 -1
  56. package/dist/core/compaction/compaction.d.ts +5 -11
  57. package/dist/core/compaction/compaction.d.ts.map +1 -1
  58. package/dist/core/compaction/compaction.js +38 -92
  59. package/dist/core/compaction/compaction.js.map +1 -1
  60. package/dist/core/context-breakdown.d.ts +2 -2
  61. package/dist/core/context-breakdown.d.ts.map +1 -1
  62. package/dist/core/context-breakdown.js +22 -20
  63. package/dist/core/context-breakdown.js.map +1 -1
  64. package/dist/core/extensions/types.d.ts +3 -1
  65. package/dist/core/extensions/types.d.ts.map +1 -1
  66. package/dist/core/extensions/types.js.map +1 -1
  67. package/dist/core/session-manager.d.ts +5 -1
  68. package/dist/core/session-manager.d.ts.map +1 -1
  69. package/dist/core/session-manager.js +16 -1
  70. package/dist/core/session-manager.js.map +1 -1
  71. package/dist/core/usage-accounting.d.ts +47 -0
  72. package/dist/core/usage-accounting.d.ts.map +1 -0
  73. package/dist/core/usage-accounting.js +205 -0
  74. package/dist/core/usage-accounting.js.map +1 -0
  75. package/dist/core/usage-history.d.ts +1 -18
  76. package/dist/core/usage-history.d.ts.map +1 -1
  77. package/dist/core/usage-history.js +46 -114
  78. package/dist/core/usage-history.js.map +1 -1
  79. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  80. package/dist/gateway/mobile-commands.js +13 -1
  81. package/dist/gateway/mobile-commands.js.map +1 -1
  82. package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
  83. package/dist/modes/interactive/components/context-view.js +2 -2
  84. package/dist/modes/interactive/components/context-view.js.map +1 -1
  85. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  86. package/dist/modes/interactive/components/footer.js +8 -12
  87. package/dist/modes/interactive/components/footer.js.map +1 -1
  88. package/dist/modes/interactive/components/usage-view.d.ts +5 -0
  89. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  90. package/dist/modes/interactive/components/usage-view.js +21 -6
  91. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.d.ts +1 -5
  93. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  94. package/dist/modes/interactive/interactive-mode.js +55 -22
  95. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  96. package/dist/node-runtime/{agent-session-services-KDMSPQDY.js → agent-session-services-RTUGP3XR.js} +5 -4
  97. package/dist/node-runtime/{builtin-extensions-OX6KELNX.js → builtin-extensions-N4EUD6SB.js} +1 -1
  98. package/dist/node-runtime/{chunk-A2WO6WIN.js → chunk-4QRUZ64T.js} +11 -5
  99. package/dist/node-runtime/{chunk-ZDJUR45D.js → chunk-BMRXLQWQ.js} +41 -38
  100. package/dist/node-runtime/{chunk-MQPKUHRN.js → chunk-DFMPRAQQ.js} +8 -8
  101. package/dist/node-runtime/{chunk-C3P6Q3B2.js → chunk-E5DQGNJI.js} +10 -10
  102. package/dist/node-runtime/{chunk-FIRA54AC.js → chunk-ICKGAKWX.js} +22 -55
  103. package/dist/node-runtime/{chunk-JWEVT363.js → chunk-JEK35V2M.js} +14 -8
  104. package/dist/node-runtime/{chunk-EPR2F3GU.js → chunk-PWHTSQC4.js} +15 -1
  105. package/dist/node-runtime/{chunk-AYHH7YSD.js → chunk-QT3F6UEV.js} +61 -30
  106. package/dist/node-runtime/{chunk-JQYNHAKX.js → chunk-RY3FJ6WI.js} +29 -27
  107. package/dist/node-runtime/{chunk-I2H5QMWW.js → chunk-STMX7W5I.js} +1 -1
  108. package/dist/node-runtime/chunk-SWWHZ2RI.js +158 -0
  109. package/dist/node-runtime/{chunk-QNVMKNNN.js → chunk-U3YVZ6UC.js} +4 -4
  110. package/dist/node-runtime/{command-3HMSY6W2.js → command-YRT7I2BW.js} +1 -1
  111. package/dist/node-runtime/{commands-OCSSEEWJ.js → commands-2ETOWWRA.js} +5 -5
  112. package/dist/node-runtime/{export-html-BRWF5AHI.js → export-html-DBQRRMAY.js} +1 -1
  113. package/dist/node-runtime/{gateway-6623C2U3.js → gateway-V6K2CDWN.js} +9 -9
  114. package/dist/node-runtime/{goal-AIHEDUYA.js → goal-J7TYMOBK.js} +9 -3
  115. package/dist/node-runtime/index.js +9 -8
  116. package/dist/node-runtime/{interactive-mode-FM5DNUSW.js → interactive-mode-ASZ7APYP.js} +7 -6
  117. package/dist/node-runtime/{lunr-cron-LKVA5CZZ.js → lunr-cron-WD3YH4CR.js} +4 -4
  118. package/dist/node-runtime/main.js +7 -6
  119. package/dist/node-runtime/{mobile-commands-XT3NQXLD.js → mobile-commands-ICUXFW5V.js} +2 -2
  120. package/dist/node-runtime/{pi-subagents-LT3CTO4E.js → pi-subagents-QPU3OXE4.js} +17 -62
  121. package/dist/node-runtime/rpc-entry.js +7 -6
  122. package/dist/node-runtime/{session-handoff-LNSPDTKY.js → session-handoff-LYH53ESV.js} +2 -2
  123. package/dist/node-runtime/{session-manager-YIFIAVGC.js → session-manager-ZJ3N5Q74.js} +1 -1
  124. package/dist/node-runtime/{subagent-executor-Q5F7DBVM.js → subagent-executor-UI6SHG3X.js} +294 -231
  125. package/docs/features.md +10 -0
  126. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  127. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  128. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  129. package/examples/extensions/gondolin/package-lock.json +2 -2
  130. package/examples/extensions/gondolin/package.json +1 -1
  131. package/examples/extensions/sandbox/package-lock.json +2 -2
  132. package/examples/extensions/sandbox/package.json +1 -1
  133. package/examples/extensions/with-deps/package-lock.json +2 -2
  134. package/examples/extensions/with-deps/package.json +1 -1
  135. package/install-lock/package-lock.json +24 -24
  136. package/install-lock/package.json +2 -2
  137. package/npm-shrinkwrap.json +21 -21
  138. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"pi-tps.d.ts","sourceRoot":"","sources":["../../src/builtin-extensions/pi-tps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAuBpE,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QA+ExC","sourcesContent":["import type { ExtensionAPI } from \"@ashx-j/lunr\";\n\n// ── Spinner frames for streaming animation ──\nconst spinner = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\n// ── ANSI color helpers ──\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst RED = \"\\x1b[31m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction colorForTps(tps: number): string {\n\tif (tps >= 100) return GREEN;\n\tif (tps >= 30) return YELLOW;\n\treturn RED;\n}\n\n// ── Compact token formatting ──\nfunction formatTokens(n: number): string {\n\tif (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n\treturn String(n);\n}\n\nexport default function (pi: ExtensionAPI) {\n\tlet messageStartTime = 0;\n\tlet lastAvgTps = 0;\n\tlet lastOutputTokens = 0;\n\tlet spinnerIdx = 0;\n\tlet spinnerInterval: ReturnType<typeof setInterval> | undefined;\n\n\tfunction stopAnimation(): void {\n\t\tif (spinnerInterval !== undefined) {\n\t\t\tclearInterval(spinnerInterval);\n\t\t\tspinnerInterval = undefined;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", stopAnimation);\n\tpi.on(\"session_shutdown\", stopAnimation);\n\tpi.on(\"agent_end\", stopAnimation);\n\n\tpi.on(\"agent_start\", async (_event, ctx) => {\n\t\tstopAnimation();\n\t\tlastAvgTps = 0;\n\t\tlastOutputTokens = 0;\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setStatus(\"tps\", \"\");\n\t\t}\n\t});\n\n\tpi.on(\"message_start\", (event, ctx) => {\n\t\tif (event.message.role === \"assistant\") {\n\t\t\tmessageStartTime = Date.now();\n\t\t\tstopAnimation();\n\t\t\tif (!ctx.hasUI) return;\n\t\t\tspinnerIdx = 0;\n\t\t\t// Start spinner animation\n\t\t\tspinnerInterval = setInterval(() => {\n\t\t\t\tspinnerIdx = (spinnerIdx + 1) % spinner.length;\n\t\t\t}, 80);\n\t\t\tspinnerInterval.unref();\n\t\t}\n\t});\n\n\tpi.on(\"message_update\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tif (!usage) return;\n\n\t\tconst outputTokens = usage.output;\n\t\tif (outputTokens === 0) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst tps = outputTokens / elapsed;\n\t\tconst color = colorForTps(tps);\n\t\tconst frame = spinner[spinnerIdx % spinner.length];\n\n\t\tctx.ui.setStatus(\"tps\", `${color}${frame} ${tps.toFixed(1)} t/s${RESET} ↓ ${formatTokens(outputTokens)} tokens`);\n\t});\n\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tstopAnimation();\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tconst outputTokens = usage?.output ?? 0;\n\n\t\tif (elapsed > 0 && outputTokens > 0) {\n\t\t\tlastAvgTps = outputTokens / elapsed;\n\t\t\tlastOutputTokens = outputTokens;\n\t\t}\n\n\t\tconst color = colorForTps(lastAvgTps);\n\t\tctx.ui.setStatus(\n\t\t\t\"tps\",\n\t\t\t`${color}✓ ${lastAvgTps.toFixed(1)} t/s · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`,\n\t\t);\n\t});\n}\n"]}
1
+ {"version":3,"file":"pi-tps.d.ts","sourceRoot":"","sources":["../../src/builtin-extensions/pi-tps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAuBpE,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAsFxC","sourcesContent":["import type { ExtensionAPI } from \"@ashx-j/lunr\";\n\n// ── Spinner frames for streaming animation ──\nconst spinner = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\n// ── ANSI color helpers ──\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst RED = \"\\x1b[31m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction colorForTps(tps: number): string {\n\tif (tps >= 100) return GREEN;\n\tif (tps >= 30) return YELLOW;\n\treturn RED;\n}\n\n// ── Compact token formatting ──\nfunction formatTokens(n: number): string {\n\tif (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n\treturn String(n);\n}\n\nexport default function (pi: ExtensionAPI) {\n\tlet messageStartTime = 0;\n\tlet lastAvgTps = 0;\n\tlet lastOutputTokens = 0;\n\tlet spinnerIdx = 0;\n\tlet spinnerInterval: ReturnType<typeof setInterval> | undefined;\n\n\tfunction stopAnimation(): void {\n\t\tif (spinnerInterval !== undefined) {\n\t\t\tclearInterval(spinnerInterval);\n\t\t\tspinnerInterval = undefined;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", stopAnimation);\n\tpi.on(\"session_shutdown\", stopAnimation);\n\tpi.on(\"agent_end\", stopAnimation);\n\n\tpi.on(\"agent_start\", async (_event, ctx) => {\n\t\tstopAnimation();\n\t\tlastAvgTps = 0;\n\t\tlastOutputTokens = 0;\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setStatus(\"tps\", \"\");\n\t\t}\n\t});\n\n\tpi.on(\"message_start\", (event, ctx) => {\n\t\tif (event.message.role === \"assistant\") {\n\t\t\tmessageStartTime = Date.now();\n\t\t\tlastAvgTps = 0;\n\t\t\tlastOutputTokens = 0;\n\t\t\tstopAnimation();\n\t\t\tif (!ctx.hasUI) return;\n\t\t\tspinnerIdx = 0;\n\t\t\t// Start spinner animation\n\t\t\tspinnerInterval = setInterval(() => {\n\t\t\t\tspinnerIdx = (spinnerIdx + 1) % spinner.length;\n\t\t\t}, 80);\n\t\t\tspinnerInterval.unref();\n\t\t}\n\t});\n\n\tpi.on(\"message_update\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tif (!usage) return;\n\n\t\tconst outputTokens = usage.output;\n\t\tif (outputTokens === 0) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tif (elapsed <= 0) return;\n\t\tconst tps = outputTokens / elapsed;\n\t\tconst color = colorForTps(tps);\n\t\tconst frame = spinner[spinnerIdx % spinner.length];\n\n\t\tctx.ui.setStatus(\"tps\", `${color}${frame} ${tps.toFixed(1)} output t/s overall${RESET} ↓ ${formatTokens(outputTokens)} tokens`);\n\t});\n\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tstopAnimation();\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tconst outputTokens = usage?.output ?? 0;\n\n\t\tif (elapsed > 0 && outputTokens > 0) {\n\t\t\tlastAvgTps = outputTokens / elapsed;\n\t\t\tlastOutputTokens = outputTokens;\n\t\t}\n\n\t\tif (outputTokens === 0) {\n\t\t\tctx.ui.setStatus(\"tps\", \"\");\n\t\t\treturn;\n\t\t}\n\t\tconst color = colorForTps(lastAvgTps);\n\t\tctx.ui.setStatus(\n\t\t\t\"tps\",\n\t\t\t`${color}✓ ${lastAvgTps.toFixed(1)} output t/s overall · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`,\n\t\t);\n\t});\n}\n"]}
@@ -44,6 +44,8 @@ export default function (pi) {
44
44
  pi.on("message_start", (event, ctx) => {
45
45
  if (event.message.role === "assistant") {
46
46
  messageStartTime = Date.now();
47
+ lastAvgTps = 0;
48
+ lastOutputTokens = 0;
47
49
  stopAnimation();
48
50
  if (!ctx.hasUI)
49
51
  return;
@@ -67,10 +69,12 @@ export default function (pi) {
67
69
  if (outputTokens === 0)
68
70
  return;
69
71
  const elapsed = (Date.now() - messageStartTime) / 1000;
72
+ if (elapsed <= 0)
73
+ return;
70
74
  const tps = outputTokens / elapsed;
71
75
  const color = colorForTps(tps);
72
76
  const frame = spinner[spinnerIdx % spinner.length];
73
- ctx.ui.setStatus("tps", `${color}${frame} ${tps.toFixed(1)} t/s${RESET} ↓ ${formatTokens(outputTokens)} tokens`);
77
+ ctx.ui.setStatus("tps", `${color}${frame} ${tps.toFixed(1)} output t/s overall${RESET} ↓ ${formatTokens(outputTokens)} tokens`);
74
78
  });
75
79
  pi.on("message_end", (event, ctx) => {
76
80
  if (event.message.role !== "assistant")
@@ -85,8 +89,12 @@ export default function (pi) {
85
89
  lastAvgTps = outputTokens / elapsed;
86
90
  lastOutputTokens = outputTokens;
87
91
  }
92
+ if (outputTokens === 0) {
93
+ ctx.ui.setStatus("tps", "");
94
+ return;
95
+ }
88
96
  const color = colorForTps(lastAvgTps);
89
- ctx.ui.setStatus("tps", `${color}✓ ${lastAvgTps.toFixed(1)} t/s · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`);
97
+ ctx.ui.setStatus("tps", `${color}✓ ${lastAvgTps.toFixed(1)} output t/s overall · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`);
90
98
  });
91
99
  }
92
100
  //# sourceMappingURL=pi-tps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi-tps.js","sourceRoot":"","sources":["../../src/builtin-extensions/pi-tps.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI } from \"@ashx-j/lunr\";\n\n// ── Spinner frames for streaming animation ──\nconst spinner = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\n// ── ANSI color helpers ──\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst RED = \"\\x1b[31m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction colorForTps(tps: number): string {\n\tif (tps >= 100) return GREEN;\n\tif (tps >= 30) return YELLOW;\n\treturn RED;\n}\n\n// ── Compact token formatting ──\nfunction formatTokens(n: number): string {\n\tif (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n\treturn String(n);\n}\n\nexport default function (pi: ExtensionAPI) {\n\tlet messageStartTime = 0;\n\tlet lastAvgTps = 0;\n\tlet lastOutputTokens = 0;\n\tlet spinnerIdx = 0;\n\tlet spinnerInterval: ReturnType<typeof setInterval> | undefined;\n\n\tfunction stopAnimation(): void {\n\t\tif (spinnerInterval !== undefined) {\n\t\t\tclearInterval(spinnerInterval);\n\t\t\tspinnerInterval = undefined;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", stopAnimation);\n\tpi.on(\"session_shutdown\", stopAnimation);\n\tpi.on(\"agent_end\", stopAnimation);\n\n\tpi.on(\"agent_start\", async (_event, ctx) => {\n\t\tstopAnimation();\n\t\tlastAvgTps = 0;\n\t\tlastOutputTokens = 0;\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setStatus(\"tps\", \"\");\n\t\t}\n\t});\n\n\tpi.on(\"message_start\", (event, ctx) => {\n\t\tif (event.message.role === \"assistant\") {\n\t\t\tmessageStartTime = Date.now();\n\t\t\tstopAnimation();\n\t\t\tif (!ctx.hasUI) return;\n\t\t\tspinnerIdx = 0;\n\t\t\t// Start spinner animation\n\t\t\tspinnerInterval = setInterval(() => {\n\t\t\t\tspinnerIdx = (spinnerIdx + 1) % spinner.length;\n\t\t\t}, 80);\n\t\t\tspinnerInterval.unref();\n\t\t}\n\t});\n\n\tpi.on(\"message_update\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tif (!usage) return;\n\n\t\tconst outputTokens = usage.output;\n\t\tif (outputTokens === 0) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst tps = outputTokens / elapsed;\n\t\tconst color = colorForTps(tps);\n\t\tconst frame = spinner[spinnerIdx % spinner.length];\n\n\t\tctx.ui.setStatus(\"tps\", `${color}${frame} ${tps.toFixed(1)} t/s${RESET} ↓ ${formatTokens(outputTokens)} tokens`);\n\t});\n\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tstopAnimation();\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tconst outputTokens = usage?.output ?? 0;\n\n\t\tif (elapsed > 0 && outputTokens > 0) {\n\t\t\tlastAvgTps = outputTokens / elapsed;\n\t\t\tlastOutputTokens = outputTokens;\n\t\t}\n\n\t\tconst color = colorForTps(lastAvgTps);\n\t\tctx.ui.setStatus(\n\t\t\t\"tps\",\n\t\t\t`${color}✓ ${lastAvgTps.toFixed(1)} t/s · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`,\n\t\t);\n\t});\n}\n"]}
1
+ {"version":3,"file":"pi-tps.js","sourceRoot":"","sources":["../../src/builtin-extensions/pi-tps.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI } from \"@ashx-j/lunr\";\n\n// ── Spinner frames for streaming animation ──\nconst spinner = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\n// ── ANSI color helpers ──\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst RED = \"\\x1b[31m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction colorForTps(tps: number): string {\n\tif (tps >= 100) return GREEN;\n\tif (tps >= 30) return YELLOW;\n\treturn RED;\n}\n\n// ── Compact token formatting ──\nfunction formatTokens(n: number): string {\n\tif (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n\treturn String(n);\n}\n\nexport default function (pi: ExtensionAPI) {\n\tlet messageStartTime = 0;\n\tlet lastAvgTps = 0;\n\tlet lastOutputTokens = 0;\n\tlet spinnerIdx = 0;\n\tlet spinnerInterval: ReturnType<typeof setInterval> | undefined;\n\n\tfunction stopAnimation(): void {\n\t\tif (spinnerInterval !== undefined) {\n\t\t\tclearInterval(spinnerInterval);\n\t\t\tspinnerInterval = undefined;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", stopAnimation);\n\tpi.on(\"session_shutdown\", stopAnimation);\n\tpi.on(\"agent_end\", stopAnimation);\n\n\tpi.on(\"agent_start\", async (_event, ctx) => {\n\t\tstopAnimation();\n\t\tlastAvgTps = 0;\n\t\tlastOutputTokens = 0;\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setStatus(\"tps\", \"\");\n\t\t}\n\t});\n\n\tpi.on(\"message_start\", (event, ctx) => {\n\t\tif (event.message.role === \"assistant\") {\n\t\t\tmessageStartTime = Date.now();\n\t\t\tlastAvgTps = 0;\n\t\t\tlastOutputTokens = 0;\n\t\t\tstopAnimation();\n\t\t\tif (!ctx.hasUI) return;\n\t\t\tspinnerIdx = 0;\n\t\t\t// Start spinner animation\n\t\t\tspinnerInterval = setInterval(() => {\n\t\t\t\tspinnerIdx = (spinnerIdx + 1) % spinner.length;\n\t\t\t}, 80);\n\t\t\tspinnerInterval.unref();\n\t\t}\n\t});\n\n\tpi.on(\"message_update\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tif (!usage) return;\n\n\t\tconst outputTokens = usage.output;\n\t\tif (outputTokens === 0) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tif (elapsed <= 0) return;\n\t\tconst tps = outputTokens / elapsed;\n\t\tconst color = colorForTps(tps);\n\t\tconst frame = spinner[spinnerIdx % spinner.length];\n\n\t\tctx.ui.setStatus(\"tps\", `${color}${frame} ${tps.toFixed(1)} output t/s overall${RESET} ↓ ${formatTokens(outputTokens)} tokens`);\n\t});\n\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tstopAnimation();\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst elapsed = (Date.now() - messageStartTime) / 1000;\n\t\tconst usage = (event.message as { usage?: { output: number } }).usage;\n\t\tconst outputTokens = usage?.output ?? 0;\n\n\t\tif (elapsed > 0 && outputTokens > 0) {\n\t\t\tlastAvgTps = outputTokens / elapsed;\n\t\t\tlastOutputTokens = outputTokens;\n\t\t}\n\n\t\tif (outputTokens === 0) {\n\t\t\tctx.ui.setStatus(\"tps\", \"\");\n\t\t\treturn;\n\t\t}\n\t\tconst color = colorForTps(lastAvgTps);\n\t\tctx.ui.setStatus(\n\t\t\t\"tps\",\n\t\t\t`${color}✓ ${lastAvgTps.toFixed(1)} output t/s overall · ${formatTokens(lastOutputTokens)} tokens in ${elapsed.toFixed(1)}s${RESET}`,\n\t\t);\n\t});\n}\n"]}