UNPKG

grix-connector

Version:

Connect local AI coding agents (Claude, Codex, Gemini, Qwen, DeepSeek, Cursor, OpenCode, Pi, OpenHuman, Reasonix) to the Grix scheduling platform. Also serves as an OpenClaw plugin for Grix channel transport.

2 lines (1 loc) 1.31 kB
import{createReadStream as m}from"node:fs";import{createInterface as T}from"node:readline";import{log as i}from"../../core/log/index.js";function g(){return{inputTokens:0,outputTokens:0,cacheReadInputTokens:0,cacheCreationInputTokens:0}}function k(e,n){e.inputTokens+=n.inputTokens,e.outputTokens+=n.outputTokens,e.cacheReadInputTokens+=n.cacheReadInputTokens,e.cacheCreationInputTokens+=n.cacheCreationInputTokens}async function R(e){i.info("pi-usage-parser",`Parsing session usage from ${e}`);const n=new Map,c=g();let a=0;try{const t=T({input:m(e,"utf8"),crlfDelay:1/0});for await(const o of t)if(o.trim())try{const p=JSON.parse(o);if(p.type!=="message")continue;const s=p.message;if(!s||s.role!=="assistant"||!s.usage)continue;const u=s.usage,f=s.model??"unknown";a++;const l={inputTokens:u.input??0,outputTokens:u.output??0,cacheReadInputTokens:u.cacheRead??0,cacheCreationInputTokens:u.cacheWrite??0};k(c,l);let r=n.get(f);r||(r={turns:0,usage:g()},n.set(f,r)),r.turns++,k(r.usage,l)}catch{}}catch(t){return t.code==="ENOENT"?(i.info("pi-usage-parser",`Session file not found: ${e}`),null):(i.error("pi-usage-parser",`Failed to parse session: ${t}`),null)}return a===0?null:{models:[...n.entries()].map(([t,o])=>({model:t,turns:o.turns,total:o.usage})),total:c,turns:a}}export{R as parsePiSessionUsage};