@neilurk12/pi-clean-footer 0.2.8 → 0.3.1
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 +7 -5
- package/package.json +5 -2
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
`).filter(Boolean).length;t={inRepo:!0,branch:a,dirtyCount:g}}catch{t={inRepo:!1,dirtyCount:0}}for(let d of r)d()}function i(){l(),n=setTimeout(()=>{n=void 0,o()},e.debounceMs)}function l(){n&&(clearTimeout(n),n=void 0)}return{get state(){return t},schedule:i,clear:l,refresh:o,onChange(d){return r.push(d),()=>{let s=r.indexOf(d);s>=0&&r.splice(s,1)}}}}function P(e){var n,r,o,i,l;let t={input:0,output:0,cacheRead:0,cacheWrite:0};for(let d of e){if(d.type!=="message"||((n=d.message)==null?void 0:n.role)!=="assistant")continue;let s=d.message;t.input+=((r=s.usage)==null?void 0:r.input)??0,t.output+=((o=s.usage)==null?void 0:o.output)??0,t.cacheRead+=((i=s.usage)==null?void 0:i.cacheRead)??0,t.cacheWrite+=((l=s.usage)==null?void 0:l.cacheWrite)??0}return t}function p(e){if(typeof e!="string")return;let t=e.toLowerCase();if(t==="medium")return"med";if(t==="extra-high"||t==="extra_high"||t==="x-high")return"xhigh";if(["low","med","high","xhigh"].includes(t))return t}var C=class{#t;#r;#i;#e;#n;#s;#a;#d;#l;#o;constructor(t){this.#a=t.globalConfigPath,this.#d=t.getProjectConfigPath,this.#l=t.getThinkingLevel,this.#o=t.onRenderNeeded,this.#t=c,this.#r={config:this.#t,loadedPaths:[]},this.#i=void 0,this.#e=void 0,this.#n=!0,this.#s=""}async start(t){this.#s=t.cwd,this.#r=x(this.#a,this.#d(t.cwd)),this.#t=this.#r.config,this.#i=p(this.#l()),this.#n=this.#t.enabled,this.#n&&(this.#e=m({cwd:t.cwd,debounceMs:this.#t.gitRefreshDebounceMs,enabled:this.#t.showGit,onChange:()=>this.#o()}),await this.#e.refresh())}shutdown(){var t;(t=this.#e)==null||t.clear(),this.#e=void 0}onThinkingLevel(t){this.#i=p(t),this.#o()}onModelSelect(){this.#o()}onMessageEnd(t){t==="assistant"&&this.#o()}onToolEnd(t){var n;["bash","edit","write"].includes(t)&&((n=this.#e)==null||n.schedule()),this.#o()}onUserBash(){var t;(t=this.#e)==null||t.schedule()}async refresh(){var t;await((t=this.#e)==null?void 0:t.refresh())}async reload(t){var n;this.#r=x(this.#a,this.#d(t.cwd)),this.#t=this.#r.config,this.#n=this.#t.enabled,(n=this.#e)==null||n.clear(),this.#e=void 0,this.#n&&(this.#e=m({cwd:this.#s,debounceMs:this.#t.gitRefreshDebounceMs,enabled:this.#t.showGit,onChange:()=>this.#o()}),await this.#e.refresh()),this.#o()}async toggle(){var t;return this.#n=!this.#n,this.#n?(this.#i=p(this.#l()),this.#e=m({cwd:this.#s,debounceMs:this.#t.gitRefreshDebounceMs,enabled:this.#t.showGit,onChange:()=>this.#o()}),await this.#e.refresh()):((t=this.#e)==null||t.clear(),this.#e=void 0),this.#o(),this.#n}getFooterInput(t){var n,r,o,i,l,d;return{modelId:((n=t.model)==null?void 0:n.id)??"no-model",thinkingLevel:this.#i,directory:W.basename(t.cwd),gitBranch:(r=this.#e)==null?void 0:r.state.branch,gitDirtyCount:((o=this.#e)==null?void 0:o.state.dirtyCount)??0,contextUsed:((l=(i=t.getContextUsage)==null?void 0:i.call(t))==null?void 0:l.tokens)??0,contextMax:(d=t.model)==null?void 0:d.contextWindow,totals:P(t.sessionManager.getBranch()),config:this.#t}}get isEnabled(){return this.#n}get loadedError(){return this.#r.error}get loadedPaths(){return this.#r.loadedPaths}get config(){return this.#t}};import{truncateToWidth as u,visibleWidth as T}from"@earendil-works/pi-tui";function f(e){return!Number.isFinite(e)||e<=0?"0":e<1e3?`${Math.round(e)}`:e<1e6?`${(e/1e3).toFixed(e<1e4?1:0)}k`:`${(e/1e6).toFixed(1)}m`}function B(e,t){if(t[e])return t[e];let n=e.toLowerCase(),r=n.includes("/")?n.split("/").pop():n;if(t[r])return t[r];if(r.includes("claude")&&r.includes("sonnet"))return r.includes("4-5")||r.includes("4.5")?"sonnet-4.5":r.includes("4")?"sonnet-4":"sonnet";if(r.includes("claude")&&r.includes("opus"))return"opus";if(r.includes("claude")&&r.includes("haiku"))return"haiku";let o=r.match(/gpt-5(?:[.-][a-z0-9]+)*/);if(o)return o[0];let i=r.match(/gpt-4(?:[.-][a-z0-9]+)*/);if(i)return i[0];let l=r.match(/gemini-[a-z0-9.-]+/);return l?l[0].replace(/-preview.*/,""):r.length>24?`${r.slice(0,21)}\u2026`:r}function F(e,t,n,r,o,i){let l=B(e,n),d=r&&t?` \u2022 ${t}`:"";return o(i,`${l}${d}`)}function k(e,t,n){if(e)return t(n,e)}function v(e,t,n,r,o){if(!e)return;let i=n(r,e);return t<=0?i:`${i} ${n(o,`\u25CF${t}`)}`}function b(e,t,n,r,o,i){if(!n)return;let l=r?t:t==="full"?"no-cache":t,d=e.input+e.output,s;if(l==="total-only")s=`\u03A3${f(d)}`;else{let a=`\u2191${f(e.input)} \u2193${f(e.output)} \u03A3${f(d)}`;s=l==="full"?`${a} \u21AF${f(e.cacheRead)} \u21A5${f(e.cacheWrite)}`:a}return o(i,s)}function E(e,t,n,r,o,i){let l=`ctx ${f(e)}/${t?f(t):"--"}`;if(!t||t<=0)return o(i.dim,l);let d=e/t*100;return d>=r?o(i.danger,l):d>=n?o(i.warning,l):o(i.normal,l)}function O(e,t){let n=e.config,r=F(e.modelId,e.thinkingLevel,n.modelAliases,n.showEffort,t,n.colors.model),o=n.showDirectory?k(e.directory,t,n.colors.directory):void 0,i=n.showGit?v(e.gitBranch,e.gitDirtyCount,t,n.colors.git,n.colors.gitDirty):void 0,l=n.showContext?E(e.contextUsed,e.contextMax,n.contextWarningPercent,n.contextDangerPercent,t,{normal:n.colors.contextNormal,warning:n.colors.contextWarning,danger:n.colors.contextDanger,dim:"dim"}):void 0,d={};return n.showTokens&&(d.full=b(e.totals,"full",!0,n.showCache,t,n.colors.tokens),d.noCache=b(e.totals,"no-cache",!0,n.showCache,t,n.colors.tokens),d.totalOnly=b(e.totals,"total-only",!0,n.showCache,t,n.colors.tokens)),{model:r,dir:o,git:i,context:l,tokens:d}}function z(e,t,n){let r=[e.model,e.dir,e.git].filter(Boolean).join(t),o=e.model;if(n>=100){let i=[e.context,e.tokens.full].filter(Boolean).join(t);return[h(r,i,n)]}if(n>=80){let i=[e.context,e.tokens.noCache].filter(Boolean).join(t);return[h(r,i,n)]}if(n>=60){let i=[e.context,e.tokens.totalOnly].filter(Boolean).join(t);return[h(r,i,n)]}return n>=40?[h(r,e.context??"",n)]:[h(o,e.context??"",n)]}function S(e,t,n){let r=(l,d)=>t.fg(l,d),o=O(e,r),i=r(e.config.colors.separator," | ");return z(o,i,n)}function h(e,t,n){if(!t)return u(e,n);if(!e)return u(t,n);let r=n-T(e)-T(t);if(r>=1)return u(e+" ".repeat(r)+t,n);let o=Math.max(1,Math.floor((n-1)/2));return u(e,o)+" "+u(t,n-o-1)}function ue(e){let t=D.join(H.homedir(),".pi","agent","clean-footer.json"),n=s=>D.join(s,".pi","clean-footer.json"),r=()=>{},o=new C({globalConfigPath:t,getProjectConfigPath:n,getThinkingLevel:()=>{var s;return(s=e.getThinkingLevel)==null?void 0:s.call(e)},onRenderNeeded:()=>r()});e.registerCommand("footer",{description:"Toggle, refresh, or configure the clean footer",handler:async(s,a)=>{let g=s.trim();if(g==="refresh"){await o.refresh(),a.hasUI&&a.ui.notify("Footer refreshed","info");return}if(g==="reload"){await o.reload(a),a.hasUI&&o.isEnabled&&i(a),a.hasUI&&!o.isEnabled&&a.ui.setFooter(void 0),r(),l(a);return}if(g==="config"){d(a);return}let y=await o.toggle();a.hasUI&&(y?(i(a),a.ui.notify("Clean footer enabled","info")):(a.ui.setFooter(void 0),a.ui.notify("Default footer restored","info")))}}),e.on("session_start",async(s,a)=>{await o.start(a),a.hasUI&&o.loadedError&&o.isEnabled&&a.ui.notify(`Config error: ${o.loadedError}`,"error"),a.hasUI&&o.isEnabled&&i(a)}),e.on("session_shutdown",(s,a)=>{o.shutdown(),r=()=>{},a.hasUI&&a.ui.setFooter(void 0)}),e.on("thinking_level_select",s=>{o.onThinkingLevel(s.level)}),e.on("model_select",()=>{o.onModelSelect()}),e.on("message_end",s=>{o.onMessageEnd(s.message.role)}),e.on("tool_execution_end",s=>{o.onToolEnd(s.toolName)}),e.on("user_bash",()=>{o.onUserBash()});function i(s){s.hasUI&&s.ui.setFooter((a,g)=>(r=()=>a.requestRender(),{invalidate(){},render(y){let M=o.getFooterInput(s);return S(M,g,y)}}))}function l(s){s.hasUI&&(o.loadedError?s.ui.notify(`Clean footer config error: ${o.loadedError}`,"error"):s.ui.notify("Clean footer config loaded","info"))}function d(s){if(!s.hasUI)return;let a=o.loadedPaths.length?o.loadedPaths.join(`
|
|
3
|
-
`):"none",
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import N from"path";import Se from"os";import se from"path";import{existsSync as Z,readFileSync as ee}from"fs";var j=["model","directory","git","context","tokensFull","tokensNoCache","tokensTotal","toks"],U=["default","minimal","compact","dense","focus","muted"],m=[{minWidth:100,left:["model","directory","git","toks"],right:["context","tokensFull"]},{minWidth:80,left:["model","directory","git","toks"],right:["context","tokensNoCache"]},{minWidth:60,left:["model","directory","git","toks"],right:["context","tokensTotal"]},{minWidth:40,left:["model","directory","git"],right:["context"]},{minWidth:0,left:["model"],right:["context"]}],G=[{minWidth:0,left:["model"],right:["context"]}],B=[{minWidth:80,left:["model","git"],right:["context","tokensTotal"]},{minWidth:0,left:["model"],right:["context"]}],H=[{minWidth:100,left:["model","directory","git","toks"],right:["context","tokensFull"]},{minWidth:60,left:["model","git"],right:["context","tokensNoCache"]},{minWidth:0,left:["model"],right:["context"]}],z=[{minWidth:0,left:["model"],right:["context"]}],K={default:{},minimal:{separator:" \xB7 ",showDirectory:!1,showGit:!1,showTokens:!1,layouts:G},compact:{separator:" \xB7 ",showDirectory:!1,showCacheRead:!1,showCacheWrites:!1,layouts:B},dense:{showCacheRead:!0,showCacheWrites:!0,layouts:H},focus:{showDirectory:!1,showGit:!1,showTokens:!1,layouts:z},muted:{colors:{model:"muted",directory:"dim",git:"muted",gitDirty:"warning",contextNormal:"muted",contextWarning:"warning",contextDanger:"error",tokens:"dim",separator:"dim"}}},l={preset:"default",enabled:!0,showGit:!0,showTokens:!0,showCache:!0,showCacheRead:!0,showCacheWrites:!1,showContext:!0,showDirectory:!0,showEffort:!0,separator:" | ",layouts:m,gitRefreshDebounceMs:500,contextWarningPercent:70,contextDangerPercent:85,modelAliases:{},colors:{model:"accent",directory:"dim",git:"success",gitDirty:"warning",contextNormal:"success",contextWarning:"warning",contextDanger:"error",tokens:"muted",separator:"dim"}};function C(e,t){return{...e,...t,modelAliases:{...e.modelAliases??{},...t.modelAliases??{}},colors:{...e.colors??{},...t.colors??{}}}}function F(e){let t=[],n=J(e.preset,t),o=K[n],r=C(o,e),s=q(r.layouts);return{config:{...l,...r,preset:n,separator:typeof r.separator=="string"?r.separator:l.separator,layouts:s.layouts,gitRefreshDebounceMs:Q(r.gitRefreshDebounceMs,l.gitRefreshDebounceMs),contextWarningPercent:T(r.contextWarningPercent,l.contextWarningPercent),contextDangerPercent:T(r.contextDangerPercent,l.contextDangerPercent),modelAliases:{...l.modelAliases,...o.modelAliases??{},...e.modelAliases??{}},colors:{...l.colors,...o.colors??{},...e.colors??{}}},loadedPaths:[],warnings:[...t,...s.warnings]}}function J(e,t){return e===void 0||e==="default"?"default":typeof e!="string"?(t.push("preset must be a string; using default preset"),"default"):U.includes(e)?e:(t.push(`unknown preset '${e}'; using default preset`),"default")}function q(e){let t=[];if(e===void 0)return{layouts:m,warnings:t};if(!Array.isArray(e))return{layouts:m,warnings:["layouts must be an array; using default layouts"]};let n=e.flatMap((o,r)=>{if(!X(o))return t.push(`layouts[${r}] must be an object; skipping`),[];let s=Y(o.minWidth);if(s===void 0)return t.push(`layouts[${r}].minWidth must be a non-negative number; skipping`),[];let d=w(o.left,`layouts[${r}].left`,t),u=w(o.right,`layouts[${r}].right`,t,new Set(d));return d.length===0&&u.length===0?(t.push(`layouts[${r}] has no visible segments; skipping`),[]):[{minWidth:s,left:d,right:u}]});return n.length===0?(t.push("no valid layouts configured; using default layouts"),{layouts:m,warnings:t}):{layouts:[...n].sort((o,r)=>r.minWidth-o.minWidth),warnings:t}}function w(e,t,n,o=new Set){if(!Array.isArray(e))return n.push(`${t} must be an array; using empty segment list`),[];let r=[];for(let s of e){if(!V(s)){n.push(`${t} contains unknown segment '${String(s)}'; omitting`);continue}if(o.has(s)){n.push(`${t} contains duplicate segment '${s}'; omitting`);continue}o.add(s),r.push(s)}return r}function V(e){return typeof e=="string"&&j.includes(e)}function X(e){return typeof e=="object"&&e!==null}function Y(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Q(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:t}function T(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=100?e:t}function x(e,t){return te([e,t])}function te(e){let t=[],n={},o;for(let s of e)if(Z(s))try{let d=JSON.parse(ee(s,"utf8"));n=C(n,d),t.push(s)}catch(d){o=`${s}: ${d instanceof Error?d.message:String(d)}`}let r=F(n);return{config:r.config,loadedPaths:t,warnings:r.warnings,error:o}}import{execFile as oe}from"child_process";import{promisify as ne}from"util";var k=ne(oe);function S(e){let t={inRepo:!1,dirtyCount:0},n,o=[];e.onChange&&o.push(e.onChange);async function r(){if(!e.enabled){t={inRepo:!1,dirtyCount:0};return}try{let[u,i]=await Promise.all([k("git",["branch","--show-current"],{cwd:e.cwd,timeout:2e3}),k("git",["status","--porcelain"],{cwd:e.cwd,timeout:2e3})]),a=u.stdout.trim()||"detached",f=i.stdout.split(`
|
|
2
|
+
`).filter(Boolean).length;t={inRepo:!0,branch:a,dirtyCount:f}}catch{t={inRepo:!1,dirtyCount:0}}for(let u of o)u()}function s(){d(),n=setTimeout(()=>{n=void 0,r()},e.debounceMs)}function d(){n&&(clearTimeout(n),n=void 0)}return{get state(){return t},schedule:s,clear:d,refresh:r,onChange(u){return o.push(u),()=>{let i=o.indexOf(u);i>=0&&o.splice(i,1)}}}}function v(e){var n,o,r,s,d;let t={input:0,output:0,cacheRead:0,cacheWrite:0};for(let u of e){if(u.type!=="message"||((n=u.message)==null?void 0:n.role)!=="assistant")continue;let i=u.message;t.input+=((o=i.usage)==null?void 0:o.input)??0,t.output+=((r=i.usage)==null?void 0:r.output)??0,t.cacheRead+=((s=i.usage)==null?void 0:s.cacheRead)??0,t.cacheWrite+=((d=i.usage)==null?void 0:d.cacheWrite)??0}return t}function p(e){if(typeof e!="string")return;let t=e.toLowerCase();if(t==="medium")return"med";if(t==="extra-high"||t==="extra_high"||t==="x-high")return"xhigh";if(["low","med","high","xhigh"].includes(t))return t}function c(e){return!Number.isFinite(e)||e<=0?"0":e<1e3?`${Math.round(e)}`:e<1e6?`${(e/1e3).toFixed(e<1e4?1:0)}k`:`${(e/1e6).toFixed(1)}m`}var re={edit:"edit",write:"write",bash:"bash",ctx_shell:"bash",read:"read",ctx_read:"read",Agent:"agent",agent_browser:"browser"},ie=[["gitnexus_","nexus"],["context7_","docs"]],R=8;function _(e){if(!e)return"";let t=re[e];if(t)return t;for(let[n,o]of ie)if(e.startsWith(n))return o;return e.length>R?e.slice(0,R):e}var ae=.25,de=.67,ue=.5,fe=1,ce=.5,le=300,ge=5e3,he=[". ",".. ","..."];function me(e){let t=0;for(let n of e){let o=n.codePointAt(0)??0;o>=32&&o<=126?t+=ae:o>=19968&&o<=40959||o>=13312&&o<=19903||o>=63744&&o<=64255||o>=12352&&o<=12447||o>=12448&&o<=12543||o>=44032&&o<=55215||o>=11904&&o<=12255||o>=12544&&o<=12590||o>=12784&&o<=12799||o>=65281&&o<=65374||o>=65381&&o<=65439?t+=de:o>=12288&&o<=12351?t+=ue:o>65535?t+=fe:t+=ce}return Math.ceil(t)}var y=class{#n;#i;#a;#t;#r;#u;#m;#p;#y;#o;#f={input:0,output:0,cacheRead:0,cacheWrite:0};#c=0;#e=void 0;#s=0;#C="";#l=0;#g=void 0;#d=void 0;constructor(t){this.#m=t.globalConfigPath,this.#p=t.getProjectConfigPath,this.#y=t.getThinkingLevel,this.#o=t.onRenderNeeded,this.#n=l,this.#i={config:this.#n,loadedPaths:[],warnings:[]},this.#a=void 0,this.#t=void 0,this.#r=!0,this.#u=""}async start(t){this.#f={input:0,output:0,cacheRead:0,cacheWrite:0},this.#c=0,this.#u=t.cwd,this.#i=x(this.#m,this.#p(t.cwd)),this.#n=this.#i.config,this.#a=p(this.#y()),this.#r=this.#n.enabled,this.#r&&(this.#x(t.cwd),await this.#t.refresh())}shutdown(){var t;(t=this.#t)==null||t.clear(),this.#t=void 0,this.#b()}#x(t){this.#t=S({cwd:t,debounceMs:this.#n.gitRefreshDebounceMs,enabled:this.#n.showGit,onChange:()=>this.#o()})}onThinkingLevel(t){this.#a=p(t),this.#o()}onModelSelect(){this.#o()}onMessageStart(t){t==="assistant"&&(this.#w(),this.#e={startTime:Date.now(),estimatedTokens:0,hasObservedOutput:!1,displayState:{state:"pending"}},this.#o())}onToolExecutionStart(t){this.#s++,this.#C=_(t)+"...",this.#l=0,this.#F(),this.#o()}onToolExecutionUpdate(t){}onToolExecutionEnd(t){var n;this.#s=Math.max(0,this.#s-1),this.#s===0&&this.#h(),["bash","edit","write"].includes(t)&&((n=this.#t)==null||n.schedule()),this.#o()}onMessageUpdate(t,n,o){if(!this.#e||!n||t!=="text_delta"&&t!=="thinking_delta"&&t!=="toolcall_delta")return;this.#e.estimatedTokens+=me(n),this.#e.hasObservedOutput=!0;let r=(Date.now()-this.#e.startTime)/1e3;if(r>0){let s=o&&o>0?o:this.#e.estimatedTokens;this.#e.displayState={state:"rate",value:s/r,approximate:!(o&&o>0)}}this.#o()}onMessageEnd(t,n){if(t==="assistant"){if(this.#s=0,this.#h(),this.#e){let o=(Date.now()-this.#e.startTime)/1e3;n&&n>0&&o>0?(this.#e.displayState={state:"rate",value:n/o,approximate:!1},this.#T()):this.#e.hasObservedOutput&&o>0?(this.#e.displayState={state:"rate",value:this.#e.estimatedTokens/o,approximate:!0},this.#T()):this.#e=void 0}this.#o()}}onMessageAbort(){if(this.#e)if(this.#e.hasObservedOutput){let t=(Date.now()-this.#e.startTime)/1e3;t>0&&(this.#e.displayState={state:"rate",value:this.#e.estimatedTokens/t,approximate:!0})}else this.#e=void 0;this.#o()}#b(){this.#f={input:0,output:0,cacheRead:0,cacheWrite:0},this.#c=0,this.#e=void 0,this.#s=0,this.#C="",this.#l=0,this.#h(),this.#w()}#F(){this.#h(),this.#g=setInterval(()=>{this.#l=(this.#l+1)%he.length,this.#o()},le)}#h(){this.#g&&(clearInterval(this.#g),this.#g=void 0)}#T(){this.#w(),this.#d=setTimeout(()=>{this.#d=void 0,this.#e&&(this.#e=void 0,this.#o())},ge)}#w(){this.#d&&(clearTimeout(this.#d),this.#d=void 0)}onUserBash(){var t;(t=this.#t)==null||t.schedule()}async refresh(){var t;await((t=this.#t)==null?void 0:t.refresh())}async reload(t){var n;this.#b(),this.#i=x(this.#m,this.#p(t.cwd)),this.#n=this.#i.config,this.#r=this.#n.enabled,(n=this.#t)==null||n.clear(),this.#t=void 0,this.#r&&(this.#x(this.#u),await this.#t.refresh()),this.#o()}async toggle(){var t;return this.#b(),this.#r=!this.#r,this.#r?(this.#a=p(this.#y()),this.#x(this.#u),await this.#t.refresh()):((t=this.#t)==null||t.clear(),this.#t=void 0),this.#o(),this.#r}getFooterInput(t){var o,r,s,d,u,i;let n=t.sessionManager.getBranch();return n.length!==this.#c&&(this.#f=v(n),this.#c=n.length),{modelId:((o=t.model)==null?void 0:o.id)??"no-model",thinkingLevel:this.#a,directory:se.basename(t.cwd),gitBranch:(r=this.#t)==null?void 0:r.state.branch,gitDirtyCount:((s=this.#t)==null?void 0:s.state.dirtyCount)??0,contextUsed:((u=(d=t.getContextUsage)==null?void 0:d.call(t))==null?void 0:u.tokens)??0,contextMax:(i=t.model)==null?void 0:i.contextWindow,totals:this.#f,toksState:this.#k(),config:this.#n}}#k(){var t;return this.#s>0?{state:"activity",label:this.#C}:((t=this.#e)==null?void 0:t.displayState)??{state:"hidden"}}get isEnabled(){return this.#r}get loadedError(){return this.#i.error}get loadedWarnings(){return this.#i.warnings}get loadedPaths(){return this.#i.loadedPaths}get config(){return this.#n}};import{truncateToWidth as h,visibleWidth as E}from"@earendil-works/pi-tui";function I(e,t,n,o){let r=e.filter(Boolean).join(n),s=t.filter(Boolean).join(n);return pe(r,s,o)}function pe(e,t,n){if(!t)return h(e,n);if(!e)return h(t,n);let o=n-E(e)-E(t);if(o>=1)return h(e+" ".repeat(o)+t,n);let r=Math.max(1,Math.floor((n-1)/2));return h(e,r)+" "+h(t,n-r-1)}function L(e,t){if(t[e])return t[e];let n=e.toLowerCase(),o=n.includes("/")?n.split("/").pop():n;if(t[o])return t[o];if(o.includes("claude")&&o.includes("sonnet"))return o.includes("4-5")||o.includes("4.5")?"sonnet-4.5":o.includes("4")?"sonnet-4":"sonnet";if(o.includes("claude")&&o.includes("opus"))return"opus";if(o.includes("claude")&&o.includes("haiku"))return"haiku";let r=o.match(/gpt-5(?:[.-][a-z0-9]+)*/);if(r)return r[0];let s=o.match(/gpt-4(?:[.-][a-z0-9]+)*/);if(s)return s[0];let d=o.match(/gemini-[a-z0-9.-]+/);return d?d[0].replace(/-preview.*/,""):o.length>24?`${o.slice(0,21)}\u2026`:o}function P(e,t){let n=e.input+e.output,o=`\u2191${c(e.input)} \u2193${c(e.output)} \u03A3${c(n)}`,r=[t.showCacheRead?`\u21AF${c(e.cacheRead)}`:void 0,t.showCacheWrites?`\u21A5${c(e.cacheWrite)}`:void 0].filter(Boolean),s=r.length?`${o} ${r.join(" ")}`:o;return t.cf(t.color,s)}function W(e,t,n){let o=e.input+e.output,r=`\u2191${c(e.input)} \u2193${c(e.output)} \u03A3${c(o)}`;return t(n,r)}function M(e,t,n){let o=e.input+e.output;return t(n,`\u03A3${c(o)}`)}function D(e,t,n){let o=(d,u)=>t.fg(d,u),r=ye(e,o),s=o(e.config.colors.separator,e.config.separator);return[Fe(r,s,e.config.layouts,n)]}function ye(e,t){let n=e.config,o=n.showCache&&n.showCacheRead,r=n.showCache&&n.showCacheWrites;return{model:Ce(e,t),directory:n.showDirectory?xe(e,t):void 0,git:n.showGit?be(e,t):void 0,context:n.showContext?we(e,t):void 0,tokensFull:n.showTokens?P(e.totals,{showCacheRead:o,showCacheWrites:r,cf:t,color:n.colors.tokens}):void 0,tokensNoCache:n.showTokens?W(e.totals,t,n.colors.tokens):void 0,tokensTotal:n.showTokens?M(e.totals,t,n.colors.tokens):void 0,toks:Te(e,t)}}function Ce(e,t){let n=L(e.modelId,e.config.modelAliases),o=e.config.showEffort&&e.thinkingLevel?` \u2022 ${e.thinkingLevel}`:"";return t(e.config.colors.model,`${n}${o}`)}function xe(e,t){if(e.directory)return t(e.config.colors.directory,e.directory)}function be(e,t){if(!e.gitBranch)return;let n=t(e.config.colors.git,e.gitBranch);return e.gitDirtyCount<=0?n:`${n} ${t(e.config.colors.gitDirty,`\u25CF${e.gitDirtyCount}`)}`}function we(e,t){let n=`ctx ${c(e.contextUsed)}/${e.contextMax?c(e.contextMax):"--"}`;if(!e.contextMax||e.contextMax<=0)return t("dim",n);let o=e.contextUsed/e.contextMax*100;return o>=e.config.contextDangerPercent?t(e.config.colors.contextDanger,n):o>=e.config.contextWarningPercent?t(e.config.colors.contextWarning,n):t(e.config.colors.contextNormal,n)}function Te(e,t){let n=e.toksState;if(n.state==="hidden")return;if(n.state==="activity")return t(e.config.colors.tokens,n.label);if(n.state==="pending")return t(e.config.colors.tokens,"\u2026 tok/s");let o=Math.round(n.value);return n.approximate?t(e.config.colors.tokens,`\u2248${o} tok/s`):t(e.config.colors.tokens,`${o} tok/s`)}function Fe(e,t,n,o){let r=ke(n,o),s=$(r.left,e),d=$(r.right,e);return I(s,d,t,o)}function ke(e,t){return e.find(n=>t>=n.minWidth)??e[e.length-1]}function $(e,t){return e.map(n=>t[n]).filter(n=>!!n)}function A(e){return e!==null&&typeof e=="object"&&"usage"in e&&e.usage!==null&&typeof e.usage=="object"}function b(e){if(e===null||typeof e!="object")return;let t=e,n=A(t)?t.usage.output:void 0;if(typeof n=="number"&&Number.isFinite(n)&&n>0)return n;let o=t.message;if(o!==null&&typeof o=="object"&&A(o)){let r=o.usage.output;if(typeof r=="number"&&Number.isFinite(r)&&r>0)return r}}function st(e){let t=N.join(Se.homedir(),".pi","agent","clean-footer.json"),n=i=>N.join(i,".pi","clean-footer.json"),o=()=>{},r=new y({globalConfigPath:t,getProjectConfigPath:n,getThinkingLevel:()=>{var i;return(i=e.getThinkingLevel)==null?void 0:i.call(e)},onRenderNeeded:()=>o()});e.registerCommand("footer",{description:"Toggle, refresh, or configure the clean footer",handler:async(i,a)=>{let f=i.trim();if(f==="refresh"){await r.refresh(),a.hasUI&&a.ui.notify("Footer refreshed","info");return}if(f==="reload"){await r.reload(a),a.hasUI&&r.isEnabled&&s(a),a.hasUI&&!r.isEnabled&&a.ui.setFooter(void 0),o(),d(a);return}if(f==="config"){u(a);return}let g=await r.toggle();a.hasUI&&(g?(s(a),a.ui.notify("Clean footer enabled","info")):(a.ui.setFooter(void 0),a.ui.notify("Default footer restored","info")))}}),e.on("session_start",async(i,a)=>{await r.start(a),a.hasUI&&r.loadedError&&r.isEnabled&&a.ui.notify(`Config error: ${r.loadedError}`,"error"),a.hasUI&&r.isEnabled&&s(a)}),e.on("session_shutdown",(i,a)=>{r.shutdown(),o=()=>{},a.hasUI&&a.ui.setFooter(void 0)}),e.on("thinking_level_select",i=>{r.onThinkingLevel(i.level)}),e.on("model_select",()=>{r.onModelSelect()}),e.on("message_start",i=>{r.onMessageStart(i.message.role)}),e.on("message_end",i=>{let a=i.message,f=a.role==="assistant"?b(a):void 0;r.onMessageEnd(a.role,f)}),e.on("message_update",i=>{let a=i.assistantMessageEvent;if(i.message.role==="assistant"){let f="delta"in a?a.delta:void 0,g=b(i.message);r.onMessageUpdate(a.type,f,g)}}),e.on("tool_execution_start",i=>{r.onToolExecutionStart(i.toolName)}),e.on("tool_execution_update",i=>{r.onToolExecutionUpdate(i.toolName)}),e.on("tool_execution_end",i=>{r.onToolExecutionEnd(i.toolName)}),e.on("user_bash",()=>{r.onUserBash()});function s(i){i.hasUI&&i.ui.setFooter((a,f)=>(o=()=>a.requestRender(),{invalidate(){},render(g){let O=r.getFooterInput(i);return D(O,f,g)}}))}function d(i){i.hasUI&&(r.loadedError?i.ui.notify(`Clean footer config error: ${r.loadedError}`,"error"):r.loadedWarnings.length>0?i.ui.notify(`Clean footer config loaded with warnings: ${r.loadedWarnings.join("; ")}`,"warning"):i.ui.notify("Clean footer config loaded","info"))}function u(i){if(!i.hasUI)return;let a=r.loadedPaths.length?r.loadedPaths.join(`
|
|
3
|
+
`):"none",f=r.loadedWarnings.length?r.loadedWarnings.join(`
|
|
4
|
+
`):"none",g=n(i.cwd);i.ui.notify(["Clean footer config",`global: ${t}`,`project: ${g}`,`loaded:
|
|
5
|
+
${a}`,r.loadedError?`error: ${r.loadedError}`:"error: none",`warnings:
|
|
6
|
+
${f}`,`preset: ${r.config.preset}`,`resolved: ${JSON.stringify(r.config)}`].join(`
|
|
7
|
+
`),"info")}}export{st as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neilurk12/pi-clean-footer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Clean, minimal, and lightweight powerline-style footer extension for pi coding agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -33,7 +33,9 @@
|
|
|
33
33
|
"build": "tsup",
|
|
34
34
|
"dev": "tsup --watch",
|
|
35
35
|
"test": "vitest run",
|
|
36
|
-
"test:watch": "vitest"
|
|
36
|
+
"test:watch": "vitest",
|
|
37
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
38
|
+
"format:check": "prettier --check \"src/**/*.ts\""
|
|
37
39
|
},
|
|
38
40
|
"peerDependencies": {
|
|
39
41
|
"@earendil-works/pi-ai": "*",
|
|
@@ -41,6 +43,7 @@
|
|
|
41
43
|
"@earendil-works/pi-tui": "*"
|
|
42
44
|
},
|
|
43
45
|
"devDependencies": {
|
|
46
|
+
"prettier": "^3.8.3",
|
|
44
47
|
"tsup": "^8.5.1",
|
|
45
48
|
"typescript": "^6.0.3",
|
|
46
49
|
"vitest": "^4.1.6"
|