@heyhuynhgiabuu/pi-pretty 0.6.24 → 0.6.26
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/CHANGELOG.md +30 -0
- package/README.md +64 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +263 -1
- package/dist/index.js.map +1 -1
- package/dist/session-color.d.ts +30 -0
- package/dist/session-color.d.ts.map +1 -0
- package/dist/session-color.js +170 -0
- package/dist/session-color.js.map +1 -0
- package/dist/tools/bash.js +1 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/find.js +4 -4
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.js +1 -1
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/ls.js +2 -2
- package/dist/tools/ls.js.map +1 -1
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/working-indicator.d.ts +241 -0
- package/dist/working-indicator.d.ts.map +1 -0
- package/dist/working-indicator.js +679 -0
- package/dist/working-indicator.js.map +1 -0
- package/package.json +7 -6
- package/src/config.ts +48 -0
- package/src/index.ts +284 -2
- package/src/session-color.ts +172 -0
- package/src/tools/bash.ts +1 -1
- package/src/tools/find.ts +4 -4
- package/src/tools/grep.ts +1 -1
- package/src/tools/ls.ts +2 -2
- package/src/tools/read.ts +2 -2
- package/src/types.ts +4 -0
- package/src/working-indicator.ts +884 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-indicator.js","sourceRoot":"","sources":["../src/working-indicator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAA6D,MAAM,aAAa,CAAC;AACnH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,gFAAgF;AAChF,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,SAAS,GAAG,IAAI,CAAC;AACvB,MAAM,QAAQ,GAAG,IAAI,CAAC;AAEtB,qEAAqE;AACrE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AAEzD,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1E,iFAAiF;AACjF,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,MAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,MAAM,SAAS,GAAG,SAAS,CAAC;AAC5B,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,sEAAsE;AACtE,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AA2BtD,MAAM,CAAC,MAAM,0BAA0B,GAA6B;IACnE,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;IACrD,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,aAAa,EAAE,IAAI;IACnB,eAAe,EAAE,KAAK;CACtB,CAAC;AAEF,MAAM,KAAK,GAAoC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE7E,SAAS,MAAM,CAAC,KAAc;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,KAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,OAAO,CAAC,KAAyB;IACzC,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,mGAAmG;AACnG,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,uHAAuH;AACvH,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEjD;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAc;IACnC,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,oBAAoB;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,IAAI,CAAC;AACb,CAAC;AAED,4EAA4E;AAC5E,SAAS,aAAa,CAAC,KAAc;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAC9C,MAA0C,EAC1C,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,QAAQ,GAA6B;QAC1C,GAAG,0BAA0B;QAC7B,OAAO,EAAE,EAAE,GAAG,0BAA0B,CAAC,OAAO,EAAE;KAClD,CAAC;IACF,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACzD,IAAI,UAAU,KAAK,SAAS;QAAE,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC;SACvD,IAAI,OAAO,MAAM,EAAE,OAAO,KAAK,SAAS;QAAE,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAEjF,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1G,QAAQ,CAAC,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEhF,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,6BAA6B,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzG,QAAQ,CAAC,KAAK,GAAG,QAAQ,IAAI,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC;IAE3E,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACtF,CAAC;IACD,IAAI,OAAO,MAAM,EAAE,IAAI,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACnE,IAAI,OAAO,MAAM,EAAE,IAAI,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACnE,IAAI,OAAO,MAAM,EAAE,aAAa,KAAK,SAAS;QAAE,QAAQ,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC9F,QAAQ,CAAC,eAAe,GAAG,OAAO,MAAM,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC;IAC/F,OAAO,QAAQ,CAAC;AACjB,CAAC;AAgBD,SAAS,WAAW,CAAC,KAAa,EAAE,KAAkC,EAAE,QAAgB;IACvF,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,IAAI,CAAC;QACJ,6EAA6E;QAC7E,0EAA0E;QAC1E,sBAAsB;QACtB,MAAM,SAAS,GAAG,KAAK,EAAE,SAAmD,CAAC;QAC7E,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACR,mEAAmE;IACpE,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgC,EAAE,KAAuB;IAC3F,OAAO;QACN,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC;QAC5C,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC9C,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;KAC/C,CAAC;AACH,CAAC;AAMD,SAAS,OAAO,CAAC,SAAiB;IACjC,IAAI,SAAS,IAAI,SAAS;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,SAAS,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,KAAK,CAAC;AACd,CAAC;AAED,kEAAkE;AAClE,SAAS,gBAAgB,CAAC,KAAa,EAAE,GAAW;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC;IACrD,IAAI,IAAI,IAAI,uBAAuB;QAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,KAAa,EAAE,IAAY,EAAE,UAAmB;IACtE,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,cAAc;QAAE,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3C,IAAI,MAAM,IAAI,cAAc;QAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,cAAc,CAAC;IACrD,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,SAAS,eAAe,CAAC,IAAY;IACpC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACV,CAAC;QACF,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,IAAI,CAAC,CAAC;IACR,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAiBD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CACjC,KAAe,EACf,OAA4B;IAE5B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/D,MAAM,GAAG,GAAkD;QAC1D,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;QAChD,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;QAChD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;KAC1C,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAU,EAAE;QACpD,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClG,OAAO,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAA+B,EAAE,KAAa,EAAU,EAAE;QAC3F,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,GAAgB,IAAI,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAQ,EAAE;YACxC,IAAI,OAAO,KAAK,IAAI,IAAI,QAAQ,IAAI,QAAQ;gBAAE,OAAO;YACrD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;QACzF,CAAC,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC1B,KAAK,CAAC,CAAC,CAAC,CAAC;gBACT,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAC3B,QAAQ,GAAG,CAAC,CAAC;YACd,CAAC;QACF,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACrE,CAAC,CAAC;IAEF,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,KAAK,KAAK,CAAC;YAAE,SAAS;QAE1B,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/B,qEAAqE;YACrE,MAAM,CAAC,IAAI,CACV,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC,GAAG,UAAU,CAC5C,IAAI,EACJ,MAAM,EACN,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,KAAa,CAAC,CAClD,GAAG,MAAM,EAAE,CACZ,CAAC;YACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;YACxB,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CACV,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC,GAAG,UAAU,CAC5C,IAAI,EACJ,MAAM,EACN,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,MAAc,CAAC,CACnD,GAAG,MAAM,EAAE,CACZ,CAAC;gBACF,SAAS;YACV,CAAC;YACD,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC;YAC7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;gBACjC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC;gBACrD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;gBACnG,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;YAC5F,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,GAAG,KAAK,GAAG,eAAe,GAAG,CAAC,CAAC;YAC3C,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzF,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;YAC5F,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC7C,MAAM,KAAK,GAAI,OAAwD,EAAE,KAAK,CAAC;IAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,OAAO,GAAI,OAAkG;QAClH,EAAE,OAAO,CAAC;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;aACpF,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAAE,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC3G,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC;AASD;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACzB,OAAO,GAAa,EAAE,CAAC;IACvB,MAAM,GAAG,CAAC,CAAC;IACX,WAAW,GAAG,mBAAmB,CAAC;IAClC,SAAS,CAA6C;IACtD,IAAI,CAA4B;IAChC,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,CAAqB;IAE3B,SAAS,CAAC,MAAgB,EAAE,UAAkB;QAC7C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,GAAkB;QACxB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACjB,CAAC;IAED;;4BAEwB;IACxB,aAAa;QACZ,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;IAC5B,CAAC;IAED;qEACiE;IACjE,QAAQ,CAAC,IAAwB;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,SAAS,CAAC;IACjC,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,qEAAqE;QACrE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO;QACrC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnE,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC;IAED,IAAI;QACH,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC5B,CAAC;IACF,CAAC;IAED,kEAAkE;IAClE,MAAM,CAAC,KAAa;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO,CAAC,eAAe,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,UAAU;QACT,gDAAgD;IACjD,CAAC;IAED,OAAO;QACN,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,CAAC;CACD;AAQD,MAAM,CAAC,MAAM,2BAA2B,GAA8B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAExF;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAC/C,MAA2C,EAC3C,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,QAAQ,GAA8B,EAAE,GAAG,2BAA2B,EAAE,CAAC;IAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC1D,IAAI,UAAU,KAAK,SAAS;QAAE,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC;SACvD,IAAI,OAAO,MAAM,EAAE,OAAO,KAAK,SAAS;QAAE,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACjF,OAAO,QAAQ,CAAC;AACjB,CAAC;AAsBD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AAMtE;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CAAC,cAAuB;IAClE,MAAM,KAAK,GAAI,cAAmF,EAAE,SAAS,CAAC;IAC9G,MAAM,QAAQ,GAAG,KAAK,EAAE,sBAAsB,CAAC;IAC/C,IAAI,OAAO,cAAc,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI,OAAO,QAAQ,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACvG,MAAM,QAAQ,GAAI,QAAuD,CAAC,aAAa,CAAC,CAAC;IACzF,wEAAwE;IACxE,6EAA6E;IAC7E,IAAI,QAAQ,EAAE,CAAC;QACd,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAA0D,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAC9F,MAAM,OAAO,GAAG,UAAyB,KAAyB;QACjE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,QAA+D,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClF,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,SAAkB,EAAE,QAA4B,EAAsB,EAAE;QACzF,IAAI,CAAC;YACJ,MAAM,EAAE,GAAI,SAAsC,EAAE,WAAW,EAAE,SAAS,CAAC;YAC3E,IAAI,OAAO,EAAE,KAAK,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC5C,IAAI,EAAE,KAAK,KAAK,CAAC,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC3C,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,sBAAsB,CAAC,EAAE,CAAC,EAAE,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,QAAQ,CAAC;QACjB,CAAC;IACF,CAAC,CAAC;IACF,MAAM,UAAU,GAAyB;QACxC,SAAS,CAAC,SAAiB;YAC1B,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;QACD,QAAQ,CAAC,SAAiB,EAAE,UAAkB;YAC7C,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW;YACV,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;QACD,SAAS;YACR,IAAI,KAAK,CAAC,sBAAsB,KAAK,OAAO,EAAE,CAAC;gBAC9C,KAAK,CAAC,sBAAsB,GAAG,QAA0E,CAAC;YAC3G,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;KACD,CAAC;IACD,OAAsD,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC;IACpF,KAAK,CAAC,sBAAsB,GAAG,OAAsF,CAAC;IACtH,OAAO,UAAU,CAAC;AACnB,CAAC;AAuBD,MAAM,cAAc,GAAG,aAAa,CAAC;AAErC,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC5C,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IAC5G,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,GAAG,YAAY,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IACrF,OAAO,GAAG,OAAO,GAAG,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAClC,QAA+B,EAC/B,MAAoB,IAAI,CAAC,GAAG,EAC5B,cAAc,GAAG,CAAC;IAElB,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,cAAc,CAAC;IACzC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,GAAW,EAAE,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAW,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,OAAO;QACN,IAAI;YACH,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,QAAQ;YACP,IAAI,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAC/B,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,eAAe,sBAAsB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO;YACN,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IACnD,MAAM,OAAO,GAAI,OAA8D,EAAE,OAAO,CAAC;IACzF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,UAAU,CAAC;AACzD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CAC1C,EAAkB,EAClB,YAAsC,EACtC,WAAoB,EACpB,QAAoC;IAEpC,MAAM,IAAI,GAA0B;QACnC,IAAI,KAAI,CAAC;QACT,IAAI,KAAI,CAAC;QACT,OAAO,KAAI,CAAC;QACZ,MAAM,EAAE,EAAE;KACV,CAAC;IACF,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,OAAO,EAAE,CAAC,sBAAsB,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAEjE,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACxE,IAAI,IAAI,GAAoB;QAC3B,GAAG,YAAY;QACf,GAAG,EAAE,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC;KAChE,CAAC;IACF,IAAI,YAAY,CAAC,aAAa,IAAI,WAAW,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;QAChF,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;QAC1D,IAAI,MAAM;YAAE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAY,EAAE,CACpD,kBAAkB,CAAC,CAAC,KAAK,CAAC,EAAE;QAC3B,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,IAAI;QACJ,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,IAAI;KACZ,CAAC,CAAC,MAAM,CAAC;IAEX,IAAI,YAAY,GAAG,cAAc,CAAC;IAClC,IAAI,MAAM,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,YAAgC,CAAC;IACrC,OAAO;QACN,IAAI,MAAM;YACT,OAAO,MAAM,CAAC;QACf,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,cAAc;YAC1B,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;gBAC5B,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACjC,YAAY,GAAG,KAAK,CAAC;YACtB,CAAC;YACD,mEAAmE;YACnE,IAAI,YAAY,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACjE,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACzD,KAAK,EAAE,CAAC;YACR,YAAY,GAAG,YAAY,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,KAAa;YACjB,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,OAAO;YACN,yDAAyD;YACzD,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;KACD,CAAC;AACH,CAAC;AAwCD,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAEvC,KAAK,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAA4C,CAAC;QAChG,OAAO,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC7C,OAAO,IAAI;SACT,IAAI,CAAC,GAAG,CAAC;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACZ,GAAG;SACD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACzE,IAAI,CAAC,GAAG,CAAC,CACX;SACA,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,KAAK,UAAU,WAAW,CACzB,EAAiB,EACjB,IAAoG;IAEpG,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,EAAE,cAAc,IAAI,mBAAmB,CAAC;QAC3D,MAAM,WAAW,GAAG,MAAM,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,EAAE,MAAM;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACtD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,EAAiB,EACjB,QAAkC,EAClC,IAAoG,EACpG,WAAoB;IAEpB,MAAM,cAAc,GAA+B;QAClD,KAAK,KAAI,CAAC;QACV,IAAI,KAAI,CAAC;QACT,OAAO,KAAI,CAAC;QACZ,QAAQ,KAAI,CAAC;QACb,aAAa,KAAI,CAAC;QAClB,MAAM,EAAE,EAAE;KACV,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,cAAc,CAAC;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAE9C,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACpE,IAAI,IAAI,GAAG,YAAY,CAAC;IACxB,IAAI,YAAgC,CAAC;IACrC,IAAI,QAAQ,CAAC,aAAa,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACxE,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,MAAM,EAAE,CAAC;YACZ,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC9C,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,KAAK,EAAE;QACxD,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI;QACJ,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,YAAY;QACZ,IAAI;KACJ,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAE/C,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IACnC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,2EAA2E;IAC3E,sEAAsE;IACtE,EAAE,CAAC,SAAS,CACX,UAAU,EACV,CAAC,GAAG,EAAE,EAAE;QACP,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,MAAM,CAAC;IACf,CAAC,EACD,EAAE,SAAS,EAAE,aAAa,EAAE,CAC5B,CAAC;IACF,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO;QACN,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;QAC3B,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;QACzB,OAAO,EAAE,GAAG,EAAE;YACb,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,QAAQ,EAAE,CAAC,IAAwB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7D,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;QAC3C,MAAM;KACN,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heyhuynhgiabuu/pi-pretty",
|
|
3
|
-
"version": "0.6.
|
|
4
|
-
"description": "Pretty terminal output for pi
|
|
3
|
+
"version": "0.6.26",
|
|
4
|
+
"description": "Pretty terminal output for pi — syntax-highlighted file reads, colored bash output, tree-view directory listings, and more.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi",
|
|
7
7
|
"pi-extension",
|
|
@@ -42,9 +42,10 @@
|
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@biomejs/biome": "^2.3.5",
|
|
45
|
-
"@earendil-works/pi-ai": "^0.
|
|
46
|
-
"@earendil-works/pi-coding-agent": "^0.
|
|
47
|
-
"@earendil-works/pi-
|
|
45
|
+
"@earendil-works/pi-ai": "^0.85.0",
|
|
46
|
+
"@earendil-works/pi-coding-agent": "^0.85.0",
|
|
47
|
+
"@earendil-works/pi-server": "^0.85.0",
|
|
48
|
+
"@earendil-works/pi-tui": "^0.85.0",
|
|
48
49
|
"@types/node": "^20.0.0",
|
|
49
50
|
"typescript": "^5.0.0",
|
|
50
51
|
"vitest": "^4.0.18"
|
|
@@ -56,7 +57,7 @@
|
|
|
56
57
|
},
|
|
57
58
|
"pi": {
|
|
58
59
|
"extensions": [
|
|
59
|
-
"./
|
|
60
|
+
"./src/index.ts"
|
|
60
61
|
]
|
|
61
62
|
},
|
|
62
63
|
"type": "module"
|
package/src/config.ts
CHANGED
|
@@ -67,6 +67,25 @@ function hexToAnsiBg(hex: string): string | null {
|
|
|
67
67
|
return `\x1b[48;2;${r};${g};${b}m`;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
export interface WorkingIndicatorConfig {
|
|
71
|
+
enabled?: boolean;
|
|
72
|
+
/** One phrase or a list of phrases rotated across sweeps. */
|
|
73
|
+
text?: string | string[];
|
|
74
|
+
mode?: "shimmer" | "kitt" | "static";
|
|
75
|
+
/** Tier colors: a pi theme color name or a `#rrggbb` hex. */
|
|
76
|
+
low?: string;
|
|
77
|
+
mid?: string;
|
|
78
|
+
high?: string;
|
|
79
|
+
bold?: boolean;
|
|
80
|
+
hint?: boolean;
|
|
81
|
+
/** Tint the indicator with a stable per-session accent color. */
|
|
82
|
+
sessionAccent?: boolean;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface ThinkingIndicatorConfig {
|
|
86
|
+
enabled?: boolean;
|
|
87
|
+
}
|
|
88
|
+
|
|
70
89
|
export interface PrettyConfig {
|
|
71
90
|
background?: {
|
|
72
91
|
tool?: string;
|
|
@@ -79,6 +98,8 @@ export interface PrettyConfig {
|
|
|
79
98
|
maxHlChars?: number;
|
|
80
99
|
maxPreviewLines?: number;
|
|
81
100
|
cacheLimit?: number;
|
|
101
|
+
workingIndicator?: WorkingIndicatorConfig;
|
|
102
|
+
thinkingIndicator?: ThinkingIndicatorConfig;
|
|
82
103
|
}
|
|
83
104
|
|
|
84
105
|
/** Normalize a comma-separated env value or JSON array into tool names. */
|
|
@@ -127,6 +148,33 @@ export function loadConfig(agentDir = getConfigDir()): PrettyConfig {
|
|
|
127
148
|
if (maxHlChars) config.maxHlChars = maxHlChars;
|
|
128
149
|
if (maxPreviewLines) config.maxPreviewLines = maxPreviewLines;
|
|
129
150
|
if (cacheLimit) config.cacheLimit = cacheLimit;
|
|
151
|
+
const workingIndicator = parsed.workingIndicator;
|
|
152
|
+
if (workingIndicator && typeof workingIndicator === "object") {
|
|
153
|
+
const wi: WorkingIndicatorConfig = {};
|
|
154
|
+
const src = workingIndicator as Record<string, unknown>;
|
|
155
|
+
if (typeof src.enabled === "boolean") wi.enabled = src.enabled;
|
|
156
|
+
if (typeof src.text === "string" && src.text.trim() !== "") wi.text = src.text;
|
|
157
|
+
else if (Array.isArray(src.text)) {
|
|
158
|
+
const list = src.text.filter((item) => typeof item === "string" && item.trim() !== "");
|
|
159
|
+
if (list.length > 0) wi.text = list;
|
|
160
|
+
}
|
|
161
|
+
if (src.mode === "shimmer" || src.mode === "kitt" || src.mode === "static") wi.mode = src.mode;
|
|
162
|
+
for (const tier of ["low", "mid", "high"] as const) {
|
|
163
|
+
const value = src[tier];
|
|
164
|
+
if (typeof value === "string" && value.trim() !== "") wi[tier] = value;
|
|
165
|
+
}
|
|
166
|
+
if (typeof src.bold === "boolean") wi.bold = src.bold;
|
|
167
|
+
if (typeof src.hint === "boolean") wi.hint = src.hint;
|
|
168
|
+
if (typeof src.sessionAccent === "boolean") wi.sessionAccent = src.sessionAccent;
|
|
169
|
+
if (Object.keys(wi).length > 0) config.workingIndicator = wi;
|
|
170
|
+
}
|
|
171
|
+
const thinkingIndicator = parsed.thinkingIndicator;
|
|
172
|
+
if (thinkingIndicator && typeof thinkingIndicator === "object") {
|
|
173
|
+
const ti: ThinkingIndicatorConfig = {};
|
|
174
|
+
const src = thinkingIndicator as Record<string, unknown>;
|
|
175
|
+
if (typeof src.enabled === "boolean") ti.enabled = src.enabled;
|
|
176
|
+
if (Object.keys(ti).length > 0) config.thinkingIndicator = ti;
|
|
177
|
+
}
|
|
130
178
|
return config;
|
|
131
179
|
} catch {
|
|
132
180
|
return {};
|
package/src/index.ts
CHANGED
|
@@ -9,7 +9,16 @@
|
|
|
9
9
|
* • Custom ANSI rendering for all tools
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import type {
|
|
15
|
+
ExtensionAPI,
|
|
16
|
+
ExtensionCommandContext,
|
|
17
|
+
ExtensionContext,
|
|
18
|
+
MessageEndEvent,
|
|
19
|
+
MessageUpdateEvent,
|
|
20
|
+
SessionInfoChangedEvent,
|
|
21
|
+
} from "@earendil-works/pi-coding-agent";
|
|
13
22
|
import * as hostSdk from "@earendil-works/pi-coding-agent";
|
|
14
23
|
import { createFffAutocompleteProvider } from "./autocomplete.js";
|
|
15
24
|
import { applyConfig, getDefaultAgentDir, loadConfig, normalizeToolList, resolveToolSets } from "./config.js";
|
|
@@ -20,6 +29,20 @@ import { registerGrepTool } from "./tools/grep.js";
|
|
|
20
29
|
import { registerLsTool } from "./tools/ls.js";
|
|
21
30
|
import { registerReadTool } from "./tools/read.js";
|
|
22
31
|
import type { PiPrettyDeps, SdkTools } from "./types.js";
|
|
32
|
+
import {
|
|
33
|
+
createThinkingLabelAnimator,
|
|
34
|
+
createThinkingTimer,
|
|
35
|
+
installPerRowThinkingLabels,
|
|
36
|
+
installWorkingIndicator,
|
|
37
|
+
type PerRowThinkingLabels,
|
|
38
|
+
resolveThinkingIndicatorSettings,
|
|
39
|
+
resolveWorkingIndicatorSettings,
|
|
40
|
+
type ThinkingTimer,
|
|
41
|
+
thinkingBlockActive,
|
|
42
|
+
WORKING_INTERVAL_MS,
|
|
43
|
+
type WorkingIndicatorController,
|
|
44
|
+
workingTokens,
|
|
45
|
+
} from "./working-indicator.js";
|
|
23
46
|
|
|
24
47
|
// ---------------------------------------------------------------------------
|
|
25
48
|
// Config
|
|
@@ -139,8 +162,101 @@ export default async function piPrettyExtension(pi: ExtensionAPI, deps?: PiPrett
|
|
|
139
162
|
// Session lifecycle
|
|
140
163
|
// ------------------------------------------------------------------
|
|
141
164
|
|
|
165
|
+
const workingSettings = resolveWorkingIndicatorSettings(config.workingIndicator);
|
|
166
|
+
const thinkingSettings = resolveThinkingIndicatorSettings(config.thinkingIndicator);
|
|
167
|
+
let workingController: WorkingIndicatorController | undefined;
|
|
168
|
+
let thinkingTimer: ThinkingTimer | undefined;
|
|
169
|
+
let thinkingInterval: ReturnType<typeof setInterval> | undefined;
|
|
170
|
+
let thinkingLastMessage: unknown;
|
|
171
|
+
let thinkingHiddenCheckedAt = 0;
|
|
172
|
+
let workingSessionName: string | undefined;
|
|
173
|
+
let workingStreaming = false;
|
|
174
|
+
let workingStatsUpdatedAt = 0;
|
|
175
|
+
let perRowLabels: PerRowThinkingLabels | undefined;
|
|
176
|
+
/** Accumulated thinking time per message timestamp — later runs in the same
|
|
177
|
+
* message resume from this total instead of rewinding to zero. */
|
|
178
|
+
const thinkingElapsedMs = new Map<number, number>();
|
|
179
|
+
const TOKEN_COUNT_FORMAT = new Intl.NumberFormat("en-US");
|
|
180
|
+
|
|
181
|
+
/** Message timestamps are the per-row identity the label patch keys on. */
|
|
182
|
+
const messageTimestamp = (message: unknown): number | undefined => {
|
|
183
|
+
const ts = (message as { timestamp?: unknown } | undefined)?.timestamp;
|
|
184
|
+
return typeof ts === "number" ? ts : undefined;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/** pi persists the thinking-visibility toggle as a top-level settings key. */
|
|
188
|
+
const thinkingHidden = (): boolean => {
|
|
189
|
+
try {
|
|
190
|
+
const dir = getDefaultAgentDir();
|
|
191
|
+
if (!dir) return false;
|
|
192
|
+
const parsed = JSON.parse(readFileSync(join(dir, "settings.json"), "utf8")) as {
|
|
193
|
+
hideThinkingBlock?: unknown;
|
|
194
|
+
};
|
|
195
|
+
return parsed.hideThinkingBlock === true;
|
|
196
|
+
} catch {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* True when the 500ms-cached hidden check is stale and settings now show
|
|
203
|
+
* thinking revealed — the single re-check shared by the ticker and the
|
|
204
|
+
* completed-phase message_update path (timestamp guard runs before the read).
|
|
205
|
+
*/
|
|
206
|
+
const thinkingRevealed = (): boolean => {
|
|
207
|
+
if (Date.now() - thinkingHiddenCheckedAt <= 500) return false;
|
|
208
|
+
thinkingHiddenCheckedAt = Date.now();
|
|
209
|
+
return !thinkingHidden();
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
const safeSessionName = (ctx: ExtensionContext): string | undefined => {
|
|
213
|
+
try {
|
|
214
|
+
return ctx.sessionManager?.getSessionName?.() ?? undefined;
|
|
215
|
+
} catch {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
// (Re-)install the widget: new session, reload, or session rename (the
|
|
221
|
+
// accent tint tracks the name, omp-style). Preserves streaming state so a
|
|
222
|
+
// mid-stream rename does not drop the row.
|
|
223
|
+
const installIndicator = async (ctx: ExtensionContext): Promise<void> => {
|
|
224
|
+
workingController?.dispose();
|
|
225
|
+
workingController = undefined;
|
|
226
|
+
try {
|
|
227
|
+
const controller = await installWorkingIndicator(ctx.ui, workingSettings, undefined, workingSessionName);
|
|
228
|
+
workingController = controller;
|
|
229
|
+
if (workingStreaming) controller.start();
|
|
230
|
+
// Noop install (disabled/blank) after a previous install → restore pi's loader.
|
|
231
|
+
if (controller.frames.length === 0) ctx.ui.setWorkingVisible?.(true);
|
|
232
|
+
} catch (error: unknown) {
|
|
233
|
+
try {
|
|
234
|
+
ctx.ui.setWorkingVisible?.(true);
|
|
235
|
+
} catch {
|
|
236
|
+
// Host without the API — nothing to restore.
|
|
237
|
+
}
|
|
238
|
+
ctx.ui?.notify?.(
|
|
239
|
+
`pi-pretty working indicator failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
240
|
+
"warning",
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
|
|
142
245
|
pi.on("session_start", async (_event: unknown, ctx: ExtensionContext) => {
|
|
143
|
-
if (ctx.mode === "tui")
|
|
246
|
+
if (ctx.mode === "tui") {
|
|
247
|
+
ctx.ui.setToolsExpanded(false);
|
|
248
|
+
// Per-row hidden-thinking labels: intercept the host's label fan-out so
|
|
249
|
+
// each row keeps its own duration. Falls back to the global-label
|
|
250
|
+
// behavior whenever the host class is missing or reshaped.
|
|
251
|
+
perRowLabels = thinkingSettings.enabled
|
|
252
|
+
? installPerRowThinkingLabels(
|
|
253
|
+
deps?.assistantMessageComponent ??
|
|
254
|
+
(hostSdk as { AssistantMessageComponent?: unknown }).AssistantMessageComponent,
|
|
255
|
+
)
|
|
256
|
+
: undefined;
|
|
257
|
+
workingSessionName = safeSessionName(ctx);
|
|
258
|
+
await installIndicator(ctx);
|
|
259
|
+
}
|
|
144
260
|
|
|
145
261
|
if (!fffService) return;
|
|
146
262
|
|
|
@@ -169,7 +285,173 @@ export default async function piPrettyExtension(pi: ExtensionAPI, deps?: PiPrett
|
|
|
169
285
|
}
|
|
170
286
|
});
|
|
171
287
|
|
|
288
|
+
// Re-apply the indicator when the session is (re)named so the accent tint
|
|
289
|
+
// tracks the name; omp derives the accent the same way.
|
|
290
|
+
pi.on("session_info_changed", async (event: SessionInfoChangedEvent, ctx: ExtensionContext) => {
|
|
291
|
+
if (ctx.mode !== "tui") return;
|
|
292
|
+
if (event.name === workingSessionName) return;
|
|
293
|
+
workingSessionName = event.name;
|
|
294
|
+
if (workingSettings.enabled) await installIndicator(ctx);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// Drive the widget with the streaming lifecycle (host loader is hidden).
|
|
298
|
+
pi.on("agent_start", async (_event: unknown, ctx: ExtensionContext) => {
|
|
299
|
+
if (ctx.mode !== "tui") return;
|
|
300
|
+
workingStreaming = true;
|
|
301
|
+
workingStatsUpdatedAt = 0;
|
|
302
|
+
workingController?.setStats(undefined);
|
|
303
|
+
workingController?.start();
|
|
304
|
+
});
|
|
305
|
+
const stopStreaming = async (_event: unknown, ctx: ExtensionContext): Promise<void> => {
|
|
306
|
+
if (ctx.mode !== "tui") return;
|
|
307
|
+
workingStreaming = false;
|
|
308
|
+
workingController?.stop();
|
|
309
|
+
stopThinkingShimmer();
|
|
310
|
+
};
|
|
311
|
+
pi.on("agent_end", stopStreaming);
|
|
312
|
+
pi.on("agent_settled", stopStreaming);
|
|
313
|
+
|
|
314
|
+
const clearThinkingInterval = (): void => {
|
|
315
|
+
if (!thinkingInterval) return;
|
|
316
|
+
clearInterval(thinkingInterval);
|
|
317
|
+
thinkingInterval = undefined;
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
const stopThinkingShimmer = (): void => {
|
|
321
|
+
clearThinkingInterval();
|
|
322
|
+
perRowLabels?.clearActive();
|
|
323
|
+
try {
|
|
324
|
+
thinkingTimer?.restore();
|
|
325
|
+
} catch {
|
|
326
|
+
// Teardown must never throw — a host that explodes on restore is left
|
|
327
|
+
// with whatever label it has; the interval is already gone.
|
|
328
|
+
}
|
|
329
|
+
thinkingTimer = undefined;
|
|
330
|
+
thinkingLastMessage = undefined;
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
const completeThinkingShimmer = (): void => {
|
|
334
|
+
clearThinkingInterval();
|
|
335
|
+
const ts = messageTimestamp(thinkingLastMessage);
|
|
336
|
+
const frozenMs = thinkingTimer?.complete();
|
|
337
|
+
if (ts !== undefined && frozenMs !== undefined) {
|
|
338
|
+
thinkingElapsedMs.set(ts, frozenMs);
|
|
339
|
+
perRowLabels?.complete(ts, frozenMs);
|
|
340
|
+
}
|
|
341
|
+
// The completed row is no longer the animating one — drop the active mark
|
|
342
|
+
// so subsequent global writes freeze it at its own duration.
|
|
343
|
+
perRowLabels?.clearActive();
|
|
344
|
+
thinkingLastMessage = undefined;
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
/** Surface one warning without letting a throwing host escape the crash guard. */
|
|
348
|
+
const notifyThinkingFailure = (ctx: ExtensionContext, error: unknown): void => {
|
|
349
|
+
try {
|
|
350
|
+
ctx.ui?.notify?.(
|
|
351
|
+
`pi-pretty thinking indicator failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
352
|
+
"warning",
|
|
353
|
+
);
|
|
354
|
+
} catch {
|
|
355
|
+
// A host that throws on notify too must not crash the timer path.
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
// Same 30fps cadence as the working row — but the interval lives ONLY while
|
|
360
|
+
// the streaming message is actively emitting a thinking block (each label
|
|
361
|
+
// change rebuilds chat children, so the moment text or tool calls stream the
|
|
362
|
+
// label freezes as `Thought for {duration}` until the run ends).
|
|
363
|
+
const startThinkingShimmer = (ctx: ExtensionContext): void => {
|
|
364
|
+
if (thinkingInterval || !thinkingSettings.enabled) return;
|
|
365
|
+
try {
|
|
366
|
+
thinkingHiddenCheckedAt = Date.now();
|
|
367
|
+
if (!thinkingHidden()) return; // thinking visible: no label writes at all
|
|
368
|
+
const animator = createThinkingLabelAnimator(ctx.ui, workingSettings, workingSessionName, thinkingSettings);
|
|
369
|
+
const activeTs = messageTimestamp(thinkingLastMessage);
|
|
370
|
+
// Same message thinking again (interleaved runs): resume its total.
|
|
371
|
+
const resumeMs = activeTs !== undefined ? (thinkingElapsedMs.get(activeTs) ?? 0) : 0;
|
|
372
|
+
thinkingTimer = createThinkingTimer(animator, Date.now, resumeMs);
|
|
373
|
+
if (activeTs !== undefined) perRowLabels?.setActive(activeTs);
|
|
374
|
+
thinkingTimer.tick();
|
|
375
|
+
thinkingInterval = setInterval(() => {
|
|
376
|
+
try {
|
|
377
|
+
if (!workingStreaming) {
|
|
378
|
+
stopThinkingShimmer();
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (thinkingRevealed()) {
|
|
382
|
+
stopThinkingShimmer();
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
if (!thinkingBlockActive(thinkingLastMessage)) {
|
|
386
|
+
// Thinking phase over: freeze its duration until the run ends.
|
|
387
|
+
completeThinkingShimmer();
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
thinkingTimer?.tick();
|
|
391
|
+
// The label has no widget of its own — reuse the working widget's
|
|
392
|
+
// TUI handle so the frame lands even when deltas pause mid-thinking.
|
|
393
|
+
workingController?.requestRender();
|
|
394
|
+
} catch (error: unknown) {
|
|
395
|
+
// A throwing host call inside our timer would crash pi (uncaught in
|
|
396
|
+
// setInterval) — tear the label down and surface one warning instead.
|
|
397
|
+
stopThinkingShimmer();
|
|
398
|
+
notifyThinkingFailure(ctx, error);
|
|
399
|
+
}
|
|
400
|
+
}, WORKING_INTERVAL_MS);
|
|
401
|
+
} catch (error: unknown) {
|
|
402
|
+
stopThinkingShimmer();
|
|
403
|
+
notifyThinkingFailure(ctx, error);
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
// Remember the streaming message; lazily start the shimmer on the first
|
|
408
|
+
// thinking delta (thinkingHidden() is re-checked at most every 500ms). After
|
|
409
|
+
// the phase completes, deltas keep refreshing the visibility cache so a
|
|
410
|
+
// mid-run `hideThinkingBlock` toggle-off restores the default label.
|
|
411
|
+
pi.on("message_update", async (event: MessageUpdateEvent, ctx: ExtensionContext) => {
|
|
412
|
+
if (ctx.mode !== "tui" || !workingStreaming) return;
|
|
413
|
+
thinkingLastMessage = event.message;
|
|
414
|
+
// Live token suffix on the working row (throttled to one update/second).
|
|
415
|
+
const now = Date.now();
|
|
416
|
+
if (now - workingStatsUpdatedAt >= 1000) {
|
|
417
|
+
workingStatsUpdatedAt = now;
|
|
418
|
+
const tokens = workingTokens(event.message);
|
|
419
|
+
workingController?.setStats(tokens > 0 ? ` (↓ ${TOKEN_COUNT_FORMAT.format(tokens)} tokens)` : undefined);
|
|
420
|
+
}
|
|
421
|
+
if (thinkingInterval) {
|
|
422
|
+
// Complete immediately on the first text/tool delta instead of waiting
|
|
423
|
+
// for the next animation frame.
|
|
424
|
+
if (!thinkingBlockActive(event.message)) completeThinkingShimmer();
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (thinkingBlockActive(event.message)) {
|
|
428
|
+
// First thinking delta — or a later phase after tool calls — starts a
|
|
429
|
+
// fresh timer (the completed one is replaced wholesale).
|
|
430
|
+
startThinkingShimmer(ctx);
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
if (thinkingTimer && thinkingRevealed()) stopThinkingShimmer();
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// The completed wording belongs to the message that produced it. The label
|
|
437
|
+
// is global, so once that assistant message ends, restore pi's default —
|
|
438
|
+
// otherwise every later phase stamps its frozen duration onto every hidden
|
|
439
|
+
// thinking row in the transcript (the image-read "Thought for 5s" stack).
|
|
440
|
+
pi.on("message_end", async (event: MessageEndEvent, ctx: ExtensionContext) => {
|
|
441
|
+
if (ctx.mode !== "tui" || event.message.role !== "assistant") return;
|
|
442
|
+
if (thinkingInterval || thinkingTimer) stopThinkingShimmer();
|
|
443
|
+
});
|
|
444
|
+
|
|
172
445
|
pi.on("session_shutdown", async () => {
|
|
446
|
+
// Tear down the widget animation; pi re-runs session_start (and our
|
|
447
|
+
// install) after resume or session switching.
|
|
448
|
+
workingController?.dispose();
|
|
449
|
+
workingController = undefined;
|
|
450
|
+
stopThinkingShimmer();
|
|
451
|
+
perRowLabels?.uninstall();
|
|
452
|
+
perRowLabels = undefined;
|
|
453
|
+
thinkingElapsedMs.clear();
|
|
454
|
+
workingStreaming = false;
|
|
173
455
|
// Intentionally keep the native FFF finder on session shutdown.
|
|
174
456
|
// Pi can emit shutdown/start during resume or session switching while the
|
|
175
457
|
// process keeps running. Native teardown, or dropping the JS handle while the
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-session accent color — port of oh-my-pi's `utils/session-color.ts`
|
|
3
|
+
* (OKLCH essence, no native dependencies).
|
|
4
|
+
*
|
|
5
|
+
* omp derives a stable per-session accent: the session name hash picks only
|
|
6
|
+
* the *hue* (djb2, walked along a dark-theme-safe arc that excludes hues
|
|
7
|
+
* which darken badly); lightness and chroma live in OKLCH so every hue
|
|
8
|
+
* renders with equal perceived weight (the reason omp carries the theme
|
|
9
|
+
* accent through per-hue gamut cusps — constant OKLCH L/C achieves the same
|
|
10
|
+
* uniformity without theme introspection, which pi's extension API does not
|
|
11
|
+
* expose). The spinner variant dims the accent exactly like omp's
|
|
12
|
+
* `adjustHsv(hex, { s: 0.55, v: 0.65 })`.
|
|
13
|
+
*
|
|
14
|
+
* Skipped from the omp original (requires host theme internals pi does not
|
|
15
|
+
* expose to extensions): per-hue gamut cusps, WCAG contrast bisection against
|
|
16
|
+
* the surface, hue-collision avoidance against theme colors.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
// ─── omp session-color.ts constants ──────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
/** omp MIN_CHROMA / MAX_CHROMA: readable floor, "not a highlighter set" ceiling. */
|
|
22
|
+
const MIN_CHROMA = 0.05;
|
|
23
|
+
const MAX_CHROMA = 0.21;
|
|
24
|
+
|
|
25
|
+
/** omp dark-theme lightness band (visible on dark surfaces). */
|
|
26
|
+
const LIGHTNESS = 0.75;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Dark-theme hue arc. omp computes these intervals from per-hue gamut cusps;
|
|
30
|
+
* its doc comment pins the always-excluded bands — the yellow/chartreuse core
|
|
31
|
+
* (≈94–138°, darkens to mustard) and the over-light cyan peak (≈158–200°) —
|
|
32
|
+
* for every theme, so the arc below hardcodes the full wheel minus those two.
|
|
33
|
+
*/
|
|
34
|
+
const DARK_HUE_INTERVALS: ReadonlyArray<readonly [number, number]> = [
|
|
35
|
+
[0, 93],
|
|
36
|
+
[139, 157],
|
|
37
|
+
[201, 359],
|
|
38
|
+
];
|
|
39
|
+
const ARC_LENGTH = DARK_HUE_INTERVALS.reduce((n, [a, b]) => n + (b - a + 1), 0);
|
|
40
|
+
|
|
41
|
+
/** omp nameToHash: stable 32-bit djb2. */
|
|
42
|
+
function nameToHash(name: string): number {
|
|
43
|
+
let hash = 5381;
|
|
44
|
+
for (let i = 0; i < name.length; i++) {
|
|
45
|
+
hash = ((hash << 5) + hash) ^ name.charCodeAt(i);
|
|
46
|
+
hash = hash >>> 0;
|
|
47
|
+
}
|
|
48
|
+
return hash;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Map a name to its OKLCH hue on the dark-safe arc. */
|
|
52
|
+
export function sessionAccentHue(name: string): number {
|
|
53
|
+
let pos = nameToHash(name) % ARC_LENGTH;
|
|
54
|
+
for (const [a, b] of DARK_HUE_INTERVALS) {
|
|
55
|
+
const n = b - a + 1;
|
|
56
|
+
if (pos < n) return a + pos;
|
|
57
|
+
pos -= n;
|
|
58
|
+
}
|
|
59
|
+
return DARK_HUE_INTERVALS[DARK_HUE_INTERVALS.length - 1]?.[1] ?? 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ─── OKLCH ↔ sRGB (Björn Ottosson's published matrices) ─────────────────────
|
|
63
|
+
|
|
64
|
+
function oklchToSrgb(l: number, c: number, hDeg: number): [number, number, number] {
|
|
65
|
+
const h = (hDeg * Math.PI) / 180;
|
|
66
|
+
const a = c * Math.cos(h);
|
|
67
|
+
const b = c * Math.sin(h);
|
|
68
|
+
const l_ = l + 0.3963377774 * a + 0.2158037573 * b;
|
|
69
|
+
const m_ = l - 0.1055613458 * a - 0.0638541728 * b;
|
|
70
|
+
const s_ = l - 0.0894841775 * a - 1.291485548 * b;
|
|
71
|
+
const ll = l_ * l_ * l_;
|
|
72
|
+
const mm = m_ * m_ * m_;
|
|
73
|
+
const ss = s_ * s_ * s_;
|
|
74
|
+
return [
|
|
75
|
+
4.0767416621 * ll - 3.3077115913 * mm + 0.2309699292 * ss,
|
|
76
|
+
-1.2684380046 * ll + 2.6097574011 * mm - 0.3413193965 * ss,
|
|
77
|
+
-0.0041960863 * ll - 0.7034186147 * mm + 1.707614701 * ss,
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const transfer = (x: number): number => (x <= 0.0031308 ? 12.92 * x : 1.055 * x ** (1 / 2.4) - 0.055);
|
|
82
|
+
const clamp01 = (x: number): number => Math.max(0, Math.min(1, x));
|
|
83
|
+
|
|
84
|
+
/** Largest chroma ≤ `c` whose color is inside the sRGB gamut (chroma bisection). */
|
|
85
|
+
function clampChroma(l: number, c: number, hDeg: number, iterations = 12): number {
|
|
86
|
+
let lo = 0;
|
|
87
|
+
let hi = c;
|
|
88
|
+
const inGamut = (chroma: number): boolean => oklchToSrgb(l, chroma, hDeg).every((x) => x >= -1e-4 && x <= 1 + 1e-4);
|
|
89
|
+
if (inGamut(hi)) return hi;
|
|
90
|
+
for (let i = 0; i < iterations; i++) {
|
|
91
|
+
const mid = (lo + hi) / 2;
|
|
92
|
+
if (inGamut(mid)) lo = mid;
|
|
93
|
+
else hi = mid;
|
|
94
|
+
}
|
|
95
|
+
return lo;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function oklchToHex(l: number, c: number, hDeg: number): string {
|
|
99
|
+
const chroma = clampChroma(l, c, hDeg);
|
|
100
|
+
const [r, g, b] = oklchToSrgb(l, chroma, hDeg);
|
|
101
|
+
const hex = (x: number): string =>
|
|
102
|
+
Math.round(clamp01(transfer(clamp01(x))) * 255)
|
|
103
|
+
.toString(16)
|
|
104
|
+
.padStart(2, "0");
|
|
105
|
+
return `#${hex(r)}${hex(g)}${hex(b)}`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ─── Public surface ──────────────────────────────────────────────────────────
|
|
109
|
+
|
|
110
|
+
/** Stable per-session accent hex at a fixed OKLCH lightness/chroma band. */
|
|
111
|
+
export function sessionAccentHex(name: string): string {
|
|
112
|
+
return oklchToHex(LIGHTNESS, Math.max(MIN_CHROMA, Math.min(MAX_CHROMA, 0.14)), sessionAccentHue(name));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function hexToRgb(hex: string): [number, number, number] | undefined {
|
|
116
|
+
const m = hex.trim().match(/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);
|
|
117
|
+
if (!m) return undefined;
|
|
118
|
+
return [Number.parseInt(m[1], 16), Number.parseInt(m[2], 16), Number.parseInt(m[3], 16)];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** RGB(0-1) → HSV; exactly the inverse legs omp's adjustHsv needs. */
|
|
122
|
+
function rgbToHsv(r: number, g: number, b: number): [number, number, number] {
|
|
123
|
+
const max = Math.max(r, g, b);
|
|
124
|
+
const min = Math.min(r, g, b);
|
|
125
|
+
const d = max - min;
|
|
126
|
+
let h: number;
|
|
127
|
+
if (d === 0) h = 0;
|
|
128
|
+
else if (max === r) h = ((g - b) / d) % 6;
|
|
129
|
+
else if (max === g) h = (b - r) / d + 2;
|
|
130
|
+
else h = (r - g) / d + 4;
|
|
131
|
+
h = (h * 60 + 360) % 360;
|
|
132
|
+
return [h, max === 0 ? 0 : d / max, max];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function hsvToHex(h: number, s: number, v: number): string {
|
|
136
|
+
const c = v * s;
|
|
137
|
+
const hp = h / 60;
|
|
138
|
+
const x = c * (1 - Math.abs((hp % 2) - 1));
|
|
139
|
+
const m = v - c;
|
|
140
|
+
let rgb: [number, number, number];
|
|
141
|
+
if (hp < 1) rgb = [c, x, 0];
|
|
142
|
+
else if (hp < 2) rgb = [x, c, 0];
|
|
143
|
+
else if (hp < 3) rgb = [0, c, x];
|
|
144
|
+
else if (hp < 4) rgb = [0, x, c];
|
|
145
|
+
else if (hp < 5) rgb = [x, 0, c];
|
|
146
|
+
else rgb = [c, 0, x];
|
|
147
|
+
const hex = (x: number): string =>
|
|
148
|
+
Math.round((x + m) * 255)
|
|
149
|
+
.toString(16)
|
|
150
|
+
.padStart(2, "0");
|
|
151
|
+
return `#${hex(rgb[0])}${hex(rgb[1])}${hex(rgb[2])}`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Dim variant for the spinner — identical transform to omp's
|
|
156
|
+
* `adjustHsv(hex, { s: 0.55, v: 0.65 })`. Unparseable input returns
|
|
157
|
+
* the input unchanged.
|
|
158
|
+
*/
|
|
159
|
+
export function dimAccentHex(hex: string): string {
|
|
160
|
+
const rgb = hexToRgb(hex);
|
|
161
|
+
if (!rgb) return hex;
|
|
162
|
+
const [r, g, b] = rgb.map((x) => x / 255) as [number, number, number];
|
|
163
|
+
const [h, s, v] = rgbToHsv(r, g, b);
|
|
164
|
+
return hsvToHex(h, s * 0.55, v * 0.65);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Truecolor ANSI foreground open sequence for a `#rrggbb` hex. */
|
|
168
|
+
export function hexToAnsiFg(hex: string): string {
|
|
169
|
+
const rgb = hexToRgb(hex);
|
|
170
|
+
if (!rgb) return "";
|
|
171
|
+
return `\x1b[38;2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
|
|
172
|
+
}
|
package/src/tools/bash.ts
CHANGED
|
@@ -66,7 +66,7 @@ export function registerBashTool(
|
|
|
66
66
|
: rawCmd;
|
|
67
67
|
const commandLabel = theme.fg(ctx.isError ? "error" : "toolTitle", theme.bold(`$ ${cmd}`));
|
|
68
68
|
text.setText(
|
|
69
|
-
fillToolBackground(`\n${TOOL_RESULT_INDENT}${commandLabel}${t}
|
|
69
|
+
fillToolBackground(`\n${TOOL_RESULT_INDENT}${commandLabel}${t}`, undefined, ctx.expanded ? undefined : tw),
|
|
70
70
|
);
|
|
71
71
|
return text;
|
|
72
72
|
},
|