@neilurk12/pi-clean-footer 0.3.2 → 0.4.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/README.md CHANGED
@@ -14,6 +14,7 @@ Shows a compact split footer:
14
14
  - Event-driven git refresh after file-changing tools and user bash commands
15
15
  - Context usage as `used/max`
16
16
  - Cumulative active-branch token totals: input, output, total, cache read, cache write
17
+ - Optional session cost display (`$x.xx`) using provider cost data; auto-hides for zero-cost models
17
18
  - Adaptive width tiers for narrow terminals
18
19
  - `/footer` toggle
19
20
  - `/footer refresh` force refresh
@@ -84,22 +85,33 @@ Example:
84
85
  "showGit": true,
85
86
  "showTokens": true,
86
87
  "showCacheRead": true,
87
- "showCacheWrites": true,
88
+ "showCacheWrites": false,
88
89
  "showContext": true,
89
90
  "showDirectory": true,
90
91
  "showEffort": true,
92
+ "showCost": true,
91
93
  "gitRefreshDebounceMs": 500,
92
- "separator": " ",
94
+ "separator": " | ",
93
95
  "layouts": [
94
96
  {
95
97
  "minWidth": 100,
96
- "left": ["model", "directory", "git"],
97
- "right": ["context", "tokensFull"]
98
+ "left": ["model", "directory", "git", "toks"],
99
+ "right": ["cost", "context", "tokensFull"]
100
+ },
101
+ {
102
+ "minWidth": 80,
103
+ "left": ["model", "directory", "git", "toks"],
104
+ "right": ["cost", "context", "tokensNoCache"]
98
105
  },
99
106
  {
100
107
  "minWidth": 60,
101
- "left": ["model", "git"],
102
- "right": ["context", "tokensTotal"]
108
+ "left": ["model", "directory", "git", "toks"],
109
+ "right": ["cost", "context", "tokensTotal"]
110
+ },
111
+ {
112
+ "minWidth": 40,
113
+ "left": ["model", "directory", "git"],
114
+ "right": ["cost", "context"]
103
115
  },
104
116
  {
105
117
  "minWidth": 0,
@@ -122,6 +134,7 @@ Example:
122
134
  "contextWarning": "warning",
123
135
  "contextDanger": "error",
124
136
  "tokens": "muted",
137
+ "cost": "muted",
125
138
  "separator": "dim"
126
139
  }
127
140
  }
@@ -159,6 +172,7 @@ Supported layout segment IDs:
159
172
  - `tokensNoCache` - input, output, and total tokens
160
173
  - `tokensTotal` - total tokens only
161
174
  - `toks` - tokens-per-second rate or activity indicator
175
+ - `cost` - cumulative session cost in `$x.xx` format
162
176
 
163
177
  `layouts` are selected by the highest `minWidth` less than or equal to the terminal width. `showGit`, `showTokens`, `showContext`, `showDirectory`, and `showEffort` still act as global visibility controls. `showCache` is a deprecated global cache-token gate; use `showCacheRead` and `showCacheWrites` to hide cache read (`↯`) and write (`↥`) counts independently. Unknown or duplicate layout segments are omitted and reported by `/footer config`.
164
178
 
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import K from"path";import Fe from"os";import he from"path";import{existsSync as re,readFileSync as ie}from"fs";var H=["model","directory","git","context","tokensFull","tokensNoCache","tokensTotal","toks"],z=["default","minimal","compact","dense","focus","muted"],y=[{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"]}],J=[{minWidth:0,left:["model"],right:["context"]}],q=[{minWidth:80,left:["model","git"],right:["context","tokensTotal"]},{minWidth:0,left:["model"],right:["context"]}],V=[{minWidth:100,left:["model","directory","git","toks"],right:["context","tokensFull"]},{minWidth:60,left:["model","git"],right:["context","tokensNoCache"]},{minWidth:0,left:["model"],right:["context"]}],X=[{minWidth:0,left:["model"],right:["context"]}],Y={default:{},minimal:{separator:" \xB7 ",showDirectory:!1,showGit:!1,showTokens:!1,layouts:J},compact:{separator:" \xB7 ",showDirectory:!1,showCacheRead:!1,showCacheWrites:!1,layouts:q},dense:{showCacheRead:!0,showCacheWrites:!0,layouts:V},focus:{showDirectory:!1,showGit:!1,showTokens:!1,layouts:X},muted:{colors:{model:"muted",directory:"dim",git:"muted",gitDirty:"warning",contextNormal:"muted",contextWarning:"warning",contextDanger:"error",tokens:"dim",separator:"dim"}}},m={preset:"default",enabled:!0,showGit:!0,showTokens:!0,showCacheRead:!0,showCacheWrites:!1,showContext:!0,showDirectory:!0,showEffort:!0,separator:" | ",layouts:y,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 w(e,t){return{...e,...t,modelAliases:{...e.modelAliases??{},...t.modelAliases??{}},colors:{...e.colors??{},...t.colors??{}}}}function R(e){let t=[];"showCache"in e&&t.push("showCache is deprecated; use showCacheRead and showCacheWrites instead"),"showCache"in e&&!("showCacheRead"in e)&&(e={...e,showCacheRead:e.showCache});let n=Q(e.preset,t),o=Y[n],r=w(o,e),s=Z(r.layouts);return{config:{...m,...r,preset:n,separator:typeof r.separator=="string"?r.separator:m.separator,layouts:s.layouts,gitRefreshDebounceMs:ne(r.gitRefreshDebounceMs,m.gitRefreshDebounceMs),contextWarningPercent:S(r.contextWarningPercent,m.contextWarningPercent),contextDangerPercent:S(r.contextDangerPercent,m.contextDangerPercent),modelAliases:{...m.modelAliases,...o.modelAliases??{},...e.modelAliases??{}},colors:{...m.colors,...o.colors??{},...e.colors??{}}},loadedPaths:[],warnings:[...t,...s.warnings]}}function Q(e,t){return e===void 0||e==="default"?"default":typeof e!="string"?(t.push("preset must be a string; using default preset"),"default"):z.includes(e)?e:(t.push(`unknown preset '${e}'; using default preset`),"default")}function Z(e){let t=[];if(e===void 0)return{layouts:y,warnings:t};if(!Array.isArray(e))return{layouts:y,warnings:["layouts must be an array; using default layouts"]};let n=e.flatMap((o,r)=>{if(!te(o))return t.push(`layouts[${r}] must be an object; skipping`),[];let s=oe(o.minWidth);if(s===void 0)return t.push(`layouts[${r}].minWidth must be a non-negative number; skipping`),[];let d=v(o.left,`layouts[${r}].left`,t),u=v(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:y,warnings:t}):{layouts:[...n].sort((o,r)=>r.minWidth-o.minWidth),warnings:t}}function v(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(!ee(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 ee(e){return typeof e=="string"&&H.includes(e)}function te(e){return typeof e=="object"&&e!==null}function oe(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function ne(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:t}function S(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=100?e:t}function k(e,t){return se([e,t])}function se(e){let t=[],n={},o;for(let s of e)if(re(s))try{let d=JSON.parse(ie(s,"utf8"));n=w(n,d),t.push(s)}catch(d){o=`${s}: ${d instanceof Error?d.message:String(d)}`}let r=R(n);return{config:r.config,loadedPaths:t,warnings:r.warnings,error:o}}import{execFile as ae}from"child_process";import{promisify as de}from"util";var _=de(ae);function E(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([_("git",["branch","--show-current"],{cwd:e.cwd,timeout:2e3}),_("git",["status","--porcelain"],{cwd:e.cwd,timeout:2e3})]),a=u.stdout.trim()||"detached",l=i.stdout.split(`
2
- `).filter(Boolean).length;t={inRepo:!0,branch:a,dirtyCount:l}}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 I(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 C(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 g(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 M(e){let t=0;for(let n of e){let o=n.codePointAt(0)??0;o>=32&&o<=126?t+=.25: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<=12591||o>=12784&&o<=12799||o>=65281&&o<=65374||o>=65381&&o<=65439?t+=.67:o>=12288&&o<=12351?t+=.5:o>65535?t+=1:t+=.5}return Math.ceil(t)}var ue={edit:"edit",write:"write",bash:"bash",ctx_shell:"bash",read:"read",ctx_read:"read",Agent:"agent",agent_browser:"browser"},le=[["gitnexus_","nexus"],["context7_","docs"]],P=8;function L(e){if(!e)return"";let t=ue[e];if(t)return t;for(let[n,o]of le)if(e.startsWith(n))return o;return e.length>P?e.slice(0,P):e}var ce=300,fe=5e3,ge=[". ",".. ","..."];function W(e){let t,n=0,o="",r=0,s,d;function u(){i(),s=setInterval(()=>{r=(r+1)%ge.length,e.onRenderNeeded()},ce)}function i(){s&&(clearInterval(s),s=void 0)}function a(){l(),d=setTimeout(()=>{d=void 0,t&&(t=void 0,e.onRenderNeeded())},fe)}function l(){d&&(clearTimeout(d),d=void 0)}function h(c,f,b){return{state:"rate",value:(f&&f>0?f:c)/b,approximate:!(f&&f>0)}}return{onMessageStart(){l(),t={startTime:Date.now(),estimatedTokens:0,hasObservedOutput:!1,displayState:{state:"pending"}},e.onRenderNeeded()},onMessageUpdate(c,f,b){if(!t||!f||c!=="text_delta"&&c!=="thinking_delta"&&c!=="toolcall_delta")return;t.estimatedTokens+=M(f),t.hasObservedOutput=!0;let T=(Date.now()-t.startTime)/1e3;T>0&&(t.displayState=h(t.estimatedTokens,b,T)),e.onRenderNeeded()},onMessageEnd(c){if(n=0,i(),t){let f=(Date.now()-t.startTime)/1e3;c&&c>0&&f>0?(t.displayState={state:"rate",value:c/f,approximate:!1},a()):t.hasObservedOutput&&f>0?(t.displayState={state:"rate",value:t.estimatedTokens/f,approximate:!0},a()):t=void 0}e.onRenderNeeded()},onMessageAbort(){if(t)if(t.hasObservedOutput){let c=(Date.now()-t.startTime)/1e3;c>0&&(t.displayState={state:"rate",value:t.estimatedTokens/c,approximate:!0})}else t=void 0;e.onRenderNeeded()},onToolStart(c){n++,o=L(c)+"...",r=0,u(),e.onRenderNeeded()},onToolEnd(){n=Math.max(0,n-1),n===0&&i(),e.onRenderNeeded()},getState(){return n>0?{state:"activity",label:o}:(t==null?void 0:t.displayState)??{state:"hidden"}},shutdown(){t=void 0,n=0,o="",r=0,i(),l()}}}var x=class{#t;#r;#s;#e;#n;#o;#a;#l;#c;#f;#i;#d={input:0,output:0,cacheRead:0,cacheWrite:0};#u=0;constructor(t){this.#l=t.globalConfigPath,this.#c=t.getProjectConfigPath,this.#f=t.getThinkingLevel,this.#i=t.onRenderNeeded,this.#t=m,this.#r={config:this.#t,loadedPaths:[],warnings:[]},this.#s=void 0,this.#e=void 0,this.#o=!0,this.#a="",this.#n=W({onRenderNeeded:()=>this.#i()})}async start(t){this.#d={input:0,output:0,cacheRead:0,cacheWrite:0},this.#u=0,this.#a=t.cwd,this.#r=k(this.#l,this.#c(t.cwd)),this.#t=this.#r.config,this.#s=C(this.#f()),this.#o=this.#t.enabled,this.#o&&(this.#g(t.cwd),await this.#e.refresh())}shutdown(){var t;(t=this.#e)==null||t.clear(),this.#e=void 0,this.#h()}#g(t){this.#e=E({cwd:t,debounceMs:this.#t.gitRefreshDebounceMs,enabled:this.#t.showGit,onChange:()=>this.#i()})}onThinkingLevel(t){this.#s=C(t),this.#i()}onModelSelect(){this.#i()}onMessageStart(t){t==="assistant"&&this.#n.onMessageStart()}onToolExecutionStart(t){this.#n.onToolStart(t)}onToolExecutionUpdate(t){}onToolExecutionEnd(t){var n;this.#n.onToolEnd(),["bash","edit","write"].includes(t)&&((n=this.#e)==null||n.schedule())}onMessageUpdate(t,n,o){this.#n.onMessageUpdate(t,n,o)}onMessageEnd(t,n){t==="assistant"&&this.#n.onMessageEnd(n)}onMessageAbort(){this.#n.onMessageAbort()}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.#h(),this.#r=k(this.#l,this.#c(t.cwd)),this.#t=this.#r.config,this.#o=this.#t.enabled,(n=this.#e)==null||n.clear(),this.#e=void 0,this.#o&&(this.#g(this.#a),await this.#e.refresh()),this.#i()}async toggle(){var t;return this.#h(),this.#o=!this.#o,this.#o?(this.#s=C(this.#f()),this.#g(this.#a),await this.#e.refresh()):((t=this.#e)==null||t.clear(),this.#e=void 0),this.#i(),this.#o}getFooterInput(t){var o,r,s,d,u,i;let n=t.sessionManager.getBranch();return n.length!==this.#u&&(this.#d=I(n),this.#u=n.length),{modelId:((o=t.model)==null?void 0:o.id)??"no-model",thinkingLevel:this.#s,directory:he.basename(t.cwd),gitBranch:(r=this.#e)==null?void 0:r.state.branch,gitDirtyCount:((s=this.#e)==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.#d,toksState:this.#n.getState(),config:this.#t}}#h(){this.#d={input:0,output:0,cacheRead:0,cacheWrite:0},this.#u=0,this.#n.shutdown()}get isEnabled(){return this.#o}get loadedError(){return this.#r.error}get loadedWarnings(){return this.#r.warnings}get loadedPaths(){return this.#r.loadedPaths}get config(){return this.#t}};import{truncateToWidth as p,visibleWidth as A}from"@earendil-works/pi-tui";function D(e,t,n,o){let r=e.filter(Boolean).join(n),s=t.filter(Boolean).join(n);return me(r,s,o)}function me(e,t,n){if(!t)return p(e,n);if(!e)return p(t,n);let o=n-A(e)-A(t);if(o>=1)return p(e+" ".repeat(o)+t,n);let r=Math.max(1,Math.floor((n-1)/2));return p(e,r)+" "+p(t,n-r-1)}function N(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 $(e,t){let n=e.input+e.output,o=`\u2191${g(e.input)} \u2193${g(e.output)} \u03A3${g(n)}`,r=[t.showCacheRead?`\u21AF${g(e.cacheRead)}`:void 0,t.showCacheWrites?`\u21A5${g(e.cacheWrite)}`:void 0].filter(Boolean),s=r.length?`${o} ${r.join(" ")}`:o;return t.cf(t.color,s)}function O(e,t,n){let o=e.input+e.output,r=`\u2191${g(e.input)} \u2193${g(e.output)} \u03A3${g(o)}`;return t(n,r)}function U(e,t,n){let o=e.input+e.output;return t(n,`\u03A3${g(o)}`)}function G(e,t,n){let o=(d,u)=>t.fg(d,u),r=pe(e,o),s=o(e.config.colors.separator,e.config.separator);return[we(r,s,e.config.layouts,n)]}function pe(e,t){let n=e.config,o=n.showCacheRead,r=n.showCacheWrites;return{model:ye(e,t),directory:n.showDirectory?Ce(e,t):void 0,git:n.showGit?xe(e,t):void 0,context:n.showContext?be(e,t):void 0,tokensFull:n.showTokens?$(e.totals,{showCacheRead:o,showCacheWrites:r,cf:t,color:n.colors.tokens}):void 0,tokensNoCache:n.showTokens?O(e.totals,t,n.colors.tokens):void 0,tokensTotal:n.showTokens?U(e.totals,t,n.colors.tokens):void 0,toks:Te(e,t)}}function ye(e,t){let n=N(e.modelId,e.config.modelAliases),o=e.config.showEffort&&e.thinkingLevel?` \u2022 ${e.thinkingLevel}`:"";return t(e.config.colors.model,`${n}${o}`)}function Ce(e,t){if(e.directory)return t(e.config.colors.directory,e.directory)}function xe(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 be(e,t){let n=`ctx ${g(e.contextUsed)}/${e.contextMax?g(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 we(e,t,n,o){let r=ke(n,o),s=j(r.left,e),d=j(r.right,e);return D(s,d,t,o)}function ke(e,t){return e.find(n=>t>=n.minWidth)??e[e.length-1]}function j(e,t){return e.map(n=>t[n]).filter(n=>!!n)}function B(e){return e!==null&&typeof e=="object"&&"usage"in e&&e.usage!==null&&typeof e.usage=="object"}function F(e){if(e===null||typeof e!="object")return;let t=e,n=B(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"&&B(o)){let r=o.usage.output;if(typeof r=="number"&&Number.isFinite(r)&&r>=0)return r}}function ut(e){let t=K.join(Fe.homedir(),".pi","agent","clean-footer.json"),n=i=>K.join(i,".pi","clean-footer.json"),o=()=>{},r=new x({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 l=i.trim();if(l==="refresh"){await r.refresh(),a.hasUI&&a.ui.notify("Footer refreshed","info");return}if(l==="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(l==="config"){u(a);return}let h=await r.toggle();a.hasUI&&(h?(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,l=a.role==="assistant"?F(a):void 0;r.onMessageEnd(a.role,l)}),e.on("message_update",i=>{let a=i.assistantMessageEvent;if(i.message.role==="assistant"){let l="delta"in a?a.delta:void 0,h=F(i.message);r.onMessageUpdate(a.type,l,h)}}),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,l)=>(o=()=>a.requestRender(),{invalidate(){},render(h){let c=r.getFooterInput(i);return G(c,l,h)}}))}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",l=r.loadedWarnings.length?r.loadedWarnings.join(`
1
+ import X from"path";import _e from"os";import O from"path";import{existsSync as de,readFileSync as ce}from"fs";var q=["model","directory","git","context","tokensFull","tokensNoCache","tokensTotal","toks","cost"],V=["default","minimal","compact","dense","focus","muted"],y=[{minWidth:100,left:["model","directory","git","toks"],right:["cost","context","tokensFull"]},{minWidth:80,left:["model","directory","git","toks"],right:["cost","context","tokensNoCache"]},{minWidth:60,left:["model","directory","git","toks"],right:["cost","context","tokensTotal"]},{minWidth:40,left:["model","directory","git"],right:["cost","context"]},{minWidth:0,left:["model"],right:["context"]}],Y=[{minWidth:0,left:["model"],right:["context"]}],Q=[{minWidth:80,left:["model","git"],right:["context","tokensTotal"]},{minWidth:0,left:["model"],right:["context"]}],Z=[{minWidth:100,left:["model","directory","git","toks"],right:["context","tokensFull"]},{minWidth:60,left:["model","git"],right:["context","tokensNoCache"]},{minWidth:0,left:["model"],right:["context"]}],ee=[{minWidth:0,left:["model"],right:["context"]}],te={default:{},minimal:{separator:" \xB7 ",showDirectory:!1,showGit:!1,showTokens:!1,layouts:Y},compact:{separator:" \xB7 ",showDirectory:!1,showCacheRead:!1,showCacheWrites:!1,layouts:Q},dense:{showCacheRead:!0,showCacheWrites:!0,layouts:Z},focus:{showDirectory:!1,showGit:!1,showTokens:!1,layouts:ee},muted:{colors:{model:"muted",directory:"dim",git:"muted",gitDirty:"warning",contextNormal:"muted",contextWarning:"warning",contextDanger:"error",tokens:"dim",cost:"dim",separator:"dim"}}},m={preset:"default",enabled:!0,showGit:!0,showTokens:!0,showCacheRead:!0,showCacheWrites:!1,showContext:!0,showDirectory:!0,showEffort:!0,showCost:!0,separator:" | ",layouts:y,gitRefreshDebounceMs:500,contextWarningPercent:70,contextDangerPercent:85,modelAliases:{},colors:{model:"accent",directory:"dim",git:"success",gitDirty:"warning",contextNormal:"success",contextWarning:"warning",contextDanger:"error",tokens:"muted",cost:"muted",separator:"dim"}};function w(e,t){return{...e,...t,modelAliases:{...e.modelAliases??{},...t.modelAliases??{}},colors:{...e.colors??{},...t.colors??{}}}}function E(e){let t=[];"showCache"in e&&t.push("showCache is deprecated; use showCacheRead and showCacheWrites instead"),"showCache"in e&&!("showCacheRead"in e)&&(e={...e,showCacheRead:e.showCache});let n=oe(e.preset,t),o=te[n],r=w(o,e),s=ne(r.layouts);return{config:{...m,...r,preset:n,separator:typeof r.separator=="string"?r.separator:m.separator,layouts:s.layouts,gitRefreshDebounceMs:ae(r.gitRefreshDebounceMs,m.gitRefreshDebounceMs),contextWarningPercent:S(r.contextWarningPercent,m.contextWarningPercent),contextDangerPercent:S(r.contextDangerPercent,m.contextDangerPercent),modelAliases:{...m.modelAliases,...o.modelAliases??{},...e.modelAliases??{}},colors:{...m.colors,...o.colors??{},...e.colors??{}}},loadedPaths:[],warnings:[...t,...s.warnings]}}function oe(e,t){return e===void 0||e==="default"?"default":typeof e!="string"?(t.push("preset must be a string; using default preset"),"default"):V.includes(e)?e:(t.push(`unknown preset '${e}'; using default preset`),"default")}function ne(e){let t=[];if(e===void 0)return{layouts:y,warnings:t};if(!Array.isArray(e))return{layouts:y,warnings:["layouts must be an array; using default layouts"]};let n=e.flatMap((o,r)=>{if(!se(o))return t.push(`layouts[${r}] must be an object; skipping`),[];let s=ie(o.minWidth);if(s===void 0)return t.push(`layouts[${r}].minWidth must be a non-negative number; skipping`),[];let d=v(o.left,`layouts[${r}].left`,t),f=v(o.right,`layouts[${r}].right`,t,new Set(d));return d.length===0&&f.length===0?(t.push(`layouts[${r}] has no visible segments; skipping`),[]):[{minWidth:s,left:d,right:f}]});return n.length===0?(t.push("no valid layouts configured; using default layouts"),{layouts:y,warnings:t}):{layouts:[...n].sort((o,r)=>r.minWidth-o.minWidth),warnings:t}}function v(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(!re(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 re(e){return typeof e=="string"&&q.includes(e)}function se(e){return typeof e=="object"&&e!==null}function ie(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function ae(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:t}function S(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=100?e:t}function k(e,t){return ue([e,t])}function ue(e){let t=[],n={},o;for(let s of e)if(de(s))try{let d=JSON.parse(ce(s,"utf8"));if(typeof d!="object"||d===null||Array.isArray(d)){o=`${s}: config must be a JSON object`;continue}n=w(n,d),t.push(s)}catch(d){o=`${s}: ${d instanceof Error?d.message:String(d)}`}let r=E(n);return{config:r.config,loadedPaths:t,warnings:r.warnings,error:o}}import{execFile as fe}from"child_process";import{promisify as le}from"util";var R=le(fe),_=2e3;function M(e){let t={inRepo:!1,dirtyCount:0},n,o=[],r=0;e.onChange&&o.push(e.onChange);async function s(){if(!e.enabled){t={inRepo:!1,dirtyCount:0};return}let i=++r;try{let[a,u]=await Promise.all([R("git",["branch","--show-current"],{cwd:e.cwd,timeout:_}),R("git",["status","--porcelain"],{cwd:e.cwd,timeout:_})]);if(i!==r)return;let h=a.stdout.trim()||"detached",c=u.stdout.split(`
2
+ `).filter(Boolean).length;t={inRepo:!0,branch:h,dirtyCount:c}}catch(a){if(i!==r)return;let u=a.code;a instanceof Error&&u!=null&&u!=="ENOENT"&&typeof u!="number"&&console.error("[clean-footer] git refresh failed:",a.message),t={inRepo:!1,dirtyCount:0}}for(let a of[...o])try{a()}catch{}}function d(){f(),n=setTimeout(()=>{n=void 0,s()},e.debounceMs)}function f(){n&&(clearTimeout(n),n=void 0)}return{get state(){return t},schedule:d,clear:f,refresh:s,onChange(i){return o.push(i),()=>{let a=o.indexOf(i);a>=0&&o.splice(a,1)}}}}function*I(e){var t;for(let n of e)n.type==="message"&&((t=n.message)==null?void 0:t.role)==="assistant"&&(yield n.message)}function L(e){var n,o,r,s;let t={input:0,output:0,cacheRead:0,cacheWrite:0};for(let d of I(e))t.input+=((n=d.usage)==null?void 0:n.input)??0,t.output+=((o=d.usage)==null?void 0:o.output)??0,t.cacheRead+=((r=d.usage)==null?void 0:r.cacheRead)??0,t.cacheWrite+=((s=d.usage)==null?void 0:s.cacheWrite)??0;return t}function A(e){var n,o;let t=0;for(let r of I(e)){let s=(o=(n=r.usage)==null?void 0:n.cost)==null?void 0:o.total;typeof s=="number"&&Number.isFinite(s)&&s>0&&(t+=s)}return t}function C(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 g(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 N(e){let t=0;for(let n of e){let o=n.codePointAt(0)??0;o>=32&&o<=126?t+=.25: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<=12591||o>=12784&&o<=12799||o>=65281&&o<=65374||o>=65381&&o<=65439?t+=.67:o>=12288&&o<=12351?t+=.5:o>65535?t+=1:t+=.5}return Math.ceil(t)}var ge={edit:"edit",write:"write",bash:"bash",ctx_shell:"bash",read:"read",ctx_read:"read",Agent:"agent",agent_browser:"browser"},he=[["gitnexus_","nexus"],["context7_","docs"]],P=8;function W(e){if(!e)return"";let t=ge[e];if(t)return t;for(let[n,o]of he)if(e.startsWith(n))return o;return e.length>P?e.slice(0,P):e}var me=300,pe=5e3,ye=[". ",".. ","..."];function D(e){let t,n=0,o="",r=0,s,d;function f(){i(),s=setInterval(()=>{r=(r+1)%ye.length,e.onRenderNeeded()},me)}function i(){s&&(clearInterval(s),s=void 0)}function a(){u(),d=setTimeout(()=>{d=void 0,t&&(t=void 0,e.onRenderNeeded())},pe)}function u(){d&&(clearTimeout(d),d=void 0)}function h(c,l,x){return{state:"rate",value:(l&&l>0?l:c)/x,approximate:!(l&&l>0)}}return{onMessageStart(){u(),t={startTime:Date.now(),estimatedTokens:0,hasObservedOutput:!1,displayState:{state:"pending"}},e.onRenderNeeded()},onMessageUpdate(c,l,x){if(!t||!l||c!=="text_delta"&&c!=="thinking_delta"&&c!=="toolcall_delta")return;t.estimatedTokens+=N(l),t.hasObservedOutput=!0;let T=(Date.now()-t.startTime)/1e3;T>0&&(t.displayState=h(t.estimatedTokens,x,T)),e.onRenderNeeded()},onMessageEnd(c){if(n=0,i(),t){let l=(Date.now()-t.startTime)/1e3;c&&c>0&&l>0?(t.displayState={state:"rate",value:c/l,approximate:!1},a()):t.hasObservedOutput&&l>0?(t.displayState={state:"rate",value:t.estimatedTokens/l,approximate:!0},a()):t=void 0}e.onRenderNeeded()},onMessageAbort(){if(t)if(t.hasObservedOutput){let c=(Date.now()-t.startTime)/1e3;c>0&&(t.displayState={state:"rate",value:t.estimatedTokens/c,approximate:!0})}else t=void 0;e.onRenderNeeded()},onToolStart(c){n++,o=W(c)+"...",r=0,f(),e.onRenderNeeded()},onToolEnd(){n=Math.max(0,n-1),n===0&&i(),e.onRenderNeeded()},getState(){return n>0?{state:"activity",label:o}:(t==null?void 0:t.displayState)??{state:"hidden"}},shutdown(){t=void 0,n=0,o="",r=0,i(),u()}}}var Ce=["bash","edit","write"],b=class{#t;#r;#i;#e;#n;#o;#a;#f;#l;#g;#h;#s;#d={input:0,output:0,cacheRead:0,cacheWrite:0};#c=0;#u=0;constructor(t){this.#l=t.globalConfigPath,this.#g=t.getProjectConfigPath,this.#h=t.getThinkingLevel,this.#s=t.onRenderNeeded,this.#t=m,this.#r={config:this.#t,loadedPaths:[],warnings:[]},this.#i=void 0,this.#e=void 0,this.#o=!0,this.#a="",this.#f="",this.#n=D({onRenderNeeded:()=>this.#s()})}async start(t){this.#d={input:0,output:0,cacheRead:0,cacheWrite:0},this.#c=0,this.#u=0,this.#a=t.cwd,this.#f=O.basename(t.cwd),this.#r=k(this.#l,this.#g(t.cwd)),this.#t=this.#r.config,this.#i=C(this.#h()),this.#o=this.#t.enabled,this.#o&&(this.#m(t.cwd),await this.#e.refresh())}shutdown(){var t;(t=this.#e)==null||t.clear(),this.#e=void 0,this.#p()}#m(t){this.#e=M({cwd:t,debounceMs:this.#t.gitRefreshDebounceMs,enabled:this.#t.showGit,onChange:()=>this.#s()})}onThinkingLevel(t){this.#i=C(t),this.#s()}onModelSelect(){this.#s()}onMessageStart(t){t==="assistant"&&this.#n.onMessageStart()}onToolExecutionStart(t){this.#n.onToolStart(t)}onToolExecutionEnd(t){var n;this.#n.onToolEnd(),Ce.includes(t)&&((n=this.#e)==null||n.schedule())}onMessageUpdate(t,n,o){this.#n.onMessageUpdate(t,n,o)}onMessageEnd(t,n){t==="assistant"&&this.#n.onMessageEnd(n)}onMessageAbort(){this.#n.onMessageAbort()}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.#p(),this.#r=k(this.#l,this.#g(t.cwd)),this.#t=this.#r.config,this.#o=this.#t.enabled,(n=this.#e)==null||n.clear(),this.#e=void 0,this.#o&&(this.#m(this.#a),await this.#e.refresh()),this.#s()}async toggle(){var t;return this.#p(),this.#o=!this.#o,this.#o?(this.#i=C(this.#h()),this.#m(this.#a),await this.#e.refresh()):((t=this.#e)==null||t.clear(),this.#e=void 0),this.#s(),this.#o}getFooterInput(t){var o,r,s,d,f,i;let n=t.sessionManager.getEntries();return n.length!==this.#u&&(this.#d=L(n),this.#c=A(n),this.#u=n.length),{modelId:((o=t.model)==null?void 0:o.id)??"no-model",thinkingLevel:this.#i,directory:this.#f||O.basename(t.cwd),gitBranch:(r=this.#e)==null?void 0:r.state.branch,gitDirtyCount:((s=this.#e)==null?void 0:s.state.dirtyCount)??0,contextUsed:((f=(d=t.getContextUsage)==null?void 0:d.call(t))==null?void 0:f.tokens)??0,contextMax:(i=t.model)==null?void 0:i.contextWindow,totals:this.#d,sessionCost:this.#c,toksState:this.#n.getState(),config:this.#t}}#p(){this.#d={input:0,output:0,cacheRead:0,cacheWrite:0},this.#c=0,this.#u=0,this.#n.shutdown()}get isEnabled(){return this.#o}get loadedError(){return this.#r.error}get loadedWarnings(){return this.#r.warnings}get loadedPaths(){return this.#r.loadedPaths}get config(){return this.#t}};import{truncateToWidth as p,visibleWidth as $}from"@earendil-works/pi-tui";function j(e,t,n,o){let r=e.filter(Boolean).join(n),s=t.filter(Boolean).join(n);return be(r,s,o)}function be(e,t,n){if(!t)return p(e,n);if(!e)return p(t,n);let o=n-$(e)-$(t);if(o>=1)return p(e+" ".repeat(o)+t,n);let r=Math.max(1,Math.floor((n-1)/2));return p(e,r)+" "+p(t,n-r-1)}function U(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 G(e,t){let n=e.input+e.output,o=`\u2191${g(e.input)} \u2193${g(e.output)} \u03A3${g(n)}`,r=[t.showCacheRead?`\u21AF${g(e.cacheRead)}`:void 0,t.showCacheWrites?`\u21A5${g(e.cacheWrite)}`:void 0].filter(Boolean),s=r.length?`${o} ${r.join(" ")}`:o;return t.cf(t.color,s)}function H(e,t,n){let o=e.input+e.output,r=`\u2191${g(e.input)} \u2193${g(e.output)} \u03A3${g(o)}`;return t(n,r)}function B(e,t,n){let o=e.input+e.output;return t(n,`\u03A3${g(o)}`)}function z(e,t,n){let o=(d,f)=>t.fg(d,f),r=xe(e,o),s=o(e.config.colors.separator,e.config.separator);return[Ee(r,s,e.config.layouts,n)]}function xe(e,t){let n=e.config,o=n.showTokens?{tokensFull:()=>G(e.totals,{showCacheRead:n.showCacheRead,showCacheWrites:n.showCacheWrites,cf:t,color:n.colors.tokens}),tokensNoCache:()=>H(e.totals,t,n.colors.tokens),tokensTotal:()=>B(e.totals,t,n.colors.tokens)}:{};return{model:Te(e,t),directory:n.showDirectory?we(e,t):void 0,git:n.showGit?ke(e,t):void 0,context:n.showContext?Fe(e,t):void 0,...o,toks:ve(e,t),cost:Se(e,t)}}function Te(e,t){let n=U(e.modelId,e.config.modelAliases),o=e.config.showEffort&&e.thinkingLevel?` \u2022 ${e.thinkingLevel}`:"";return t(e.config.colors.model,`${n}${o}`)}function we(e,t){if(e.directory)return t(e.config.colors.directory,e.directory)}function ke(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 Fe(e,t){let n=`ctx ${g(e.contextUsed)}/${e.contextMax?g(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 ve(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 Se(e,t){if(e.config.showCost&&!(e.sessionCost==null||e.sessionCost<=0))return t(e.config.colors.cost,`$${e.sessionCost.toFixed(2)}`)}function Ee(e,t,n,o){let r=Re(n,o),s=K(r.left,e),d=K(r.right,e);return j(s,d,t,o)}function Re(e,t){return e.find(n=>t>=n.minWidth)??e[e.length-1]}function K(e,t){return e.map(n=>{let o=t[n];return typeof o=="function"?o():o}).filter(n=>!!n)}function J(e){return e!==null&&typeof e=="object"&&"usage"in e&&e.usage!==null&&typeof e.usage=="object"}function F(e){if(e===null||typeof e!="object")return;let t=e,n=J(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"&&J(o)){let r=o.usage.output;if(typeof r=="number"&&Number.isFinite(r)&&r>=0)return r}}function ht(e){let t=X.join(_e.homedir(),".pi","agent","clean-footer.json"),n=i=>X.join(i,".pi","clean-footer.json"),o=()=>{},r=new b({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 u=i.trim();if(u==="refresh"){await r.refresh(),a.hasUI&&a.ui.notify("Footer refreshed","info");return}if(u==="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(u==="config"){f(a);return}let h=await r.toggle();a.hasUI&&(h?(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,u=a.role==="assistant"?F(a):void 0;r.onMessageEnd(a.role,u)}),e.on("message_update",i=>{let a=i.assistantMessageEvent;if(i.message.role==="assistant"){let u="delta"in a?a.delta:void 0,h=F(i.message);r.onMessageUpdate(a.type,u,h)}}),e.on("tool_execution_start",i=>{r.onToolExecutionStart(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,u)=>(o=()=>a.requestRender(),{invalidate(){},render(h){try{let c=r.getFooterInput(i);return z(c,u,h)}catch(c){return console.error("[clean-footer] render failed:",c instanceof Error?c.message:c),[]}}}))}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 f(i){if(!i.hasUI)return;let a=r.loadedPaths.length?r.loadedPaths.join(`
3
+ `):"none",u=r.loadedWarnings.length?r.loadedWarnings.join(`
4
4
  `):"none",h=n(i.cwd);i.ui.notify(["Clean footer config",`global: ${t}`,`project: ${h}`,`loaded:
5
5
  ${a}`,r.loadedError?`error: ${r.loadedError}`:"error: none",`warnings:
6
- ${l}`,`preset: ${r.config.preset}`,`resolved: ${JSON.stringify(r.config)}`].join(`
7
- `),"info")}}export{ut as default};
6
+ ${u}`,`preset: ${r.config.preset}`,`resolved: ${JSON.stringify(r.config)}`].join(`
7
+ `),"info")}}export{ht as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neilurk12/pi-clean-footer",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "Clean, minimal, and lightweight powerline-style footer extension for pi coding agent.",
5
5
  "type": "module",
6
6
  "keywords": [