slack-term 1.42.0 → 1.43.0
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 +76 -0
- package/SKILL.md +9 -0
- package/dist/cli.js +219 -205
- package/package.json +2 -1
- package/ts/cli.ts +151 -1
- package/ts/newlines.ts +158 -0
- package/ts/relay.ts +105 -0
- package/ts/slack.ts +52 -4
- package/ts/stream.ts +1048 -0
package/dist/cli.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{createRequire as Jf}from"node:module";var Lf=Object.create;var{getPrototypeOf:Nf,defineProperty:da,getOwnPropertyNames:Mf}=Object;var fa=Object.prototype.hasOwnProperty;function jf(e){return this[e]}var Wf,Uf,pa=(e,t,n)=>{var o=e!=null&&typeof e==="object";if(o){var s=t?Wf??=new WeakMap:Uf??=new WeakMap,r=s.get(e);if(r)return r}n=e!=null?Lf(Nf(e)):{};let i=t||!e||!e.__esModule||!fa.call(e,"default")?da(n,"default",{value:e,enumerable:!0}):n;if(e&&typeof e==="object"||typeof e==="function"){for(let a of Mf(e))if(!fa.call(i,a))da(i,a,{get:jf.bind(e,a),enumerable:!0})}if(o)s.set(e,i);return i};var ha=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ln=Jf(import.meta.url);var Oa=ha(function(iw,Ia){Ia.exports=()=>/[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g});var oc=ha(function(Gw,sc){sc.exports=function(t){if(t===void 0)t=2;if(t>=Error.stackTraceLimit)throw TypeError("getCallerFile(position) requires position be less then Error.stackTraceLimit but position was: `"+t+"` and Error.stackTraceLimit was: `"+Error.stackTraceLimit+"`");var n=Error.prepareStackTrace;Error.prepareStackTrace=function(s,r){return r};var o=Error().stack;if(Error.prepareStackTrace=n,o!==null&&typeof o==="object")return o[t]?o[t].getFileName():void 0}});import{createHash as ym}from"crypto";import{existsSync as hf,readFileSync as gf,mkdirSync as wm,realpathSync as Dm,writeFileSync as mf}from"fs";import{homedir as tf}from"os";import{join as Mt,resolve as bm}from"path";import{notStrictEqual as Fp,strictEqual as Ap}from"assert";var Kf={right:zf,center:Gf};class ma{constructor(e){var t;this.width=e.width,this.wrap=(t=e.wrap)!==null&&t!==void 0?t:!0,this.rows=[]}span(...e){let t=this.div(...e);t.span=!0}resetOutput(){this.rows=[]}div(...e){if(e.length===0)this.div("");if(this.wrap&&this.shouldApplyLayoutDSL(...e)&&typeof e[0]==="string")return this.applyLayoutDSL(e[0]);let t=e.map((n)=>{if(typeof n==="string")return this.colFromString(n);return n});return this.rows.push(t),t}shouldApplyLayoutDSL(...e){return e.length===1&&typeof e[0]==="string"&&/[\t\n]/.test(e[0])}applyLayoutDSL(e){let t=e.split(`
|
|
4
|
-
`).map((o)=>o.split("\t")),n=0;return t.forEach((o)=>{if(o.length>1&&
|
|
5
|
-
`)}rowToString(e,t){return this.rasterize(e).forEach((n,o)=>{let s="";n.forEach((r,i)=>{let{width:a}=e[i],c=this.negatePadding(e[i]),l=r;if(c>
|
|
3
|
+
import{createRequire as xp}from"node:module";var mp=Object.create;var{getPrototypeOf:yp,defineProperty:Ra,getOwnPropertyNames:wp}=Object;var Oa=Object.prototype.hasOwnProperty;function bp(e){return this[e]}var Dp,kp,Pa=(e,t,n)=>{var o=e!=null&&typeof e==="object";if(o){var s=t?Dp??=new WeakMap:kp??=new WeakMap,r=s.get(e);if(r)return r}n=e!=null?mp(yp(e)):{};let i=t||!e||!e.__esModule||!Oa.call(e,"default")?Ra(n,"default",{value:e,enumerable:!0}):n;if(e&&typeof e==="object"||typeof e==="function"){for(let a of wp(e))if(!Oa.call(i,a))Ra(i,a,{get:bp.bind(e,a),enumerable:!0})}if(o)s.set(e,i);return i};var va=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var zn=xp(import.meta.url);var Qa=va(function(pb,Za){Za.exports=()=>/[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g});var _c=va(function(tD,Ec){Ec.exports=function(t){if(t===void 0)t=2;if(t>=Error.stackTraceLimit)throw TypeError("getCallerFile(position) requires position be less then Error.stackTraceLimit but position was: `"+t+"` and Error.stackTraceLimit was: `"+Error.stackTraceLimit+"`");var n=Error.prepareStackTrace;Error.prepareStackTrace=function(s,r){return r};var o=Error().stack;if(Error.prepareStackTrace=n,o!==null&&typeof o==="object")return o[t]?o[t].getFileName():void 0}});import{createHash as Hf}from"crypto";import{existsSync as zf,readFileSync as Gf,mkdirSync as _y,realpathSync as Cy,writeFileSync as Yf}from"fs";import{homedir as ka}from"os";import{join as wt,resolve as $y}from"path";import{notStrictEqual as ah,strictEqual as ch}from"assert";var Sp={right:Cp,center:$p};class Ba{constructor(e){var t;this.width=e.width,this.wrap=(t=e.wrap)!==null&&t!==void 0?t:!0,this.rows=[]}span(...e){let t=this.div(...e);t.span=!0}resetOutput(){this.rows=[]}div(...e){if(e.length===0)this.div("");if(this.wrap&&this.shouldApplyLayoutDSL(...e)&&typeof e[0]==="string")return this.applyLayoutDSL(e[0]);let t=e.map((n)=>{if(typeof n==="string")return this.colFromString(n);return n});return this.rows.push(t),t}shouldApplyLayoutDSL(...e){return e.length===1&&typeof e[0]==="string"&&/[\t\n]/.test(e[0])}applyLayoutDSL(e){let t=e.split(`
|
|
4
|
+
`).map((o)=>o.split("\t")),n=0;return t.forEach((o)=>{if(o.length>1&&Ye.stringWidth(o[0])>n)n=Math.min(Math.floor(this.width*0.5),Ye.stringWidth(o[0]))}),t.forEach((o)=>{this.div(...o.map((s,r)=>({text:s.trim(),padding:this.measurePadding(s),width:r===0&&o.length>1?n:void 0})))}),this.rows[this.rows.length-1]}colFromString(e){return{text:e,padding:this.measurePadding(e)}}measurePadding(e){let t=Ye.stripAnsi(e);return[0,t.match(/\s*$/)[0].length,0,t.match(/^\s*/)[0].length]}toString(){let e=[];return this.rows.forEach((t)=>{this.rowToString(t,e)}),e.filter((t)=>!t.hidden).map((t)=>t.text).join(`
|
|
5
|
+
`)}rowToString(e,t){return this.rasterize(e).forEach((n,o)=>{let s="";n.forEach((r,i)=>{let{width:a}=e[i],c=this.negatePadding(e[i]),l=r;if(c>Ye.stringWidth(r))l+=" ".repeat(c-Ye.stringWidth(r));if(e[i].align&&e[i].align!=="left"&&this.wrap){let d=Sp[e[i].align];if(l=d(l,c),Ye.stringWidth(l)<c)l+=" ".repeat((a||0)-Ye.stringWidth(l)-1)}let u=e[i].padding||[0,0,0,0];if(u[3])s+=" ".repeat(u[3]);if(s+=La(e[i],l,"| "),s+=l,s+=La(e[i],l," |"),u[1])s+=" ".repeat(u[1]);if(o===0&&t.length>0)s=this.renderInline(s,t[t.length-1])}),t.push({text:s.replace(/ +$/,""),span:e.span})}),t}renderInline(e,t){let n=e.match(/^ */),o=n?n[0].length:0,s=t.text,r=Ye.stringWidth(s.trimRight());if(!t.span)return e;if(!this.wrap)return t.hidden=!0,s+e;if(o<r)return e;return t.hidden=!0,s.trimRight()+" ".repeat(o-r)+e.trimLeft()}rasterize(e){let t=[],n=this.columnWidths(e),o;return e.forEach((s,r)=>{if(s.width=n[r],this.wrap)o=Ye.wrap(s.text,this.negatePadding(s),{hard:!0}).split(`
|
|
6
6
|
`);else o=s.text.split(`
|
|
7
|
-
`);if(s.border)o.unshift("."+"-".repeat(this.negatePadding(s)+2)+"."),o.push("'"+"-".repeat(this.negatePadding(s)+2)+"'");if(s.padding)o.unshift(...Array(s.padding[0]||0).fill("")),o.push(...Array(s.padding[2]||0).fill(""));o.forEach((i,a)=>{if(!t[a])t.push([]);let c=t[a];for(let l=0;l<r;l++)if(c[l]===void 0)c.push("");c.push(i)})}),t}negatePadding(e){let t=e.width||0;if(e.padding)t-=(e.padding[3]||0)+(e.padding[1]||0);if(e.border)t-=4;return t}columnWidths(e){if(!this.wrap)return e.map((r)=>r.width||Me.stringWidth(r.text));let t=e.length,n=this.width,o=e.map((r)=>{if(r.width)return t--,n-=r.width,r.width;return}),s=t?Math.floor(n/t):0;return o.map((r,i)=>{if(r===void 0)return Math.max(s,qf(e[i]));return r})}}function ga(e,t,n){if(e.border){if(/[.']-+[.']/.test(t))return"";if(t.trim().length!==0)return n;return" "}return""}function qf(e){let t=e.padding||[],n=1+(t[3]||0)+(t[1]||0);if(e.border)return n+4;return n}function Hf(){if(typeof process==="object"&&process.stdout&&process.stdout.columns)return process.stdout.columns;return 80}function zf(e,t){e=e.trim();let n=Me.stringWidth(e);if(n<t)return" ".repeat(t-n)+e;return e}function Gf(e,t){e=e.trim();let n=Me.stringWidth(e);if(n>=t)return e;return" ".repeat(t-n>>1)+e}var Me;function ya(e,t){return Me=t,new ma({width:(e===null||e===void 0?void 0:e.width)||Hf(),wrap:e===null||e===void 0?void 0:e.wrap})}function Yo({onlyFirst:e=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",e?void 0:"g")}var Yf=Yo();function Ut(e){if(typeof e!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof e}\``);if(!e.includes("\x1B")&&!e.includes(""))return e;return e.replace(Yf,"")}var wa=161,Da=1114109,ba=[161,161,164,164,167,168,170,170,173,174,176,180,182,186,188,191,198,198,208,208,215,216,222,225,230,230,232,234,236,237,240,240,242,243,247,250,252,252,254,254,257,257,273,273,275,275,283,283,294,295,299,299,305,307,312,312,319,322,324,324,328,331,333,333,338,339,358,359,363,363,462,462,464,464,466,466,468,468,470,470,472,472,474,474,476,476,593,593,609,609,708,708,711,711,713,715,717,717,720,720,728,731,733,733,735,735,768,879,913,929,931,937,945,961,963,969,1025,1025,1040,1103,1105,1105,8208,8208,8211,8214,8216,8217,8220,8221,8224,8226,8228,8231,8240,8240,8242,8243,8245,8245,8251,8251,8254,8254,8308,8308,8319,8319,8321,8324,8364,8364,8451,8451,8453,8453,8457,8457,8467,8467,8470,8470,8481,8482,8486,8486,8491,8491,8531,8532,8539,8542,8544,8555,8560,8569,8585,8585,8592,8601,8632,8633,8658,8658,8660,8660,8679,8679,8704,8704,8706,8707,8711,8712,8715,8715,8719,8719,8721,8721,8725,8725,8730,8730,8733,8736,8739,8739,8741,8741,8743,8748,8750,8750,8756,8759,8764,8765,8776,8776,8780,8780,8786,8786,8800,8801,8804,8807,8810,8811,8814,8815,8834,8835,8838,8839,8853,8853,8857,8857,8869,8869,8895,8895,8978,8978,9312,9449,9451,9547,9552,9587,9600,9615,9618,9621,9632,9633,9635,9641,9650,9651,9654,9655,9660,9661,9664,9665,9670,9672,9675,9675,9678,9681,9698,9701,9711,9711,9733,9734,9737,9737,9742,9743,9756,9756,9758,9758,9792,9792,9794,9794,9824,9825,9827,9829,9831,9834,9836,9837,9839,9839,9886,9887,9919,9919,9926,9933,9935,9939,9941,9953,9955,9955,9960,9961,9963,9969,9972,9972,9974,9977,9979,9980,9982,9983,10045,10045,10102,10111,11094,11097,12872,12879,57344,63743,65024,65039,65533,65533,127232,127242,127248,127277,127280,127337,127344,127373,127375,127376,127387,127404,917760,917999,983040,1048573,1048576,1114109],ka=12288,xa=65510,Ea=[12288,12288,65281,65376,65504,65510];var Sa=4352,Ca=262141,Xo=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141];var _s=(e,t)=>{let n=0,o=Math.floor(e.length/2)-1;while(n<=o){let s=Math.floor((n+o)/2),r=s*2;if(t<e[r])o=s-1;else if(t>e[r+1])n=s+1;else return!0}return!1};var _a=19968,[Xf,Vf]=Zf(Xo);function Zf(e){let t=e[0],n=e[1];for(let o=0;o<e.length;o+=2){let s=e[o],r=e[o+1];if(_a>=s&&_a<=r)return[s,r];if(r-s>n-t)t=s,n=r}return[t,n]}var $a=(e)=>{if(e<wa||e>Da)return!1;return _s(ba,e)},Fa=(e)=>{if(e<ka||e>xa)return!1;return _s(Ea,e)};var Aa=(e)=>{if(e>=Xf&&e<=Vf)return!0;if(e<Sa||e>Ca)return!1;return _s(Xo,e)};function Qf(e){if(!Number.isSafeInteger(e))throw TypeError(`Expected a code point, got \`${typeof e}\`.`)}function Ta(e,{ambiguousAsWide:t=!1}={}){if(Qf(e),Fa(e)||Aa(e)||t&&$a(e))return 2;return 1}var Ra=pa(Oa(),1),ep=new Intl.Segmenter,tp=/^\p{Default_Ignorable_Code_Point}$/u;function tt(e,t={}){if(typeof e!=="string"||e.length===0)return 0;let{ambiguousIsNarrow:n=!0,countAnsiEscapeCodes:o=!1}=t;if(!o)e=Ut(e);if(e.length===0)return 0;let s=0,r={ambiguousAsWide:!n};for(let{segment:i}of ep.segment(e)){let a=i.codePointAt(0);if(a<=31||a>=127&&a<=159)continue;if(a>=8203&&a<=8207||a===65279)continue;if(a>=768&&a<=879||a>=6832&&a<=6911||a>=7616&&a<=7679||a>=8400&&a<=8447||a>=65056&&a<=65071)continue;if(a>=55296&&a<=57343)continue;if(a>=65024&&a<=65039)continue;if(tp.test(i))continue;if(Ra.default().test(i)){s+=2;continue}s+=Ta(a,r)}return s}var Pa=(e=0)=>(t)=>`\x1B[${t+e}m`,va=(e=0)=>(t)=>`\x1B[${38+e};5;${t}m`,Ba=(e=0)=>(t,n,o)=>`\x1B[${38+e};2;${t};${n};${o}m`,le={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},uw=Object.keys(le.modifier),np=Object.keys(le.color),sp=Object.keys(le.bgColor),dw=[...np,...sp];function op(){let e=new Map;for(let[t,n]of Object.entries(le)){for(let[o,s]of Object.entries(n))le[o]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},n[o]=le[o],e.set(s[0],s[1]);Object.defineProperty(le,t,{value:n,enumerable:!1})}return Object.defineProperty(le,"codes",{value:e,enumerable:!1}),le.color.close="\x1B[39m",le.bgColor.close="\x1B[49m",le.color.ansi=Pa(),le.color.ansi256=va(),le.color.ansi16m=Ba(),le.bgColor.ansi=Pa(10),le.bgColor.ansi256=va(10),le.bgColor.ansi16m=Ba(10),Object.defineProperties(le,{rgbToAnsi256:{value(t,n,o){if(t===n&&n===o){if(t<8)return 16;if(t>248)return 231;return Math.round((t-8)/247*24)+232}return 16+36*Math.round(t/255*5)+6*Math.round(n/255*5)+Math.round(o/255*5)},enumerable:!1},hexToRgb:{value(t){let n=/[a-f\d]{6}|[a-f\d]{3}/i.exec(t.toString(16));if(!n)return[0,0,0];let[o]=n;if(o.length===3)o=[...o].map((r)=>r+r).join("");let s=Number.parseInt(o,16);return[s>>16&255,s>>8&255,s&255]},enumerable:!1},hexToAnsi256:{value:(t)=>le.rgbToAnsi256(...le.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let n,o,s;if(t>=232)n=((t-232)*10+8)/255,o=n,s=n;else{t-=16;let a=t%36;n=Math.floor(t/36)/5,o=Math.floor(a/6)/5,s=a%6/5}let r=Math.max(n,o,s)*2;if(r===0)return 30;let i=30+(Math.round(s)<<2|Math.round(o)<<1|Math.round(n));if(r===2)i+=60;return i},enumerable:!1},rgbToAnsi:{value:(t,n,o)=>le.ansi256ToAnsi(le.rgbToAnsi256(t,n,o)),enumerable:!1},hexToAnsi:{value:(t)=>le.ansi256ToAnsi(le.hexToAnsi256(t)),enumerable:!1}}),le}var rp=op(),La=rp;var Fs=new Set(["\x1B",""]),ip=39,Zo="\x07",ja="[",ap="]",Wa="m",$s=`${ap}8;;`,Na=(e)=>`${Fs.values().next().value}${ja}${e}${Wa}`,Ma=(e)=>`${Fs.values().next().value}${$s}${e}${Zo}`,cp=(e)=>e.split(" ").map((t)=>tt(t)),Vo=(e,t,n)=>{let o=[...t],s=!1,r=!1,i=tt(Ut(e.at(-1)));for(let[a,c]of o.entries()){let l=tt(c);if(i+l<=n)e[e.length-1]+=c;else e.push(c),i=0;if(Fs.has(c))s=!0,r=o.slice(a+1,a+1+$s.length).join("")===$s;if(s){if(r){if(c===Zo)s=!1,r=!1}else if(c===Wa)s=!1;continue}if(i+=l,i===n&&a<o.length-1)e.push(""),i=0}if(!i&&e.at(-1).length>0&&e.length>1)e[e.length-2]+=e.pop()},lp=(e)=>{let t=e.split(" "),n=t.length;while(n>0){if(tt(t[n-1])>0)break;n--}if(n===t.length)return e;return t.slice(0,n).join(" ")+t.slice(n).join("")},up=(e,t,n={})=>{if(n.trim!==!1&&e.trim()==="")return"";let o="",s,r,i=cp(e),a=[""];for(let[d,p]of e.split(" ").entries()){if(n.trim!==!1)a[a.length-1]=a.at(-1).trimStart();let h=tt(a.at(-1));if(d!==0){if(h>=t&&(n.wordWrap===!1||n.trim===!1))a.push(""),h=0;if(h>0||n.trim===!1)a[a.length-1]+=" ",h++}if(n.hard&&i[d]>t){let y=t-h,f=1+Math.floor((i[d]-y-1)/t);if(Math.floor((i[d]-1)/t)<f)a.push("");Vo(a,p,t);continue}if(h+i[d]>t&&h>0&&i[d]>0){if(n.wordWrap===!1&&h<t){Vo(a,p,t);continue}a.push("")}if(h+i[d]>t&&n.wordWrap===!1){Vo(a,p,t);continue}a[a.length-1]+=p}if(n.trim!==!1)a=a.map((d)=>lp(d));let c=a.join(`
|
|
8
|
-
`),l=[...c],u=0;for(let[d,
|
|
9
|
-
`){if(r)o+=
|
|
10
|
-
`){if(s&&h)o+=
|
|
7
|
+
`);if(s.border)o.unshift("."+"-".repeat(this.negatePadding(s)+2)+"."),o.push("'"+"-".repeat(this.negatePadding(s)+2)+"'");if(s.padding)o.unshift(...Array(s.padding[0]||0).fill("")),o.push(...Array(s.padding[2]||0).fill(""));o.forEach((i,a)=>{if(!t[a])t.push([]);let c=t[a];for(let l=0;l<r;l++)if(c[l]===void 0)c.push("");c.push(i)})}),t}negatePadding(e){let t=e.width||0;if(e.padding)t-=(e.padding[3]||0)+(e.padding[1]||0);if(e.border)t-=4;return t}columnWidths(e){if(!this.wrap)return e.map((r)=>r.width||Ye.stringWidth(r.text));let t=e.length,n=this.width,o=e.map((r)=>{if(r.width)return t--,n-=r.width,r.width;return}),s=t?Math.floor(n/t):0;return o.map((r,i)=>{if(r===void 0)return Math.max(s,Ep(e[i]));return r})}}function La(e,t,n){if(e.border){if(/[.']-+[.']/.test(t))return"";if(t.trim().length!==0)return n;return" "}return""}function Ep(e){let t=e.padding||[],n=1+(t[3]||0)+(t[1]||0);if(e.border)return n+4;return n}function _p(){if(typeof process==="object"&&process.stdout&&process.stdout.columns)return process.stdout.columns;return 80}function Cp(e,t){e=e.trim();let n=Ye.stringWidth(e);if(n<t)return" ".repeat(t-n)+e;return e}function $p(e,t){e=e.trim();let n=Ye.stringWidth(e);if(n>=t)return e;return" ".repeat(t-n>>1)+e}var Ye;function Ma(e,t){return Ye=t,new Ba({width:(e===null||e===void 0?void 0:e.width)||_p(),wrap:e===null||e===void 0?void 0:e.wrap})}function ar({onlyFirst:e=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",e?void 0:"g")}var Fp=ar();function Zt(e){if(typeof e!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof e}\``);if(!e.includes("\x1B")&&!e.includes(""))return e;return e.replace(Fp,"")}var Na=161,ja=1114109,Wa=[161,161,164,164,167,168,170,170,173,174,176,180,182,186,188,191,198,198,208,208,215,216,222,225,230,230,232,234,236,237,240,240,242,243,247,250,252,252,254,254,257,257,273,273,275,275,283,283,294,295,299,299,305,307,312,312,319,322,324,324,328,331,333,333,338,339,358,359,363,363,462,462,464,464,466,466,468,468,470,470,472,472,474,474,476,476,593,593,609,609,708,708,711,711,713,715,717,717,720,720,728,731,733,733,735,735,768,879,913,929,931,937,945,961,963,969,1025,1025,1040,1103,1105,1105,8208,8208,8211,8214,8216,8217,8220,8221,8224,8226,8228,8231,8240,8240,8242,8243,8245,8245,8251,8251,8254,8254,8308,8308,8319,8319,8321,8324,8364,8364,8451,8451,8453,8453,8457,8457,8467,8467,8470,8470,8481,8482,8486,8486,8491,8491,8531,8532,8539,8542,8544,8555,8560,8569,8585,8585,8592,8601,8632,8633,8658,8658,8660,8660,8679,8679,8704,8704,8706,8707,8711,8712,8715,8715,8719,8719,8721,8721,8725,8725,8730,8730,8733,8736,8739,8739,8741,8741,8743,8748,8750,8750,8756,8759,8764,8765,8776,8776,8780,8780,8786,8786,8800,8801,8804,8807,8810,8811,8814,8815,8834,8835,8838,8839,8853,8853,8857,8857,8869,8869,8895,8895,8978,8978,9312,9449,9451,9547,9552,9587,9600,9615,9618,9621,9632,9633,9635,9641,9650,9651,9654,9655,9660,9661,9664,9665,9670,9672,9675,9675,9678,9681,9698,9701,9711,9711,9733,9734,9737,9737,9742,9743,9756,9756,9758,9758,9792,9792,9794,9794,9824,9825,9827,9829,9831,9834,9836,9837,9839,9839,9886,9887,9919,9919,9926,9933,9935,9939,9941,9953,9955,9955,9960,9961,9963,9969,9972,9972,9974,9977,9979,9980,9982,9983,10045,10045,10102,10111,11094,11097,12872,12879,57344,63743,65024,65039,65533,65533,127232,127242,127248,127277,127280,127337,127344,127373,127375,127376,127387,127404,917760,917999,983040,1048573,1048576,1114109],Ua=12288,Ja=65510,Ka=[12288,12288,65281,65376,65504,65510];var qa=4352,Ha=262141,cr=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141];var vs=(e,t)=>{let n=0,o=Math.floor(e.length/2)-1;while(n<=o){let s=Math.floor((n+o)/2),r=s*2;if(t<e[r])o=s-1;else if(t>e[r+1])n=s+1;else return!0}return!1};var za=19968,[Ap,Tp]=Ip(cr);function Ip(e){let t=e[0],n=e[1];for(let o=0;o<e.length;o+=2){let s=e[o],r=e[o+1];if(za>=s&&za<=r)return[s,r];if(r-s>n-t)t=s,n=r}return[t,n]}var Ga=(e)=>{if(e<Na||e>ja)return!1;return vs(Wa,e)},Ya=(e)=>{if(e<Ua||e>Ja)return!1;return vs(Ka,e)};var Xa=(e)=>{if(e>=Ap&&e<=Tp)return!0;if(e<qa||e>Ha)return!1;return vs(cr,e)};function Rp(e){if(!Number.isSafeInteger(e))throw TypeError(`Expected a code point, got \`${typeof e}\`.`)}function Va(e,{ambiguousAsWide:t=!1}={}){if(Rp(e),Ya(e)||Xa(e)||t&&Ga(e))return 2;return 1}var ec=Pa(Qa(),1),Op=new Intl.Segmenter,Pp=/^\p{Default_Ignorable_Code_Point}$/u;function lt(e,t={}){if(typeof e!=="string"||e.length===0)return 0;let{ambiguousIsNarrow:n=!0,countAnsiEscapeCodes:o=!1}=t;if(!o)e=Zt(e);if(e.length===0)return 0;let s=0,r={ambiguousAsWide:!n};for(let{segment:i}of Op.segment(e)){let a=i.codePointAt(0);if(a<=31||a>=127&&a<=159)continue;if(a>=8203&&a<=8207||a===65279)continue;if(a>=768&&a<=879||a>=6832&&a<=6911||a>=7616&&a<=7679||a>=8400&&a<=8447||a>=65056&&a<=65071)continue;if(a>=55296&&a<=57343)continue;if(a>=65024&&a<=65039)continue;if(Pp.test(i))continue;if(ec.default().test(i)){s+=2;continue}s+=Va(a,r)}return s}var tc=(e=0)=>(t)=>`\x1B[${t+e}m`,nc=(e=0)=>(t)=>`\x1B[${38+e};5;${t}m`,sc=(e=0)=>(t,n,o)=>`\x1B[${38+e};2;${t};${n};${o}m`,we={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},yb=Object.keys(we.modifier),vp=Object.keys(we.color),Lp=Object.keys(we.bgColor),wb=[...vp,...Lp];function Bp(){let e=new Map;for(let[t,n]of Object.entries(we)){for(let[o,s]of Object.entries(n))we[o]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},n[o]=we[o],e.set(s[0],s[1]);Object.defineProperty(we,t,{value:n,enumerable:!1})}return Object.defineProperty(we,"codes",{value:e,enumerable:!1}),we.color.close="\x1B[39m",we.bgColor.close="\x1B[49m",we.color.ansi=tc(),we.color.ansi256=nc(),we.color.ansi16m=sc(),we.bgColor.ansi=tc(10),we.bgColor.ansi256=nc(10),we.bgColor.ansi16m=sc(10),Object.defineProperties(we,{rgbToAnsi256:{value(t,n,o){if(t===n&&n===o){if(t<8)return 16;if(t>248)return 231;return Math.round((t-8)/247*24)+232}return 16+36*Math.round(t/255*5)+6*Math.round(n/255*5)+Math.round(o/255*5)},enumerable:!1},hexToRgb:{value(t){let n=/[a-f\d]{6}|[a-f\d]{3}/i.exec(t.toString(16));if(!n)return[0,0,0];let[o]=n;if(o.length===3)o=[...o].map((r)=>r+r).join("");let s=Number.parseInt(o,16);return[s>>16&255,s>>8&255,s&255]},enumerable:!1},hexToAnsi256:{value:(t)=>we.rgbToAnsi256(...we.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let n,o,s;if(t>=232)n=((t-232)*10+8)/255,o=n,s=n;else{t-=16;let a=t%36;n=Math.floor(t/36)/5,o=Math.floor(a/6)/5,s=a%6/5}let r=Math.max(n,o,s)*2;if(r===0)return 30;let i=30+(Math.round(s)<<2|Math.round(o)<<1|Math.round(n));if(r===2)i+=60;return i},enumerable:!1},rgbToAnsi:{value:(t,n,o)=>we.ansi256ToAnsi(we.rgbToAnsi256(t,n,o)),enumerable:!1},hexToAnsi:{value:(t)=>we.ansi256ToAnsi(we.hexToAnsi256(t)),enumerable:!1}}),we}var Mp=Bp(),oc=Mp;var Bs=new Set(["\x1B",""]),Np=39,ur="\x07",ac="[",jp="]",cc="m",Ls=`${jp}8;;`,rc=(e)=>`${Bs.values().next().value}${ac}${e}${cc}`,ic=(e)=>`${Bs.values().next().value}${Ls}${e}${ur}`,Wp=(e)=>e.split(" ").map((t)=>lt(t)),lr=(e,t,n)=>{let o=[...t],s=!1,r=!1,i=lt(Zt(e.at(-1)));for(let[a,c]of o.entries()){let l=lt(c);if(i+l<=n)e[e.length-1]+=c;else e.push(c),i=0;if(Bs.has(c))s=!0,r=o.slice(a+1,a+1+Ls.length).join("")===Ls;if(s){if(r){if(c===ur)s=!1,r=!1}else if(c===cc)s=!1;continue}if(i+=l,i===n&&a<o.length-1)e.push(""),i=0}if(!i&&e.at(-1).length>0&&e.length>1)e[e.length-2]+=e.pop()},Up=(e)=>{let t=e.split(" "),n=t.length;while(n>0){if(lt(t[n-1])>0)break;n--}if(n===t.length)return e;return t.slice(0,n).join(" ")+t.slice(n).join("")},Jp=(e,t,n={})=>{if(n.trim!==!1&&e.trim()==="")return"";let o="",s,r,i=Wp(e),a=[""];for(let[d,f]of e.split(" ").entries()){if(n.trim!==!1)a[a.length-1]=a.at(-1).trimStart();let h=lt(a.at(-1));if(d!==0){if(h>=t&&(n.wordWrap===!1||n.trim===!1))a.push(""),h=0;if(h>0||n.trim===!1)a[a.length-1]+=" ",h++}if(n.hard&&i[d]>t){let m=t-h,p=1+Math.floor((i[d]-m-1)/t);if(Math.floor((i[d]-1)/t)<p)a.push("");lr(a,f,t);continue}if(h+i[d]>t&&h>0&&i[d]>0){if(n.wordWrap===!1&&h<t){lr(a,f,t);continue}a.push("")}if(h+i[d]>t&&n.wordWrap===!1){lr(a,f,t);continue}a[a.length-1]+=f}if(n.trim!==!1)a=a.map((d)=>Up(d));let c=a.join(`
|
|
8
|
+
`),l=[...c],u=0;for(let[d,f]of l.entries()){if(o+=f,Bs.has(f)){let{groups:m}=new RegExp(`(?:\\${ac}(?<code>\\d+)m|\\${Ls}(?<uri>.*)${ur})`).exec(c.slice(u))||{groups:{}};if(m.code!==void 0){let p=Number.parseFloat(m.code);s=p===Np?void 0:p}else if(m.uri!==void 0)r=m.uri.length===0?void 0:m.uri}let h=oc.codes.get(Number(s));if(l[d+1]===`
|
|
9
|
+
`){if(r)o+=ic("");if(s&&h)o+=rc(h)}else if(f===`
|
|
10
|
+
`){if(s&&h)o+=rc(s);if(r)o+=ic(r)}u+=f.length}return o};function dr(e,t,n){return String(e).normalize().replaceAll(`\r
|
|
11
11
|
`,`
|
|
12
12
|
`).split(`
|
|
13
|
-
`).map((o)=>
|
|
14
|
-
`)}function er(e){return ya(e,{stringWidth:tt,stripAnsi:Ut,wrap:Qo})}import{dirname as Ua,resolve as Ja}from"path";import{readdirSync as dp,statSync as fp}from"fs";function tr(e,t){let n=Ja(".",e),o;if(!fp(n).isDirectory())n=Ua(n);while(!0){if(o=t(n,dp(n)),o)return Ja(n,o);if(n=Ua(o=n),o===n)break}}import{inspect as Tp}from"util";import{fileURLToPath as ic}from"url";import{format as gp}from"util";import{normalize as mp,resolve as yp}from"path";function Jt(e){if(!(e!==e.toLowerCase()&&e!==e.toUpperCase()))e=e.toLowerCase();if(e.indexOf("-")===-1&&e.indexOf("_")===-1)return e;else{let n="",o=!1,s=e.match(/^-+/);for(let r=s?s[0].length:0;r<e.length;r++){let i=e.charAt(r);if(o)o=!1,i=i.toUpperCase();if(r!==0&&(i==="-"||i==="_"))o=!0;else if(i!=="-"&&i!=="_")n+=i}return n}}function As(e,t){let n=e.toLowerCase();t=t||"-";let o="";for(let s=0;s<e.length;s++){let r=n.charAt(s),i=e.charAt(s);if(r!==i&&s>0)o+=`${t}${n.charAt(s)}`;else o+=i}return o}function Ts(e){if(e===null||e===void 0)return!1;if(typeof e==="number")return!0;if(/^0x[0-9a-f]+$/i.test(e))return!0;if(/^0[^.]/.test(e))return!1;return/^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(e)}function Ka(e){if(Array.isArray(e))return e.map((i)=>typeof i!=="string"?i+"":i);e=e.trim();let t=0,n=null,o=null,s=null,r=[];for(let i=0;i<e.length;i++){if(n=o,o=e.charAt(i),o===" "&&!s){if(n!==" ")t++;continue}if(o===s)s=null;else if((o==="'"||o==='"')&&!s)s=o;if(!r[t])r[t]="";r[t]+=o}return r}var ze;(function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARRAY="array"})(ze||(ze={}));var ft;class sr{constructor(e){ft=e}parse(e,t){let n=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},t),o=Ka(e),s=typeof e==="string",r=pp(Object.assign(Object.create(null),n.alias)),i=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":"no-","parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},n.configuration),a=Object.assign(Object.create(null),n.default),c=n.configObjects||[],l=n.envPrefix,u=i["populate--"],d=u?"--":"_",p=Object.create(null),h=Object.create(null),y=n.__||ft.format,f={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},g=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,w=new RegExp("^--"+i["negation-prefix"]+"(.+)");if([].concat(n.array||[]).filter(Boolean).forEach(function(b){let E=typeof b==="object"?b.key:b,N=Object.keys(b).map(function(I){return{boolean:"bools",string:"strings",number:"numbers"}[I]}).filter(Boolean).pop();if(N)f[N][E]=!0;f.arrays[E]=!0,f.keys.push(E)}),[].concat(n.boolean||[]).filter(Boolean).forEach(function(b){f.bools[b]=!0,f.keys.push(b)}),[].concat(n.string||[]).filter(Boolean).forEach(function(b){f.strings[b]=!0,f.keys.push(b)}),[].concat(n.number||[]).filter(Boolean).forEach(function(b){f.numbers[b]=!0,f.keys.push(b)}),[].concat(n.count||[]).filter(Boolean).forEach(function(b){f.counts[b]=!0,f.keys.push(b)}),[].concat(n.normalize||[]).filter(Boolean).forEach(function(b){f.normalize[b]=!0,f.keys.push(b)}),typeof n.narg==="object")Object.entries(n.narg).forEach(([b,E])=>{if(typeof E==="number")f.nargs[b]=E,f.keys.push(b)});if(typeof n.coerce==="object")Object.entries(n.coerce).forEach(([b,E])=>{if(typeof E==="function")f.coercions[b]=E,f.keys.push(b)});if(typeof n.config<"u"){if(Array.isArray(n.config)||typeof n.config==="string")[].concat(n.config).filter(Boolean).forEach(function(b){f.configs[b]=!0});else if(typeof n.config==="object")Object.entries(n.config).forEach(([b,E])=>{if(typeof E==="boolean"||typeof E==="function")f.configs[b]=E})}ut(n.key,r,n.default,f.arrays),Object.keys(a).forEach(function(b){(f.aliases[b]||[]).forEach(function(E){a[E]=a[b]})});let D=null;Go();let k=[],S=Object.assign(Object.create(null),{_:[]}),C={};for(let b=0;b<o.length;b++){let E=o[b],N=E.replace(/^-{3,}/,"---"),I,x,q,j,Y,ke;if(E!=="--"&&/^-/.test(E)&&V(E))F(E);else if(N.match(/^---+(=|$)/)){F(E);continue}else if(E.match(/^--.+=/)||!i["short-option-groups"]&&E.match(/^-.+=/)){if(j=E.match(/^--?([^=]+)=([\s\S]*)$/),j!==null&&Array.isArray(j)&&j.length>=3)if(G(j[1],f.arrays))b=O(b,j[1],o,j[2]);else if(G(j[1],f.nargs)!==!1)b=A(b,j[1],o,j[2]);else B(j[1],j[2],!0)}else if(E.match(w)&&i["boolean-negation"]){if(j=E.match(w),j!==null&&Array.isArray(j)&&j.length>=2)x=j[1],B(x,G(x,f.arrays)?[!1]:!1)}else if(E.match(/^--.+/)||!i["short-option-groups"]&&E.match(/^-[^-]+/)){if(j=E.match(/^--?(.+)/),j!==null&&Array.isArray(j)&&j.length>=2)if(x=j[1],G(x,f.arrays))b=O(b,x,o);else if(G(x,f.nargs)!==!1)b=A(b,x,o);else if(Y=o[b+1],Y!==void 0&&(!Y.match(/^-/)||Y.match(g))&&!G(x,f.bools)&&!G(x,f.counts))B(x,Y),b++;else if(/^(true|false)$/.test(Y))B(x,Y),b++;else B(x,ee(x))}else if(E.match(/^-.\..+=/)){if(j=E.match(/^-([^=]+)=([\s\S]*)$/),j!==null&&Array.isArray(j)&&j.length>=3)B(j[1],j[2])}else if(E.match(/^-.\..+/)&&!E.match(g)){if(Y=o[b+1],j=E.match(/^-(.\..+)/),j!==null&&Array.isArray(j)&&j.length>=2)if(x=j[1],Y!==void 0&&!Y.match(/^-/)&&!G(x,f.bools)&&!G(x,f.counts))B(x,Y),b++;else B(x,ee(x))}else if(E.match(/^-[^-]+/)&&!E.match(g)){q=E.slice(1,-1).split(""),I=!1;for(let Oe=0;Oe<q.length;Oe++){if(Y=E.slice(Oe+2),q[Oe+1]&&q[Oe+1]==="="){if(ke=E.slice(Oe+3),x=q[Oe],G(x,f.arrays))b=O(b,x,o,ke);else if(G(x,f.nargs)!==!1)b=A(b,x,o,ke);else B(x,ke);I=!0;break}if(Y==="-"){B(q[Oe],Y);continue}if(/[A-Za-z]/.test(q[Oe])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(Y)&&G(Y,f.bools)===!1){B(q[Oe],Y),I=!0;break}if(q[Oe+1]&&q[Oe+1].match(/\W/)){B(q[Oe],Y),I=!0;break}else B(q[Oe],ee(q[Oe]))}if(x=E.slice(-1)[0],!I&&x!=="-")if(G(x,f.arrays))b=O(b,x,o);else if(G(x,f.nargs)!==!1)b=A(b,x,o);else if(Y=o[b+1],Y!==void 0&&(!/^(-|--)[^-]/.test(Y)||Y.match(g))&&!G(x,f.bools)&&!G(x,f.counts))B(x,Y),b++;else if(/^(true|false)$/.test(Y))B(x,Y),b++;else B(x,ee(x))}else if(E.match(/^-[0-9]$/)&&E.match(g)&&G(E.slice(1),f.bools))x=E.slice(1),B(x,ee(x));else if(E==="--"){k=o.slice(b+1);break}else if(i["halt-at-non-option"]){k=o.slice(b);break}else F(E)}if(ne(S,!0),ne(S,!1),R(S),W(),et(S,f.aliases,a,!0),te(S),i["set-placeholder-key"])ge(S);if(Object.keys(f.counts).forEach(function(b){if(!oe(S,b.split(".")))B(b,0)}),u&&k.length)S[d]=[];if(k.forEach(function(b){S[d].push(b)}),i["camel-case-expansion"]&&i["strip-dashed"])Object.keys(S).filter((b)=>b!=="--"&&b.includes("-")).forEach((b)=>{delete S[b]});if(i["strip-aliased"])[].concat(...Object.keys(r).map((b)=>r[b])).forEach((b)=>{if(i["camel-case-expansion"]&&b.includes("-"))delete S[b.split(".").map((E)=>Jt(E)).join(".")];delete S[b]});function F(b){let E=_("_",b);if(typeof E==="string"||typeof E==="number")S._.push(E)}function A(b,E,N,I){let x,q=G(E,f.nargs);if(q=typeof q!=="number"||isNaN(q)?1:q,q===0){if(!De(I))D=Error(y("Argument unexpected for: %s",E));return B(E,ee(E)),b}let j=De(I)?0:1;if(i["nargs-eats-options"]){if(N.length-(b+1)+j<q)D=Error(y("Not enough arguments following: %s",E));j=q}else{for(x=b+1;x<N.length;x++)if(!N[x].match(/^-[^0-9]/)||N[x].match(g)||V(N[x]))j++;else break;if(j<q)D=Error(y("Not enough arguments following: %s",E))}let Y=Math.min(j,q);if(!De(I)&&Y>0)B(E,I),Y--;for(x=b+1;x<Y+b+1;x++)B(E,N[x]);return b+Y}function O(b,E,N,I){let x=[],q=I||N[b+1],j=G(E,f.nargs);if(G(E,f.bools)&&!/^(true|false)$/.test(q))x.push(!0);else if(De(q)||De(I)&&/^-/.test(q)&&!g.test(q)&&!V(q)){if(a[E]!==void 0){let Y=a[E];x=Array.isArray(Y)?Y:[Y]}}else{if(!De(I))x.push(P(E,I,!0));for(let Y=b+1;Y<N.length;Y++){if(!i["greedy-arrays"]&&x.length>0||j&&typeof j==="number"&&x.length>=j)break;if(q=N[Y],/^-/.test(q)&&!g.test(q)&&!V(q))break;b=Y,x.push(P(E,q,s))}}if(typeof j==="number"&&(j&&x.length<j||isNaN(j)&&x.length===0))D=Error(y("Not enough arguments following: %s",E));return B(E,x),b}function B(b,E,N=s){if(/-/.test(b)&&i["camel-case-expansion"]){let q=b.split(".").map(function(j){return Jt(j)}).join(".");U(b,q)}let I=P(b,E,N),x=b.split(".");if(Ie(S,x,I),f.aliases[b])f.aliases[b].forEach(function(q){let j=q.split(".");Ie(S,j,I)});if(x.length>1&&i["dot-notation"])(f.aliases[x[0]]||[]).forEach(function(q){let j=q.split("."),Y=[].concat(x);if(Y.shift(),j=j.concat(Y),!(f.aliases[b]||[]).includes(j.join(".")))Ie(S,j,I)});if(G(b,f.normalize)&&!G(b,f.arrays))[b].concat(f.aliases[b]||[]).forEach(function(j){Object.defineProperty(C,j,{enumerable:!0,get(){return E},set(Y){E=typeof Y==="string"?ft.normalize(Y):Y}})})}function U(b,E){if(!(f.aliases[b]&&f.aliases[b].length))f.aliases[b]=[E],p[E]=!0;if(!(f.aliases[E]&&f.aliases[E].length))U(E,b)}function P(b,E,N){if(N)E=hp(E);if(G(b,f.bools)||G(b,f.counts)){if(typeof E==="string")E=E==="true"}let I=Array.isArray(E)?E.map(function(x){return _(b,x)}):_(b,E);if(G(b,f.counts)&&(De(I)||typeof I==="boolean"))I=nr();if(G(b,f.normalize)&&G(b,f.arrays))if(Array.isArray(E))I=E.map((x)=>ft.normalize(x));else I=ft.normalize(E);return I}function _(b,E){if(!i["parse-positional-numbers"]&&b==="_")return E;if(!G(b,f.strings)&&!G(b,f.bools)&&!Array.isArray(E)){if(Ts(E)&&i["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${E}`)))||!De(E)&&G(b,f.numbers))E=Number(E)}return E}function R(b){let E=Object.create(null);et(E,f.aliases,a),Object.keys(f.configs).forEach(function(N){let I=b[N]||E[N];if(I)try{let x=null,q=ft.resolve(ft.cwd(),I),j=f.configs[N];if(typeof j==="function"){try{x=j(q)}catch(Y){x=Y}if(x instanceof Error){D=x;return}}else x=ft.require(q);L(x)}catch(x){if(x.name==="PermissionDenied")D=x;else if(b[N])D=Error(y("Invalid JSON config file: %s",I))}})}function L(b,E){Object.keys(b).forEach(function(N){let I=b[N],x=E?E+"."+N:N;if(typeof I==="object"&&I!==null&&!Array.isArray(I)&&i["dot-notation"])L(I,x);else if(!oe(S,x.split("."))||G(x,f.arrays)&&i["combine-arrays"])B(x,I)})}function W(){if(typeof c<"u")c.forEach(function(b){L(b)})}function ne(b,E){if(typeof l>"u")return;let N=typeof l==="string"?l:"",I=ft.env();Object.keys(I).forEach(function(x){if(N===""||x.lastIndexOf(N,0)===0){let q=x.split("__").map(function(j,Y){if(Y===0)j=j.substring(N.length);return Jt(j)});if((E&&f.configs[q.join(".")]||!E)&&!oe(b,q))B(q.join("."),I[x])}})}function te(b){let E,N=new Set;Object.keys(b).forEach(function(I){if(!N.has(I)){if(E=G(I,f.coercions),typeof E==="function")try{let x=_(I,E(b[I]));[].concat(f.aliases[I]||[],I).forEach((q)=>{N.add(q),b[q]=x})}catch(x){D=x}}})}function ge(b){return f.keys.forEach((E)=>{if(~E.indexOf("."))return;if(typeof b[E]>"u")b[E]=void 0}),b}function et(b,E,N,I=!1){Object.keys(N).forEach(function(x){if(!oe(b,x.split("."))){if(Ie(b,x.split("."),N[x]),I)h[x]=!0;(E[x]||[]).forEach(function(q){if(oe(b,q.split(".")))return;Ie(b,q.split("."),N[x])})}})}function oe(b,E){let N=b;if(!i["dot-notation"])E=[E.join(".")];E.slice(0,-1).forEach(function(x){N=N[x]||{}});let I=E[E.length-1];if(typeof N!=="object")return!1;else return I in N}function Ie(b,E,N){let I=b;if(!i["dot-notation"])E=[E.join(".")];E.slice(0,-1).forEach(function(ke){if(ke=qa(ke),typeof I==="object"&&I[ke]===void 0)I[ke]={};if(typeof I[ke]!=="object"||Array.isArray(I[ke])){if(Array.isArray(I[ke]))I[ke].push({});else I[ke]=[I[ke],{}];I=I[ke][I[ke].length-1]}else I=I[ke]});let x=qa(E[E.length-1]),q=G(E.join("."),f.arrays),j=Array.isArray(N),Y=i["duplicate-arguments-array"];if(!Y&&G(x,f.nargs)){if(Y=!0,!De(I[x])&&f.nargs[x]===1||Array.isArray(I[x])&&I[x].length===f.nargs[x])I[x]=void 0}if(N===nr())I[x]=nr(I[x]);else if(Array.isArray(I[x]))if(Y&&q&&j)I[x]=i["flatten-duplicate-arrays"]?I[x].concat(N):(Array.isArray(I[x][0])?I[x]:[I[x]]).concat([N]);else if(!Y&&Boolean(q)===Boolean(j))I[x]=N;else I[x]=I[x].concat([N]);else if(I[x]===void 0&&q)I[x]=j?N:[N];else if(Y&&!(I[x]===void 0||G(x,f.counts)||G(x,f.bools)))I[x]=[I[x],N];else I[x]=N}function ut(...b){b.forEach(function(E){Object.keys(E||{}).forEach(function(N){if(f.aliases[N])return;f.aliases[N]=[].concat(r[N]||[]),f.aliases[N].concat(N).forEach(function(I){if(/-/.test(I)&&i["camel-case-expansion"]){let x=Jt(I);if(x!==N&&f.aliases[N].indexOf(x)===-1)f.aliases[N].push(x),p[x]=!0}}),f.aliases[N].concat(N).forEach(function(I){if(I.length>1&&/[A-Z]/.test(I)&&i["camel-case-expansion"]){let x=As(I,"-");if(x!==N&&f.aliases[N].indexOf(x)===-1)f.aliases[N].push(x),p[x]=!0}}),f.aliases[N].forEach(function(I){f.aliases[I]=[N].concat(f.aliases[N].filter(function(x){return I!==x}))})})})}function G(b,E){let N=[].concat(f.aliases[b]||[],b),I=Object.keys(E),x=N.find((q)=>I.includes(q));return x?E[x]:!1}function dt(b){let E=Object.keys(f);return[].concat(E.map((I)=>f[I])).some(function(I){return Array.isArray(I)?I.includes(b):I[b]})}function hn(b,...E){return[].concat(...E).some(function(I){let x=b.match(I);return x&&dt(x[1])})}function M(b){if(b.match(g)||!b.match(/^-[^-]+/))return!1;let E=!0,N,I=b.slice(1).split("");for(let x=0;x<I.length;x++){if(N=b.slice(x+2),!dt(I[x])){E=!1;break}if(I[x+1]&&I[x+1]==="="||N==="-"||/[A-Za-z]/.test(I[x])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(N)||I[x+1]&&I[x+1].match(/\W/))break}return E}function V(b){return i["unknown-options-as-args"]&&re(b)}function re(b){if(b=b.replace(/^-{3,}/,"--"),b.match(g))return!1;if(M(b))return!1;return!hn(b,/^-+([^=]+?)=[\s\S]*$/,w,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}function ee(b){if(!G(b,f.bools)&&!G(b,f.counts)&&`${b}`in a)return a[b];else return Se(me(b))}function Se(b){return{[ze.BOOLEAN]:!0,[ze.STRING]:"",[ze.NUMBER]:void 0,[ze.ARRAY]:[]}[b]}function me(b){let E=ze.BOOLEAN;if(G(b,f.strings))E=ze.STRING;else if(G(b,f.numbers))E=ze.NUMBER;else if(G(b,f.bools))E=ze.BOOLEAN;else if(G(b,f.arrays))E=ze.ARRAY;return E}function De(b){return b===void 0}function Go(){Object.keys(f.counts).find((b)=>{if(G(b,f.arrays))return D=Error(y("Invalid configuration: %s, opts.count excludes opts.array.",b)),!0;else if(G(b,f.nargs))return D=Error(y("Invalid configuration: %s, opts.count excludes opts.narg.",b)),!0;return!1})}return{aliases:Object.assign({},f.aliases),argv:Object.assign(C,S),configuration:i,defaulted:Object.assign({},h),error:D,newAliases:Object.assign({},p)}}}function pp(e){let t=[],n=Object.create(null),o=!0;Object.keys(e).forEach(function(s){t.push([].concat(e[s],s))});while(o){o=!1;for(let s=0;s<t.length;s++)for(let r=s+1;r<t.length;r++)if(t[s].filter(function(a){return t[r].indexOf(a)!==-1}).length){t[s]=t[s].concat(t[r]),t.splice(r,1),o=!0;break}}return t.forEach(function(s){s=s.filter(function(i,a,c){return c.indexOf(i)===a});let r=s.pop();if(r!==void 0&&typeof r==="string")n[r]=s}),n}function nr(e){return e!==void 0?e+1:1}function qa(e){if(e==="__proto__")return"___proto___";return e}function hp(e){return typeof e==="string"&&(e[0]==="'"||e[0]==='"')&&e[e.length-1]===e[0]?e.substring(1,e.length-1):e}import{readFileSync as wp}from"fs";import{createRequire as Ha}from"node:module";var or,rr,ir,za=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):20,Ga=(rr=(or=process===null||process===void 0?void 0:process.versions)===null||or===void 0?void 0:or.node)!==null&&rr!==void 0?rr:(ir=process===null||process===void 0?void 0:process.version)===null||ir===void 0?void 0:ir.slice(1);if(Ga){if(Number(Ga.match(/^([^.]+)/)[1])<za)throw Error(`yargs parser supports a minimum Node.js version of ${za}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}var Dp=process?process.env:{},Ya=Ha?Ha(import.meta.url):void 0,Xa=new sr({cwd:process.cwd,env:()=>Dp,format:gp,normalize:mp,resolve:yp,require:(e)=>{if(typeof Ya<"u")return Ya(e);else if(e.match(/\.json$/))return JSON.parse(wp(e,"utf8"));else throw Error("only .json config files are supported in ESM")}}),Nn=function(t,n){return Xa.parse(t.slice(),n).argv};Nn.detailed=function(e,t){return Xa.parse(e.slice(),t)};Nn.camelCase=Jt;Nn.decamelize=As;Nn.looksLikeNumber=Ts;var ar=Nn;import{basename as Ip,dirname as Op,extname as Rp,relative as Pp,resolve as rc,join as vp}from"path";function Va(){if(bp())return 0;return 1}function bp(){return kp()&&!process.defaultApp}function kp(){return!!process.versions.electron}function cr(e){return e.slice(Va()+1)}function Za(){return process.argv[Va()]}import{readFileSync as xp,statSync as Ep,writeFile as Sp}from"fs";import{format as Cp}from"util";import{resolve as _p}from"path";var Qa={fs:{readFileSync:xp,writeFile:Sp},format:Cp,resolve:_p,exists:(e)=>{try{return Ep(e).isFile()}catch(t){return!1}}};var nt;class ec{constructor(e){e=e||{},this.directory=e.directory||"./locales",this.updateFiles=typeof e.updateFiles==="boolean"?e.updateFiles:!0,this.locale=e.locale||"en",this.fallbackToLanguage=typeof e.fallbackToLanguage==="boolean"?e.fallbackToLanguage:!0,this.cache=Object.create(null),this.writeQueue=[]}__(...e){if(typeof arguments[0]!=="string")return this._taggedLiteral(arguments[0],...arguments);let t=e.shift(),n=function(){};if(typeof e[e.length-1]==="function")n=e.pop();if(n=n||function(){},!this.cache[this.locale])this._readLocaleFile();if(!this.cache[this.locale][t]&&this.updateFiles)this.cache[this.locale][t]=t,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n});else n();return nt.format.apply(nt.format,[this.cache[this.locale][t]||t].concat(e))}__n(){let e=Array.prototype.slice.call(arguments),t=e.shift(),n=e.shift(),o=e.shift(),s=function(){};if(typeof e[e.length-1]==="function")s=e.pop();if(!this.cache[this.locale])this._readLocaleFile();let r=o===1?t:n;if(this.cache[this.locale][t])r=this.cache[this.locale][t][o===1?"one":"other"];if(!this.cache[this.locale][t]&&this.updateFiles)this.cache[this.locale][t]={one:t,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:s});else s();let i=[r];if(~r.indexOf("%d"))i.push(o);return nt.format.apply(nt.format,i.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){if(!this.cache[this.locale])this._readLocaleFile();for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t))this.cache[this.locale][t]=e[t]}_taggedLiteral(e,...t){let n="";return e.forEach(function(o,s){let r=t[s+1];if(n+=o,typeof r<"u")n+="%s"}),this.__.apply(this,[n].concat([].slice.call(t,1)))}_enqueueWrite(e){if(this.writeQueue.push(e),this.writeQueue.length===1)this._processWriteQueue()}_processWriteQueue(){let e=this,t=this.writeQueue[0],{directory:n,locale:o,cb:s}=t,r=this._resolveLocaleFile(n,o),i=JSON.stringify(this.cache[o],null,2);nt.fs.writeFile(r,i,"utf-8",function(a){if(e.writeQueue.shift(),e.writeQueue.length>0)e._processWriteQueue();s(a)})}_readLocaleFile(){let e={},t=this._resolveLocaleFile(this.directory,this.locale);try{if(nt.fs.readFileSync)e=JSON.parse(nt.fs.readFileSync(t,"utf-8"))}catch(n){if(n instanceof SyntaxError)n.message="syntax error in "+t;if(n.code==="ENOENT")e={};else throw n}this.cache[this.locale]=e}_resolveLocaleFile(e,t){let n=nt.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){let o=nt.resolve(e,"./",t.split("_")[0]+".json");if(this._fileExistsSync(o))n=o}return n}_fileExistsSync(e){return nt.exists(e)}}function tc(e,t){nt=t;let n=new ec(e);return{__:n.__.bind(n),__n:n.__n.bind(n),setLocale:n.setLocale.bind(n),getLocale:n.getLocale.bind(n),updateLocale:n.updateLocale.bind(n),locale:n.locale}}var $p=(e)=>tc(e,Qa),nc=$p;var ac=pa(oc(),1);import{createRequire as Bp}from"node:module";import{readFileSync as Lp,readdirSync as Np}from"node:fs";var lr=ic(import.meta.url),Mp=lr.substring(0,lr.lastIndexOf("node_modules")),jp=Bp(import.meta.url),ur={assert:{notStrictEqual:Fp,strictEqual:Ap},cliui:er,findUp:tr,getEnv:(e)=>process.env[e],inspect:Tp,getProcessArgvBin:Za,mainFilename:Mp||process.cwd(),Parser:ar,path:{basename:Ip,dirname:Op,extname:Rp,relative:Pp,resolve:rc,join:vp},process:{argv:()=>process.argv,cwd:process.cwd,emitWarning:(e,t)=>process.emitWarning(e,t),execPath:()=>process.execPath,exit:(e)=>{process.exit(e)},nextTick:process.nextTick,stdColumns:typeof process.stdout.columns<"u"?process.stdout.columns:null},readFileSync:Lp,readdirSync:Np,require:jp,getCallerFile:()=>{let e=ac.default(3);return e.match(/^file:\/\//)?ic(e):e},stringWidth:tt,y18n:nc({directory:rc(lr,"../../../locales"),updateFiles:!1})};function Re(e,t,n,o){n.assert.notStrictEqual(e,t,o)}function dr(e,t){t.assert.strictEqual(typeof e,"string")}function gn(e){return Object.keys(e)}function ce(e){return!!e&&!!e.then&&typeof e.then==="function"}class ye extends Error{constructor(e){super(e||"yargs error");if(this.name="YError",Error.captureStackTrace)Error.captureStackTrace(this,ye)}}function kt(e){let n=e.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),o=/\.*[\][<>]/g,s=n.shift();if(!s)throw Error(`No command found in: ${e}`);let r={cmd:s.replace(o,""),demanded:[],optional:[]};return n.forEach((i,a)=>{let c=!1;if(i=i.replace(/\s/g,""),/\.+[\]>]/.test(i)&&a===n.length-1)c=!0;if(/^\[/.test(i))r.optional.push({cmd:i.replace(o,"").split("|"),variadic:c});else r.demanded.push({cmd:i.replace(o,"").split("|"),variadic:c})}),r}var Wp=["first","second","third","fourth","fifth","sixth"];function J(e,t,n){function o(){return typeof e==="object"?[{demanded:[],optional:[]},e,t]:[kt(`cmd ${e}`),t,n]}try{let s=0,[r,i,a]=o(),c=[].slice.call(i);while(c.length&&c[c.length-1]===void 0)c.pop();let l=a||c.length;if(l<r.demanded.length)throw new ye(`Not enough arguments provided. Expected ${r.demanded.length} but received ${c.length}.`);let u=r.demanded.length+r.optional.length;if(l>u)throw new ye(`Too many arguments provided. Expected max ${u} but received ${l}.`);r.demanded.forEach((d)=>{let p=c.shift(),h=cc(p);if(d.cmd.filter((f)=>f===h||f==="*").length===0)lc(h,d.cmd,s);s+=1}),r.optional.forEach((d)=>{if(c.length===0)return;let p=c.shift(),h=cc(p);if(d.cmd.filter((f)=>f===h||f==="*").length===0)lc(h,d.cmd,s);s+=1})}catch(s){console.warn(s.stack)}}function cc(e){if(Array.isArray(e))return"array";else if(e===null)return"null";return typeof e}function lc(e,t,n){throw new ye(`Invalid ${Wp[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class fr{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,o=!1){if(J("<array|function> [boolean] [boolean] [boolean]",[e,t,n],arguments.length),Array.isArray(e)){for(let s=0;s<e.length;s++){if(typeof e[s]!=="function")throw Error("middleware must be a function");let r=e[s];r.applyBeforeValidation=t,r.global=n}Array.prototype.push.apply(this.globalMiddleware,e)}else if(typeof e==="function"){let s=e;s.applyBeforeValidation=t,s.global=n,s.mutates=o,this.globalMiddleware.push(e)}return this.yargs}addCoerceMiddleware(e,t){let n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((o)=>{let s=[...n[t]||[],t];if(!o.option)return!0;else return!s.includes(o.option)}),e.option=t,this.addMiddleware(e,!0,!0,!0)}getMiddleware(){return this.globalMiddleware}freeze(){this.frozens.push([...this.globalMiddleware])}unfreeze(){let e=this.frozens.pop();if(e!==void 0)this.globalMiddleware=e}reset(){this.globalMiddleware=this.globalMiddleware.filter((e)=>e.global)}}function uc(e){if(!e)return[];return e.map((t)=>(t.applyBeforeValidation=!1,t))}function Kt(e,t,n,o){return n.reduce((s,r)=>{if(r.applyBeforeValidation!==o)return s;if(r.mutates){if(r.applied)return s;r.applied=!0}if(ce(s))return s.then((i)=>Promise.all([i,r(i,t)])).then(([i,a])=>Object.assign(i,a));else{let i=r(s,t);return ce(i)?i.then((a)=>Object.assign(s,a)):Object.assign(s,i)}},e)}function qt(e,t,n=(o)=>{throw o}){try{let o=Up(e)?e():e;return ce(o)?o.then((s)=>t(s)):t(o)}catch(o){return n(o)}}function Up(e){return typeof e==="function"}var mn=/(^\*)|(^\$0)/;class fc{constructor(e,t,n,o){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=o,this.usage=e,this.globalMiddleware=n,this.validation=t}addDirectory(e,t,n,o){o=o||{},this.requireCache.add(n);let s=this.shim.path.resolve(this.shim.path.dirname(n),e),r=this.shim.readdirSync(s,{recursive:o.recurse?!0:!1});if(!Array.isArray(o.extensions))o.extensions=["js"];let i=typeof o.visit==="function"?o.visit:(a)=>a;for(let a of r){let c=a.toString();if(o.exclude){let u=!1;if(typeof o.exclude==="function")u=o.exclude(c);else u=o.exclude.test(c);if(u)continue}if(o.include){let u=!1;if(typeof o.include==="function")u=o.include(c);else u=o.include.test(c);if(!u)continue}let l=!1;for(let u of o.extensions)if(c.endsWith(u))l=!0;if(l){let u=this.shim.path.join(s,c),d=t(u),p=Object.create(null,Object.getOwnPropertyDescriptors({...d}));if(i(p,u,c)){if(this.requireCache.has(u))continue;else this.requireCache.add(u);if(!p.command)p.command=this.shim.path.basename(u,this.shim.path.extname(u));this.addHandler(p)}}}}addHandler(e,t,n,o,s,r){let i=[],a=uc(s);if(o=o||(()=>{}),Array.isArray(e))if(Jp(e))[e,...i]=e;else for(let c of e)this.addHandler(c);else if(qp(e)){let c=Array.isArray(e.command)||typeof e.command==="string"?e.command:null;if(c===null)throw Error(`No command name given for module: ${this.shim.inspect(e)}`);if(e.aliases)c=[].concat(c).concat(e.aliases);this.addHandler(c,this.extractDesc(e),e.builder,e.handler,e.middlewares,e.deprecated);return}else if(dc(n)){this.addHandler([e].concat(i),t,n.builder,n.handler,n.middlewares,n.deprecated);return}if(typeof e==="string"){let c=kt(e);i=i.map((d)=>kt(d).cmd);let l=!1,u=[c.cmd].concat(i).filter((d)=>{if(mn.test(d))return l=!0,!1;return!0});if(u.length===0&&l)u.push("$0");if(l)c.cmd=u[0],i=u.slice(1),e=e.replace(mn,c.cmd);if(i.forEach((d)=>{this.aliasMap[d]=c.cmd}),t!==!1)this.usage.command(e,t,l,i,r);if(this.handlers[c.cmd]={original:e,description:t,handler:o,builder:n||{},middlewares:a,deprecated:r,demanded:c.demanded,optional:c.optional},l)this.defaultCommand=this.handlers[c.cmd]}}getCommandHandlers(){return this.handlers}getCommands(){return Object.keys(this.handlers).concat(Object.keys(this.aliasMap))}hasDefaultCommand(){return!!this.defaultCommand}runCommand(e,t,n,o,s,r){let i=this.handlers[e]||this.handlers[this.aliasMap[e]]||this.defaultCommand,a=t.getInternalMethods().getContext(),c=a.commands.slice(),l=!e;if(e)a.commands.push(e),a.fullCommands.push(i.original);let u=this.applyBuilderUpdateUsageAndParse(l,i,t,n.aliases,c,o,s,r);return ce(u)?u.then((d)=>this.applyMiddlewareAndGetResult(l,i,d.innerArgv,a,s,d.aliases,t)):this.applyMiddlewareAndGetResult(l,i,u.innerArgv,a,s,u.aliases,t)}applyBuilderUpdateUsageAndParse(e,t,n,o,s,r,i,a){let c=t.builder,l=n;if(Is(c)){n.getInternalMethods().getUsageInstance().freeze();let u=c(n.getInternalMethods().reset(o),a);if(ce(u))return u.then((d)=>(l=hc(d)?d:n,this.parseAndUpdateUsage(e,t,l,s,r,i)))}else if(Kp(c))n.getInternalMethods().getUsageInstance().freeze(),l=n.getInternalMethods().reset(o),Object.keys(t.builder).forEach((u)=>{l.option(u,c[u])});return this.parseAndUpdateUsage(e,t,l,s,r,i)}parseAndUpdateUsage(e,t,n,o,s,r){if(e)n.getInternalMethods().getUsageInstance().unfreeze(!0);if(this.shouldUpdateUsage(n))n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(o,t),t.description);let i=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,s,r);return ce(i)?i.then((a)=>({aliases:n.parsed.aliases,innerArgv:a})):{aliases:n.parsed.aliases,innerArgv:i}}shouldUpdateUsage(e){return!e.getInternalMethods().getUsageInstance().getUsageDisabled()&&e.getInternalMethods().getUsageInstance().getUsage().length===0}usageFromParentCommandsCommandHandler(e,t){let n=mn.test(t.original)?t.original.replace(mn,"").trim():t.original,o=e.filter((s)=>!mn.test(s));return o.push(n),`$0 ${o.join(" ")}`}handleValidationAndGetResult(e,t,n,o,s,r,i,a){if(!r.getInternalMethods().getHasOutput()){let c=r.getInternalMethods().runValidation(s,a,r.parsed.error,e);n=qt(n,(l)=>(c(l),l))}if(t.handler&&!r.getInternalMethods().getHasOutput()){r.getInternalMethods().setHasOutput();let c=!!r.getOptions().configuration["populate--"];if(r.getInternalMethods().postProcess(n,c,!1,!1),n=Kt(n,r,i,!1),n=qt(n,(l)=>{let u=t.handler(l);return ce(u)?u.then(()=>l):l}),!e)r.getInternalMethods().getUsageInstance().cacheHelpMessage();if(ce(n)&&!r.getInternalMethods().hasParseCallback())n.catch((l)=>{try{r.getInternalMethods().getUsageInstance().fail(null,l)}catch(u){}})}if(!e)o.commands.pop(),o.fullCommands.pop();return n}applyMiddlewareAndGetResult(e,t,n,o,s,r,i){let a={};if(s)return n;if(!i.getInternalMethods().getHasOutput())a=this.populatePositionals(t,n,o,i);let c=this.globalMiddleware.getMiddleware().slice(0).concat(t.middlewares),l=Kt(n,i,c,!0);return ce(l)?l.then((u)=>this.handleValidationAndGetResult(e,t,u,o,r,i,c,a)):this.handleValidationAndGetResult(e,t,l,o,r,i,c,a)}populatePositionals(e,t,n,o){t._=t._.slice(n.commands.length);let s=e.demanded.slice(0),r=e.optional.slice(0),i={};this.validation.positionalCount(s.length,t._.length);while(s.length){let a=s.shift();this.populatePositional(a,t,i)}while(r.length){let a=r.shift();this.populatePositional(a,t,i)}return t._=n.commands.concat(t._.map((a)=>""+a)),this.postProcessPositionals(t,i,this.cmdToParseOptions(e.original),o),i}populatePositional(e,t,n){let o=e.cmd[0];if(e.variadic)n[o]=t._.splice(0).map(String);else if(t._.length)n[o]=[String(t._.shift())]}cmdToParseOptions(e){let t={array:[],default:{},alias:{},demand:{}},n=kt(e);return n.demanded.forEach((o)=>{let[s,...r]=o.cmd;if(o.variadic)t.array.push(s),t.default[s]=[];t.alias[s]=r,t.demand[s]=!0}),n.optional.forEach((o)=>{let[s,...r]=o.cmd;if(o.variadic)t.array.push(s),t.default[s]=[];t.alias[s]=r}),t}postProcessPositionals(e,t,n,o){let s=Object.assign({},o.getOptions());s.default=Object.assign(n.default,s.default);for(let c of Object.keys(n.alias))s.alias[c]=(s.alias[c]||[]).concat(n.alias[c]);s.array=s.array.concat(n.array),s.config={};let r=[];if(Object.keys(t).forEach((c)=>{t[c].map((l)=>{if(s.configuration["unknown-options-as-args"])s.key[c]=!0;r.push(`--${c}`),r.push(l)})}),!r.length)return;let i=Object.assign({},s.configuration,{"populate--":!1}),a=this.shim.Parser.detailed(r,Object.assign({},s,{configuration:i}));if(a.error)o.getInternalMethods().getUsageInstance().fail(a.error.message,a.error);else{let c=Object.keys(t);Object.keys(t).forEach((l)=>{c.push(...a.aliases[l])}),Object.keys(a.argv).forEach((l)=>{if(c.includes(l)){if(!t[l])t[l]=a.argv[l];if(!this.isInConfigs(o,l)&&!this.isDefaulted(o,l)&&Object.prototype.hasOwnProperty.call(e,l)&&Object.prototype.hasOwnProperty.call(a.argv,l)&&(Array.isArray(e[l])||Array.isArray(a.argv[l])))e[l]=[].concat(e[l],a.argv[l]);else e[l]=a.argv[l]}})}}isDefaulted(e,t){let{default:n}=e.getOptions();return Object.prototype.hasOwnProperty.call(n,t)||Object.prototype.hasOwnProperty.call(n,this.shim.Parser.camelCase(t))}isInConfigs(e,t){let{configObjects:n}=e.getOptions();return n.some((o)=>Object.prototype.hasOwnProperty.call(o,t))||n.some((o)=>Object.prototype.hasOwnProperty.call(o,this.shim.Parser.camelCase(t)))}runDefaultBuilderOn(e){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(e)){let n=mn.test(this.defaultCommand.original)?this.defaultCommand.original:this.defaultCommand.original.replace(/^[^[\]<>]*/,"$0 ");e.getInternalMethods().getUsageInstance().usage(n,this.defaultCommand.description)}let t=this.defaultCommand.builder;if(Is(t))return t(e,!0);else if(!dc(t))Object.keys(t).forEach((n)=>{e.option(n,t[n])});return}extractDesc({describe:e,description:t,desc:n}){for(let o of[e,t,n]){if(typeof o==="string"||o===!1)return o;Re(o,!0,this.shim)}return!1}freeze(){this.frozens.push({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand})}unfreeze(){let e=this.frozens.pop();Re(e,void 0,this.shim),{handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand}=e}reset(){return this.handlers={},this.aliasMap={},this.defaultCommand=void 0,this.requireCache=new Set,this}}function pc(e,t,n,o){return new fc(e,t,n,o)}function dc(e){return typeof e==="object"&&!!e.builder&&typeof e.handler==="function"}function Jp(e){return e.every((t)=>typeof t==="string")}function Is(e){return typeof e==="function"}function Kp(e){return typeof e==="object"}function qp(e){return typeof e==="object"&&!Array.isArray(e)}function xt(e={},t=()=>!0){let n={};return gn(e).forEach((o)=>{if(t(o,e[o]))n[o]=e[o]}),n}function Et(e){if(typeof process>"u")return;[process.stdout,process.stderr].forEach((t)=>{let n=t;if(n._handle&&n.isTTY&&typeof n._handle.setBlocking==="function")n._handle.setBlocking(e)})}function Hp(e){return typeof e==="boolean"}function mc(e,t){let n=t.y18n.__,o={},s=[];o.failFn=function(_){s.push(_)};let r=null,i=null,a=!0;o.showHelpOnFail=function(_=!0,R){let[L,W]=typeof _==="string"?[!0,_]:[_,R];if(e.getInternalMethods().isGlobalContext())i=W;return r=W,a=L,o};let c=!1;o.fail=function(_,R){let L=e.getInternalMethods().getLoggerInstance();if(s.length)for(let W=s.length-1;W>=0;--W){let ne=s[W];if(Hp(ne)){if(R)throw R;else if(_)throw Error(_)}else ne(_,R,o)}else{if(e.getExitProcess())Et(!0);if(!c){if(c=!0,a)e.showHelp("error"),L.error();if(_||R)L.error(_||R);let W=r||i;if(W){if(_||R)L.error("");L.error(W)}}if(R=R||new ye(_),e.getExitProcess())return e.exit(1);else if(e.getInternalMethods().hasParseCallback())return e.exit(1,R);else throw R}};let l=[],u=!1;o.usage=(P,_)=>{if(P===null)return u=!0,l=[],o;return u=!1,l.push([P,_||""]),o},o.getUsage=()=>l,o.getUsageDisabled=()=>u,o.getPositionalGroupName=()=>n("Positionals:");let d=[];o.example=(P,_)=>{d.push([P,_||""])};let p=[];o.command=function(_,R,L,W,ne=!1){if(L)p=p.map((te)=>(te[2]=!1,te));p.push([_,R||"",L,W,ne])},o.getCommands=()=>p;let h={};o.describe=function(_,R){if(Array.isArray(_))_.forEach((L)=>{o.describe(L,R)});else if(typeof _==="object")Object.keys(_).forEach((L)=>{o.describe(L,_[L])});else h[_]=R},o.getDescriptions=()=>h;let y=[];o.epilog=(P)=>{y.push(P)};let f=!1,g;o.wrap=(P)=>{f=!0,g=P},o.getWrap=()=>{if(t.getEnv("YARGS_DISABLE_WRAP"))return null;if(!f)g=O(),f=!0;return g};let w="__yargsString__:";o.deferY18nLookup=(P)=>w+P,o.help=function(){if(S)return S;k();let _=e.customScriptName?e.$0:t.path.basename(e.$0),R=e.getDemandedOptions(),L=e.getDemandedCommands(),W=e.getDeprecatedOptions(),ne=e.getGroups(),te=e.getOptions(),ge=[];ge=ge.concat(Object.keys(h)),ge=ge.concat(Object.keys(R)),ge=ge.concat(Object.keys(L)),ge=ge.concat(Object.keys(te.default)),ge=ge.filter(F),ge=Object.keys(ge.reduce((M,V)=>{if(V!=="_")M[V]=!0;return M},{}));let et=o.getWrap(),oe=t.cliui({width:et,wrap:!!et});if(!u){if(l.length)l.forEach((M)=>{if(oe.div({text:`${M[0].replace(/\$0/g,_)}`}),M[1])oe.div({text:`${M[1]}`,padding:[1,0,0,0]})}),oe.div();else if(p.length){let M=null;if(L._)M=`${_} <${n("command")}>
|
|
15
|
-
`;else
|
|
16
|
-
`;
|
|
17
|
-
`);
|
|
18
|
-
`)}return
|
|
13
|
+
`).map((o)=>Jp(o,t,n)).join(`
|
|
14
|
+
`)}function fr(e){return Ma(e,{stringWidth:lt,stripAnsi:Zt,wrap:dr})}import{dirname as lc,resolve as uc}from"path";import{readdirSync as Kp,statSync as qp}from"fs";function pr(e,t){let n=uc(".",e),o;if(!qp(n).isDirectory())n=lc(n);while(!0){if(o=t(n,Kp(n)),o)return uc(n,o);if(n=lc(o=n),o===n)break}}import{inspect as lh}from"util";import{fileURLToPath as $c}from"url";import{format as Gp}from"util";import{normalize as Yp,resolve as Xp}from"path";function Qt(e){if(!(e!==e.toLowerCase()&&e!==e.toUpperCase()))e=e.toLowerCase();if(e.indexOf("-")===-1&&e.indexOf("_")===-1)return e;else{let n="",o=!1,s=e.match(/^-+/);for(let r=s?s[0].length:0;r<e.length;r++){let i=e.charAt(r);if(o)o=!1,i=i.toUpperCase();if(r!==0&&(i==="-"||i==="_"))o=!0;else if(i!=="-"&&i!=="_")n+=i}return n}}function Ms(e,t){let n=e.toLowerCase();t=t||"-";let o="";for(let s=0;s<e.length;s++){let r=n.charAt(s),i=e.charAt(s);if(r!==i&&s>0)o+=`${t}${n.charAt(s)}`;else o+=i}return o}function Ns(e){if(e===null||e===void 0)return!1;if(typeof e==="number")return!0;if(/^0x[0-9a-f]+$/i.test(e))return!0;if(/^0[^.]/.test(e))return!1;return/^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(e)}function dc(e){if(Array.isArray(e))return e.map((i)=>typeof i!=="string"?i+"":i);e=e.trim();let t=0,n=null,o=null,s=null,r=[];for(let i=0;i<e.length;i++){if(n=o,o=e.charAt(i),o===" "&&!s){if(n!==" ")t++;continue}if(o===s)s=null;else if((o==="'"||o==='"')&&!s)s=o;if(!r[t])r[t]="";r[t]+=o}return r}var nt;(function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARRAY="array"})(nt||(nt={}));var bt;class gr{constructor(e){bt=e}parse(e,t){let n=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},t),o=dc(e),s=typeof e==="string",r=Hp(Object.assign(Object.create(null),n.alias)),i=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":"no-","parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},n.configuration),a=Object.assign(Object.create(null),n.default),c=n.configObjects||[],l=n.envPrefix,u=i["populate--"],d=u?"--":"_",f=Object.create(null),h=Object.create(null),m=n.__||bt.format,p={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},g=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,w=new RegExp("^--"+i["negation-prefix"]+"(.+)");if([].concat(n.array||[]).filter(Boolean).forEach(function(D){let C=typeof D==="object"?D.key:D,N=Object.keys(D).map(function(O){return{boolean:"bools",string:"strings",number:"numbers"}[O]}).filter(Boolean).pop();if(N)p[N][C]=!0;p.arrays[C]=!0,p.keys.push(C)}),[].concat(n.boolean||[]).filter(Boolean).forEach(function(D){p.bools[D]=!0,p.keys.push(D)}),[].concat(n.string||[]).filter(Boolean).forEach(function(D){p.strings[D]=!0,p.keys.push(D)}),[].concat(n.number||[]).filter(Boolean).forEach(function(D){p.numbers[D]=!0,p.keys.push(D)}),[].concat(n.count||[]).filter(Boolean).forEach(function(D){p.counts[D]=!0,p.keys.push(D)}),[].concat(n.normalize||[]).filter(Boolean).forEach(function(D){p.normalize[D]=!0,p.keys.push(D)}),typeof n.narg==="object")Object.entries(n.narg).forEach(([D,C])=>{if(typeof C==="number")p.nargs[D]=C,p.keys.push(D)});if(typeof n.coerce==="object")Object.entries(n.coerce).forEach(([D,C])=>{if(typeof C==="function")p.coercions[D]=C,p.keys.push(D)});if(typeof n.config<"u"){if(Array.isArray(n.config)||typeof n.config==="string")[].concat(n.config).filter(Boolean).forEach(function(D){p.configs[D]=!0});else if(typeof n.config==="object")Object.entries(n.config).forEach(([D,C])=>{if(typeof C==="boolean"||typeof C==="function")p.configs[D]=C})}le(n.key,r,n.default,p.arrays),Object.keys(a).forEach(function(D){(p.aliases[D]||[]).forEach(function(C){a[C]=a[D]})});let b=null;ir();let k=[],x=Object.assign(Object.create(null),{_:[]}),_={};for(let D=0;D<o.length;D++){let C=o[D],N=C.replace(/^-{3,}/,"---"),O,E,G,J,Z,Te;if(C!=="--"&&/^-/.test(C)&&q(C))F(C);else if(N.match(/^---+(=|$)/)){F(C);continue}else if(C.match(/^--.+=/)||!i["short-option-groups"]&&C.match(/^-.+=/)){if(J=C.match(/^--?([^=]+)=([\s\S]*)$/),J!==null&&Array.isArray(J)&&J.length>=3)if(j(J[1],p.arrays))D=S(D,J[1],o,J[2]);else if(j(J[1],p.nargs)!==!1)D=I(D,J[1],o,J[2]);else B(J[1],J[2],!0)}else if(C.match(w)&&i["boolean-negation"]){if(J=C.match(w),J!==null&&Array.isArray(J)&&J.length>=2)E=J[1],B(E,j(E,p.arrays)?[!1]:!1)}else if(C.match(/^--.+/)||!i["short-option-groups"]&&C.match(/^-[^-]+/)){if(J=C.match(/^--?(.+)/),J!==null&&Array.isArray(J)&&J.length>=2)if(E=J[1],j(E,p.arrays))D=S(D,E,o);else if(j(E,p.nargs)!==!1)D=I(D,E,o);else if(Z=o[D+1],Z!==void 0&&(!Z.match(/^-/)||Z.match(g))&&!j(E,p.bools)&&!j(E,p.counts))B(E,Z),D++;else if(/^(true|false)$/.test(Z))B(E,Z),D++;else B(E,U(E))}else if(C.match(/^-.\..+=/)){if(J=C.match(/^-([^=]+)=([\s\S]*)$/),J!==null&&Array.isArray(J)&&J.length>=3)B(J[1],J[2])}else if(C.match(/^-.\..+/)&&!C.match(g)){if(Z=o[D+1],J=C.match(/^-(.\..+)/),J!==null&&Array.isArray(J)&&J.length>=2)if(E=J[1],Z!==void 0&&!Z.match(/^-/)&&!j(E,p.bools)&&!j(E,p.counts))B(E,Z),D++;else B(E,U(E))}else if(C.match(/^-[^-]+/)&&!C.match(g)){G=C.slice(1,-1).split(""),O=!1;for(let Ne=0;Ne<G.length;Ne++){if(Z=C.slice(Ne+2),G[Ne+1]&&G[Ne+1]==="="){if(Te=C.slice(Ne+3),E=G[Ne],j(E,p.arrays))D=S(D,E,o,Te);else if(j(E,p.nargs)!==!1)D=I(D,E,o,Te);else B(E,Te);O=!0;break}if(Z==="-"){B(G[Ne],Z);continue}if(/[A-Za-z]/.test(G[Ne])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(Z)&&j(Z,p.bools)===!1){B(G[Ne],Z),O=!0;break}if(G[Ne+1]&&G[Ne+1].match(/\W/)){B(G[Ne],Z),O=!0;break}else B(G[Ne],U(G[Ne]))}if(E=C.slice(-1)[0],!O&&E!=="-")if(j(E,p.arrays))D=S(D,E,o);else if(j(E,p.nargs)!==!1)D=I(D,E,o);else if(Z=o[D+1],Z!==void 0&&(!/^(-|--)[^-]/.test(Z)||Z.match(g))&&!j(E,p.bools)&&!j(E,p.counts))B(E,Z),D++;else if(/^(true|false)$/.test(Z))B(E,Z),D++;else B(E,U(E))}else if(C.match(/^-[0-9]$/)&&C.match(g)&&j(C.slice(1),p.bools))E=C.slice(1),B(E,U(E));else if(C==="--"){k=o.slice(D+1);break}else if(i["halt-at-non-option"]){k=o.slice(D);break}else F(C)}if(ce(x,!0),ce(x,!1),A(x),K(),ve(x,p.aliases,a,!0),ie(x),i["set-placeholder-key"])ye(x);if(Object.keys(p.counts).forEach(function(D){if(!ue(x,D.split(".")))B(D,0)}),u&&k.length)x[d]=[];if(k.forEach(function(D){x[d].push(D)}),i["camel-case-expansion"]&&i["strip-dashed"])Object.keys(x).filter((D)=>D!=="--"&&D.includes("-")).forEach((D)=>{delete x[D]});if(i["strip-aliased"])[].concat(...Object.keys(r).map((D)=>r[D])).forEach((D)=>{if(i["camel-case-expansion"]&&D.includes("-"))delete x[D.split(".").map((C)=>Qt(C)).join(".")];delete x[D]});function F(D){let C=T("_",D);if(typeof C==="string"||typeof C==="number")x._.push(C)}function I(D,C,N,O){let E,G=j(C,p.nargs);if(G=typeof G!=="number"||isNaN(G)?1:G,G===0){if(!$e(O))b=Error(m("Argument unexpected for: %s",C));return B(C,U(C)),D}let J=$e(O)?0:1;if(i["nargs-eats-options"]){if(N.length-(D+1)+J<G)b=Error(m("Not enough arguments following: %s",C));J=G}else{for(E=D+1;E<N.length;E++)if(!N[E].match(/^-[^0-9]/)||N[E].match(g)||q(N[E]))J++;else break;if(J<G)b=Error(m("Not enough arguments following: %s",C))}let Z=Math.min(J,G);if(!$e(O)&&Z>0)B(C,O),Z--;for(E=D+1;E<Z+D+1;E++)B(C,N[E]);return D+Z}function S(D,C,N,O){let E=[],G=O||N[D+1],J=j(C,p.nargs);if(j(C,p.bools)&&!/^(true|false)$/.test(G))E.push(!0);else if($e(G)||$e(O)&&/^-/.test(G)&&!g.test(G)&&!q(G)){if(a[C]!==void 0){let Z=a[C];E=Array.isArray(Z)?Z:[Z]}}else{if(!$e(O))E.push(P(C,O,!0));for(let Z=D+1;Z<N.length;Z++){if(!i["greedy-arrays"]&&E.length>0||J&&typeof J==="number"&&E.length>=J)break;if(G=N[Z],/^-/.test(G)&&!g.test(G)&&!q(G))break;D=Z,E.push(P(C,G,s))}}if(typeof J==="number"&&(J&&E.length<J||isNaN(J)&&E.length===0))b=Error(m("Not enough arguments following: %s",C));return B(C,E),D}function B(D,C,N=s){if(/-/.test(D)&&i["camel-case-expansion"]){let G=D.split(".").map(function(J){return Qt(J)}).join(".");W(D,G)}let O=P(D,C,N),E=D.split(".");if(V(x,E,O),p.aliases[D])p.aliases[D].forEach(function(G){let J=G.split(".");V(x,J,O)});if(E.length>1&&i["dot-notation"])(p.aliases[E[0]]||[]).forEach(function(G){let J=G.split("."),Z=[].concat(E);if(Z.shift(),J=J.concat(Z),!(p.aliases[D]||[]).includes(J.join(".")))V(x,J,O)});if(j(D,p.normalize)&&!j(D,p.arrays))[D].concat(p.aliases[D]||[]).forEach(function(J){Object.defineProperty(_,J,{enumerable:!0,get(){return C},set(Z){C=typeof Z==="string"?bt.normalize(Z):Z}})})}function W(D,C){if(!(p.aliases[D]&&p.aliases[D].length))p.aliases[D]=[C],f[C]=!0;if(!(p.aliases[C]&&p.aliases[C].length))W(C,D)}function P(D,C,N){if(N)C=zp(C);if(j(D,p.bools)||j(D,p.counts)){if(typeof C==="string")C=C==="true"}let O=Array.isArray(C)?C.map(function(E){return T(D,E)}):T(D,C);if(j(D,p.counts)&&($e(O)||typeof O==="boolean"))O=hr();if(j(D,p.normalize)&&j(D,p.arrays))if(Array.isArray(C))O=C.map((E)=>bt.normalize(E));else O=bt.normalize(C);return O}function T(D,C){if(!i["parse-positional-numbers"]&&D==="_")return C;if(!j(D,p.strings)&&!j(D,p.bools)&&!Array.isArray(C)){if(Ns(C)&&i["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${C}`)))||!$e(C)&&j(D,p.numbers))C=Number(C)}return C}function A(D){let C=Object.create(null);ve(C,p.aliases,a),Object.keys(p.configs).forEach(function(N){let O=D[N]||C[N];if(O)try{let E=null,G=bt.resolve(bt.cwd(),O),J=p.configs[N];if(typeof J==="function"){try{E=J(G)}catch(Z){E=Z}if(E instanceof Error){b=E;return}}else E=bt.require(G);L(E)}catch(E){if(E.name==="PermissionDenied")b=E;else if(D[N])b=Error(m("Invalid JSON config file: %s",O))}})}function L(D,C){Object.keys(D).forEach(function(N){let O=D[N],E=C?C+"."+N:N;if(typeof O==="object"&&O!==null&&!Array.isArray(O)&&i["dot-notation"])L(O,E);else if(!ue(x,E.split("."))||j(E,p.arrays)&&i["combine-arrays"])B(E,O)})}function K(){if(typeof c<"u")c.forEach(function(D){L(D)})}function ce(D,C){if(typeof l>"u")return;let N=typeof l==="string"?l:"",O=bt.env();Object.keys(O).forEach(function(E){if(N===""||E.lastIndexOf(N,0)===0){let G=E.split("__").map(function(J,Z){if(Z===0)J=J.substring(N.length);return Qt(J)});if((C&&p.configs[G.join(".")]||!C)&&!ue(D,G))B(G.join("."),O[E])}})}function ie(D){let C,N=new Set;Object.keys(D).forEach(function(O){if(!N.has(O)){if(C=j(O,p.coercions),typeof C==="function")try{let E=T(O,C(D[O]));[].concat(p.aliases[O]||[],O).forEach((G)=>{N.add(G),D[G]=E})}catch(E){b=E}}})}function ye(D){return p.keys.forEach((C)=>{if(~C.indexOf("."))return;if(typeof D[C]>"u")D[C]=void 0}),D}function ve(D,C,N,O=!1){Object.keys(N).forEach(function(E){if(!ue(D,E.split("."))){if(V(D,E.split("."),N[E]),O)h[E]=!0;(C[E]||[]).forEach(function(G){if(ue(D,G.split(".")))return;V(D,G.split("."),N[E])})}})}function ue(D,C){let N=D;if(!i["dot-notation"])C=[C.join(".")];C.slice(0,-1).forEach(function(E){N=N[E]||{}});let O=C[C.length-1];if(typeof N!=="object")return!1;else return O in N}function V(D,C,N){let O=D;if(!i["dot-notation"])C=[C.join(".")];C.slice(0,-1).forEach(function(Te){if(Te=fc(Te),typeof O==="object"&&O[Te]===void 0)O[Te]={};if(typeof O[Te]!=="object"||Array.isArray(O[Te])){if(Array.isArray(O[Te]))O[Te].push({});else O[Te]=[O[Te],{}];O=O[Te][O[Te].length-1]}else O=O[Te]});let E=fc(C[C.length-1]),G=j(C.join("."),p.arrays),J=Array.isArray(N),Z=i["duplicate-arguments-array"];if(!Z&&j(E,p.nargs)){if(Z=!0,!$e(O[E])&&p.nargs[E]===1||Array.isArray(O[E])&&O[E].length===p.nargs[E])O[E]=void 0}if(N===hr())O[E]=hr(O[E]);else if(Array.isArray(O[E]))if(Z&&G&&J)O[E]=i["flatten-duplicate-arrays"]?O[E].concat(N):(Array.isArray(O[E][0])?O[E]:[O[E]]).concat([N]);else if(!Z&&Boolean(G)===Boolean(J))O[E]=N;else O[E]=O[E].concat([N]);else if(O[E]===void 0&&G)O[E]=J?N:[N];else if(Z&&!(O[E]===void 0||j(E,p.counts)||j(E,p.bools)))O[E]=[O[E],N];else O[E]=N}function le(...D){D.forEach(function(C){Object.keys(C||{}).forEach(function(N){if(p.aliases[N])return;p.aliases[N]=[].concat(r[N]||[]),p.aliases[N].concat(N).forEach(function(O){if(/-/.test(O)&&i["camel-case-expansion"]){let E=Qt(O);if(E!==N&&p.aliases[N].indexOf(E)===-1)p.aliases[N].push(E),f[E]=!0}}),p.aliases[N].concat(N).forEach(function(O){if(O.length>1&&/[A-Z]/.test(O)&&i["camel-case-expansion"]){let E=Ms(O,"-");if(E!==N&&p.aliases[N].indexOf(E)===-1)p.aliases[N].push(E),f[E]=!0}}),p.aliases[N].forEach(function(O){p.aliases[O]=[N].concat(p.aliases[N].filter(function(E){return O!==E}))})})})}function j(D,C){let N=[].concat(p.aliases[D]||[],D),O=Object.keys(C),E=N.find((G)=>O.includes(G));return E?C[E]:!1}function re(D){let C=Object.keys(p);return[].concat(C.map((O)=>p[O])).some(function(O){return Array.isArray(O)?O.includes(D):O[D]})}function te(D,...C){return[].concat(...C).some(function(O){let E=D.match(O);return E&&re(E[1])})}function v(D){if(D.match(g)||!D.match(/^-[^-]+/))return!1;let C=!0,N,O=D.slice(1).split("");for(let E=0;E<O.length;E++){if(N=D.slice(E+2),!re(O[E])){C=!1;break}if(O[E+1]&&O[E+1]==="="||N==="-"||/[A-Za-z]/.test(O[E])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(N)||O[E+1]&&O[E+1].match(/\W/))break}return C}function q(D){return i["unknown-options-as-args"]&&ne(D)}function ne(D){if(D=D.replace(/^-{3,}/,"--"),D.match(g))return!1;if(v(D))return!1;return!te(D,/^-+([^=]+?)=[\s\S]*$/,w,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}function U(D){if(!j(D,p.bools)&&!j(D,p.counts)&&`${D}`in a)return a[D];else return ge(Ee(D))}function ge(D){return{[nt.BOOLEAN]:!0,[nt.STRING]:"",[nt.NUMBER]:void 0,[nt.ARRAY]:[]}[D]}function Ee(D){let C=nt.BOOLEAN;if(j(D,p.strings))C=nt.STRING;else if(j(D,p.numbers))C=nt.NUMBER;else if(j(D,p.bools))C=nt.BOOLEAN;else if(j(D,p.arrays))C=nt.ARRAY;return C}function $e(D){return D===void 0}function ir(){Object.keys(p.counts).find((D)=>{if(j(D,p.arrays))return b=Error(m("Invalid configuration: %s, opts.count excludes opts.array.",D)),!0;else if(j(D,p.nargs))return b=Error(m("Invalid configuration: %s, opts.count excludes opts.narg.",D)),!0;return!1})}return{aliases:Object.assign({},p.aliases),argv:Object.assign(_,x),configuration:i,defaulted:Object.assign({},h),error:b,newAliases:Object.assign({},f)}}}function Hp(e){let t=[],n=Object.create(null),o=!0;Object.keys(e).forEach(function(s){t.push([].concat(e[s],s))});while(o){o=!1;for(let s=0;s<t.length;s++)for(let r=s+1;r<t.length;r++)if(t[s].filter(function(a){return t[r].indexOf(a)!==-1}).length){t[s]=t[s].concat(t[r]),t.splice(r,1),o=!0;break}}return t.forEach(function(s){s=s.filter(function(i,a,c){return c.indexOf(i)===a});let r=s.pop();if(r!==void 0&&typeof r==="string")n[r]=s}),n}function hr(e){return e!==void 0?e+1:1}function fc(e){if(e==="__proto__")return"___proto___";return e}function zp(e){return typeof e==="string"&&(e[0]==="'"||e[0]==='"')&&e[e.length-1]===e[0]?e.substring(1,e.length-1):e}import{readFileSync as Vp}from"fs";import{createRequire as pc}from"node:module";var mr,yr,wr,hc=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):20,gc=(yr=(mr=process===null||process===void 0?void 0:process.versions)===null||mr===void 0?void 0:mr.node)!==null&&yr!==void 0?yr:(wr=process===null||process===void 0?void 0:process.version)===null||wr===void 0?void 0:wr.slice(1);if(gc){if(Number(gc.match(/^([^.]+)/)[1])<hc)throw Error(`yargs parser supports a minimum Node.js version of ${hc}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}var Zp=process?process.env:{},mc=pc?pc(import.meta.url):void 0,yc=new gr({cwd:process.cwd,env:()=>Zp,format:Gp,normalize:Yp,resolve:Xp,require:(e)=>{if(typeof mc<"u")return mc(e);else if(e.match(/\.json$/))return JSON.parse(Vp(e,"utf8"));else throw Error("only .json config files are supported in ESM")}}),Gn=function(t,n){return yc.parse(t.slice(),n).argv};Gn.detailed=function(e,t){return yc.parse(e.slice(),t)};Gn.camelCase=Qt;Gn.decamelize=Ms;Gn.looksLikeNumber=Ns;var br=Gn;import{basename as uh,dirname as dh,extname as fh,relative as ph,resolve as Cc,join as hh}from"path";function wc(){if(Qp())return 0;return 1}function Qp(){return eh()&&!process.defaultApp}function eh(){return!!process.versions.electron}function Dr(e){return e.slice(wc()+1)}function bc(){return process.argv[wc()]}import{readFileSync as th,statSync as nh,writeFile as sh}from"fs";import{format as oh}from"util";import{resolve as rh}from"path";var Dc={fs:{readFileSync:th,writeFile:sh},format:oh,resolve:rh,exists:(e)=>{try{return nh(e).isFile()}catch(t){return!1}}};var ut;class kc{constructor(e){e=e||{},this.directory=e.directory||"./locales",this.updateFiles=typeof e.updateFiles==="boolean"?e.updateFiles:!0,this.locale=e.locale||"en",this.fallbackToLanguage=typeof e.fallbackToLanguage==="boolean"?e.fallbackToLanguage:!0,this.cache=Object.create(null),this.writeQueue=[]}__(...e){if(typeof arguments[0]!=="string")return this._taggedLiteral(arguments[0],...arguments);let t=e.shift(),n=function(){};if(typeof e[e.length-1]==="function")n=e.pop();if(n=n||function(){},!this.cache[this.locale])this._readLocaleFile();if(!this.cache[this.locale][t]&&this.updateFiles)this.cache[this.locale][t]=t,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n});else n();return ut.format.apply(ut.format,[this.cache[this.locale][t]||t].concat(e))}__n(){let e=Array.prototype.slice.call(arguments),t=e.shift(),n=e.shift(),o=e.shift(),s=function(){};if(typeof e[e.length-1]==="function")s=e.pop();if(!this.cache[this.locale])this._readLocaleFile();let r=o===1?t:n;if(this.cache[this.locale][t])r=this.cache[this.locale][t][o===1?"one":"other"];if(!this.cache[this.locale][t]&&this.updateFiles)this.cache[this.locale][t]={one:t,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:s});else s();let i=[r];if(~r.indexOf("%d"))i.push(o);return ut.format.apply(ut.format,i.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){if(!this.cache[this.locale])this._readLocaleFile();for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t))this.cache[this.locale][t]=e[t]}_taggedLiteral(e,...t){let n="";return e.forEach(function(o,s){let r=t[s+1];if(n+=o,typeof r<"u")n+="%s"}),this.__.apply(this,[n].concat([].slice.call(t,1)))}_enqueueWrite(e){if(this.writeQueue.push(e),this.writeQueue.length===1)this._processWriteQueue()}_processWriteQueue(){let e=this,t=this.writeQueue[0],{directory:n,locale:o,cb:s}=t,r=this._resolveLocaleFile(n,o),i=JSON.stringify(this.cache[o],null,2);ut.fs.writeFile(r,i,"utf-8",function(a){if(e.writeQueue.shift(),e.writeQueue.length>0)e._processWriteQueue();s(a)})}_readLocaleFile(){let e={},t=this._resolveLocaleFile(this.directory,this.locale);try{if(ut.fs.readFileSync)e=JSON.parse(ut.fs.readFileSync(t,"utf-8"))}catch(n){if(n instanceof SyntaxError)n.message="syntax error in "+t;if(n.code==="ENOENT")e={};else throw n}this.cache[this.locale]=e}_resolveLocaleFile(e,t){let n=ut.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){let o=ut.resolve(e,"./",t.split("_")[0]+".json");if(this._fileExistsSync(o))n=o}return n}_fileExistsSync(e){return ut.exists(e)}}function xc(e,t){ut=t;let n=new kc(e);return{__:n.__.bind(n),__n:n.__n.bind(n),setLocale:n.setLocale.bind(n),getLocale:n.getLocale.bind(n),updateLocale:n.updateLocale.bind(n),locale:n.locale}}var ih=(e)=>xc(e,Dc),Sc=ih;var Fc=Pa(_c(),1);import{createRequire as gh}from"node:module";import{readFileSync as mh,readdirSync as yh}from"node:fs";var kr=$c(import.meta.url),wh=kr.substring(0,kr.lastIndexOf("node_modules")),bh=gh(import.meta.url),xr={assert:{notStrictEqual:ah,strictEqual:ch},cliui:fr,findUp:pr,getEnv:(e)=>process.env[e],inspect:lh,getProcessArgvBin:bc,mainFilename:wh||process.cwd(),Parser:br,path:{basename:uh,dirname:dh,extname:fh,relative:ph,resolve:Cc,join:hh},process:{argv:()=>process.argv,cwd:process.cwd,emitWarning:(e,t)=>process.emitWarning(e,t),execPath:()=>process.execPath,exit:(e)=>{process.exit(e)},nextTick:process.nextTick,stdColumns:typeof process.stdout.columns<"u"?process.stdout.columns:null},readFileSync:mh,readdirSync:yh,require:bh,getCallerFile:()=>{let e=Fc.default(3);return e.match(/^file:\/\//)?$c(e):e},stringWidth:lt,y18n:Sc({directory:Cc(kr,"../../../locales"),updateFiles:!1})};function je(e,t,n,o){n.assert.notStrictEqual(e,t,o)}function Sr(e,t){t.assert.strictEqual(typeof e,"string")}function _n(e){return Object.keys(e)}function me(e){return!!e&&!!e.then&&typeof e.then==="function"}class _e extends Error{constructor(e){super(e||"yargs error");if(this.name="YError",Error.captureStackTrace)Error.captureStackTrace(this,_e)}}function At(e){let n=e.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),o=/\.*[\][<>]/g,s=n.shift();if(!s)throw Error(`No command found in: ${e}`);let r={cmd:s.replace(o,""),demanded:[],optional:[]};return n.forEach((i,a)=>{let c=!1;if(i=i.replace(/\s/g,""),/\.+[\]>]/.test(i)&&a===n.length-1)c=!0;if(/^\[/.test(i))r.optional.push({cmd:i.replace(o,"").split("|"),variadic:c});else r.demanded.push({cmd:i.replace(o,"").split("|"),variadic:c})}),r}var Dh=["first","second","third","fourth","fifth","sixth"];function H(e,t,n){function o(){return typeof e==="object"?[{demanded:[],optional:[]},e,t]:[At(`cmd ${e}`),t,n]}try{let s=0,[r,i,a]=o(),c=[].slice.call(i);while(c.length&&c[c.length-1]===void 0)c.pop();let l=a||c.length;if(l<r.demanded.length)throw new _e(`Not enough arguments provided. Expected ${r.demanded.length} but received ${c.length}.`);let u=r.demanded.length+r.optional.length;if(l>u)throw new _e(`Too many arguments provided. Expected max ${u} but received ${l}.`);r.demanded.forEach((d)=>{let f=c.shift(),h=Ac(f);if(d.cmd.filter((p)=>p===h||p==="*").length===0)Tc(h,d.cmd,s);s+=1}),r.optional.forEach((d)=>{if(c.length===0)return;let f=c.shift(),h=Ac(f);if(d.cmd.filter((p)=>p===h||p==="*").length===0)Tc(h,d.cmd,s);s+=1})}catch(s){console.warn(s.stack)}}function Ac(e){if(Array.isArray(e))return"array";else if(e===null)return"null";return typeof e}function Tc(e,t,n){throw new _e(`Invalid ${Dh[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class Er{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,o=!1){if(H("<array|function> [boolean] [boolean] [boolean]",[e,t,n],arguments.length),Array.isArray(e)){for(let s=0;s<e.length;s++){if(typeof e[s]!=="function")throw Error("middleware must be a function");let r=e[s];r.applyBeforeValidation=t,r.global=n}Array.prototype.push.apply(this.globalMiddleware,e)}else if(typeof e==="function"){let s=e;s.applyBeforeValidation=t,s.global=n,s.mutates=o,this.globalMiddleware.push(e)}return this.yargs}addCoerceMiddleware(e,t){let n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((o)=>{let s=[...n[t]||[],t];if(!o.option)return!0;else return!s.includes(o.option)}),e.option=t,this.addMiddleware(e,!0,!0,!0)}getMiddleware(){return this.globalMiddleware}freeze(){this.frozens.push([...this.globalMiddleware])}unfreeze(){let e=this.frozens.pop();if(e!==void 0)this.globalMiddleware=e}reset(){this.globalMiddleware=this.globalMiddleware.filter((e)=>e.global)}}function Ic(e){if(!e)return[];return e.map((t)=>(t.applyBeforeValidation=!1,t))}function en(e,t,n,o){return n.reduce((s,r)=>{if(r.applyBeforeValidation!==o)return s;if(r.mutates){if(r.applied)return s;r.applied=!0}if(me(s))return s.then((i)=>Promise.all([i,r(i,t)])).then(([i,a])=>Object.assign(i,a));else{let i=r(s,t);return me(i)?i.then((a)=>Object.assign(s,a)):Object.assign(s,i)}},e)}function tn(e,t,n=(o)=>{throw o}){try{let o=kh(e)?e():e;return me(o)?o.then((s)=>t(s)):t(o)}catch(o){return n(o)}}function kh(e){return typeof e==="function"}var Cn=/(^\*)|(^\$0)/;class Oc{constructor(e,t,n,o){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=o,this.usage=e,this.globalMiddleware=n,this.validation=t}addDirectory(e,t,n,o){o=o||{},this.requireCache.add(n);let s=this.shim.path.resolve(this.shim.path.dirname(n),e),r=this.shim.readdirSync(s,{recursive:o.recurse?!0:!1});if(!Array.isArray(o.extensions))o.extensions=["js"];let i=typeof o.visit==="function"?o.visit:(a)=>a;for(let a of r){let c=a.toString();if(o.exclude){let u=!1;if(typeof o.exclude==="function")u=o.exclude(c);else u=o.exclude.test(c);if(u)continue}if(o.include){let u=!1;if(typeof o.include==="function")u=o.include(c);else u=o.include.test(c);if(!u)continue}let l=!1;for(let u of o.extensions)if(c.endsWith(u))l=!0;if(l){let u=this.shim.path.join(s,c),d=t(u),f=Object.create(null,Object.getOwnPropertyDescriptors({...d}));if(i(f,u,c)){if(this.requireCache.has(u))continue;else this.requireCache.add(u);if(!f.command)f.command=this.shim.path.basename(u,this.shim.path.extname(u));this.addHandler(f)}}}}addHandler(e,t,n,o,s,r){let i=[],a=Ic(s);if(o=o||(()=>{}),Array.isArray(e))if(xh(e))[e,...i]=e;else for(let c of e)this.addHandler(c);else if(Eh(e)){let c=Array.isArray(e.command)||typeof e.command==="string"?e.command:null;if(c===null)throw Error(`No command name given for module: ${this.shim.inspect(e)}`);if(e.aliases)c=[].concat(c).concat(e.aliases);this.addHandler(c,this.extractDesc(e),e.builder,e.handler,e.middlewares,e.deprecated);return}else if(Rc(n)){this.addHandler([e].concat(i),t,n.builder,n.handler,n.middlewares,n.deprecated);return}if(typeof e==="string"){let c=At(e);i=i.map((d)=>At(d).cmd);let l=!1,u=[c.cmd].concat(i).filter((d)=>{if(Cn.test(d))return l=!0,!1;return!0});if(u.length===0&&l)u.push("$0");if(l)c.cmd=u[0],i=u.slice(1),e=e.replace(Cn,c.cmd);if(i.forEach((d)=>{this.aliasMap[d]=c.cmd}),t!==!1)this.usage.command(e,t,l,i,r);if(this.handlers[c.cmd]={original:e,description:t,handler:o,builder:n||{},middlewares:a,deprecated:r,demanded:c.demanded,optional:c.optional},l)this.defaultCommand=this.handlers[c.cmd]}}getCommandHandlers(){return this.handlers}getCommands(){return Object.keys(this.handlers).concat(Object.keys(this.aliasMap))}hasDefaultCommand(){return!!this.defaultCommand}runCommand(e,t,n,o,s,r){let i=this.handlers[e]||this.handlers[this.aliasMap[e]]||this.defaultCommand,a=t.getInternalMethods().getContext(),c=a.commands.slice(),l=!e;if(e)a.commands.push(e),a.fullCommands.push(i.original);let u=this.applyBuilderUpdateUsageAndParse(l,i,t,n.aliases,c,o,s,r);return me(u)?u.then((d)=>this.applyMiddlewareAndGetResult(l,i,d.innerArgv,a,s,d.aliases,t)):this.applyMiddlewareAndGetResult(l,i,u.innerArgv,a,s,u.aliases,t)}applyBuilderUpdateUsageAndParse(e,t,n,o,s,r,i,a){let c=t.builder,l=n;if(js(c)){n.getInternalMethods().getUsageInstance().freeze();let u=c(n.getInternalMethods().reset(o),a);if(me(u))return u.then((d)=>(l=vc(d)?d:n,this.parseAndUpdateUsage(e,t,l,s,r,i)))}else if(Sh(c))n.getInternalMethods().getUsageInstance().freeze(),l=n.getInternalMethods().reset(o),Object.keys(t.builder).forEach((u)=>{l.option(u,c[u])});return this.parseAndUpdateUsage(e,t,l,s,r,i)}parseAndUpdateUsage(e,t,n,o,s,r){if(e)n.getInternalMethods().getUsageInstance().unfreeze(!0);if(this.shouldUpdateUsage(n))n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(o,t),t.description);let i=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,s,r);return me(i)?i.then((a)=>({aliases:n.parsed.aliases,innerArgv:a})):{aliases:n.parsed.aliases,innerArgv:i}}shouldUpdateUsage(e){return!e.getInternalMethods().getUsageInstance().getUsageDisabled()&&e.getInternalMethods().getUsageInstance().getUsage().length===0}usageFromParentCommandsCommandHandler(e,t){let n=Cn.test(t.original)?t.original.replace(Cn,"").trim():t.original,o=e.filter((s)=>!Cn.test(s));return o.push(n),`$0 ${o.join(" ")}`}handleValidationAndGetResult(e,t,n,o,s,r,i,a){if(!r.getInternalMethods().getHasOutput()){let c=r.getInternalMethods().runValidation(s,a,r.parsed.error,e);n=tn(n,(l)=>(c(l),l))}if(t.handler&&!r.getInternalMethods().getHasOutput()){r.getInternalMethods().setHasOutput();let c=!!r.getOptions().configuration["populate--"];if(r.getInternalMethods().postProcess(n,c,!1,!1),n=en(n,r,i,!1),n=tn(n,(l)=>{let u=t.handler(l);return me(u)?u.then(()=>l):l}),!e)r.getInternalMethods().getUsageInstance().cacheHelpMessage();if(me(n)&&!r.getInternalMethods().hasParseCallback())n.catch((l)=>{try{r.getInternalMethods().getUsageInstance().fail(null,l)}catch(u){}})}if(!e)o.commands.pop(),o.fullCommands.pop();return n}applyMiddlewareAndGetResult(e,t,n,o,s,r,i){let a={};if(s)return n;if(!i.getInternalMethods().getHasOutput())a=this.populatePositionals(t,n,o,i);let c=this.globalMiddleware.getMiddleware().slice(0).concat(t.middlewares),l=en(n,i,c,!0);return me(l)?l.then((u)=>this.handleValidationAndGetResult(e,t,u,o,r,i,c,a)):this.handleValidationAndGetResult(e,t,l,o,r,i,c,a)}populatePositionals(e,t,n,o){t._=t._.slice(n.commands.length);let s=e.demanded.slice(0),r=e.optional.slice(0),i={};this.validation.positionalCount(s.length,t._.length);while(s.length){let a=s.shift();this.populatePositional(a,t,i)}while(r.length){let a=r.shift();this.populatePositional(a,t,i)}return t._=n.commands.concat(t._.map((a)=>""+a)),this.postProcessPositionals(t,i,this.cmdToParseOptions(e.original),o),i}populatePositional(e,t,n){let o=e.cmd[0];if(e.variadic)n[o]=t._.splice(0).map(String);else if(t._.length)n[o]=[String(t._.shift())]}cmdToParseOptions(e){let t={array:[],default:{},alias:{},demand:{}},n=At(e);return n.demanded.forEach((o)=>{let[s,...r]=o.cmd;if(o.variadic)t.array.push(s),t.default[s]=[];t.alias[s]=r,t.demand[s]=!0}),n.optional.forEach((o)=>{let[s,...r]=o.cmd;if(o.variadic)t.array.push(s),t.default[s]=[];t.alias[s]=r}),t}postProcessPositionals(e,t,n,o){let s=Object.assign({},o.getOptions());s.default=Object.assign(n.default,s.default);for(let c of Object.keys(n.alias))s.alias[c]=(s.alias[c]||[]).concat(n.alias[c]);s.array=s.array.concat(n.array),s.config={};let r=[];if(Object.keys(t).forEach((c)=>{t[c].map((l)=>{if(s.configuration["unknown-options-as-args"])s.key[c]=!0;r.push(`--${c}`),r.push(l)})}),!r.length)return;let i=Object.assign({},s.configuration,{"populate--":!1}),a=this.shim.Parser.detailed(r,Object.assign({},s,{configuration:i}));if(a.error)o.getInternalMethods().getUsageInstance().fail(a.error.message,a.error);else{let c=Object.keys(t);Object.keys(t).forEach((l)=>{c.push(...a.aliases[l])}),Object.keys(a.argv).forEach((l)=>{if(c.includes(l)){if(!t[l])t[l]=a.argv[l];if(!this.isInConfigs(o,l)&&!this.isDefaulted(o,l)&&Object.prototype.hasOwnProperty.call(e,l)&&Object.prototype.hasOwnProperty.call(a.argv,l)&&(Array.isArray(e[l])||Array.isArray(a.argv[l])))e[l]=[].concat(e[l],a.argv[l]);else e[l]=a.argv[l]}})}}isDefaulted(e,t){let{default:n}=e.getOptions();return Object.prototype.hasOwnProperty.call(n,t)||Object.prototype.hasOwnProperty.call(n,this.shim.Parser.camelCase(t))}isInConfigs(e,t){let{configObjects:n}=e.getOptions();return n.some((o)=>Object.prototype.hasOwnProperty.call(o,t))||n.some((o)=>Object.prototype.hasOwnProperty.call(o,this.shim.Parser.camelCase(t)))}runDefaultBuilderOn(e){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(e)){let n=Cn.test(this.defaultCommand.original)?this.defaultCommand.original:this.defaultCommand.original.replace(/^[^[\]<>]*/,"$0 ");e.getInternalMethods().getUsageInstance().usage(n,this.defaultCommand.description)}let t=this.defaultCommand.builder;if(js(t))return t(e,!0);else if(!Rc(t))Object.keys(t).forEach((n)=>{e.option(n,t[n])});return}extractDesc({describe:e,description:t,desc:n}){for(let o of[e,t,n]){if(typeof o==="string"||o===!1)return o;je(o,!0,this.shim)}return!1}freeze(){this.frozens.push({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand})}unfreeze(){let e=this.frozens.pop();je(e,void 0,this.shim),{handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand}=e}reset(){return this.handlers={},this.aliasMap={},this.defaultCommand=void 0,this.requireCache=new Set,this}}function Pc(e,t,n,o){return new Oc(e,t,n,o)}function Rc(e){return typeof e==="object"&&!!e.builder&&typeof e.handler==="function"}function xh(e){return e.every((t)=>typeof t==="string")}function js(e){return typeof e==="function"}function Sh(e){return typeof e==="object"}function Eh(e){return typeof e==="object"&&!Array.isArray(e)}function Tt(e={},t=()=>!0){let n={};return _n(e).forEach((o)=>{if(t(o,e[o]))n[o]=e[o]}),n}function It(e){if(typeof process>"u")return;[process.stdout,process.stderr].forEach((t)=>{let n=t;if(n._handle&&n.isTTY&&typeof n._handle.setBlocking==="function")n._handle.setBlocking(e)})}function _h(e){return typeof e==="boolean"}function Bc(e,t){let n=t.y18n.__,o={},s=[];o.failFn=function(T){s.push(T)};let r=null,i=null,a=!0;o.showHelpOnFail=function(T=!0,A){let[L,K]=typeof T==="string"?[!0,T]:[T,A];if(e.getInternalMethods().isGlobalContext())i=K;return r=K,a=L,o};let c=!1;o.fail=function(T,A){let L=e.getInternalMethods().getLoggerInstance();if(s.length)for(let K=s.length-1;K>=0;--K){let ce=s[K];if(_h(ce)){if(A)throw A;else if(T)throw Error(T)}else ce(T,A,o)}else{if(e.getExitProcess())It(!0);if(!c){if(c=!0,a)e.showHelp("error"),L.error();if(T||A)L.error(T||A);let K=r||i;if(K){if(T||A)L.error("");L.error(K)}}if(A=A||new _e(T),e.getExitProcess())return e.exit(1);else if(e.getInternalMethods().hasParseCallback())return e.exit(1,A);else throw A}};let l=[],u=!1;o.usage=(P,T)=>{if(P===null)return u=!0,l=[],o;return u=!1,l.push([P,T||""]),o},o.getUsage=()=>l,o.getUsageDisabled=()=>u,o.getPositionalGroupName=()=>n("Positionals:");let d=[];o.example=(P,T)=>{d.push([P,T||""])};let f=[];o.command=function(T,A,L,K,ce=!1){if(L)f=f.map((ie)=>(ie[2]=!1,ie));f.push([T,A||"",L,K,ce])},o.getCommands=()=>f;let h={};o.describe=function(T,A){if(Array.isArray(T))T.forEach((L)=>{o.describe(L,A)});else if(typeof T==="object")Object.keys(T).forEach((L)=>{o.describe(L,T[L])});else h[T]=A},o.getDescriptions=()=>h;let m=[];o.epilog=(P)=>{m.push(P)};let p=!1,g;o.wrap=(P)=>{p=!0,g=P},o.getWrap=()=>{if(t.getEnv("YARGS_DISABLE_WRAP"))return null;if(!p)g=S(),p=!0;return g};let w="__yargsString__:";o.deferY18nLookup=(P)=>w+P,o.help=function(){if(x)return x;k();let T=e.customScriptName?e.$0:t.path.basename(e.$0),A=e.getDemandedOptions(),L=e.getDemandedCommands(),K=e.getDeprecatedOptions(),ce=e.getGroups(),ie=e.getOptions(),ye=[];ye=ye.concat(Object.keys(h)),ye=ye.concat(Object.keys(A)),ye=ye.concat(Object.keys(L)),ye=ye.concat(Object.keys(ie.default)),ye=ye.filter(F),ye=Object.keys(ye.reduce((v,q)=>{if(q!=="_")v[q]=!0;return v},{}));let ve=o.getWrap(),ue=t.cliui({width:ve,wrap:!!ve});if(!u){if(l.length)l.forEach((v)=>{if(ue.div({text:`${v[0].replace(/\$0/g,T)}`}),v[1])ue.div({text:`${v[1]}`,padding:[1,0,0,0]})}),ue.div();else if(f.length){let v=null;if(L._)v=`${T} <${n("command")}>
|
|
15
|
+
`;else v=`${T} [${n("command")}]
|
|
16
|
+
`;ue.div(`${v}`)}}if(f.length>1||f.length===1&&!f[0][2]){ue.div(n("Commands:"));let v=e.getInternalMethods().getContext(),q=v.commands.length?`${v.commands.join(" ")} `:"";if(e.getInternalMethods().getParserConfiguration()["sort-commands"]===!0)f=f.sort((U,ge)=>U[0].localeCompare(ge[0]));let ne=T?`${T} `:"";f.forEach((U)=>{let ge=`${ne}${q}${U[0].replace(/^\$0 ?/,"")}`;ue.span({text:ge,padding:[0,2,0,2],width:b(f,ve,`${T}${q}`)+4},{text:U[1]});let Ee=[];if(U[2])Ee.push(`[${n("default")}]`);if(U[3]&&U[3].length)Ee.push(`[${n("aliases:")} ${U[3].join(", ")}]`);if(U[4])if(typeof U[4]==="string")Ee.push(`[${n("deprecated: %s",U[4])}]`);else Ee.push(`[${n("deprecated")}]`);if(Ee.length)ue.div({text:Ee.join(" "),padding:[0,0,0,2],align:"right"});else ue.div()}),ue.div()}let V=(Object.keys(ie.alias)||[]).concat(Object.keys(e.parsed.newAliases)||[]);ye=ye.filter((v)=>!e.parsed.newAliases[v]&&V.every((q)=>(ie.alias[q]||[]).indexOf(v)===-1));let le=n("Options:");if(!ce[le])ce[le]=[];_(ye,ie.alias,ce,le);let j=(v)=>/^--/.test(Ws(v)),re=Object.keys(ce).filter((v)=>ce[v].length>0).map((v)=>{let q=ce[v].filter(F).map((ne)=>{if(V.includes(ne))return ne;for(let U=0,ge;(ge=V[U])!==void 0;U++)if((ie.alias[ge]||[]).includes(ne))return ge;return ne});return{groupName:v,normalizedKeys:q}}).filter(({normalizedKeys:v})=>v.length>0).map(({groupName:v,normalizedKeys:q})=>{let ne=q.reduce((U,ge)=>(U[ge]=[ge].concat(ie.alias[ge]||[]).map((Ee)=>{if(v===o.getPositionalGroupName())return Ee;else return(/^[0-9]$/.test(Ee)?ie.boolean.includes(ge)?"-":"--":Ee.length>1?"--":"-")+Ee}).sort((Ee,$e)=>j(Ee)===j($e)?0:j(Ee)?1:-1).join(", "),U),{});return{groupName:v,normalizedKeys:q,switches:ne}});if(re.filter(({groupName:v})=>v!==o.getPositionalGroupName()).some(({normalizedKeys:v,switches:q})=>!v.every((ne)=>j(q[ne]))))re.filter(({groupName:v})=>v!==o.getPositionalGroupName()).forEach(({normalizedKeys:v,switches:q})=>{v.forEach((ne)=>{if(j(q[ne]))q[ne]=Ch(q[ne],4)})});if(re.forEach(({groupName:v,normalizedKeys:q,switches:ne})=>{ue.div(v),q.forEach((U)=>{let ge=ne[U],Ee=h[U]||"",$e=null;if(Ee.includes(w))Ee=n(Ee.substring(w.length));if(ie.boolean.includes(U))$e=`[${n("boolean")}]`;if(ie.count.includes(U))$e=`[${n("count")}]`;if(ie.string.includes(U))$e=`[${n("string")}]`;if(ie.normalize.includes(U))$e=`[${n("string")}]`;if(ie.array.includes(U))$e=`[${n("array")}]`;if(ie.number.includes(U))$e=`[${n("number")}]`;let ir=(N)=>typeof N==="string"?`[${n("deprecated: %s",N)}]`:`[${n("deprecated")}]`,D=[U in K?ir(K[U]):null,$e,U in A?`[${n("required")}]`:null,ie.choices&&ie.choices[U]?`[${n("choices:")} ${o.stringifiedValues(ie.choices[U])}]`:null,I(ie.default[U],ie.defaultDescription[U])].filter(Boolean).join(" ");ue.span({text:Ws(ge),padding:[0,2,0,2+Lc(ge)],width:b(ne,ve)+4},Ee);let C=e.getInternalMethods().getUsageConfiguration()["hide-types"]===!0;if(D&&!C)ue.div({text:D,padding:[0,0,0,2],align:"right"});else ue.div()}),ue.div()}),d.length)ue.div(n("Examples:")),d.forEach((v)=>{v[0]=v[0].replace(/\$0/g,T)}),d.forEach((v)=>{if(v[1]==="")ue.div({text:v[0],padding:[0,2,0,2]});else ue.div({text:v[0],padding:[0,2,0,2],width:b(d,ve)+4},{text:v[1]})}),ue.div();if(m.length>0){let v=m.map((q)=>q.replace(/\$0/g,T)).join(`
|
|
17
|
+
`);ue.div(`${v}
|
|
18
|
+
`)}return ue.toString().replace(/\s*$/,"")};function b(P,T,A){let L=0;if(!Array.isArray(P))P=Object.values(P).map((K)=>[K]);if(P.forEach((K)=>{L=Math.max(t.stringWidth(A?`${A} ${Ws(K[0])}`:Ws(K[0]))+Lc(K[0]),L)}),T)L=Math.min(L,parseInt((T*0.5).toString(),10));return L}function k(){let P=e.getDemandedOptions(),T=e.getOptions();(Object.keys(T.alias)||[]).forEach((A)=>{T.alias[A].forEach((L)=>{if(h[L])o.describe(A,h[L]);if(L in P)e.demandOption(A,P[L]);if(T.boolean.includes(L))e.boolean(A);if(T.count.includes(L))e.count(A);if(T.string.includes(L))e.string(A);if(T.normalize.includes(L))e.normalize(A);if(T.array.includes(L))e.array(A);if(T.number.includes(L))e.number(A)})})}let x;o.cacheHelpMessage=function(){x=this.help()},o.clearCachedHelpMessage=function(){x=void 0},o.hasCachedHelpMessage=function(){return!!x};function _(P,T,A,L){let K=[],ce=null;return Object.keys(A).forEach((ie)=>{K=K.concat(A[ie])}),P.forEach((ie)=>{if(ce=[ie].concat(T[ie]),!ce.some((ye)=>K.indexOf(ye)!==-1))A[L].push(ie)}),K}function F(P){return e.getOptions().hiddenOptions.indexOf(P)<0||e.parsed.argv[e.getOptions().showHiddenOpt]}o.showHelp=(P)=>{let T=e.getInternalMethods().getLoggerInstance();if(!P)P="error";(typeof P==="function"?P:T[P])(o.help())},o.functionDescription=(P)=>["(",P.name?t.Parser.decamelize(P.name,"-"):n("generated-value"),")"].join(""),o.stringifiedValues=function(T,A){let L="",K=A||", ",ce=[].concat(T);if(!T||!ce.length)return L;return ce.forEach((ie)=>{if(L.length)L+=K;L+=JSON.stringify(ie)}),L};function I(P,T){let A=`[${n("default:")} `;if(P===void 0&&!T)return null;if(T)A+=T;else switch(typeof P){case"string":A+=`"${P}"`;break;case"object":A+=JSON.stringify(P);break;default:A+=P}return`${A}]`}function S(){if(t.process.stdColumns)return Math.min(80,t.process.stdColumns);else return 80}let B=null;o.version=(P)=>{B=P},o.showVersion=(P)=>{let T=e.getInternalMethods().getLoggerInstance();if(!P)P="error";(typeof P==="function"?P:T[P])(B)},o.reset=function(T){return r=null,c=!1,l=[],u=!1,m=[],d=[],f=[],h=Tt(h,(A)=>!T[A]),o};let W=[];return o.freeze=function(){W.push({failMessage:r,failureOutput:c,usages:l,usageDisabled:u,epilogs:m,examples:d,commands:f,descriptions:h})},o.unfreeze=function(T=!1){let A=W.pop();if(!A)return;if(T)h={...A.descriptions,...h},f=[...A.commands,...f],l=[...A.usages,...l],d=[...A.examples,...d],m=[...A.epilogs,...m];else({failMessage:r,failureOutput:c,usages:l,usageDisabled:u,epilogs:m,examples:d,commands:f,descriptions:h}=A)},o}function _r(e){return typeof e==="object"}function Ch(e,t){return _r(e)?{text:e.text,indentation:e.indentation+t}:{text:e,indentation:t}}function Lc(e){return _r(e)?e.indentation:0}function Ws(e){return _r(e)?e.text:e}var Mc=`###-begin-{{app_name}}-completions-###
|
|
19
19
|
#
|
|
20
20
|
# yargs command completion script
|
|
21
21
|
#
|
|
@@ -44,7 +44,7 @@ _{{app_name}}_yargs_completions()
|
|
|
44
44
|
}
|
|
45
45
|
complete -o bashdefault -o default -F _{{app_name}}_yargs_completions {{app_name}}
|
|
46
46
|
###-end-{{app_name}}-completions-###
|
|
47
|
-
`,
|
|
47
|
+
`,Nc=`#compdef {{app_name}}
|
|
48
48
|
###-begin-{{app_name}}-completions-###
|
|
49
49
|
#
|
|
50
50
|
# yargs command completion script
|
|
@@ -71,24 +71,24 @@ else
|
|
|
71
71
|
compdef _{{app_name}}_yargs_completions {{app_name}}
|
|
72
72
|
fi
|
|
73
73
|
###-end-{{app_name}}-completions-###
|
|
74
|
-
`;class
|
|
75
|
-
${
|
|
76
|
-
`)}`:"";t.fail(s("Missing required argument: %s","Missing required arguments: %s",Object.keys(h).length,Object.keys(h).join(", ")+
|
|
77
|
-
${o("Argument: %s, Given: %s, Choices: %s",g,t.stringifiedValues(h[g]),t.stringifiedValues(
|
|
78
|
-
`;p.forEach((y)=>{h+=y}),t.fail(h)}};let c={};r.conflicts=function(d,p){if(J("<string|object> [array|string]",[d,p],arguments.length),typeof d==="object")Object.keys(d).forEach((h)=>{r.conflicts(h,d[h])});else{if(e.global(d),!c[d])c[d]=[];if(Array.isArray(p))p.forEach((h)=>r.conflicts(d,h));else c[d].push(p)}},r.getConflicting=()=>c,r.conflicting=function(d){if(Object.keys(d).forEach((p)=>{if(c[p])c[p].forEach((h)=>{if(h&&d[p]!==void 0&&d[h]!==void 0)t.fail(o("Arguments %s and %s are mutually exclusive",p,h))})}),e.getInternalMethods().getParserConfiguration()["strip-dashed"])Object.keys(c).forEach((p)=>{c[p].forEach((h)=>{if(h&&d[n.Parser.camelCase(p)]!==void 0&&d[n.Parser.camelCase(h)]!==void 0)t.fail(o("Arguments %s and %s are mutually exclusive",p,h))})})},r.recommendCommands=function(d,p){p=p.sort((g,w)=>w.length-g.length);let y=null,f=1/0;for(let g=0,w;(w=p[g])!==void 0;g++){let D=kc(d,w);if(D<=3&&D<f)f=D,y=w}if(y)t.fail(o("Did you mean %s?",y))},r.reset=function(d){return i=xt(i,(p)=>!d[p]),c=xt(c,(p)=>!d[p]),r};let l=[];return r.freeze=function(){l.push({implied:i,conflicting:c})},r.unfreeze=function(){let d=l.pop();Re(d,void 0,n),{implied:i,conflicting:c}=d},r}var hr=[],Mn;function jn(e,t,n,o){Mn=o;let s={};if(Object.prototype.hasOwnProperty.call(e,"extends")){if(typeof e.extends!=="string")return s;let r=/\.json|\..*rc$/.test(e.extends),i=null;if(!r)try{i=import.meta.resolve(e.extends)}catch(a){return e}else i=Zp(t,e.extends);Vp(i),hr.push(i),s=r?JSON.parse(Mn.readFileSync(i,"utf8")):o.require(e.extends),delete e.extends,s=jn(s,Mn.path.dirname(i),n,Mn)}return hr=[],n?Sc(s,e):Object.assign({},s,e)}function Vp(e){if(hr.indexOf(e)>-1)throw new ye(`Circular extended configurations: '${e}'.`)}function Zp(e,t){return Mn.path.resolve(e,t)}function Sc(e,t){let n={};function o(s){return s&&typeof s==="object"&&!Array.isArray(s)}Object.assign(n,e);for(let s of Object.keys(t))if(o(t[s])&&o(n[s]))n[s]=Sc(e[s],t[s]);else n[s]=t[s];return n}var K=function(e,t,n,o,s){if(o==="m")throw TypeError("Private method is not writable");if(o==="a"&&!s)throw TypeError("Private accessor was defined without a setter");if(typeof t==="function"?e!==t||!s:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return o==="a"?s.call(e,n):s?s.value=n:t.set(e,n),n},m=function(e,t,n,o){if(n==="a"&&!o)throw TypeError("Private accessor was defined without a getter");if(typeof t==="function"?e!==t||!o:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?o:n==="a"?o.call(e):o?o.value:t.get(e)},we,Ht,Wn,ve,je,Rs,St,zt,Ps,Ge,vs,Ye,at,We,Xe,Bs,Gt,xe,z,Ls,Ns,Ue,Yt,yn,Xt,Ct,Ms,X,Vt,Zt,Qt,Q,js,ct,de;function Kc(e){return(t=[],n=e.process.cwd(),o)=>{let s=new qc(t,n,o,e);return Object.defineProperty(s,"argv",{get:()=>s.parse(),enumerable:!0}),s.help(),s.version(),s}}var Cc=Symbol("copyDoubleDash"),_c=Symbol("copyDoubleDash"),gr=Symbol("deleteFromParserHintObject"),$c=Symbol("emitWarning"),Fc=Symbol("freeze"),Ac=Symbol("getDollarZero"),en=Symbol("getParserConfiguration"),Tc=Symbol("getUsageConfiguration"),mr=Symbol("guessLocale"),Ic=Symbol("guessVersion"),Oc=Symbol("parsePositionalNumbers"),yr=Symbol("pkgUp"),_t=Symbol("populateParserHintArray"),wn=Symbol("populateParserHintSingleValueDictionary"),wr=Symbol("populateParserHintArrayDictionary"),Dr=Symbol("populateParserHintDictionary"),br=Symbol("sanitizeKey"),kr=Symbol("setKey"),xr=Symbol("unfreeze"),Rc=Symbol("validateAsync"),Pc=Symbol("getCommandInstance"),vc=Symbol("getContext"),Bc=Symbol("getHasOutput"),Lc=Symbol("getLoggerInstance"),Nc=Symbol("getParseContext"),Mc=Symbol("getUsageInstance"),jc=Symbol("getValidationInstance"),Ws=Symbol("hasParseCallback"),Wc=Symbol("isGlobalContext"),tn=Symbol("postProcess"),Uc=Symbol("rebase"),Er=Symbol("reset"),Un=Symbol("runYargsParserAndExecuteCommands"),Sr=Symbol("runValidation"),Jc=Symbol("setHasOutput"),nn=Symbol("kTrackManuallySetKeys"),Qp="en_US";class qc{constructor(e=[],t,n,o){this.customScriptName=!1,this.parsed=!1,we.set(this,void 0),Ht.set(this,void 0),Wn.set(this,{commands:[],fullCommands:[]}),ve.set(this,null),je.set(this,null),Rs.set(this,"show-hidden"),St.set(this,null),zt.set(this,!0),Ps.set(this,{}),Ge.set(this,!0),vs.set(this,[]),Ye.set(this,void 0),at.set(this,{}),We.set(this,!1),Xe.set(this,null),Bs.set(this,!0),Gt.set(this,void 0),xe.set(this,""),z.set(this,void 0),Ls.set(this,void 0),Ns.set(this,{}),Ue.set(this,null),Yt.set(this,null),yn.set(this,{}),Xt.set(this,{}),Ct.set(this,void 0),Ms.set(this,!1),X.set(this,void 0),Vt.set(this,!1),Zt.set(this,!1),Qt.set(this,!1),Q.set(this,void 0),js.set(this,{}),ct.set(this,null),de.set(this,void 0),K(this,X,o,"f"),K(this,Ct,e,"f"),K(this,Ht,t,"f"),K(this,Ls,n,"f"),K(this,Ye,new fr(this),"f"),this.$0=this[Ac](),this[Er](),K(this,we,m(this,we,"f"),"f"),K(this,Q,m(this,Q,"f"),"f"),K(this,de,m(this,de,"f"),"f"),K(this,z,m(this,z,"f"),"f"),m(this,z,"f").showHiddenOpt=m(this,Rs,"f"),K(this,Gt,this[_c](),"f"),m(this,X,"f").y18n.setLocale(Qp)}addHelpOpt(e,t){if(J("[string|boolean] [string]",[e,t],arguments.length),m(this,Xe,"f"))this[gr](m(this,Xe,"f")),K(this,Xe,null,"f");if(e===!1&&t===void 0)return this;return K(this,Xe,typeof e==="string"?e:"help","f"),this.boolean(m(this,Xe,"f")),this.describe(m(this,Xe,"f"),t||m(this,Q,"f").deferY18nLookup("Show help")),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(J("[string|boolean] [string]",[e,t],arguments.length),e===!1&&t===void 0)return this;let n=typeof e==="string"?e:m(this,Rs,"f");return this.boolean(n),this.describe(n,t||m(this,Q,"f").deferY18nLookup("Show hidden options")),m(this,z,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return J("<object|string|array> [string|array]",[e,t],arguments.length),this[wr](this.alias.bind(this),"alias",e,t),this}array(e){return J("<array|string>",[e],arguments.length),this[_t]("array",e),this[nn](e),this}boolean(e){return J("<array|string>",[e],arguments.length),this[_t]("boolean",e),this[nn](e),this}check(e,t){return J("<function> [boolean]",[e,t],arguments.length),this.middleware((n,o)=>qt(()=>e(n,o.getOptions()),(s)=>{if(!s)m(this,Q,"f").fail(m(this,X,"f").y18n.__("Argument check failed: %s",e.toString()));else if(typeof s==="string"||s instanceof Error)m(this,Q,"f").fail(s.toString(),s);return n},(s)=>(m(this,Q,"f").fail(s.message?s.message:s.toString(),s),n)),!1,t),this}choices(e,t){return J("<object|string|array> [string|array]",[e,t],arguments.length),this[wr](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(J("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new ye("coerce callback must be provided");for(let o of e)this.coerce(o,t);return this}else if(typeof e==="object"){for(let o of Object.keys(e))this.coerce(o,e[o]);return this}if(!t)throw new ye("coerce callback must be provided");let n=e;return m(this,z,"f").key[n]=!0,m(this,Ye,"f").addCoerceMiddleware((o,s)=>{var r;let i=(r=s.getAliases()[n])!==null&&r!==void 0?r:[],a=[n,...i].filter((c)=>Object.prototype.hasOwnProperty.call(o,c));if(a.length===0)return o;return qt(()=>t(o[a[0]]),(c)=>(a.forEach((l)=>{o[l]=c}),o),(c)=>{throw new ye(c.message)})},n),this}conflicts(e,t){return J("<string|object> [string|array]",[e,t],arguments.length),m(this,de,"f").conflicts(e,t),this}config(e="config",t,n){if(J("[object|string] [string|function] [function]",[e,t,n],arguments.length),typeof e==="object"&&!Array.isArray(e))return e=jn(e,m(this,Ht,"f"),this[en]()["deep-merge-config"]||!1,m(this,X,"f")),m(this,z,"f").configObjects=(m(this,z,"f").configObjects||[]).concat(e),this;if(typeof t==="function")n=t,t=void 0;return this.describe(e,t||m(this,Q,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((o)=>{m(this,z,"f").config[o]=n||!0}),this}completion(e,t,n){if(J("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),typeof t==="function")n=t,t=void 0;if(K(this,je,e||m(this,je,"f")||"completion","f"),!t&&t!==!1)t="generate completion script";if(this.command(m(this,je,"f"),t),n)m(this,ve,"f").registerFunction(n);return this}command(e,t,n,o,s,r){return J("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,o,s,r],arguments.length),m(this,we,"f").addHandler(e,t,n,o,s,r),this}commands(e,t,n,o,s,r){return this.command(e,t,n,o,s,r)}commandDir(e,t){J("<string> [object]",[e,t],arguments.length);let n=m(this,Ls,"f")||m(this,X,"f").require;return m(this,we,"f").addDirectory(e,n,m(this,X,"f").getCallerFile(),t),this}count(e){return J("<array|string>",[e],arguments.length),this[_t]("count",e),this[nn](e),this}default(e,t,n){if(J("<object|string|array> [*] [string]",[e,t,n],arguments.length),n)dr(e,m(this,X,"f")),m(this,z,"f").defaultDescription[e]=n;if(typeof t==="function"){if(dr(e,m(this,X,"f")),!m(this,z,"f").defaultDescription[e])m(this,z,"f").defaultDescription[e]=m(this,Q,"f").functionDescription(t);t=t.call()}return this[wn](this.default.bind(this),"default",e,t),this}defaults(e,t,n){return this.default(e,t,n)}demandCommand(e=1,t,n,o){if(J("[number] [number|string] [string|null|undefined] [string|null|undefined]",[e,t,n,o],arguments.length),typeof t!=="number")n=t,t=1/0;return this.global("_",!1),m(this,z,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:o},this}demand(e,t,n){if(Array.isArray(t))t.forEach((o)=>{Re(n,!0,m(this,X,"f")),this.demandOption(o,n)}),t=1/0;else if(typeof t!=="number")n=t,t=1/0;if(typeof e==="number")Re(n,!0,m(this,X,"f")),this.demandCommand(e,t,n,n);else if(Array.isArray(e))e.forEach((o)=>{Re(n,!0,m(this,X,"f")),this.demandOption(o,n)});else if(typeof n==="string")this.demandOption(e,n);else if(n===!0||typeof n>"u")this.demandOption(e);return this}demandOption(e,t){return J("<object|string|array> [string]",[e,t],arguments.length),this[wn](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return J("<string> [string|boolean]",[e,t],arguments.length),m(this,z,"f").deprecatedOptions[e]=t,this}describe(e,t){return J("<object|string|array> [string]",[e,t],arguments.length),this[kr](e,!0),m(this,Q,"f").describe(e,t),this}detectLocale(e){return J("<boolean>",[e],arguments.length),K(this,zt,e,"f"),this}env(e){if(J("[string|boolean]",[e],arguments.length),e===!1)delete m(this,z,"f").envPrefix;else m(this,z,"f").envPrefix=e||"";return this}epilogue(e){return J("<string>",[e],arguments.length),m(this,Q,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){if(J("<string|array> [string]",[e,t],arguments.length),Array.isArray(e))e.forEach((n)=>this.example(...n));else m(this,Q,"f").example(e,t);return this}exit(e,t){if(K(this,We,!0,"f"),K(this,St,t,"f"),m(this,Ge,"f"))m(this,X,"f").process.exit(e)}exitProcess(e=!0){return J("[boolean]",[e],arguments.length),K(this,Ge,e,"f"),this}fail(e){if(J("<function|boolean>",[e],arguments.length),typeof e==="boolean"&&e!==!1)throw new ye("Invalid first argument. Expected function or boolean 'false'");return m(this,Q,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){if(J("<array> [function]",[e,t],arguments.length),!t)return new Promise((n,o)=>{m(this,ve,"f").getCompletion(e,(s,r)=>{if(s)o(s);else n(r)})});else return m(this,ve,"f").getCompletion(e,t)}getDemandedOptions(){return J([],0),m(this,z,"f").demandedOptions}getDemandedCommands(){return J([],0),m(this,z,"f").demandedCommands}getDeprecatedOptions(){return J([],0),m(this,z,"f").deprecatedOptions}getDetectLocale(){return m(this,zt,"f")}getExitProcess(){return m(this,Ge,"f")}getGroups(){return Object.assign({},m(this,at,"f"),m(this,Xt,"f"))}getHelp(){if(K(this,We,!0,"f"),!m(this,Q,"f").hasCachedHelpMessage()){if(!this.parsed){let t=this[Un](m(this,Ct,"f"),void 0,void 0,0,!0);if(ce(t))return t.then(()=>m(this,Q,"f").help())}let e=m(this,we,"f").runDefaultBuilderOn(this);if(ce(e))return e.then(()=>m(this,Q,"f").help())}return Promise.resolve(m(this,Q,"f").help())}getOptions(){return m(this,z,"f")}getStrict(){return m(this,Vt,"f")}getStrictCommands(){return m(this,Zt,"f")}getStrictOptions(){return m(this,Qt,"f")}global(e,t){if(J("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),t!==!1)m(this,z,"f").local=m(this,z,"f").local.filter((n)=>e.indexOf(n)===-1);else e.forEach((n)=>{if(!m(this,z,"f").local.includes(n))m(this,z,"f").local.push(n)});return this}group(e,t){J("<string|array> <string>",[e,t],arguments.length);let n=m(this,Xt,"f")[t]||m(this,at,"f")[t];if(m(this,Xt,"f")[t])delete m(this,Xt,"f")[t];let o={};return m(this,at,"f")[t]=(n||[]).concat(e).filter((s)=>{if(o[s])return!1;return o[s]=!0}),this}hide(e){return J("<string>",[e],arguments.length),m(this,z,"f").hiddenOptions.push(e),this}implies(e,t){return J("<string|object> [number|string|array]",[e,t],arguments.length),m(this,de,"f").implies(e,t),this}locale(e){if(J("[string]",[e],arguments.length),e===void 0)return this[mr](),m(this,X,"f").y18n.getLocale();return K(this,zt,!1,"f"),m(this,X,"f").y18n.setLocale(e),this}middleware(e,t,n){return m(this,Ye,"f").addMiddleware(e,!!t,n)}nargs(e,t){return J("<string|object|array> [number]",[e,t],arguments.length),this[wn](this.nargs.bind(this),"narg",e,t),this}normalize(e){return J("<array|string>",[e],arguments.length),this[_t]("normalize",e),this}number(e){return J("<array|string>",[e],arguments.length),this[_t]("number",e),this[nn](e),this}option(e,t){if(J("<string|object> [object]",[e,t],arguments.length),typeof e==="object")Object.keys(e).forEach((n)=>{this.options(n,e[n])});else{if(typeof t!=="object")t={};if(this[nn](e),m(this,ct,"f")&&(e==="version"||(t===null||t===void 0?void 0:t.alias)==="version"))this[$c](['"version" is a reserved word.',"Please do one of the following:",'- Disable version with `yargs.version(false)` if using "version" as an option',"- Use the built-in `yargs.version` method instead (if applicable)","- Use a different option key","https://yargs.js.org/docs/#api-reference-version"].join(`
|
|
79
|
-
`),void 0,"versionWarning");if(
|
|
80
|
-
`,"f");
|
|
81
|
-
`,"f");
|
|
74
|
+
`;class jc{constructor(e,t,n,o){var s,r,i;this.yargs=e,this.usage=t,this.command=n,this.shim=o,this.completionKey="get-yargs-completions",this.aliases=null,this.customCompletionFunction=null,this.indexAfterLastReset=0,this.zshShell=(i=((s=this.shim.getEnv("SHELL"))===null||s===void 0?void 0:s.includes("zsh"))||((r=this.shim.getEnv("ZSH_NAME"))===null||r===void 0?void 0:r.includes("zsh")))!==null&&i!==void 0?i:!1}defaultCompletion(e,t,n,o){let s=this.command.getCommandHandlers();for(let i=0,a=e.length;i<a;++i)if(s[e[i]]&&s[e[i]].builder){let c=s[e[i]].builder;if(js(c)){this.indexAfterLastReset=i+1;let l=this.yargs.getInternalMethods().reset();return c(l,!0),l.argv}}let r=[];this.commandCompletions(r,e,n),this.optionCompletions(r,e,t,n),this.choicesFromOptionsCompletions(r,e,t,n),this.choicesFromPositionalsCompletions(r,e,t,n),o(null,r)}commandCompletions(e,t,n){let o=this.yargs.getInternalMethods().getContext().commands;if(!n.match(/^-/)&&o[o.length-1]!==n&&!this.previousArgHasChoices(t))this.usage.getCommands().forEach((s)=>{let r=At(s[0]).cmd;if(t.indexOf(r)===-1)if(!this.zshShell)e.push(r);else{let i=s[1]||"";e.push(r.replace(/:/g,"\\:")+":"+i)}})}optionCompletions(e,t,n,o){if((o.match(/^-/)||o===""&&e.length===0)&&!this.previousArgHasChoices(t)){let s=this.yargs.getOptions(),r=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[];Object.keys(s.key).forEach((i)=>{let a=!!s.configuration["boolean-negation"]&&s.boolean.includes(i);if(!r.includes(i)&&!s.hiddenOptions.includes(i)&&!this.argsContainKey(t,i,a))this.completeOptionKey(i,e,o,a&&!!s.default[i])})}}choicesFromOptionsCompletions(e,t,n,o){if(this.previousArgHasChoices(t)){let s=this.getPreviousArgChoices(t);if(s&&s.length>0)e.push(...s.map((r)=>r.replace(/:/g,"\\:")))}}choicesFromPositionalsCompletions(e,t,n,o){if(o===""&&e.length>0&&this.previousArgHasChoices(t))return;let s=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[],r=Math.max(this.indexAfterLastReset,this.yargs.getInternalMethods().getContext().commands.length+1),i=s[n._.length-r-1];if(!i)return;let a=this.yargs.getOptions().choices[i]||[];for(let c of a)if(c.startsWith(o))e.push(c.replace(/:/g,"\\:"))}getPreviousArgChoices(e){if(e.length<1)return;let t=e[e.length-1],n="";if(!t.startsWith("-")&&e.length>1)n=t,t=e[e.length-2];if(!t.startsWith("-"))return;let o=t.replace(/^-+/,""),s=this.yargs.getOptions(),r=[o,...this.yargs.getAliases()[o]||[]],i;for(let a of r)if(Object.prototype.hasOwnProperty.call(s.key,a)&&Array.isArray(s.choices[a])){i=s.choices[a];break}if(i)return i.filter((a)=>!n||a.startsWith(n))}previousArgHasChoices(e){let t=this.getPreviousArgChoices(e);return t!==void 0&&t.length>0}argsContainKey(e,t,n){let o=(s)=>e.indexOf((/^[^0-9]$/.test(s)?"-":"--")+s)!==-1;if(o(t))return!0;if(n&&o(`no-${t}`))return!0;if(this.aliases){for(let s of this.aliases[t])if(o(s))return!0}return!1}completeOptionKey(e,t,n,o){var s,r,i,a;let c=e;if(this.zshShell){let f=this.usage.getDescriptions(),h=(r=(s=this===null||this===void 0?void 0:this.aliases)===null||s===void 0?void 0:s[e])===null||r===void 0?void 0:r.find((g)=>{let w=f[g];return typeof w==="string"&&w.length>0}),m=h?f[h]:void 0,p=(a=(i=f[e])!==null&&i!==void 0?i:m)!==null&&a!==void 0?a:"";c=`${e.replace(/:/g,"\\:")}:${p.replace("__yargsString__:","").replace(/(\r\n|\n|\r)/gm," ")}`}let l=(f)=>/^--/.test(f),u=(f)=>/^[^0-9]$/.test(f),d=!l(n)&&u(e)?"-":"--";if(t.push(d+c),o)t.push(d+"no-"+c)}customCompletion(e,t,n,o){if(je(this.customCompletionFunction,null,this.shim),Fh(this.customCompletionFunction)){let s=this.customCompletionFunction(n,t);if(me(s))return s.then((r)=>{this.shim.process.nextTick(()=>{o(null,r)})}).catch((r)=>{this.shim.process.nextTick(()=>{o(r,void 0)})});return o(null,s)}else if(Ah(this.customCompletionFunction))return this.customCompletionFunction(n,t,(s=o)=>this.defaultCompletion(e,t,n,s),(s)=>{o(null,s)});else return this.customCompletionFunction(n,t,(s)=>{o(null,s)})}getCompletion(e,t){let n=e.length?e[e.length-1]:"",o=this.yargs.parse(e,!0),s=this.customCompletionFunction?(r)=>this.customCompletion(e,r,n,t):(r)=>this.defaultCompletion(e,r,n,t);return me(o)?o.then(s):s(o)}generateCompletionScript(e,t){let n=this.zshShell?Nc:Mc,o=this.shim.path.basename(e);if(e.match(/\.js$/))e=`./${e}`;return n=n.replace(/{{app_name}}/g,o),n=n.replace(/{{completion_command}}/g,t),n.replace(/{{app_path}}/g,e)}registerFunction(e){this.customCompletionFunction=e}setParsed(e){this.aliases=e.aliases}}function Wc(e,t,n,o){return new jc(e,t,n,o)}function Fh(e){return e.length<3}function Ah(e){return e.length>3}function Uc(e,t){if(e.length===0)return t.length;if(t.length===0)return e.length;let n=[],o;for(o=0;o<=t.length;o++)n[o]=[o];let s;for(s=0;s<=e.length;s++)n[0][s]=s;for(o=1;o<=t.length;o++)for(s=1;s<=e.length;s++)if(t.charAt(o-1)===e.charAt(s-1))n[o][s]=n[o-1][s-1];else if(o>1&&s>1&&t.charAt(o-2)===e.charAt(s-1)&&t.charAt(o-1)===e.charAt(s-2))n[o][s]=n[o-2][s-2]+1;else n[o][s]=Math.min(n[o-1][s-1]+1,Math.min(n[o][s-1]+1,n[o-1][s]+1));return n[t.length][e.length]}var Jc=["$0","--","_"];function Kc(e,t,n){let o=n.y18n.__,s=n.y18n.__n,r={};r.nonOptionCount=function(d){let f=e.getDemandedCommands(),m=d._.length+(d["--"]?d["--"].length:0)-e.getInternalMethods().getContext().commands.length;if(f._&&(m<f._.min||m>f._.max)){if(m<f._.min)if(f._.minMsg!==void 0)t.fail(f._.minMsg?f._.minMsg.replace(/\$0/g,m.toString()).replace(/\$1/,f._.min.toString()):null);else t.fail(s("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",m,m.toString(),f._.min.toString()));else if(m>f._.max)if(f._.maxMsg!==void 0)t.fail(f._.maxMsg?f._.maxMsg.replace(/\$0/g,m.toString()).replace(/\$1/,f._.max.toString()):null);else t.fail(s("Too many non-option arguments: got %s, maximum of %s","Too many non-option arguments: got %s, maximum of %s",m,m.toString(),f._.max.toString()))}},r.positionalCount=function(d,f){if(f<d)t.fail(s("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",f,f+"",d+""))},r.requiredArguments=function(d,f){let h=null;for(let m of Object.keys(f))if(!Object.prototype.hasOwnProperty.call(d,m)||typeof d[m]>"u")h=h||{},h[m]=f[m];if(h){let m=[];for(let g of Object.keys(h)){let w=h[g];if(w&&m.indexOf(w)<0)m.push(w)}let p=m.length?`
|
|
75
|
+
${m.join(`
|
|
76
|
+
`)}`:"";t.fail(s("Missing required argument: %s","Missing required arguments: %s",Object.keys(h).length,Object.keys(h).join(", ")+p))}},r.unknownArguments=function(d,f,h,m,p=!0){var g;let w=e.getInternalMethods().getCommandInstance().getCommands(),b=[],k=e.getInternalMethods().getContext();if(Object.keys(d).forEach((x)=>{if(!Jc.includes(x)&&!Object.prototype.hasOwnProperty.call(h,x)&&!Object.prototype.hasOwnProperty.call(e.getInternalMethods().getParseContext(),x)&&!r.isValidAndSomeAliasIsNotNew(x,f))b.push(x)}),p&&(k.commands.length>0||w.length>0||m))d._.slice(k.commands.length).forEach((x)=>{if(!w.includes(""+x))b.push(""+x)});if(p){let _=((g=e.getDemandedCommands()._)===null||g===void 0?void 0:g.max)||0,F=k.commands.length+_;if(F<d._.length)d._.slice(F).forEach((I)=>{if(I=String(I),!k.commands.includes(I)&&!b.includes(I))b.push(I)})}if(b.length)t.fail(s("Unknown argument: %s","Unknown arguments: %s",b.length,b.map((x)=>x.trim()?x:`"${x}"`).join(", ")))},r.unknownCommands=function(d){let f=e.getInternalMethods().getCommandInstance().getCommands(),h=[],m=e.getInternalMethods().getContext();if(m.commands.length>0||f.length>0)d._.slice(m.commands.length).forEach((p)=>{if(!f.includes(""+p))h.push(""+p)});if(h.length>0)return t.fail(s("Unknown command: %s","Unknown commands: %s",h.length,h.join(", "))),!0;else return!1},r.isValidAndSomeAliasIsNotNew=function(d,f){if(!Object.prototype.hasOwnProperty.call(f,d))return!1;let h=e.parsed.newAliases;return[d,...f[d]].some((m)=>!Object.prototype.hasOwnProperty.call(h,m)||!h[d])},r.limitedChoices=function(d){let f=e.getOptions(),h={};if(!Object.keys(f.choices).length)return;Object.keys(d).forEach((g)=>{if(Jc.indexOf(g)===-1&&Object.prototype.hasOwnProperty.call(f.choices,g))[].concat(d[g]).forEach((w)=>{if(f.choices[g].indexOf(w)===-1&&w!==void 0)h[g]=(h[g]||[]).concat(w)})});let m=Object.keys(h);if(!m.length)return;let p=o("Invalid values:");m.forEach((g)=>{p+=`
|
|
77
|
+
${o("Argument: %s, Given: %s, Choices: %s",g,t.stringifiedValues(h[g]),t.stringifiedValues(f.choices[g]))}`}),t.fail(p)};let i={};r.implies=function(d,f){if(H("<string|object> [array|number|string]",[d,f],arguments.length),typeof d==="object")Object.keys(d).forEach((h)=>{r.implies(h,d[h])});else{if(e.global(d),!i[d])i[d]=[];if(Array.isArray(f))f.forEach((h)=>r.implies(d,h));else je(f,void 0,n),i[d].push(f)}},r.getImplied=function(){return i};function a(u,d){let f=Number(d);if(d=isNaN(f)?d:f,typeof d==="number")d=u._.length>=d;else if(d.match(/^--no-.+/))d=d.match(/^--no-(.+)/)[1],d=!Object.prototype.hasOwnProperty.call(u,d);else d=Object.prototype.hasOwnProperty.call(u,d);return d}r.implications=function(d){let f=[];if(Object.keys(i).forEach((h)=>{let m=h;(i[h]||[]).forEach((p)=>{let g=m,w=p;if(g=a(d,g),p=a(d,p),g&&!p)f.push(` ${m} -> ${w}`)})}),f.length){let h=`${o("Implications failed:")}
|
|
78
|
+
`;f.forEach((m)=>{h+=m}),t.fail(h)}};let c={};r.conflicts=function(d,f){if(H("<string|object> [array|string]",[d,f],arguments.length),typeof d==="object")Object.keys(d).forEach((h)=>{r.conflicts(h,d[h])});else{if(e.global(d),!c[d])c[d]=[];if(Array.isArray(f))f.forEach((h)=>r.conflicts(d,h));else c[d].push(f)}},r.getConflicting=()=>c,r.conflicting=function(d){if(Object.keys(d).forEach((f)=>{if(c[f])c[f].forEach((h)=>{if(h&&d[f]!==void 0&&d[h]!==void 0)t.fail(o("Arguments %s and %s are mutually exclusive",f,h))})}),e.getInternalMethods().getParserConfiguration()["strip-dashed"])Object.keys(c).forEach((f)=>{c[f].forEach((h)=>{if(h&&d[n.Parser.camelCase(f)]!==void 0&&d[n.Parser.camelCase(h)]!==void 0)t.fail(o("Arguments %s and %s are mutually exclusive",f,h))})})},r.recommendCommands=function(d,f){f=f.sort((g,w)=>w.length-g.length);let m=null,p=1/0;for(let g=0,w;(w=f[g])!==void 0;g++){let b=Uc(d,w);if(b<=3&&b<p)p=b,m=w}if(m)t.fail(o("Did you mean %s?",m))},r.reset=function(d){return i=Tt(i,(f)=>!d[f]),c=Tt(c,(f)=>!d[f]),r};let l=[];return r.freeze=function(){l.push({implied:i,conflicting:c})},r.unfreeze=function(){let d=l.pop();je(d,void 0,n),{implied:i,conflicting:c}=d},r}var Cr=[],Yn;function Xn(e,t,n,o){Yn=o;let s={};if(Object.prototype.hasOwnProperty.call(e,"extends")){if(typeof e.extends!=="string")return s;let r=/\.json|\..*rc$/.test(e.extends),i=null;if(!r)try{i=import.meta.resolve(e.extends)}catch(a){return e}else i=Ih(t,e.extends);Th(i),Cr.push(i),s=r?JSON.parse(Yn.readFileSync(i,"utf8")):o.require(e.extends),delete e.extends,s=Xn(s,Yn.path.dirname(i),n,Yn)}return Cr=[],n?qc(s,e):Object.assign({},s,e)}function Th(e){if(Cr.indexOf(e)>-1)throw new _e(`Circular extended configurations: '${e}'.`)}function Ih(e,t){return Yn.path.resolve(e,t)}function qc(e,t){let n={};function o(s){return s&&typeof s==="object"&&!Array.isArray(s)}Object.assign(n,e);for(let s of Object.keys(t))if(o(t[s])&&o(n[s]))n[s]=qc(e[s],t[s]);else n[s]=t[s];return n}var z=function(e,t,n,o,s){if(o==="m")throw TypeError("Private method is not writable");if(o==="a"&&!s)throw TypeError("Private accessor was defined without a setter");if(typeof t==="function"?e!==t||!s:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return o==="a"?s.call(e,n):s?s.value=n:t.set(e,n),n},y=function(e,t,n,o){if(n==="a"&&!o)throw TypeError("Private accessor was defined without a getter");if(typeof t==="function"?e!==t||!o:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?o:n==="a"?o.call(e):o?o.value:t.get(e)},Ce,nn,Vn,Ue,Xe,Us,Rt,sn,Js,st,Ks,ot,gt,Ve,rt,qs,on,Ie,X,Hs,zs,Ze,rn,$n,an,Ot,Gs,Q,cn,ln,un,oe,Ys,mt,ke;function dl(e){return(t=[],n=e.process.cwd(),o)=>{let s=new fl(t,n,o,e);return Object.defineProperty(s,"argv",{get:()=>s.parse(),enumerable:!0}),s.help(),s.version(),s}}var Hc=Symbol("copyDoubleDash"),zc=Symbol("copyDoubleDash"),$r=Symbol("deleteFromParserHintObject"),Gc=Symbol("emitWarning"),Yc=Symbol("freeze"),Xc=Symbol("getDollarZero"),dn=Symbol("getParserConfiguration"),Vc=Symbol("getUsageConfiguration"),Fr=Symbol("guessLocale"),Zc=Symbol("guessVersion"),Qc=Symbol("parsePositionalNumbers"),Ar=Symbol("pkgUp"),Pt=Symbol("populateParserHintArray"),Fn=Symbol("populateParserHintSingleValueDictionary"),Tr=Symbol("populateParserHintArrayDictionary"),Ir=Symbol("populateParserHintDictionary"),Rr=Symbol("sanitizeKey"),Or=Symbol("setKey"),Pr=Symbol("unfreeze"),el=Symbol("validateAsync"),tl=Symbol("getCommandInstance"),nl=Symbol("getContext"),sl=Symbol("getHasOutput"),ol=Symbol("getLoggerInstance"),rl=Symbol("getParseContext"),il=Symbol("getUsageInstance"),al=Symbol("getValidationInstance"),Xs=Symbol("hasParseCallback"),cl=Symbol("isGlobalContext"),fn=Symbol("postProcess"),ll=Symbol("rebase"),vr=Symbol("reset"),Zn=Symbol("runYargsParserAndExecuteCommands"),Lr=Symbol("runValidation"),ul=Symbol("setHasOutput"),pn=Symbol("kTrackManuallySetKeys"),Rh="en_US";class fl{constructor(e=[],t,n,o){this.customScriptName=!1,this.parsed=!1,Ce.set(this,void 0),nn.set(this,void 0),Vn.set(this,{commands:[],fullCommands:[]}),Ue.set(this,null),Xe.set(this,null),Us.set(this,"show-hidden"),Rt.set(this,null),sn.set(this,!0),Js.set(this,{}),st.set(this,!0),Ks.set(this,[]),ot.set(this,void 0),gt.set(this,{}),Ve.set(this,!1),rt.set(this,null),qs.set(this,!0),on.set(this,void 0),Ie.set(this,""),X.set(this,void 0),Hs.set(this,void 0),zs.set(this,{}),Ze.set(this,null),rn.set(this,null),$n.set(this,{}),an.set(this,{}),Ot.set(this,void 0),Gs.set(this,!1),Q.set(this,void 0),cn.set(this,!1),ln.set(this,!1),un.set(this,!1),oe.set(this,void 0),Ys.set(this,{}),mt.set(this,null),ke.set(this,void 0),z(this,Q,o,"f"),z(this,Ot,e,"f"),z(this,nn,t,"f"),z(this,Hs,n,"f"),z(this,ot,new Er(this),"f"),this.$0=this[Xc](),this[vr](),z(this,Ce,y(this,Ce,"f"),"f"),z(this,oe,y(this,oe,"f"),"f"),z(this,ke,y(this,ke,"f"),"f"),z(this,X,y(this,X,"f"),"f"),y(this,X,"f").showHiddenOpt=y(this,Us,"f"),z(this,on,this[zc](),"f"),y(this,Q,"f").y18n.setLocale(Rh)}addHelpOpt(e,t){if(H("[string|boolean] [string]",[e,t],arguments.length),y(this,rt,"f"))this[$r](y(this,rt,"f")),z(this,rt,null,"f");if(e===!1&&t===void 0)return this;return z(this,rt,typeof e==="string"?e:"help","f"),this.boolean(y(this,rt,"f")),this.describe(y(this,rt,"f"),t||y(this,oe,"f").deferY18nLookup("Show help")),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(H("[string|boolean] [string]",[e,t],arguments.length),e===!1&&t===void 0)return this;let n=typeof e==="string"?e:y(this,Us,"f");return this.boolean(n),this.describe(n,t||y(this,oe,"f").deferY18nLookup("Show hidden options")),y(this,X,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return H("<object|string|array> [string|array]",[e,t],arguments.length),this[Tr](this.alias.bind(this),"alias",e,t),this}array(e){return H("<array|string>",[e],arguments.length),this[Pt]("array",e),this[pn](e),this}boolean(e){return H("<array|string>",[e],arguments.length),this[Pt]("boolean",e),this[pn](e),this}check(e,t){return H("<function> [boolean]",[e,t],arguments.length),this.middleware((n,o)=>tn(()=>e(n,o.getOptions()),(s)=>{if(!s)y(this,oe,"f").fail(y(this,Q,"f").y18n.__("Argument check failed: %s",e.toString()));else if(typeof s==="string"||s instanceof Error)y(this,oe,"f").fail(s.toString(),s);return n},(s)=>(y(this,oe,"f").fail(s.message?s.message:s.toString(),s),n)),!1,t),this}choices(e,t){return H("<object|string|array> [string|array]",[e,t],arguments.length),this[Tr](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(H("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new _e("coerce callback must be provided");for(let o of e)this.coerce(o,t);return this}else if(typeof e==="object"){for(let o of Object.keys(e))this.coerce(o,e[o]);return this}if(!t)throw new _e("coerce callback must be provided");let n=e;return y(this,X,"f").key[n]=!0,y(this,ot,"f").addCoerceMiddleware((o,s)=>{var r;let i=(r=s.getAliases()[n])!==null&&r!==void 0?r:[],a=[n,...i].filter((c)=>Object.prototype.hasOwnProperty.call(o,c));if(a.length===0)return o;return tn(()=>t(o[a[0]]),(c)=>(a.forEach((l)=>{o[l]=c}),o),(c)=>{throw new _e(c.message)})},n),this}conflicts(e,t){return H("<string|object> [string|array]",[e,t],arguments.length),y(this,ke,"f").conflicts(e,t),this}config(e="config",t,n){if(H("[object|string] [string|function] [function]",[e,t,n],arguments.length),typeof e==="object"&&!Array.isArray(e))return e=Xn(e,y(this,nn,"f"),this[dn]()["deep-merge-config"]||!1,y(this,Q,"f")),y(this,X,"f").configObjects=(y(this,X,"f").configObjects||[]).concat(e),this;if(typeof t==="function")n=t,t=void 0;return this.describe(e,t||y(this,oe,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((o)=>{y(this,X,"f").config[o]=n||!0}),this}completion(e,t,n){if(H("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),typeof t==="function")n=t,t=void 0;if(z(this,Xe,e||y(this,Xe,"f")||"completion","f"),!t&&t!==!1)t="generate completion script";if(this.command(y(this,Xe,"f"),t),n)y(this,Ue,"f").registerFunction(n);return this}command(e,t,n,o,s,r){return H("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,o,s,r],arguments.length),y(this,Ce,"f").addHandler(e,t,n,o,s,r),this}commands(e,t,n,o,s,r){return this.command(e,t,n,o,s,r)}commandDir(e,t){H("<string> [object]",[e,t],arguments.length);let n=y(this,Hs,"f")||y(this,Q,"f").require;return y(this,Ce,"f").addDirectory(e,n,y(this,Q,"f").getCallerFile(),t),this}count(e){return H("<array|string>",[e],arguments.length),this[Pt]("count",e),this[pn](e),this}default(e,t,n){if(H("<object|string|array> [*] [string]",[e,t,n],arguments.length),n)Sr(e,y(this,Q,"f")),y(this,X,"f").defaultDescription[e]=n;if(typeof t==="function"){if(Sr(e,y(this,Q,"f")),!y(this,X,"f").defaultDescription[e])y(this,X,"f").defaultDescription[e]=y(this,oe,"f").functionDescription(t);t=t.call()}return this[Fn](this.default.bind(this),"default",e,t),this}defaults(e,t,n){return this.default(e,t,n)}demandCommand(e=1,t,n,o){if(H("[number] [number|string] [string|null|undefined] [string|null|undefined]",[e,t,n,o],arguments.length),typeof t!=="number")n=t,t=1/0;return this.global("_",!1),y(this,X,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:o},this}demand(e,t,n){if(Array.isArray(t))t.forEach((o)=>{je(n,!0,y(this,Q,"f")),this.demandOption(o,n)}),t=1/0;else if(typeof t!=="number")n=t,t=1/0;if(typeof e==="number")je(n,!0,y(this,Q,"f")),this.demandCommand(e,t,n,n);else if(Array.isArray(e))e.forEach((o)=>{je(n,!0,y(this,Q,"f")),this.demandOption(o,n)});else if(typeof n==="string")this.demandOption(e,n);else if(n===!0||typeof n>"u")this.demandOption(e);return this}demandOption(e,t){return H("<object|string|array> [string]",[e,t],arguments.length),this[Fn](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return H("<string> [string|boolean]",[e,t],arguments.length),y(this,X,"f").deprecatedOptions[e]=t,this}describe(e,t){return H("<object|string|array> [string]",[e,t],arguments.length),this[Or](e,!0),y(this,oe,"f").describe(e,t),this}detectLocale(e){return H("<boolean>",[e],arguments.length),z(this,sn,e,"f"),this}env(e){if(H("[string|boolean]",[e],arguments.length),e===!1)delete y(this,X,"f").envPrefix;else y(this,X,"f").envPrefix=e||"";return this}epilogue(e){return H("<string>",[e],arguments.length),y(this,oe,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){if(H("<string|array> [string]",[e,t],arguments.length),Array.isArray(e))e.forEach((n)=>this.example(...n));else y(this,oe,"f").example(e,t);return this}exit(e,t){if(z(this,Ve,!0,"f"),z(this,Rt,t,"f"),y(this,st,"f"))y(this,Q,"f").process.exit(e)}exitProcess(e=!0){return H("[boolean]",[e],arguments.length),z(this,st,e,"f"),this}fail(e){if(H("<function|boolean>",[e],arguments.length),typeof e==="boolean"&&e!==!1)throw new _e("Invalid first argument. Expected function or boolean 'false'");return y(this,oe,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){if(H("<array> [function]",[e,t],arguments.length),!t)return new Promise((n,o)=>{y(this,Ue,"f").getCompletion(e,(s,r)=>{if(s)o(s);else n(r)})});else return y(this,Ue,"f").getCompletion(e,t)}getDemandedOptions(){return H([],0),y(this,X,"f").demandedOptions}getDemandedCommands(){return H([],0),y(this,X,"f").demandedCommands}getDeprecatedOptions(){return H([],0),y(this,X,"f").deprecatedOptions}getDetectLocale(){return y(this,sn,"f")}getExitProcess(){return y(this,st,"f")}getGroups(){return Object.assign({},y(this,gt,"f"),y(this,an,"f"))}getHelp(){if(z(this,Ve,!0,"f"),!y(this,oe,"f").hasCachedHelpMessage()){if(!this.parsed){let t=this[Zn](y(this,Ot,"f"),void 0,void 0,0,!0);if(me(t))return t.then(()=>y(this,oe,"f").help())}let e=y(this,Ce,"f").runDefaultBuilderOn(this);if(me(e))return e.then(()=>y(this,oe,"f").help())}return Promise.resolve(y(this,oe,"f").help())}getOptions(){return y(this,X,"f")}getStrict(){return y(this,cn,"f")}getStrictCommands(){return y(this,ln,"f")}getStrictOptions(){return y(this,un,"f")}global(e,t){if(H("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),t!==!1)y(this,X,"f").local=y(this,X,"f").local.filter((n)=>e.indexOf(n)===-1);else e.forEach((n)=>{if(!y(this,X,"f").local.includes(n))y(this,X,"f").local.push(n)});return this}group(e,t){H("<string|array> <string>",[e,t],arguments.length);let n=y(this,an,"f")[t]||y(this,gt,"f")[t];if(y(this,an,"f")[t])delete y(this,an,"f")[t];let o={};return y(this,gt,"f")[t]=(n||[]).concat(e).filter((s)=>{if(o[s])return!1;return o[s]=!0}),this}hide(e){return H("<string>",[e],arguments.length),y(this,X,"f").hiddenOptions.push(e),this}implies(e,t){return H("<string|object> [number|string|array]",[e,t],arguments.length),y(this,ke,"f").implies(e,t),this}locale(e){if(H("[string]",[e],arguments.length),e===void 0)return this[Fr](),y(this,Q,"f").y18n.getLocale();return z(this,sn,!1,"f"),y(this,Q,"f").y18n.setLocale(e),this}middleware(e,t,n){return y(this,ot,"f").addMiddleware(e,!!t,n)}nargs(e,t){return H("<string|object|array> [number]",[e,t],arguments.length),this[Fn](this.nargs.bind(this),"narg",e,t),this}normalize(e){return H("<array|string>",[e],arguments.length),this[Pt]("normalize",e),this}number(e){return H("<array|string>",[e],arguments.length),this[Pt]("number",e),this[pn](e),this}option(e,t){if(H("<string|object> [object]",[e,t],arguments.length),typeof e==="object")Object.keys(e).forEach((n)=>{this.options(n,e[n])});else{if(typeof t!=="object")t={};if(this[pn](e),y(this,mt,"f")&&(e==="version"||(t===null||t===void 0?void 0:t.alias)==="version"))this[Gc](['"version" is a reserved word.',"Please do one of the following:",'- Disable version with `yargs.version(false)` if using "version" as an option',"- Use the built-in `yargs.version` method instead (if applicable)","- Use a different option key","https://yargs.js.org/docs/#api-reference-version"].join(`
|
|
79
|
+
`),void 0,"versionWarning");if(y(this,X,"f").key[e]=!0,t.alias)this.alias(e,t.alias);let n=t.deprecate||t.deprecated;if(n)this.deprecateOption(e,n);let o=t.demand||t.required||t.require;if(o)this.demand(e,o);if(t.demandOption)this.demandOption(e,typeof t.demandOption==="string"?t.demandOption:void 0);if(t.conflicts)this.conflicts(e,t.conflicts);if("default"in t)this.default(e,t.default);if(t.implies!==void 0)this.implies(e,t.implies);if(t.nargs!==void 0)this.nargs(e,t.nargs);if(t.config)this.config(e,t.configParser);if(t.normalize)this.normalize(e);if(t.choices)this.choices(e,t.choices);if(t.coerce)this.coerce(e,t.coerce);if(t.group)this.group(e,t.group);if(t.boolean||t.type==="boolean"){if(this.boolean(e),t.alias)this.boolean(t.alias)}if(t.array||t.type==="array"){if(this.array(e),t.alias)this.array(t.alias)}if(t.number||t.type==="number"){if(this.number(e),t.alias)this.number(t.alias)}if(t.string||t.type==="string"){if(this.string(e),t.alias)this.string(t.alias)}if(t.count||t.type==="count")this.count(e);if(typeof t.global==="boolean")this.global(e,t.global);if(t.defaultDescription)y(this,X,"f").defaultDescription[e]=t.defaultDescription;if(t.skipValidation)this.skipValidation(e);let s=t.describe||t.description||t.desc,r=y(this,oe,"f").getDescriptions();if(!Object.prototype.hasOwnProperty.call(r,e)||typeof s==="string")this.describe(e,s);if(t.hidden)this.hide(e);if(t.requiresArg)this.requiresArg(e)}return this}options(e,t){return this.option(e,t)}parse(e,t,n){if(H("[string|array] [function|boolean|object] [function]",[e,t,n],arguments.length),this[Yc](),typeof e>"u")e=y(this,Ot,"f");if(typeof t==="object")z(this,rn,t,"f"),t=n;if(typeof t==="function")z(this,Ze,t,"f"),t=!1;if(!t)z(this,Ot,e,"f");if(y(this,Ze,"f"))z(this,st,!1,"f");let o=this[Zn](e,!!t),s=this.parsed;if(y(this,Ue,"f").setParsed(this.parsed),me(o))return o.then((r)=>{if(y(this,Ze,"f"))y(this,Ze,"f").call(this,y(this,Rt,"f"),r,y(this,Ie,"f"));return r}).catch((r)=>{if(y(this,Ze,"f"))y(this,Ze,"f")(r,this.parsed.argv,y(this,Ie,"f"));throw r}).finally(()=>{this[Pr](),this.parsed=s});else{if(y(this,Ze,"f"))y(this,Ze,"f").call(this,y(this,Rt,"f"),o,y(this,Ie,"f"));this[Pr](),this.parsed=s}return o}parseAsync(e,t,n){let o=this.parse(e,t,n);return!me(o)?Promise.resolve(o):o}parseSync(e,t,n){let o=this.parse(e,t,n);if(me(o))throw new _e(".parseSync() must not be used with asynchronous builders, handlers, or middleware");return o}parserConfiguration(e){return H("<object>",[e],arguments.length),z(this,zs,e,"f"),this}pkgConf(e,t){H("<string> [string]",[e,t],arguments.length);let n=null,o=this[Ar](t||y(this,nn,"f"));if(o[e]&&typeof o[e]==="object")n=Xn(o[e],t||y(this,nn,"f"),this[dn]()["deep-merge-config"]||!1,y(this,Q,"f")),y(this,X,"f").configObjects=(y(this,X,"f").configObjects||[]).concat(n);return this}positional(e,t){H("<string> <object>",[e,t],arguments.length);let n=["default","defaultDescription","implies","normalize","choices","conflicts","coerce","type","describe","desc","description","alias"];t=Tt(t,(r,i)=>{if(r==="type"&&!["string","number","boolean"].includes(i))return!1;return n.includes(r)});let o=y(this,Vn,"f").fullCommands[y(this,Vn,"f").fullCommands.length-1],s=o?y(this,Ce,"f").cmdToParseOptions(o):{array:[],alias:{},default:{},demand:{}};return _n(s).forEach((r)=>{let i=s[r];if(Array.isArray(i)){if(i.indexOf(e)!==-1)t[r]=!0}else if(i[e]&&!(r in t))t[r]=i[e]}),this.group(e,y(this,oe,"f").getPositionalGroupName()),this.option(e,t)}recommendCommands(e=!0){return H("[boolean]",[e],arguments.length),z(this,Gs,e,"f"),this}required(e,t,n){return this.demand(e,t,n)}require(e,t,n){return this.demand(e,t,n)}requiresArg(e){if(H("<array|string|object> [number]",[e],arguments.length),typeof e==="string"&&y(this,X,"f").narg[e])return this;else this[Fn](this.requiresArg.bind(this),"narg",e,NaN);return this}showCompletionScript(e,t){return H("[string] [string]",[e,t],arguments.length),e=e||this.$0,y(this,on,"f").log(y(this,Ue,"f").generateCompletionScript(e,t||y(this,Xe,"f")||"completion")),this}showHelp(e){if(H("[string|function]",[e],arguments.length),z(this,Ve,!0,"f"),!y(this,oe,"f").hasCachedHelpMessage()){if(!this.parsed){let n=this[Zn](y(this,Ot,"f"),void 0,void 0,0,!0);if(me(n))return n.then(()=>{y(this,oe,"f").showHelp(e)}),this}let t=y(this,Ce,"f").runDefaultBuilderOn(this);if(me(t))return t.then(()=>{y(this,oe,"f").showHelp(e)}),this}return y(this,oe,"f").showHelp(e),this}scriptName(e){return this.customScriptName=!0,this.$0=e,this}showHelpOnFail(e,t){return H("[boolean|string] [string]",[e,t],arguments.length),y(this,oe,"f").showHelpOnFail(e,t),this}showVersion(e){return H("[string|function]",[e],arguments.length),y(this,oe,"f").showVersion(e),this}skipValidation(e){return H("<array|string>",[e],arguments.length),this[Pt]("skipValidation",e),this}strict(e){return H("[boolean]",[e],arguments.length),z(this,cn,e!==!1,"f"),this}strictCommands(e){return H("[boolean]",[e],arguments.length),z(this,ln,e!==!1,"f"),this}strictOptions(e){return H("[boolean]",[e],arguments.length),z(this,un,e!==!1,"f"),this}string(e){return H("<array|string>",[e],arguments.length),this[Pt]("string",e),this[pn](e),this}terminalWidth(){return H([],0),y(this,Q,"f").process.stdColumns}updateLocale(e){return this.updateStrings(e)}updateStrings(e){return H("<object>",[e],arguments.length),z(this,sn,!1,"f"),y(this,Q,"f").y18n.updateLocale(e),this}usage(e,t,n,o){if(H("<string|null|undefined> [string|boolean] [function|object] [function]",[e,t,n,o],arguments.length),t!==void 0)if(je(e,null,y(this,Q,"f")),(e||"").match(/^\$0( |$)/))return this.command(e,t,n,o);else throw new _e(".usage() description must start with $0 if being used as alias for .command()");else return y(this,oe,"f").usage(e),this}usageConfiguration(e){return H("<object>",[e],arguments.length),z(this,Ys,e,"f"),this}version(e,t,n){if(H("[boolean|string] [string] [string]",[e,t,n],arguments.length),y(this,mt,"f"))this[$r](y(this,mt,"f")),y(this,oe,"f").version(void 0),z(this,mt,null,"f");if(arguments.length===0)n=this[Zc](),e="version";else if(arguments.length===1){if(e===!1)return this;n=e,e="version"}else if(arguments.length===2)n=t,t=void 0;return z(this,mt,typeof e==="string"?e:"version","f"),t=t||y(this,oe,"f").deferY18nLookup("Show version number"),y(this,oe,"f").version(n||void 0),this.boolean(y(this,mt,"f")),this.describe(y(this,mt,"f"),t),this}wrap(e){return H("<number|null|undefined>",[e],arguments.length),y(this,oe,"f").wrap(e),this}[(Ce=new WeakMap,nn=new WeakMap,Vn=new WeakMap,Ue=new WeakMap,Xe=new WeakMap,Us=new WeakMap,Rt=new WeakMap,sn=new WeakMap,Js=new WeakMap,st=new WeakMap,Ks=new WeakMap,ot=new WeakMap,gt=new WeakMap,Ve=new WeakMap,rt=new WeakMap,qs=new WeakMap,on=new WeakMap,Ie=new WeakMap,X=new WeakMap,Hs=new WeakMap,zs=new WeakMap,Ze=new WeakMap,rn=new WeakMap,$n=new WeakMap,an=new WeakMap,Ot=new WeakMap,Gs=new WeakMap,Q=new WeakMap,cn=new WeakMap,ln=new WeakMap,un=new WeakMap,oe=new WeakMap,Ys=new WeakMap,mt=new WeakMap,ke=new WeakMap,Hc)](e){if(!e._||!e["--"])return e;e._.push.apply(e._,e["--"]);try{delete e["--"]}catch(t){}return e}[zc](){return{log:(...e)=>{if(!this[Xs]())console.log(...e);if(z(this,Ve,!0,"f"),y(this,Ie,"f").length)z(this,Ie,y(this,Ie,"f")+`
|
|
80
|
+
`,"f");z(this,Ie,y(this,Ie,"f")+e.join(" "),"f")},error:(...e)=>{if(!this[Xs]())console.error(...e);if(z(this,Ve,!0,"f"),y(this,Ie,"f").length)z(this,Ie,y(this,Ie,"f")+`
|
|
81
|
+
`,"f");z(this,Ie,y(this,Ie,"f")+e.join(" "),"f")}}}[$r](e){_n(y(this,X,"f")).forEach((t)=>{if(((o)=>o==="configObjects")(t))return;let n=y(this,X,"f")[t];if(Array.isArray(n)){if(n.includes(e))n.splice(n.indexOf(e),1)}else if(typeof n==="object")delete n[e]}),delete y(this,oe,"f").getDescriptions()[e]}[Gc](e,t,n){if(!y(this,Js,"f")[n])y(this,Q,"f").process.emitWarning(e,t),y(this,Js,"f")[n]=!0}[Yc](){y(this,Ks,"f").push({options:y(this,X,"f"),configObjects:y(this,X,"f").configObjects.slice(0),exitProcess:y(this,st,"f"),groups:y(this,gt,"f"),strict:y(this,cn,"f"),strictCommands:y(this,ln,"f"),strictOptions:y(this,un,"f"),completionCommand:y(this,Xe,"f"),output:y(this,Ie,"f"),exitError:y(this,Rt,"f"),hasOutput:y(this,Ve,"f"),parsed:this.parsed,parseFn:y(this,Ze,"f"),parseContext:y(this,rn,"f")}),y(this,oe,"f").freeze(),y(this,ke,"f").freeze(),y(this,Ce,"f").freeze(),y(this,ot,"f").freeze()}[Xc](){let e="",t;if(/\b(node|iojs|electron)(\.exe)?$/.test(y(this,Q,"f").process.argv()[0]))t=y(this,Q,"f").process.argv().slice(1,2);else t=y(this,Q,"f").process.argv().slice(0,1);if(e=t.map((n)=>{let o=this[ll](y(this,nn,"f"),n);return n.match(/^(\/|([a-zA-Z]:)?\\)/)&&o.length<n.length?o:n}).join(" ").trim(),y(this,Q,"f").getEnv("_")&&y(this,Q,"f").getProcessArgvBin()===y(this,Q,"f").getEnv("_"))e=y(this,Q,"f").getEnv("_").replace(`${y(this,Q,"f").path.dirname(y(this,Q,"f").process.execPath())}/`,"");return e}[dn](){return y(this,zs,"f")}[Vc](){return y(this,Ys,"f")}[Fr](){if(!y(this,sn,"f"))return;let e=y(this,Q,"f").getEnv("LC_ALL")||y(this,Q,"f").getEnv("LC_MESSAGES")||y(this,Q,"f").getEnv("LANG")||y(this,Q,"f").getEnv("LANGUAGE")||"en_US";this.locale(e.replace(/[.:].*/,""))}[Zc](){return this[Ar]().version||"unknown"}[Qc](e){let t=e["--"]?e["--"]:e._;for(let n=0,o;(o=t[n])!==void 0;n++)if(y(this,Q,"f").Parser.looksLikeNumber(o)&&Number.isSafeInteger(Math.floor(parseFloat(`${o}`))))t[n]=Number(o);return e}[Ar](e){let t=e||"*";if(y(this,$n,"f")[t])return y(this,$n,"f")[t];let n={};try{let o=e||y(this,Q,"f").mainFilename;if(y(this,Q,"f").path.extname(o))o=y(this,Q,"f").path.dirname(o);let s=y(this,Q,"f").findUp(o,(r,i)=>{if(i.includes("package.json"))return"package.json";else return});je(s,void 0,y(this,Q,"f")),n=JSON.parse(y(this,Q,"f").readFileSync(s,"utf8"))}catch(o){}return y(this,$n,"f")[t]=n||{},y(this,$n,"f")[t]}[Pt](e,t){t=[].concat(t),t.forEach((n)=>{n=this[Rr](n),y(this,X,"f")[e].push(n)})}[Fn](e,t,n,o){this[Ir](e,t,n,o,(s,r,i)=>{y(this,X,"f")[s][r]=i})}[Tr](e,t,n,o){this[Ir](e,t,n,o,(s,r,i)=>{y(this,X,"f")[s][r]=(y(this,X,"f")[s][r]||[]).concat(i)})}[Ir](e,t,n,o,s){if(Array.isArray(n))n.forEach((r)=>{e(r,o)});else if(((r)=>typeof r==="object")(n))for(let r of _n(n))e(r,n[r]);else s(t,this[Rr](n),o)}[Rr](e){if(e==="__proto__")return"___proto___";return e}[Or](e,t){return this[Fn](this[Or].bind(this),"key",e,t),this}[Pr](){var e,t,n,o,s,r,i,a,c,l,u,d;let f=y(this,Ks,"f").pop();je(f,void 0,y(this,Q,"f"));let h;e=this,t=this,n=this,o=this,s=this,r=this,i=this,a=this,c=this,l=this,u=this,d=this,{options:{set value(m){z(e,X,m,"f")}}.value,configObjects:h,exitProcess:{set value(m){z(t,st,m,"f")}}.value,groups:{set value(m){z(n,gt,m,"f")}}.value,output:{set value(m){z(o,Ie,m,"f")}}.value,exitError:{set value(m){z(s,Rt,m,"f")}}.value,hasOutput:{set value(m){z(r,Ve,m,"f")}}.value,parsed:this.parsed,strict:{set value(m){z(i,cn,m,"f")}}.value,strictCommands:{set value(m){z(a,ln,m,"f")}}.value,strictOptions:{set value(m){z(c,un,m,"f")}}.value,completionCommand:{set value(m){z(l,Xe,m,"f")}}.value,parseFn:{set value(m){z(u,Ze,m,"f")}}.value,parseContext:{set value(m){z(d,rn,m,"f")}}.value}=f,y(this,X,"f").configObjects=h,y(this,oe,"f").unfreeze(),y(this,ke,"f").unfreeze(),y(this,Ce,"f").unfreeze(),y(this,ot,"f").unfreeze()}[el](e,t){return tn(t,(n)=>(e(n),n))}getInternalMethods(){return{getCommandInstance:this[tl].bind(this),getContext:this[nl].bind(this),getHasOutput:this[sl].bind(this),getLoggerInstance:this[ol].bind(this),getParseContext:this[rl].bind(this),getParserConfiguration:this[dn].bind(this),getUsageConfiguration:this[Vc].bind(this),getUsageInstance:this[il].bind(this),getValidationInstance:this[al].bind(this),hasParseCallback:this[Xs].bind(this),isGlobalContext:this[cl].bind(this),postProcess:this[fn].bind(this),reset:this[vr].bind(this),runValidation:this[Lr].bind(this),runYargsParserAndExecuteCommands:this[Zn].bind(this),setHasOutput:this[ul].bind(this)}}[tl](){return y(this,Ce,"f")}[nl](){return y(this,Vn,"f")}[sl](){return y(this,Ve,"f")}[ol](){return y(this,on,"f")}[rl](){return y(this,rn,"f")||{}}[il](){return y(this,oe,"f")}[al](){return y(this,ke,"f")}[Xs](){return!!y(this,Ze,"f")}[cl](){return y(this,qs,"f")}[fn](e,t,n,o){if(n)return e;if(me(e))return e;if(!t)e=this[Hc](e);if(this[dn]()["parse-positional-numbers"]||this[dn]()["parse-positional-numbers"]===void 0)e=this[Qc](e);if(o)e=en(e,this,y(this,ot,"f").getMiddleware(),!1);return e}[vr](e={}){z(this,X,y(this,X,"f")||{},"f");let t={};t.local=y(this,X,"f").local||[],t.configObjects=y(this,X,"f").configObjects||[];let n={};t.local.forEach((r)=>{n[r]=!0,(e[r]||[]).forEach((i)=>{n[i]=!0})}),Object.assign(y(this,an,"f"),Object.keys(y(this,gt,"f")).reduce((r,i)=>{let a=y(this,gt,"f")[i].filter((c)=>!(c in n));if(a.length>0)r[i]=a;return r},{})),z(this,gt,{},"f");let o=["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"],s=["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"];if(o.forEach((r)=>{t[r]=(y(this,X,"f")[r]||[]).filter((i)=>!n[i])}),s.forEach((r)=>{t[r]=Tt(y(this,X,"f")[r],(i)=>!n[i])}),t.envPrefix=y(this,X,"f").envPrefix,z(this,X,t,"f"),z(this,oe,y(this,oe,"f")?y(this,oe,"f").reset(n):Bc(this,y(this,Q,"f")),"f"),z(this,ke,y(this,ke,"f")?y(this,ke,"f").reset(n):Kc(this,y(this,oe,"f"),y(this,Q,"f")),"f"),z(this,Ce,y(this,Ce,"f")?y(this,Ce,"f").reset():Pc(y(this,oe,"f"),y(this,ke,"f"),y(this,ot,"f"),y(this,Q,"f")),"f"),!y(this,Ue,"f"))z(this,Ue,Wc(this,y(this,oe,"f"),y(this,Ce,"f"),y(this,Q,"f")),"f");return y(this,ot,"f").reset(),z(this,Xe,null,"f"),z(this,Ie,"","f"),z(this,Rt,null,"f"),z(this,Ve,!1,"f"),this.parsed=!1,this}[ll](e,t){return y(this,Q,"f").path.relative(e,t)}[Zn](e,t,n,o=0,s=!1){var r,i,a,c;let l=!!n||s;e=e||y(this,Ot,"f"),y(this,X,"f").__=y(this,Q,"f").y18n.__,y(this,X,"f").configuration=this[dn]();let u=!!y(this,X,"f").configuration["populate--"],d=Object.assign({},y(this,X,"f").configuration,{"populate--":!0}),f=y(this,Q,"f").Parser.detailed(e,Object.assign({},y(this,X,"f"),{configuration:{"parse-positional-numbers":!1,...d}})),h=Object.assign(f.argv,y(this,rn,"f")),m=void 0,p=f.aliases,g=!1,w=!1;if(Object.keys(h).forEach((b)=>{if(b===y(this,rt,"f")&&h[b])g=!0;else if(b===y(this,mt,"f")&&h[b])w=!0}),h.$0=this.$0,this.parsed=f,o===0)y(this,oe,"f").clearCachedHelpMessage();try{if(this[Fr](),t)return this[fn](h,u,!!n,!1);if(y(this,rt,"f")){if([y(this,rt,"f")].concat(p[y(this,rt,"f")]||[]).filter((F)=>F.length>1).includes(""+h._[h._.length-1]))h._.pop(),g=!0}z(this,qs,!1,"f");let b=y(this,Ce,"f").getCommands(),k=((r=y(this,Ue,"f"))===null||r===void 0?void 0:r.completionKey)?[(i=y(this,Ue,"f"))===null||i===void 0?void 0:i.completionKey,...(c=this.getAliases()[(a=y(this,Ue,"f"))===null||a===void 0?void 0:a.completionKey])!==null&&c!==void 0?c:[]].some((_)=>Object.prototype.hasOwnProperty.call(h,_)):!1,x=g||k||s;if(h._.length){if(b.length){let _;for(let F=o||0,I;h._[F]!==void 0;F++)if(I=String(h._[F]),b.includes(I)&&I!==y(this,Xe,"f")){let S=y(this,Ce,"f").runCommand(I,this,f,F+1,s,g||w||s);return this[fn](S,u,!!n,!1)}else if(!_&&I!==y(this,Xe,"f")){_=I;break}if(!y(this,Ce,"f").hasDefaultCommand()&&y(this,Gs,"f")&&_&&!x)y(this,ke,"f").recommendCommands(_,b)}if(y(this,Xe,"f")&&h._.includes(y(this,Xe,"f"))&&!k){if(y(this,st,"f"))It(!0);this.showCompletionScript(),this.exit(0)}}if(y(this,Ce,"f").hasDefaultCommand()&&!x){let _=y(this,Ce,"f").runCommand(null,this,f,0,s,g||w||s);return this[fn](_,u,!!n,!1)}if(k){if(y(this,st,"f"))It(!0);e=[].concat(e);let _=e.slice(e.indexOf(`--${y(this,Ue,"f").completionKey}`)+1);return y(this,Ue,"f").getCompletion(_,(F,I)=>{if(F)throw new _e(F.message);(I||[]).forEach((S)=>{y(this,on,"f").log(S)}),this.exit(0)}),this[fn](h,!u,!!n,!1)}if(!y(this,Ve,"f")){if(g){if(y(this,st,"f"))It(!0);l=!0,this.showHelp((_)=>{y(this,on,"f").log(_),this.exit(0)})}else if(w){if(y(this,st,"f"))It(!0);l=!0,y(this,oe,"f").showVersion("log"),this.exit(0)}}if(!l&&y(this,X,"f").skipValidation.length>0)l=Object.keys(h).some((_)=>y(this,X,"f").skipValidation.indexOf(_)>=0&&h[_]===!0);if(!l){if(f.error)throw new _e(f.error.message);if(!k){let _=this[Lr](p,{},f.error);if(!n)m=en(h,this,y(this,ot,"f").getMiddleware(),!0);if(m=this[el](_,m!==null&&m!==void 0?m:h),me(m)&&!n)m=m.then(()=>en(h,this,y(this,ot,"f").getMiddleware(),!1))}}}catch(b){if(b instanceof _e)y(this,oe,"f").fail(b.message,b);else throw b}return this[fn](m!==null&&m!==void 0?m:h,u,!!n,!0)}[Lr](e,t,n,o){let s={...this.getDemandedOptions()};return(r)=>{if(n)throw new _e(n.message);y(this,ke,"f").nonOptionCount(r),y(this,ke,"f").requiredArguments(r,s);let i=!1;if(y(this,ln,"f"))i=y(this,ke,"f").unknownCommands(r);if(y(this,cn,"f")&&!i)y(this,ke,"f").unknownArguments(r,e,t,!!o);else if(y(this,un,"f"))y(this,ke,"f").unknownArguments(r,e,{},!1,!1);y(this,ke,"f").limitedChoices(r),y(this,ke,"f").implications(r),y(this,ke,"f").conflicting(r)}}[ul](){z(this,Ve,!0,"f")}[pn](e){if(typeof e==="string")y(this,X,"f").key[e]=!0;else for(let t of e)y(this,X,"f").key[t]=!0}}function vc(e){return!!e&&typeof e.getInternalMethods==="function"}var Oh=dl(xr),pl=Oh;var Ph=/<https?:\/\/[^\s<>|]+(?:\|[^<>\r\n]*)?>|https?:\/\/[^\t\n\v\f\r <\x00]+/gi,vh=/[\t\n\v\f\r (*_~]/;function Lh(e){let t=e.split(""),n=(s,r)=>{for(let i=s;i<r;i++)if(t[i]!==`
|
|
82
82
|
`)t[i]="\x00"},o=0;while(o<e.length){let r=o===0||e[o-1]===`
|
|
83
83
|
`?/^ {0,3}(?:(`{3,})[^`\n]*|(~{3,})[^\n]*)(?=\n|$)/.exec(e.slice(o)):null;if(r){let a=r[1]??r[2],c=new RegExp(`
|
|
84
84
|
{0,3}${a[0]==="`"?"`":"~"}{${a.length},}[ ]*\r?(?=
|
|
85
85
|
|$)`,"g");c.lastIndex=o+r[0].length;let l=c.exec(e),u=l?l.index+l[0].length:e.length;n(o,u),o=u;continue}let i=e[o];if(i==="\\"){o+=2;continue}if(i==="`"){let a=0;while(e[o+a]==="`")a++;let c=o+a,l=-1;while(c<e.length){if(e[c]===`
|
|
86
|
-
`&&/^\n[ \t\r]*(?:\n|$)/.test(e.slice(c)))break;if(e[c]!=="`"){c++;continue}let u=0;while(e[c+u]==="`")u++;if(u===a){l=c+u;break}c+=u}if(l<0){o+=a;continue}n(o,l),o=l;continue}if(i==="["){let a=/^\[(?:\\.|[^\]\\\n])*\]\([^()\s]*\)/.exec(e.slice(o));if(a){n(o,o+a[0].length),o+=a[0].length;continue}}o++}return t.join("")}function
|
|
87
|
-
`,{mode:384}),process.platform!=="win32")
|
|
88
|
-
`);
|
|
89
|
-
`)}function
|
|
90
|
-
`)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s===-1)continue;let r=o.slice(0,s).trim(),i=o.slice(s+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);t[r]=i}return t}function
|
|
91
|
-
`+" Migrate to SLACK_TOKEN=... or remove from your shell config.")}}let i=
|
|
86
|
+
`&&/^\n[ \t\r]*(?:\n|$)/.test(e.slice(c)))break;if(e[c]!=="`"){c++;continue}let u=0;while(e[c+u]==="`")u++;if(u===a){l=c+u;break}c+=u}if(l<0){o+=a;continue}n(o,l),o=l;continue}if(i==="["){let a=/^\[(?:\\.|[^\]\\\n])*\]\([^()\s]*\)/.exec(e.slice(o));if(a){n(o,o+a[0].length),o+=a[0].length;continue}}o++}return t.join("")}function Bh(e,{markdown:t=!0}={}){let n=t?Lh(e):e,o=[];for(let s of n.matchAll(Ph)){let r=s[0];if(r.startsWith("<"))continue;let i=s.index??0,a=i>0?n[i-1]:"";if(a&&!vh.test(a))o.push({url:r,side:"before",char:e[i-1]});let c=r.match(/[^\x00-\x7f]|>/);if(c)o.push({url:r,side:"after",char:c[0]})}return o}function Je(e,t=!1,n=console.error,{sides:o=["before","after"],markdown:s=!0}={}){let r=Bh(e,{markdown:s}).filter((l)=>o.includes(l.side));if(!r.length)return;let i=r.map((l)=>l.side==="before"?`${JSON.stringify(l.url)} (glued to ${JSON.stringify(l.char)} before it — Slack will NOT make it a link)`:`${JSON.stringify(l.url)} (runs into ${JSON.stringify(l.char)} after it)`),a=r.some((l)=>l.side==="before")?"Put an ASCII space (or a newline) before the URL, ":"",c=`Ambiguous URL boundary: ${i.join(", ")}. ${a}Put the URL on its own line, or wrap it as <url> / <url|label>. Use --allow-url-adjacent to warn only.`;if(!t)throw Error(c);n(`Warning: ${c}`)}import{existsSync as es,readFileSync as Nr,writeFileSync as Br,mkdirSync as yl,chmodSync as hl}from"node:fs";import{homedir as Mh}from"node:os";import{join as hn,dirname as jr}from"node:path";function Wr(){return process.env.HOME||Mh()}function wl(){return hn(Wr(),".config","slack-cli","profiles.json")}function Vs(){return hn(process.cwd(),".slack-cli","workspace")}function Zs(){return hn(Wr(),".slack-cli","workspace")}function ts(){let e=wl();if(!es(e))return{profiles:{}};return JSON.parse(Nr(e,"utf8"))}function Nh(e){let t=wl();if(yl(jr(t),{recursive:!0}),process.platform!=="win32"&&es(t))hl(t,384);if(Br(t,JSON.stringify(e,null,2)+`
|
|
87
|
+
`,{mode:384}),process.platform!=="win32")hl(t,384)}function An(e){if(!es(e))return;return Nr(e,"utf8").trim()||void 0}function gl(e,t){let n=jr(e);yl(n,{recursive:!0});let o=hn(n,".gitignore");if(!es(o))Br(o,`*
|
|
88
|
+
`);Br(e,t+`
|
|
89
|
+
`)}function jh(e){let t={};for(let n of e.split(`
|
|
90
|
+
`)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s===-1)continue;let r=o.slice(0,s).trim(),i=o.slice(s+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);t[r]=i}return t}function ml(e){if(!es(e))return{};try{return jh(Nr(e,"utf8"))}catch{return{}}}function Mr(e,t){let n=Wr(),o=e;while(!0){for(let i of[hn(o,".slack-term",".env.local"),hn(o,".env.local")]){let a=ml(i);for(let c of t)if(a[c])return a[c]}if(o===n)break;let r=jr(o);if(r===o)break;o=r}let s=ml(hn(n,".slack-term",".env.local"));for(let r of t)if(s[r])return s[r];return}function Ur(){let e=ts(),t=An(Vs()),n=An(Zs()),o=t??n;return Object.entries(e.profiles).map(([s,r])=>{let i=Qn(e,s);return{name:s,profile:{...r,...i?{cookie:i}:{}},current:s===o}})}function Qn(e,t){if(!t)return;let n=e.profiles[t];if(!n)return;if(n.cookie)return n.cookie;if(n.identity)return e.users?.[n.identity]?.cookie;return}function bl(e){let t=ts();if(!(e in t.profiles))throw Error(`Profile not found: ${e}`);delete t.profiles[e],Nh(t)}function Dl(e,t=!1){let n=ts();if(!(e in n.profiles))throw Error(`Profile not found: ${e}`);if(t)gl(Zs(),e);else gl(Vs(),e)}function ns(e){let n=ts().profiles,o=Object.keys(n);if(e){let u=n[e];if(!u)throw Error(`Workspace "${e}" not found. Available: ${o.join(", ")||"(none)"}`);return u.token}if(process.env.SLACK_TOKEN)return process.env.SLACK_TOKEN;let s=process.env.SLACK_BOT_TOKEN??process.env.SLACK_MCP_XOXP_TOKEN;if(s&&o.length===0)return s;let r=[process.env.SLACK_BOT_TOKEN,process.env.SLACK_MCP_XOXP_TOKEN].find((u)=>u&&!u.startsWith("xoxb-"));if(r&&o.length>0){let u=Mr(process.cwd(),["SLACK_BOT_TOKEN","SLACK_MCP_XOXP_TOKEN"]);if(r!==u){if(!globalThis.__slackEnvWarnShown)globalThis.__slackEnvWarnShown=!0,console.error(`Warning: SLACK_MCP_XOXP_TOKEN / SLACK_BOT_TOKEN is set but workspace profiles exist — using profiles.
|
|
91
|
+
`+" Migrate to SLACK_TOKEN=... or remove from your shell config.")}}let i=Mr(process.cwd(),["SLACK_TOKEN"]);if(i)return i;let a=process.env.SLACK_WORKSPACE;if(a){let u=n[a];if(!u)throw Error(`Workspace "${a}" not found. Available: ${o.join(", ")||"(none)"}`);return u.token}let c=An(Vs());if(c){let u=n[c];if(!u)throw Error(`Workspace "${c}" (from .slack-cli/workspace) not found in profiles.`);return u.token}let l=An(Zs());if(l){let u=n[l];if(!u)throw Error(`Workspace "${l}" (from ~/.slack-cli/workspace) not found in profiles.`);return u.token}if(o.length>0)throw Error(`Workspace not selected (${o.join(", ")} available).
|
|
92
92
|
Select locally: slack auth use <name> (writes .slack-cli/workspace)
|
|
93
93
|
Select globally: slack auth use -g <name> (writes ~/.slack-cli/workspace)`);throw Error(`No Slack token found.
|
|
94
94
|
Run one of:
|
|
@@ -97,13 +97,13 @@ ${y.join(`
|
|
|
97
97
|
`+` slack auth cookie — attach the xoxd cookie from Chrome (macOS/Windows)
|
|
98
98
|
`+` slack auth firefox — attach the xoxd cookie from Firefox (all platforms)
|
|
99
99
|
`+` slack auth token --token xoxp-... — paste an existing token
|
|
100
|
-
`+" Or set SLACK_TOKEN=xoxp-... in .slack-term/.env.local")}function
|
|
101
|
-
`,{mode:384}),process.platform!=="win32")
|
|
102
|
-
`)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s===-1)continue;let r=o.slice(0,s).trim(),i=o.slice(s+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);t[r]=i}return t}function
|
|
103
|
-
`):[];for(let[s,r]of Object.entries(t)){let i=o.findIndex((c)=>{let l=c.trim();return l.startsWith(s+"=")||l.startsWith(s+" =")}),a=`${s}=${r}`;if(i!==-1)o[i]=a;else o.push(a)}if(process.platform!=="win32"&&
|
|
100
|
+
`+" Or set SLACK_TOKEN=xoxp-... in .slack-term/.env.local")}function Ke(){let e=process.env.SLACK_BOT_TOKEN;return e&&e.startsWith("xoxb-")?e:void 0}function Jr(e){let t=ts(),n=t.profiles;if(e)return Qn(t,e);if(process.env.SLACK_COOKIE)return process.env.SLACK_COOKIE;if(process.env.SLACK_MCP_XOXD_COOKIE)return process.env.SLACK_MCP_XOXD_COOKIE;if(process.env.SLACK_MCP_XOXP_TOKEN&&Object.keys(n).length===0)return process.env.SLACK_MCP_XOXD_COOKIE;let s=Mr(process.cwd(),["SLACK_COOKIE"]);if(s)return s;let r=process.env.SLACK_WORKSPACE;if(r)return Qn(t,r);let i=An(Vs());if(i)return Qn(t,i);let a=An(Zs());if(a)return Qn(t,a);return}import{existsSync as In,readFileSync as eo,writeFileSync as xl,mkdirSync as Sl,chmodSync as Qs}from"node:fs";import{homedir as Wh}from"node:os";import{join as Tn,dirname as qr}from"node:path";function Hr(){return process.env.HOME||Wh()}function El(){return Tn(Hr(),".config","slack-cli","profiles.json")}function zr(){return Tn(process.cwd(),".slack-cli","workspace")}function Gr(){return Tn(Hr(),".slack-cli","workspace")}function On(){let e=El();if(!In(e))return{profiles:{}};return JSON.parse(eo(e,"utf8"))}function Yr(e){let t=El();if(Sl(qr(t),{recursive:!0}),process.platform!=="win32"&&In(t))Qs(t,384);if(xl(t,JSON.stringify(e,null,2)+`
|
|
101
|
+
`,{mode:384}),process.platform!=="win32")Qs(t,384)}function Rn(e){if(!In(e))return;return eo(e,"utf8").trim()||void 0}function Uh(e){let t={};for(let n of e.split(`
|
|
102
|
+
`)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s===-1)continue;let r=o.slice(0,s).trim(),i=o.slice(s+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);t[r]=i}return t}function kl(e){if(!In(e))return{};try{return Uh(eo(e,"utf8"))}catch{return{}}}function Kr(e,t){let n=Hr(),o=e;while(!0){for(let i of[Tn(o,".slack-term",".env.local"),Tn(o,".env.local")]){let a=kl(i);for(let c of t)if(a[c])return a[c]}if(o===n)break;let r=qr(o);if(r===o)break;o=r}let s=kl(Tn(n,".slack-term",".env.local"));for(let r of t)if(s[r])return s[r];return}function Xr(e,t){Sl(qr(e),{recursive:!0});let n=In(e)?eo(e,"utf8"):"",o=n?n.split(`
|
|
103
|
+
`):[];for(let[s,r]of Object.entries(t)){let i=o.findIndex((c)=>{let l=c.trim();return l.startsWith(s+"=")||l.startsWith(s+" =")}),a=`${s}=${r}`;if(i!==-1)o[i]=a;else o.push(a)}if(process.platform!=="win32"&&In(e))Qs(e,384);if(xl(e,o.join(`
|
|
104
104
|
`).trimEnd()+`
|
|
105
|
-
`,{mode:384}),process.platform!=="win32")
|
|
106
|
-
`+" Migrate to SLACK_TOKEN=... or remove from your shell config.")}}let i=
|
|
105
|
+
`,{mode:384}),process.platform!=="win32")Qs(e,384)}function os(){let e=On(),t=Rn(zr()),n=Rn(Gr()),o=t??n;return Object.entries(e.profiles).map(([s,r])=>{let i=ss(e,s);return{name:s,profile:{...r,...i?{cookie:i}:{}},current:s===o}})}function to(e,t){let n=On();if(t.identity&&t.cookie){n.users??={};let o=n.users[t.identity]??{};n.users[t.identity]={...o,cookie:t.cookie};let{cookie:s,...r}=t;n.profiles[e]=r}else n.profiles[e]=t;Yr(n)}function Vr(e,t){let n=On(),o=n.profiles[e];if(!o)throw Error(`Profile not found: ${e}`);if(o.identity)n.users??={},n.users[o.identity]={...n.users[o.identity]??{},cookie:t};else o.cookie=t;Yr(n)}function _l(e,t,n){let o=On();o.users??={},o.users[e]={...o.users[e]??{},cookie:t,...n?{source:n}:{}},Yr(o)}function ss(e,t){if(!t)return;let n=e.profiles[t];if(!n)return;if(n.cookie)return n.cookie;if(n.identity)return e.users?.[n.identity]?.cookie;return}function Cl(e){let n=On().profiles,o=Object.keys(n);if(e){let u=n[e];if(!u)throw Error(`Workspace "${e}" not found. Available: ${o.join(", ")||"(none)"}`);return u.token}if(process.env.SLACK_TOKEN)return process.env.SLACK_TOKEN;let s=process.env.SLACK_BOT_TOKEN??process.env.SLACK_MCP_XOXP_TOKEN;if(s&&o.length===0)return s;let r=[process.env.SLACK_BOT_TOKEN,process.env.SLACK_MCP_XOXP_TOKEN].find((u)=>u&&!u.startsWith("xoxb-"));if(r&&o.length>0){let u=Kr(process.cwd(),["SLACK_BOT_TOKEN","SLACK_MCP_XOXP_TOKEN"]);if(r!==u){if(!globalThis.__slackEnvWarnShown)globalThis.__slackEnvWarnShown=!0,console.error(`Warning: SLACK_MCP_XOXP_TOKEN / SLACK_BOT_TOKEN is set but workspace profiles exist — using profiles.
|
|
106
|
+
`+" Migrate to SLACK_TOKEN=... or remove from your shell config.")}}let i=Kr(process.cwd(),["SLACK_TOKEN"]);if(i)return i;let a=process.env.SLACK_WORKSPACE;if(a){let u=n[a];if(!u)throw Error(`Workspace "${a}" not found. Available: ${o.join(", ")||"(none)"}`);return u.token}let c=Rn(zr());if(c){let u=n[c];if(!u)throw Error(`Workspace "${c}" (from .slack-cli/workspace) not found in profiles.`);return u.token}let l=Rn(Gr());if(l){let u=n[l];if(!u)throw Error(`Workspace "${l}" (from ~/.slack-cli/workspace) not found in profiles.`);return u.token}if(o.length>0)throw Error(`Workspace not selected (${o.join(", ")} available).
|
|
107
107
|
Select locally: slack auth use <name> (writes .slack-cli/workspace)
|
|
108
108
|
Select globally: slack auth use -g <name> (writes ~/.slack-cli/workspace)`);throw Error(`No Slack token found.
|
|
109
109
|
Run one of:
|
|
@@ -112,31 +112,34 @@ ${y.join(`
|
|
|
112
112
|
`+` slack auth cookie — attach the xoxd cookie from Chrome (macOS/Windows)
|
|
113
113
|
`+` slack auth firefox — attach the xoxd cookie from Firefox (all platforms)
|
|
114
114
|
`+` slack auth token --token xoxp-... — paste an existing token
|
|
115
|
-
`+" Or set SLACK_TOKEN=xoxp-... in .slack-term/.env.local")}function
|
|
115
|
+
`+" Or set SLACK_TOKEN=xoxp-... in .slack-term/.env.local")}function no(){let e=process.env.SLACK_BOT_TOKEN;return e&&e.startsWith("xoxb-")?e:void 0}function vt(e){let t=On(),n=t.profiles;if(e)return ss(t,e);if(process.env.SLACK_COOKIE)return process.env.SLACK_COOKIE;if(process.env.SLACK_MCP_XOXD_COOKIE)return process.env.SLACK_MCP_XOXD_COOKIE;if(process.env.SLACK_MCP_XOXP_TOKEN&&Object.keys(n).length===0)return process.env.SLACK_MCP_XOXD_COOKIE;let s=Kr(process.cwd(),["SLACK_COOKIE"]);if(s)return s;let r=process.env.SLACK_WORKSPACE;if(r)return ss(t,r);let i=Rn(zr());if(i)return ss(t,i);let a=Rn(Gr());if(a)return ss(t,a);return}function so(e){let t=[],n=(r)=>{if(!r)return;let i=t[t.length-1];if(i?.type==="text")i.text+=r;else t.push({type:"text",text:r})},o=/<(https?:\/\/[^\s<>|]+)(?:\|([^<>\r\n]*))?>|https?:\/\/[\x21-\x3b\x3d\x3f-\x7e]+/gi,s=0;for(let r of e.matchAll(o)){let i=r.index??0;if(n(e.slice(s,i)),r[1]){t.push(r[2]?{type:"link",url:r[1],text:r[2]}:{type:"link",url:r[1]}),s=i+r[0].length;continue}let a=r[0];while(/[.,:;!?'"*_~]$/.test(a)||a.endsWith(")")&&$l(a,"(")<$l(a,")"))a=a.slice(0,-1);t.push({type:"link",url:a}),s=i+a.length}return n(e.slice(s)),t}function $l(e,t){return e.split(t).length-1}var Jh={"&":"&","<":"<",">":">"};function Kh(e){if(typeof e!=="string"||!/^[0-9a-f]+(-[0-9a-f]+)*$/i.test(e))return[];let t=e.split("-").map((s)=>parseInt(s,16)),n=String.fromCodePoint(...t),o=String.fromCodePoint(...t.filter((s)=>s!==65039));return n===o?[n]:[n,o]}function qh(e){let t=[],n=(r)=>{for(let i of r)if(i===`
|
|
116
|
+
`)t.push(null);else if(!/\s/u.test(i))t.push(...Jh[i]??i)},o=(r)=>{switch(r.type){case"text":n(String(r.text??""));break;case"link":case"message_mention":n(String(r.url??""));break;case"user":n(String(r.user_id??""));break;case"channel":n(String(r.channel_id??""));break;case"usergroup":n(String(r.usergroup_id??""));break;case"broadcast":n(String(r.range??""));break;case"emoji":t.push([`:${String(r.name??"")}:`,...Kh(r.unicode)].filter((i)=>i!=="::"));break;default:break}},s=(r)=>{let i=Array.isArray(r.elements)?r.elements:[];if(r.type==="rich_text_list"||r.type==="rich_text")i.forEach((a,c)=>{if(c>0)t.push(null);s(a)});else i.forEach(o)};return e.forEach((r,i)=>{if(i>0)t.push(null);let a=r;if(a.type==="rich_text")s(a)}),t}function Hh(e,t,n){if(typeof t==="string"){let s=n;while(s<e.length&&e[s]!==t)s++;return s<e.length?[s,1]:[-1,0]}let o=[-1,0];for(let s of t){let r=[...s];for(let i=n;i+r.length<=e.length&&(o[0]<0||i<o[0]);i++)if(r.every((a,c)=>e[i+c]===a)){o=[i,r.length];break}}return o}function zh(e,t){if(e.includes(`
|
|
117
|
+
`)||!Array.isArray(t)||!t.some((m)=>m?.type==="rich_text"))return e;let n=qh(t);if(!n.includes(null))return e;let o=[...e],s=t[0].elements,i=t[t.length-1].elements,a=Array.isArray(s)&&s[0]?.type==="rich_text_preformatted",c=Array.isArray(i)&&i[i.length-1]?.type==="rich_text_preformatted",l=0,u=-1,d=a,f=[];for(let m of n){if(m===null){d=!0;continue}let[p,g]=Hh(o,m,l);if(p<0)return e;if(d)f.push([u+1,p]),d=!1;u=p+g-1,l=p+g}if((d||c)&&u>=0)f.push([u+1,o.length]);let h=/^(?:[-*+•]|\d{1,9}[.)]|>|>)$/;for(let[m,p]of f){let g=m;if(o.lastIndexOf("<",m-1)>o.lastIndexOf(">",m-1)){let k=o.indexOf(">",m);if(k!==-1&&k<p)g=k+1}let w="",b=m===0;while(g<p)if(o[g]===" "){let k=g;while(k<p&&o[k]===" ")k++;if(b&&h.test(w))b=!1;else{let x=k-g<=2?k-g:1;for(let _=g;_<g+x;_++)o[_]=`
|
|
118
|
+
`;b=!0}w="",g=k}else w+=o[g],g++}return o.join("")}function oo(e){if(!e||typeof e!=="object"||Array.isArray(e))return;let t=e;if(typeof t.text==="string")t.text=zh(t.text,t.blocks)}class qe extends Error{retryAfter;method;constructor(e,t){super(t?`Slack rate limited on ${t} — retry after ${e}s`:`Slack rate limited — retry after ${e}s`);if(this.name="RateLimitError",this.retryAfter=e,t)this.method=t}}function Qr(){return(process.env.SLACK_API_BASE??"https://slack.com/api").replace(/\/$/,"")}async function ei(e,t,n,o){o=e.startsWith("xoxc-")?o??vt():void 0;let s={};if(o)s.Cookie=`d=${o}`;let r=await fetch(`${Qr()}/${t}`,{...n,headers:{...n.headers??{},Authorization:`Bearer ${e}`,...s}});if(r.status===429){let a=parseInt(r.headers.get("retry-after")??"60",10);throw new qe(isNaN(a)?60:a,t)}let i=await r.json();if(i.ok!==!0){let a=i.error??"unknown";if(a==="ratelimited")throw new qe(60,t);if(a==="invalid_auth"&&e.startsWith("xoxc-")&&!o)throw Error(`Desktop app token (xoxc-) needs its session cookie to be accepted by the public Slack API.
|
|
116
119
|
Attach it: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)
|
|
117
120
|
Or replace the token with an xoxp- user token:
|
|
118
121
|
slack auth login`);if((a==="missing_scope"||a==="cannot_dm_bot")&&e.startsWith("xoxb-")){if(t.startsWith("agents.sessions."))throw Error(`Slack error on ${t}: ${a}. Agent sessions need a granular bot token with chat:write and app membership in the channel.`);throw Error(`Slack error on ${t}: ${a} — ${a==="cannot_dm_bot"?`you're authenticated as a bot, so "@you" is the bot itself and it can't DM itself`:"this bot token lacks the user scope this action needs"}.
|
|
119
122
|
Tailing/DMing people and listing users need a user session, not a bot token.
|
|
120
123
|
Switch workspace: slack auth ls then slack auth use <name>
|
|
121
|
-
Or import your Slack desktop session: slack auth login`)}throw Error(`Slack error on ${t}: ${a}`)}return i}async function
|
|
124
|
+
Or import your Slack desktop session: slack auth login`)}throw Error(`Slack error on ${t}: ${a}`)}return i}async function Gh(e,t,n,o){let s={};if(o)s.Cookie=`d=${o}`;let r=await fetch(`${Qr()}/${t}`,{...n,headers:{...n.headers??{},Authorization:`Bearer ${e}`,...s}});if(r.status===429){let a=parseInt(r.headers.get("retry-after")??"60",10);throw new qe(isNaN(a)?60:a,t)}let i=await r.json();if(i.ok!==!0){let a=i.error??"unknown";if(a==="ratelimited")throw new qe(60,t);if((a==="invalid_auth"||a==="not_authed")&&!e.startsWith("xoxc-"))throw Error(`${t} requires a desktop app session token (xoxc-).
|
|
122
125
|
Import from Slack desktop: slack auth login`);if((a==="invalid_auth"||a==="not_authed")&&!o)throw Error(`${t} also requires the xoxd session cookie.
|
|
123
|
-
Attach it with: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)`);throw Error(`Slack error on ${t}: ${a}`)}return i}function
|
|
126
|
+
Attach it with: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)`);throw Error(`Slack error on ${t}: ${a}`)}return i}function Yh(e,t,n={},o){let s=new URLSearchParams({token:e,...n});return Gh(e,t,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:s.toString()},o)}function Fe(e,t,n,o){let s=new URLSearchParams(n).toString();return ei(e,`${t}?${s}`,{method:"GET"},o)}function ti(e,t,n,o){return ei(e,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},o)}async function Il(e,t,n){if(!e.startsWith("xoxb-"))throw Error("Agent sessions require a bot token (xoxb); user tokens are refused.");return ei(e,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),signal:AbortSignal.timeout(1e4)})}function is(e,t,n){return Il(e,"agents.sessions.setStatus",{...t,status:n})}function ni(e,t,n){return Il(e,"agents.sessions.rename",{...t,title:n})}async function Pn(e,t){let n=await Fe(e,"auth.test",{},t);return{team:n.team??"",teamId:n.team_id??"",url:n.url??"",user:n.user??"",userId:n.user_id??""}}async function Rl(e,t){t=e.startsWith("xoxc-")?t??vt():void 0;let n={Authorization:`Bearer ${e}`};if(t)n.Cookie=`d=${t}`;let o=await fetch(`${Qr()}/auth.test`,{method:"GET",headers:n});if(o.status===429){let i=parseInt(o.headers.get("retry-after")??"60",10);throw new qe(isNaN(i)?60:i,"auth.test")}let s=o.headers.get("x-oauth-scopes")??"",r=await o.json();if(r.ok!==!0)throw Error(`Slack error on auth.test: ${r.error??"unknown"}`);return{userId:r.user_id??"",user:r.user??"",botId:r.bot_id??"",team:r.team??"",url:r.url??"",scopes:s.split(",").map((i)=>i.trim()).filter(Boolean)}}async function Ol(e,t,n){let o=await Fe(e,"bots.info",{bot:t},n);return{appId:o.bot?.app_id??"",userId:o.bot?.user_id??""}}async function gn(e,t,n=20,o,s,r,i){let a={channel:t,limit:String(n)};if(o!==void 0)a.oldest=o;if(s!==void 0)a.cursor=s;if(i)a.inclusive="true";return si(await Fe(e,"conversations.history",a,r))}function si(e){let t=e,n=Array.isArray(t.messages)?t.messages:t.messages&&typeof t.messages==="object"&&Array.isArray(t.messages.matches)?t.messages.matches:[];for(let o of n)oo(o);return e}async function Pl(e,t,n,o=50,s){return si(await Fe(e,"conversations.replies",{channel:t,ts:n,limit:String(o)},s))}async function vl(e,t,n,o={},s){let r={channel:t,ts:n,limit:String(o.limit??200)};if(o.oldest!==void 0)r.oldest=o.oldest;if(o.cursor!==void 0)r.cursor=o.cursor;return si(await Fe(e,"conversations.replies",r,s))}async function Ll(e,t,n){let o=[],s="";do{let r={limit:"200",types:t,exclude_archived:"true"};if(s)r.cursor=s;let i=await Fe(e,"users.conversations",r,n);o.push(...i.channels??[]),s=i.response_metadata?.next_cursor??""}while(s);return o}async function ro(e,t,n,o,s){await ti(e,"reactions.add",{channel:t,timestamp:n,name:o},s)}async function Bl(e,t,n,o){return((await Fe(e,"reactions.get",{channel:t,timestamp:n,full:"true"},o)).message?.reactions??[]).map((r)=>({name:String(r.name??""),users:Array.isArray(r.users)?r.users.map(String):[]}))}async function io(e,t,n,o,s){await ti(e,"reactions.remove",{channel:t,timestamp:n,name:o},s)}async function Xh(e,t,n){let s=(await ti(e,"conversations.open",{users:t},n)).channel?.id;if(!s)throw Error(`Failed to open DM with user ${t}`);return s}async function Ml(e,t,n){let o="";while(!0){let s={types:"im",limit:"200"};if(o)s.cursor=o;let r=await Fe(e,"conversations.list",s,n);for(let i of r.channels??[])if(i.user===t)return String(i.id??"");if(o=r.response_metadata?.next_cursor??"",!o)break}return""}async function Zr(e,t,n,o){let s=await Ml(e,t,n);if(s)return s;let r=o?`${o} (${t})`:t;throw Error(`No existing DM with ${r}. Open it once in Slack first.`)}function rs(e){return e.toLowerCase().replace(/[-_\s]/g,"")}function Fl(e,t){let n=rs(e.name??""),o=rs(e.real_name??e.profile?.real_name??""),s=rs(e.profile?.display_name??"");return n===t||o===t||!!s&&s===t}var Nl=200;async function Vh(e,t,n){let o=0,s=new Set,r="";while(!0){let u={limit:"200"};if(r)u.cursor=r;let d=await Fe(e,"users.list",u,n);for(let f of d.members??[]){if(o++,f.id)s.add(f.id);if(Fl(f,t))return{id:f.id??"",workspaceCount:o,connectCount:0,skipped:0,capped:!1}}if(r=d.response_metadata?.next_cursor??"",!r)break}let i=0,a=0,c=!1,l="";while(!0){let u={types:"im",limit:"200"};if(l)u.cursor=l;let d=await Fe(e,"conversations.list",u,n);for(let f of d.channels??[]){let h=f.user;if(!h||s.has(h))continue;if(i>=Nl){c=!0;break}s.add(h),i++;let m;try{m=(await Fe(e,"users.info",{user:h},n)).user}catch(p){if(p instanceof qe)throw p;a++;continue}if(m&&Fl(m,t))return{id:h,dm:String(f.id??""),workspaceCount:o,connectCount:i,skipped:a,capped:c}}if(c)break;if(l=d.response_metadata?.next_cursor??"",!l)break}return{id:"",workspaceCount:o,connectCount:i,skipped:a,capped:c}}function Zh(e,t){if(t.workspaceCount===0)return Error(`Cannot resolve ${e}: users.list returned no members at all, so nothing could have matched.
|
|
124
127
|
`+`That is a token or scope fault, not a wrong handle — this says nothing about whether ${e} exists.
|
|
125
|
-
Check who you are: slack auth ls`);let n=t.connectCount?`${t.workspaceCount} workspace account(s) and ${t.connectCount} Slack Connect DM partner(s)`:`${t.workspaceCount} workspace account(s)`,o=[];if(t.capped)o.push(`stopped after ${
|
|
128
|
+
Check who you are: slack auth ls`);let n=t.connectCount?`${t.workspaceCount} workspace account(s) and ${t.connectCount} Slack Connect DM partner(s)`:`${t.workspaceCount} workspace account(s)`,o=[];if(t.capped)o.push(`stopped after ${Nl} Slack Connect DM partners, so there may be more`);if(t.skipped)o.push(`${t.skipped} DM partner profile(s) could not be read and were never compared`);return Error(`User not found: ${e} — searched ${n}, none matched.
|
|
126
129
|
`+(o.length?`This search was incomplete: ${o.join("; ")}.
|
|
127
130
|
`:"")+`Slack Connect people from another workspace are not in users.list, so if they never
|
|
128
131
|
DMed you they cannot be found by name at all. Look them up and use their ID:
|
|
129
|
-
slack user ls --external`)}function
|
|
130
|
-
${
|
|
132
|
+
slack user ls --external`)}function oi(e){let t=e.match(/(?:app\.slack\.com\/client\/T[A-Za-z0-9]+|[A-Za-z0-9-]+\.slack\.com\/archives)\/([A-Za-z0-9]+)(?:\/p(\d{10})(\d{6}))?/);if(!t)return;let n=t[1],o=t[2]&&t[3]?`${t[2]}.${t[3]}`:void 0,s=e.indexOf("?"),r=s>=0?new URLSearchParams(e.slice(s)):void 0,i=r?.get("thread_ts")??void 0,l={channel:r?.get("cid")??void 0??n};if(o)l.ts=o;if(i)l.threadTs=i;return l}function Qh(e){return oi(e)?.channel}function Al(e){return/^[CDG][A-Z0-9]{8,}$/.test(e)}function Tl(e){return/^[UW][A-Z0-9]{6,}$/.test(e)}async function ao(e,t,n){let o=Qh(t);if(o)return o;if(!t.startsWith("@")&&!t.startsWith("#")){if(Al(t))return t;if(Tl(t))return Zr(e,t,n);throw Error(`Target must start with # or @ (or be a Slack URL/ID), got: ${t}`)}if(t.startsWith("#")&&Al(t.slice(1)))return t.slice(1);let s=t.startsWith("@"),r=t.slice(1),i=rs(r);if(s){if(Tl(r))return Zr(e,r,n);let l=await Fe(e,"auth.test",{},n);if(i==="you"||i==="me"||rs(l.user??"")===i){let f=l.user_id;if(!f)throw Error("auth.test did not return user_id");return await Ml(e,f,n)||Xh(e,f,n)}let d=await Vh(e,i,n);if(!d.id)throw Zh(t,d);if(d.dm)return d.dm;return Zr(e,d.id,n,t)}let a=r.toLowerCase(),c="";while(!0){let l={limit:"200",types:"public_channel,private_channel",exclude_archived:"true"};if(c)l.cursor=c;let u=await Fe(e,"conversations.list",l,n);for(let d of u.channels??[])if(String(d.name??"").toLowerCase()===a)return String(d.id??"");if(c=u.response_metadata?.next_cursor??"",!c)break}throw Error(`channel not found: ${t}`)}async function co(e,t,n){try{let o=await Fe(e,"users.info",{user:t},n),s=o.user?.profile?.display_name,r=s&&s.length>0?s:o.user?.real_name??o.user?.name??t,i=o.user?.name??t;return[r,i]}catch{return[t,t]}}async function vn(e,t,n){try{let o=await Fe(e,"users.info",{user:t},n),s=o.user?.profile?.display_name;if(s&&s.length>0)return s;return o.user?.real_name??o.user?.name??t}catch{return t}}async function lo(e,t){let n=[],o="";while(!0){let s={limit:"200"};if(o)s.cursor=o;let r=await Fe(e,"users.list",s,t);if(n.push(...r.members??[]),o=r.response_metadata?.next_cursor??"",!o)break}return{members:n}}async function ri(e,t,n){let o=[],s="";while(!0){let r={channel:t,limit:"200"};if(s)r.cursor=s;let i=await Fe(e,"conversations.members",r,n);if(o.push(...i.members??[]),s=i.response_metadata?.next_cursor??"",!s)break}return o}async function ii(e,t,n){return Fe(e,"users.info",{user:t},n)}async function jl(e,t,n){return Fe(e,"conversations.info",{channel:t},n)}async function Wl(e,t){let n=await Yh(e,"client.boot",{},t),o=typeof n.url==="string"?n.url:void 0;if(!o){let r=Object.keys(n).join(", ");throw Error(`client.boot did not return a WebSocket URL. Keys: ${r}`)}let s=n.self&&typeof n.self==="object"&&!Array.isArray(n.self)?n.self:{};return{wsUrl:o,selfId:typeof s.id==="string"?s.id:""}}var eg=["chat:write","im:write"],tg=["im:history","im:read"];async function uo(e){let{userId:t,botId:n,team:o,scopes:s}=await Rl(e),r="";if(n)try{r=(await Ol(e,n)).appId}catch{r=""}let i=(l)=>s.includes(l),a=eg.filter((l)=>!i(l)),c=tg.filter((l)=>!i(l));return{canSend:a.length===0,canReceiveReplies:c.length===0,ok:a.length===0&&c.length===0,botUserId:t,appId:r,team:o,grantedScopes:s,missingSendScopes:a,missingReplyScopes:c}}function Ul(e){return["",` Bot user: ${e.botUserId||"(unknown)"}`,` App ID: ${e.appId||"(unknown — bots.info unavailable)"}`,` Granted scopes: ${e.grantedScopes.join(", ")||"(none reported)"}`]}function fo(e,t=!1){let n=e.appId?`https://api.slack.com/apps/${e.appId}`:"https://api.slack.com/apps";if(e.ok){let s=["✓ Bot DM scopes are complete (send + read replies)."," Two-way replies also require the Messages Tab, which is not API-detectable.",' If recipients see "Sending messages to this app is turned off", enable it:',` ${n} → App Home → "Messages Tab" ON + "Allow users to send messages".`];return t?s:[...s,...Ul(e)]}let o=[];if(!e.canSend)o.push(`⚠ This bot CANNOT send DMs — missing scope(s): ${e.missingSendScopes.join(", ")}.`);else o.push("⚠ This bot can send DMs, but the user's replies will NOT be readable.");return o.push(" Make escalation DMs two-way:"),o.push(` 1. ${n} → App Home → enable "Messages Tab" and check`),o.push(' "Allow users to send Slash commands and messages".'),o.push(` 2. OAuth & Permissions → add Bot Token Scopes: ${[...e.missingSendScopes,...e.missingReplyScopes].join(", ")}`),o.push(" 3. Reinstall the app to apply the new scopes."),t?o:[...o,...Ul(e)]}import{createInterface as He}from"node:readline/promises";import{join as mi,resolve as $g}from"node:path";import{homedir as Fg}from"node:os";import{readdirSync as ls,readFileSync as cs,existsSync as Qe,copyFileSync as li,mkdtempSync as Hl,rmSync as zl}from"node:fs";import{homedir as ho,tmpdir as Gl}from"node:os";import{join as fe,dirname as og}from"node:path";import{pbkdf2Sync as po,createDecipheriv as Yl,createHash as rg,timingSafeEqual as ig}from"node:crypto";import{execSync as Xl,execFileSync as ag}from"node:child_process";function as(e,t){let n=0,o=0,s=t;while(s<e.length){let r=e[s++];if(n+=(r&127)*2**o,(r&128)===0)break;o+=7}return{value:n,pos:s}}function ng(e){let t=0,n=0,o=0;while(t<e.length){let i=e[t++];if(n+=(i&127)*2**o,(i&128)===0)break;o+=7}let s=Buffer.allocUnsafe(n),r=0;while(t<e.length&&r<n){let i=e[t++],a=i&3;if(a===0){let c=i>>2;if(c>=60){let l=c-59;c=0;for(let u=0;u<l;u++)c+=e[t++]*2**(8*u)}c+=1,e.copy(s,r,t,t+c),t+=c,r+=c}else{let c,l;if(a===1)c=4+(i>>2&7),l=(i>>5&7)*256+e[t++];else if(a===2)c=1+(i>>2),l=e[t]+e[t+1]*256,t+=2;else c=1+(i>>2),l=e[t]+e[t+1]*256+e[t+2]*65536+e[t+3]*16777216,t+=4;let u=r-l;for(let d=0;d<c&&r<n;d++)s[r++]=s[u++]}}return r===n?s:s.subarray(0,r)}function ai(e,t){let n=as(e,t),o=as(e,n.pos);return{handle:{offset:n.value,size:o.value},pos:o.pos}}function Jl(e,t){let{offset:n,size:o}=t,s=e.subarray(n,n+o);return e[n+o]===1?ng(s):Buffer.from(s)}function sg(e){if(e.length<4)return[];let t=e.readUInt32LE(e.length-4),n=e.length-(t+1)*4,o=[],s=0,r=Buffer.alloc(0);while(s<n){let i=as(e,s),a=as(e,i.pos),c=as(e,a.pos);s=c.pos;let l=i.value,u=a.value,d=c.value,f=e.subarray(s,s+u);s+=u;let h=e.subarray(s,s+d);s+=d,r=Buffer.concat([r.subarray(0,l),f]),o.push(h)}return o}function Kl(e){if(e.length<48)return Buffer.alloc(0);try{let t=e.length-48,n=ai(e,t),o=ai(e,n.pos),s=Jl(e,o.handle),r=[];for(let i of sg(s))try{let{handle:a}=ai(i,0);r.push(Jl(e,a))}catch{}return Buffer.concat(r)}catch{return Buffer.alloc(0)}}function ql(){let e=process.env.HOME??ho();if(process.platform==="darwin")return[fe(e,"Library","Application Support","Slack","Local Storage","leveldb")];if(process.platform==="linux")return[fe(e,".config","Slack","Local Storage","leveldb"),fe(e,"snap","slack","current",".config","Slack","Local Storage","leveldb"),fe(e,".var","app","com.slack.Slack","config","Slack","Local Storage","leveldb")];if(process.platform==="win32"){let t=process.env.APPDATA??fe(e,"AppData","Roaming");return[fe(t,"Slack","Local Storage","leveldb")]}throw Error(`Unsupported platform: ${process.platform}`)}function cg(){let e=process.env.HOME??ho();if(process.platform==="darwin")return fe(e,"Library","Application Support","Slack","Cookies");return""}function lg(e,t){if(e.length<35||e.slice(0,3).toString()!=="v10")throw Error("Not a v10 encrypted cookie");let n=e.slice(19,35),o=e.slice(35),s=Yl("aes-128-cbc",t,n);return s.setAutoPadding(!0),Buffer.concat([s.update(o),s.final()]).toString("utf8")}function ug(){if(process.platform!=="darwin")return;let e=cg();if(!Qe(e))return;let t;try{t=Xl('security find-generic-password -w -s "Slack Safe Storage" -a "Slack Key"',{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trimEnd()}catch{return}let n=po(t,"saltysalt",1003,16,"sha1");try{let{default:o}=zn("bun:sqlite"),s=new o(e,{readonly:!0}),r=s.prepare("SELECT encrypted_value FROM cookies WHERE name='d' AND host_key LIKE '%slack%'").get();if(s.close(),!r)return;return lg(Buffer.from(r.encrypted_value),n)}catch{return}}function Vl(e){if(!Qe(e))return[];let t=ls(e).filter((i)=>i.endsWith(".ldb")||i.endsWith(".log"));if(t.length===0)return[];let n=new Map,o=(i)=>{let a=n.get(i);if(a!==void 0)return a;let c="";try{let l=cs(fe(e,i));c=i.endsWith(".ldb")?Kl(l).toString("latin1")||l.toString("latin1"):l.toString("latin1")}catch{c=""}return n.set(i,c),c},s=new Map;for(let i of t){let a=o(i);for(let c of a.matchAll(/"token":"(xoxc-[^"]+)"/g)){let l=c[1],u=l.split("-")[1]??"";if(!u||l.length<40)continue;let d=Math.max(0,c.index-2000),f=Math.min(a.length,c.index+2000),h=a.slice(d,f),m=h.match(/"url":"(https:\/\/[a-z0-9-]+\.slack\.com\/)"/),p=h.match(/"(?:team_name|name)":"([^"]{2,60})"/),g=s.get(u);if(!g||l.length>g.token.length){let w={token:l,teamId:u},b=m?.[1]??g?.url,k=p?.[1]??g?.teamName;if(b)w.url=b;if(k)w.teamName=k;s.set(u,w)}}}let r=t.map((i)=>o(i).replace(/[^\x20-\x7e]/g," ")).join(" ");for(let i of s.values()){if(i.teamName)continue;let a=r.indexOf(i.teamId);if(a!==-1){let c=Math.max(0,a-500),l=Math.min(r.length,a+500),d=r.slice(c,l).match(/"(?:team_name|name)":"([^"]{2,60})"/);if(d?.[1]){i.teamName=d[1];continue}}if(!i.teamName&&i.url){let c=i.url.match(/https:\/\/([a-z0-9-]+)\.slack\.com\//)?.[1];if(c){let l=r.indexOf(c);if(l!==-1){let u=Math.max(0,l-500),d=Math.min(r.length,l+500),h=r.slice(u,d).match(/"(?:team_name|name)":"([^"]{2,60})"/);if(h?.[1]){i.teamName=h[1];continue}}i.teamName=c.split("-").map((u)=>u.charAt(0).toUpperCase()+u.slice(1)).join(" ")}}}return[...s.values()]}async function ui(e){let t=e??ql().find(Qe);if(!t)throw Error(`Slack desktop app LevelDB not found at:
|
|
133
|
+
${ql().join(`
|
|
131
134
|
`)}
|
|
132
|
-
Is Slack installed and opened at least once?`);let n=
|
|
133
|
-
`)){let c=a.trim();if(c.startsWith("[")){r="",i="";continue}let l=c.indexOf("=");if(l===-1)continue;let u=c.slice(0,l).trim().toLowerCase(),d=c.slice(l+1).trim();if(u==="name")r=d;if(u==="path")i=d.split(/[\\/]/).pop()??d;if(r&&i)o[i]=r,r="",i=""}}catch{}return o}function
|
|
135
|
+
Is Slack installed and opened at least once?`);let n=Vl(t),o=e?void 0:ug();if(o)for(let s of n)s.cookie=o;return n}function dg(e,t){try{return JSON.parse(cs(fe(e,"Local State"),"utf8")).profile?.info_cache?.[t]?.user_name||void 0}catch{return}}function di(){let e=fi();if(!e||!Qe(e))return[];let t=["Default",...ls(e).filter((o)=>o.startsWith("Profile "))],n=[];for(let o of t){let s=fe(e,o,"Local Storage","leveldb"),r=Vl(s);if(r.length===0)continue;let i=dg(e,o);n.push({profileDir:o,...i?{email:i}:{},label:Zl(e,o),sessions:r})}return n}function ci(e,t,n,o=!1){let s=(r,i)=>{try{let a=Yl("aes-128-cbc",t,r);a.setAutoPadding(!0);let c=Buffer.concat([a.update(i),a.final()]);if(c.subarray(0,5).toString()==="xoxd-")return c.toString("utf8");if(c.length>=37){let l=rg("sha256").update(n).digest();if(ig(c.subarray(0,32),l)){let u=c.subarray(32).toString("utf8");if(u.startsWith("xoxd-"))return u}}return}catch{return}};return s(Buffer.alloc(16,32),e.slice(3))??(o&&e.length>=35?s(e.slice(19,35),e.slice(35)):void 0)}function Zl(e,t){let n=(o,s)=>{if(o&&s)return`${o} (${s})`;return o||s||t};try{let s=JSON.parse(cs(fe(e,"Local State"),"utf8")).profile?.info_cache?.[t];if(s&&(s.name||s.user_name))return n(s.name??"",s.user_name??"")}catch{}try{let s=JSON.parse(cs(fe(e,t,"Preferences"),"utf8")).profile;return n(s?.name??"",s?.user_name??"")}catch{return t}}function fi(){let e=process.env.HOME??ho();if(process.platform==="darwin")return fe(e,"Library","Application Support","Google","Chrome");if(process.platform==="linux")return fe(process.env.XDG_CONFIG_HOME??fe(e,".config"),"google-chrome");return""}function fg(){try{return ag("secret-tool",["lookup","application","chrome"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trimEnd()||void 0}catch{return}}function us(){if(process.platform!=="darwin"&&process.platform!=="linux")return{candidates:[],totalProfiles:0};let e=fi();if(!Qe(e))return{candidates:[],totalProfiles:0};let t;if(process.platform==="darwin"){let i;try{i=Xl('security find-generic-password -a Chrome -s "Chrome Safe Storage" -w',{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trimEnd()}catch{return{candidates:[],totalProfiles:0}}if(!i)return{candidates:[],totalProfiles:0};t=po(i,"saltysalt",1003,16,"sha1")}let n=["Default",...ls(e).filter((i)=>i.startsWith("Profile "))],o=[],s,r=!1;for(let i of n){let a=[fe(e,i,"Network","Cookies"),fe(e,i,"Cookies")].find(Qe);if(!a)continue;let c=Hl(fe(Gl(),"slack-chrome-cookies-")),l=fe(c,"Cookies");try{if(li(a,l),Qe(`${a}-wal`))li(`${a}-wal`,`${l}-wal`);let{default:u}=zn("bun:sqlite"),d=new u(l,{readonly:!0}),f;try{f=d.prepare("SELECT encrypted_value, value, host_key FROM cookies WHERE name='d' AND (host_key='slack.com' OR host_key LIKE '%.slack.com') LIMIT 1").get()}finally{d.close()}if(!f)continue;let h=Buffer.from(f.encrypted_value),m=h.subarray(0,3).toString(),p;if(m==="v20")throw Error("Chrome cookie uses unsupported v20 app-bound encryption.");if(process.platform==="linux"){if(!h.length&&f.value?.startsWith("xoxd-"))p=f.value;else if(m==="v10")p=ci(h,po("peanuts","saltysalt",1,16,"sha1"),f.host_key);else if(m==="v11"){if(!s){let g=fg();if(g)s=po(g,"saltysalt",1,16,"sha1")}if(s)p=ci(h,s,f.host_key);else r=!0}}else if(m==="v10"&&t)p=ci(h,t,f.host_key,!0);else if(m!=="v10")throw Error("Unknown cookie encryption prefix.");if(p)o.push({profileDir:i,profileName:Zl(e,i),cookie:p})}catch(u){if(u instanceof Error&&(u.message.includes("unsupported v20")||u.message.includes("Unknown cookie")))throw u}finally{zl(c,{recursive:!0,force:!0})}}if(r&&o.length===0)throw Error("Chrome v11 cookie key is unavailable. Install secret-tool and unlock the GNOME keyring, or use slack auth firefox.");return{candidates:o,totalProfiles:n.length}}async function pi(){if(process.platform!=="linux")throw Error("Chrome session import is currently supported on Linux only.");let e=fi();if(!Qe(e))throw Error("Chrome profile directory was not found.");let t=new Map(us().candidates.map((s)=>[s.profileDir,s.cookie])),n=new Map,o=["Default",...ls(e).filter((s)=>s.startsWith("Profile "))];for(let s of o){let r=fe(e,s,"Local Storage","leveldb");if(!Qe(r))continue;let i;try{i=await ui(r)}catch{continue}for(let a of i){if(n.has(a.teamId))throw Error("More than one Chrome profile has a token for the same workspace. Select one browser profile first.");let c=t.get(s);if(c)a.cookie=c;n.set(a.teamId,a)}}return[...n.values()]}function pg(){let e=process.env.HOME??ho();if(process.platform==="darwin")return[fe(e,"Library","Application Support","Firefox","Profiles")];if(process.platform==="linux")return[fe(e,".mozilla","firefox"),fe(e,"snap","firefox","common",".mozilla","firefox"),fe(e,".var","app","org.mozilla.firefox",".mozilla","firefox")];if(process.platform==="win32")return[fe(process.env.APPDATA??fe(e,"AppData","Roaming"),"Mozilla","Firefox","Profiles")];return[]}function hg(e){let t=fe(e,"profiles.ini"),n=Qe(t)?t:fe(og(e),"profiles.ini"),o={};if(!Qe(n))return o;try{let s=cs(n,"utf8"),r="",i="";for(let a of s.split(`
|
|
136
|
+
`)){let c=a.trim();if(c.startsWith("[")){r="",i="";continue}let l=c.indexOf("=");if(l===-1)continue;let u=c.slice(0,l).trim().toLowerCase(),d=c.slice(l+1).trim();if(u==="name")r=d;if(u==="path")i=d.split(/[\\/]/).pop()??d;if(r&&i)o[i]=r,r="",i=""}}catch{}return o}function go(){let e=[];for(let t of pg().filter(Qe)){let n=hg(t),o;try{o=ls(t)}catch{continue}for(let s of o){let r=fe(t,s,"cookies.sqlite");if(!Qe(r))continue;let i=Hl(fe(Gl(),"slack-firefox-cookies-")),a=fe(i,"cookies.sqlite");try{li(r,a);let{default:c}=zn("bun:sqlite"),l=new c(a,{readonly:!0}),u=l.prepare("SELECT value FROM moz_cookies WHERE name='d' AND (host='slack.com' OR host LIKE '%.slack.com') LIMIT 1").get();if(l.close(),!u?.value||!u.value.startsWith("xoxd-"))continue;let d=n[s]??s;e.push({profileDir:s,profileName:d,cookie:u.value})}catch{}finally{zl(i,{recursive:!0,force:!0})}}}return e}import{readFileSync as hi,writeFileSync as gi,mkdirSync as gg,existsSync as ds,rmSync as mg}from"node:fs";import{join as it}from"node:path";import{createDecipheriv as mo}from"node:crypto";import{spawnSync as yg}from"node:child_process";var wg=Buffer.from("b31c6e241ac846728da9c1fac4936651cffb944d143ab816276bcc6da0284787","hex"),bg=Buffer.from("e98f37d7f4e1fa433d19304dc2258042090e2d1d7eea7670d41f738d08729660","hex"),Dg=Buffer.from("ccf8a1cec56605b8517552ba1a2d061c03a29e90274fb2fcf59ba4b75c392390","hex"),dt="C:\\ProgramData\\slack-term-abe";function kg(){let e=process.env.LOCALAPPDATA??it(process.env.USERPROFILE??"","AppData","Local");return it(e,"Google","Chrome","User Data")}var xg=String.raw`try {
|
|
134
137
|
Add-Type -AssemblyName System.Security
|
|
135
138
|
$d = [IO.File]::ReadAllBytes('C:\ProgramData\slack-term-abe\in.bin')
|
|
136
139
|
$o = [Security.Cryptography.ProtectedData]::Unprotect($d, $null, 'CurrentUser')
|
|
137
140
|
[IO.File]::WriteAllBytes('C:\ProgramData\slack-term-abe\sys.bin', $o)
|
|
138
141
|
} catch { Set-Content 'C:\ProgramData\slack-term-abe\dpapi.err' ($_.Exception.Message) }
|
|
139
|
-
`,
|
|
142
|
+
`,Sg=String.raw`try {
|
|
140
143
|
Add-Type -TypeDefinition @'
|
|
141
144
|
using System; using System.Runtime.InteropServices;
|
|
142
145
|
public static class NC {
|
|
@@ -152,7 +155,7 @@ public static class NC {
|
|
|
152
155
|
'@
|
|
153
156
|
[IO.File]::WriteAllBytes('C:\ProgramData\slack-term-abe\cng.bin', [NC]::Dec([IO.File]::ReadAllBytes('C:\ProgramData\slack-term-abe\eak.bin')))
|
|
154
157
|
} catch { Set-Content 'C:\ProgramData\slack-term-abe\cng.err' ($_.Exception.Message) }
|
|
155
|
-
`;function
|
|
158
|
+
`;function Eg(e,t){let n=(o)=>`'${o.replace(/'/g,"''")}'`;return String.raw`
|
|
156
159
|
$ErrorActionPreference = 'Stop'
|
|
157
160
|
Add-Type -AssemblyName System.Security
|
|
158
161
|
$work = 'C:\ProgramData\slack-term-abe'
|
|
@@ -218,59 +221,70 @@ icacls "$work\Cookies" /grant "$($u):(R)" | Out-Null
|
|
|
218
221
|
if (Test-Path "$work\cng.bin") { icacls "$work\cng.bin" /grant "$($u):(R)" | Out-Null }
|
|
219
222
|
Write-Host 'OK'
|
|
220
223
|
try { Stop-Transcript | Out-Null } catch {}
|
|
221
|
-
`}function
|
|
222
|
-
`).filter((c)=>c.startsWith("ERROR")).join(" "):"";throw Error(`Elevated extraction did not complete${a?` (${a.trim()})`:" (UAC declined or Chrome build unsupported)"}`)}try{let a=
|
|
223
|
-
Could not extract the cookie automatically: ${r instanceof Error?r.message:String(r)}`),console.error("Fallback (manual): Chrome > DevTools (F12) > Application > Cookies > https://app.slack.com > copy the `d` value,"),console.error("then set it via an env file: SLACK_COOKIE=xoxd-... (in .slack-term/.env.local)"),process.exit(1)}}async function
|
|
224
|
+
`}function _g(e,t){let o=4+e.readUInt32LE(0)+4,s=e[o];if(s===1||s===2){let r=e.subarray(o+1,o+13),i=e.subarray(o+13,o+45),a=e.subarray(o+45,o+61),c=s===1?mo("aes-256-gcm",wg,r):mo("chacha20-poly1305",bg,r,{authTagLength:16});return c.setAuthTag(a),Buffer.concat([c.update(i),c.final()])}if(s===3){if(!t)throw Error("flag 3 requires the CNG-decrypted key (cng.bin missing)");let r=e.subarray(o+33,o+45),i=e.subarray(o+45,o+77),a=e.subarray(o+77,o+93),c=Buffer.from(t.map((u,d)=>u^Dg[d])),l=mo("aes-256-gcm",c,r);return l.setAuthTag(a),Buffer.concat([l.update(i),l.final()])}throw Error(`Unsupported app-bound key flag: ${s}`)}function Cg(e,t){let n=t.subarray(3,15),o=t.subarray(15,t.length-16),s=t.subarray(t.length-16),r=mo("aes-256-gcm",e,n);return r.setAuthTag(s),Buffer.concat([r.update(o),r.final()]).subarray(32).toString("utf8")}async function Ql(e){if(process.platform!=="win32")throw Error("Windows-only");let t=kg();if(!ds(it(t,"Local State")))throw Error(`Chrome Local State not found at ${t}`);gg(dt,{recursive:!0});let n=it(dt,"extract.ps1");gi(n,Eg(t,e)),gi(it(dt,"inner_dpapi.ps1"),xg),gi(it(dt,"inner_cng.ps1"),Sg);let o=`Start-Process powershell -Verb RunAs -Wait -ArgumentList @('-NoProfile','-ExecutionPolicy','Bypass','-WindowStyle','Hidden','-File','${n.replace(/'/g,"''")}')`,s=yg("powershell",["-NoProfile","-Command",o],{encoding:"utf8",windowsHide:!0});if(s.status!==0&&s.error)throw Error(`Failed to launch elevated helper: ${s.error.message}`);let r=it(dt,"out.bin"),i=it(dt,"Cookies");if(!ds(r)||!ds(i)){let a=ds(it(dt,"log.txt"))?hi(it(dt,"log.txt"),"utf8").split(`
|
|
225
|
+
`).filter((c)=>c.startsWith("ERROR")).join(" "):"";throw Error(`Elevated extraction did not complete${a?` (${a.trim()})`:" (UAC declined or Chrome build unsupported)"}`)}try{let a=hi(r),c=ds(it(dt,"cng.bin"))?hi(it(dt,"cng.bin")):void 0,l=_g(a,c),{Database:u}=zn("bun:sqlite"),d=new u(i,{readonly:!0}),f=d.query("SELECT encrypted_value v FROM cookies WHERE name = char(100) AND host_key LIKE char(37,115,108,97,99,107,37) LIMIT 1").get();if(d.close(),!f)throw Error("no Slack `d` cookie in that Chrome profile");let h=Buffer.from(f.v);if(h.subarray(0,3).toString()!=="v20")throw Error(`unexpected cookie version ${h.subarray(0,3).toString("latin1")}`);let m=Cg(l,h);if(!m.startsWith("xoxd-"))throw Error("decrypted value is not an xoxd- cookie");return m}finally{if(!process.env.SLACK_KEEP_ABE)mg(dt,{recursive:!0,force:!0})}}var Ag=["search:read","channels:history","groups:history","im:history","mpim:history","channels:read","groups:read","im:read","mpim:read","users:read","chat:write","files:write"],Tg=["channels:history","groups:history","im:history","mpim:history","channels:read","groups:read","im:read","mpim:read","users:read","chat:write","files:write"];function Ln(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function Ig(){return JSON.stringify({display_information:{name:"slack-term"},oauth_config:{scopes:{user:Ag}},settings:{org_deploy_enabled:!1,socket_mode_enabled:!1,token_rotation_enabled:!1}},null,2)}function Rg(){return JSON.stringify({display_information:{name:"slack-term"},features:{bot_user:{display_name:"slack-term",always_online:!1}},oauth_config:{scopes:{bot:Tg}},settings:{org_deploy_enabled:!1,socket_mode_enabled:!1,token_rotation_enabled:!1}},null,2)}async function Lt(e,t){return(await e.question(t)).trim()}async function fs(e,t){if(t)return!0;if(!e)return!1;let n=await Lt(e,"Read local browser profiles and Slack session cookies? [y/N]: ");return n.toLowerCase()==="y"||n.toLowerCase()==="yes"}async function mn(e,t,n,o){console.error("Verifying token...");let s=await Pn(t,o),r=Ln(s.team),i;if(n)i=n;else if(e)i=await Lt(e,`Workspace name [${r}]: `)||r;else i=r;let a=null;if(e){console.log(""),console.log("Where to save the token?"),console.log(" 1) ./.env.local (current directory) [default]"),console.log(" 2) ./.slack-term/.env.local (current directory, slack-specific)"),console.log(" 3) ~/.slack-term/.env.local (global, available everywhere)"),console.log(" 4) profiles.json (multi-workspace: slack auth use)"),console.log("");let c=await Lt(e,"Choice [1/2/3/4, Enter=1]: ");if(c==="2")a=mi(process.cwd(),".slack-term",".env.local");else if(c==="3")a=mi(Fg(),".slack-term",".env.local");else if(c==="4")a=null;else a=mi(process.cwd(),".env.local")}if(a===null)if(to(i,{token:t,...s,...o?{cookie:o}:{}}),console.log(`Saved workspace "${i}" to profiles.json: ${s.team} (${s.user})`),process.env.SLACK_MCP_XOXP_TOKEN)console.log(""),console.log("Warning: SLACK_MCP_XOXP_TOKEN is set — it conflicts with profiles."),console.log(" Unset it: unset SLACK_MCP_XOXP_TOKEN (and remove from ~/.zshrc / ~/.bashrc)");else console.log(` Run: slack auth use -g ${i}`);else{let c={SLACK_TOKEN:t};if(o)c.SLACK_COOKIE=o;Xr(a,c),console.log(`Saved token to ${a}`),console.log(" SLACK_TOKEN will be picked up automatically in this directory tree.")}return i}async function yi(e,t=!1,n="auto",o=!1){console.error("Scanning Slack desktop app...");let s=await ui();if(s.length===0)console.error("No sessions found. Make sure Slack is installed and you have signed in at least once."),process.exit(1);if(process.platform==="linux"&&n!=="none"&&s.some((r)=>!r.cookie)&&await fs(e,t)){let r=[];if(n!=="chrome")for(let i of go())r.push({source:"Firefox",profileName:i.profileName,cookie:i.cookie});if(n==="chrome"||n==="all"||n==="auto"&&r.length===0)try{for(let i of us().candidates)r.push({source:"Chrome",profileName:i.profileName,cookie:i.cookie})}catch(i){console.error(i instanceof Error?i.message:String(i))}if(r.length===1){for(let i of s)i.cookie??=r[0].cookie;console.log(`Found Slack session cookie in ${r[0].source} profile: ${r[0].profileName}`)}else if(r.length>1)console.log("Multiple browser sessions found. Choose one later with slack auth chrome or slack auth firefox.");if(s.some((i)=>!i.cookie))console.log("Desktop session needs an xoxd cookie on Linux. Run: slack auth chrome or slack auth firefox")}await wi(s,e,o)}async function wi(e,t,n=!1){if(e.length===1&&t&&e[0]?.cookie&&!n){let o=e[0],s=o.teamName??o.teamId;console.log(`Found workspace: ${s}${o.cookie?" (+ xoxd cookie)":""}`),await mn(t,o.token,Ln(s),o.cookie),console.log(""),console.log("Note: desktop app tokens (xoxc-) are internal Slack tokens."),console.log("If API calls fail, replace with an xoxp- token: slack auth login");return}for(let o of e){let s=o.teamName??o.teamId,r=Ln(s);to(r,{token:o.token,team:s,teamId:o.teamId,url:o.url??"",user:"",...o.cookie?{cookie:o.cookie}:{}}),console.log(`Added workspace "${r}": ${s}${o.cookie?" + xoxd cookie":""}`)}if(console.log(""),e.length===1){let o=Ln(e[0].teamName??e[0].teamId);console.log(`Run: slack auth use -g ${o}`)}else console.log("Run: slack auth ls then: slack auth use -g <name>");console.log(""),console.log("Note: desktop app tokens (xoxc-) are internal Slack tokens."),console.log("If API calls fail, replace with an xoxp- user token by re-running: slack auth login")}async function eu(e){console.log("Which token type does your app use?"),console.log(""),console.log(" 1) User token (xoxp-) -full access including search [recommended]"),console.log(" 2) Bot token (xoxb-) -search and news unavailable"),console.log("");let n=await Lt(e,"Choice [1/2]: ")==="2"?"bot":"user",o=n==="user"?"xoxp-":"xoxb-",s=n==="user"?"User OAuth Token":"Bot User OAuth Token";console.log(""),console.log("Find your token here:"),console.log(" https://api.slack.com/apps"),console.log(" -> Select your app -> OAuth & Permissions"),console.log(` -> Copy the "${s}" (starts with ${o})`),console.log("");let r=await Lt(e,"Paste your token: ");if(!r)console.error("No token provided."),process.exit(1);if(!r.startsWith(o))console.error(`Expected a ${o} token, got: ${r.slice(0,10)}...`),process.exit(1);await mn(e,r)}async function yo(e,t){let n=t==="user"?Ig():Rg(),o=t==="user"?"User OAuth Token (xoxp-...)":"Bot User OAuth Token (xoxb-...)",s=t==="user"?"xoxp-":"xoxb-";if(t==="bot")console.log("Note: bot tokens cannot use search:read (user-only scope)."),console.log(" The news and search commands will not work with a bot token."),console.log("");console.log("Step 1 -Create your Slack app:"),console.log(" Open: https://api.slack.com/apps"),console.log(' Click "Create New App" -> "From a manifest" -> select your workspace'),console.log(" Paste this manifest (JSON tab):"),console.log(""),console.log("-------------------------------------------------------------"),console.log(n),console.log("-------------------------------------------------------------"),console.log(""),console.log('Step 2 -Install: "Install App" -> "Install to Workspace" -> Authorize'),console.log(""),console.log("Step 3 -Copy your token:"),console.log(` OAuth & Permissions -> ${o}`),console.log("");let r=await Lt(e,"Paste your token: ");if(!r)console.error("No token provided."),process.exit(1);if(!r.startsWith(s))console.error(`Expected a ${s} token, got: ${r.slice(0,10)}...`),process.exit(1);await mn(e,r)}async function Og(e,t){let n=di();if(n.length===0)console.error("No Slack session found in Chrome. Sign in to Slack in Chrome (app.slack.com) and retry."),process.exit(1);let o=e.profile.token.split("-")[1],s=n.find((r)=>r.sessions.some((i)=>i.teamId===o));if(!s&&t){if(s=n.find((r)=>r.email===t||r.profileDir===t||r.profileDir===`Profile ${t}`),!s)console.error(`Chrome profile "${t}" has no Slack session. Available: ${n.map((r)=>r.email??r.profileDir).join(", ")}`),process.exit(1)}if(!s)if(n.length===1)s=n[0];else if(process.stdin.isTTY){console.log("Multiple Chrome profiles have a Slack session:"),n.forEach((c,l)=>console.log(` ${l+1}) ${c.email??c.label} [${c.profileDir}]`));let r=He({input:process.stdin,output:process.stdout}),i=(await r.question(`Choice [1-${n.length}]: `)).trim();r.close();let a=parseInt(i,10)-1;if(isNaN(a)||a<0||a>=n.length)console.error("Invalid choice."),process.exit(1);s=n[a]}else console.error("Multiple Chrome profiles have a Slack session — choose one with --profile:"),n.forEach((r)=>console.error(` slack auth cookie -w ${e.name} --profile "${r.email??r.profileDir}"`)),process.exit(1);console.log(`Using Chrome profile: ${s.email??s.label} [${s.profileDir}]`),console.log("Chrome's cookie is app-bound encrypted; a Windows elevation (UAC) prompt will appear — approve it.");try{return await Ql(s.profileDir)}catch(r){console.error(`
|
|
226
|
+
Could not extract the cookie automatically: ${r instanceof Error?r.message:String(r)}`),console.error("Fallback (manual): Chrome > DevTools (F12) > Application > Cookies > https://app.slack.com > copy the `d` value,"),console.error("then set it via an env file: SLACK_COOKIE=xoxd-... (in .slack-term/.env.local)"),process.exit(1)}}async function tu(e={}){if(process.platform!=="darwin"&&process.platform!=="linux"&&process.platform!=="win32")console.error("Chrome cookie extraction is supported on macOS, Linux, and Windows."),process.exit(1);let t=os();if(t.length===0)console.error("No workspaces configured. Run: slack auth login"),process.exit(1);let n;if(e.workspace){if(!t.find((i)=>i.name===e.workspace))console.error(`Workspace "${e.workspace}" not found. Available: ${t.map((i)=>i.name).join(", ")}`),process.exit(1);n=e.workspace}else if(t.length===1)n=t[0].name;else{let r=t.find((i)=>i.current);if(r)n=r.name,console.log(`Using active workspace: ${n}`);else{console.log("Multiple workspaces found. Choose one:"),t.forEach((l,u)=>console.log(` ${u+1}) ${l.name} (${l.profile.team})`));let i=He({input:process.stdin,output:process.stdout}),a=(await i.question("Choice: ")).trim();i.close();let c=parseInt(a,10)-1;if(isNaN(c)||c<0||c>=t.length)console.error("Invalid choice."),process.exit(1);n=t[c].name}}let o=t.find((r)=>r.name===n);if(o.profile.token.startsWith("xoxb-")){console.error(`
|
|
224
227
|
Workspace "${n}" uses a bot token (xoxb-). A Chrome session cookie only
|
|
225
228
|
`+`augments a user session token (xoxc-) — it has no effect on a bot token, so user-level
|
|
226
|
-
`+"actions (tail @user, DMs, listing users) would still fail.");let r=t.filter((i)=>i.profile.token.startsWith("xoxc-")||i.profile.token.startsWith("xoxp-"));if(r.length>0)console.error(` Target a user-token workspace instead: ${r.map((i)=>i.name).join(", ")}`),console.error(` slack auth chrome -w ${r[0].name}`);else console.error(" Import your Slack desktop user session instead: slack auth login");process.exit(1)}let s;if(process.platform==="win32")s=await
|
|
227
|
-
`))}function
|
|
229
|
+
`+"actions (tail @user, DMs, listing users) would still fail.");let r=t.filter((i)=>i.profile.token.startsWith("xoxc-")||i.profile.token.startsWith("xoxp-"));if(r.length>0)console.error(` Target a user-token workspace instead: ${r.map((i)=>i.name).join(", ")}`),console.error(` slack auth chrome -w ${r[0].name}`);else console.error(" Import your Slack desktop user session instead: slack auth login");process.exit(1)}let s;if(process.platform==="win32")s=await Og(o,e.profile);else{if(!e.yes&&!process.stdin.isTTY)console.error("Reading browser profiles requires confirmation. Re-run interactively or pass --yes."),process.exit(1);let r=e.yes?void 0:He({input:process.stdin,output:process.stdout});try{if(!await fs(r,e.yes??!1)){console.log("Browser profile scan cancelled.");return}}finally{r?.close()}if(console.log("Scanning Chrome profiles for Slack session..."),process.platform==="darwin")console.log("macOS may show a dialog asking for your login password — click Allow.");let i,a;try{({candidates:i,totalProfiles:a}=us())}catch(c){console.error(`Failed: ${c instanceof Error?c.message:String(c)}`),process.exit(1)}if(i.length===0)console.error(`No Slack session found in Chrome (scanned ${a} profile${a!==1?"s":""}). Possible reasons:`),console.error(" - You denied the keychain dialog (try running again and click Allow)"),console.error(" - Chrome is not installed or has no Slack session"),console.error(" - You're not logged in to Slack in Chrome"),process.exit(1);if(i.length===1&&a<=1)s=i[0].cookie,console.log(`Found session in Chrome profile: ${i[0].profileName}`);else{let c=i.length===1?`Found 1 Slack session across ${a} Chrome profiles:`:`Found ${i.length} Slack sessions across ${a} Chrome profiles:`;console.log(c),i.forEach((h,m)=>console.log(` ${m+1}) ${h.profileName} [${h.profileDir}]`)),console.log("");let l=He({input:process.stdin,output:process.stdout}),u=i.length===1?" [Enter=1]":"",d=(await l.question(`Choice [1-${i.length}]${u}: `)).trim();l.close();let f=d===""&&i.length===1?0:parseInt(d,10)-1;if(isNaN(f)||f<0||f>=i.length)console.error("Invalid choice."),process.exit(1);s=i[f].cookie}}Vr(n,s),console.log(`Saved xoxd cookie to workspace "${n}".`),console.log("RTM WebSocket mode is now available: slack tail @you")}async function bi(e={}){console.error("Scanning Chrome profiles for Slack sessions...");let t=di();if(t.length===0)console.error("No Slack session found in Chrome."),console.error(" Open Slack in Chrome (https://app.slack.com) and sign in, then retry."),process.exit(1);let n;if(e.profile){let r=e.profile,i=t.find((a)=>a.email===r||a.profileDir===r||a.profileDir===`Profile ${r}`);if(!i)console.error(`Chrome profile "${r}" has no Slack session. Available:`),t.forEach((a)=>console.error(` - ${a.email??a.label} [${a.profileDir}] (${a.sessions.length} workspace${a.sessions.length!==1?"s":""})`)),process.exit(1);n=i}else if(t.length===1)n=t[0];else if(process.stdin.isTTY){console.log("Found Slack sessions in multiple Chrome profiles:"),t.forEach((c,l)=>console.log(` ${l+1}) ${c.email??c.label} [${c.profileDir}] (${c.sessions.length} workspace${c.sessions.length!==1?"s":""})`));let r=He({input:process.stdin,output:process.stdout}),i=(await r.question(`Choice [1-${t.length}]: `)).trim();r.close();let a=parseInt(i,10)-1;if(isNaN(a)||a<0||a>=t.length)console.error("Invalid choice."),process.exit(1);n=t[a]}else console.error("Multiple Chrome profiles have a Slack session — choose one with --profile:"),t.forEach((r)=>console.error(` slack auth login chrome --profile "${r.email??r.profileDir}"`)),process.exit(1);let o=n.email??n.label??n.profileDir,s;if(process.platform==="darwin")try{let{candidates:r}=us();s=r.find((i)=>i.profileDir===n.profileDir)?.cookie??r[0]?.cookie}catch{}if(s)_l(o,s,`chrome:${n.profileDir}`);for(let r of n.sessions){let i=r.teamName??r.teamId,a=Ln(i);to(a,{token:r.token,team:i,teamId:r.teamId,url:r.url??"",user:"",identity:o}),console.log(`Added workspace "${a}": ${i} (identity: ${o})`)}if(console.log(""),s)console.log(`Captured xoxd cookie for ${o} — shared across its ${n.sessions.length} workspace(s).`),console.log("RTM WebSocket mode is now available: slack tail @you");else console.log("Note: no xoxd cookie captured (LocalStorage yields the token only; the cookie is"),console.log("encrypted at rest on this platform). Some features (RTM, drafts, search fallback) need it."),console.log(" Attach it from your live browser — e.g. a CDP read via rech — or paste it:"),console.log(` slack auth cookie --workspace ${Ln(n.sessions[0].teamName??n.sessions[0].teamId)}`);console.log(""),console.log("Select a workspace: slack auth use <name> (see: slack auth ls)")}async function Di(e={}){let t=os();if(t.length===0)console.error("No workspaces configured. Run: slack auth login"),process.exit(1);let n;if(e.workspace){if(!t.find((a)=>a.name===e.workspace))console.error(`Workspace "${e.workspace}" not found. Available: ${t.map((a)=>a.name).join(", ")}`),process.exit(1);n=e.workspace}else if(t.length===1)n=t[0].name;else{let i=t.find((a)=>a.current);if(i)n=i.name,console.log(`Using active workspace: ${n}`);else{console.log("Multiple workspaces found. Choose one:"),t.forEach((u,d)=>console.log(` ${d+1}) ${u.name} (${u.profile.team})`));let a=He({input:process.stdin,output:process.stdout}),c=(await a.question("Choice: ")).trim();a.close();let l=parseInt(c,10)-1;if(isNaN(l)||l<0||l>=t.length)console.error("Invalid choice."),process.exit(1);n=t[l].name}}if(!e.yes&&!process.stdin.isTTY)console.error("Reading browser profiles requires confirmation. Re-run interactively or pass --yes."),process.exit(1);let o=e.yes?void 0:He({input:process.stdin,output:process.stdout});try{if(!await fs(o,e.yes??!1)){console.log("Browser profile scan cancelled.");return}}finally{o?.close()}console.log("Scanning Firefox profiles for Slack session...");let s=go();if(s.length===0)console.error("No Slack session found in Firefox. Possible reasons:"),console.error(" - Firefox is not installed"),console.error(" - You are not logged in to Slack in Firefox"),process.exit(1);let r;if(s.length===1)r=s[0].cookie,console.log(`Found session in Firefox profile: ${s[0].profileName}`);else{console.log("Multiple Firefox profiles have a Slack session. Choose one:"),s.forEach((l,u)=>console.log(` ${u+1}) ${l.profileName} [${l.profileDir}]`));let i=He({input:process.stdin,output:process.stdout}),a=(await i.question("Choice: ")).trim();i.close();let c=parseInt(a,10)-1;if(isNaN(c)||c<0||c>=s.length)console.error("Invalid choice."),process.exit(1);r=s[c].cookie}Vr(n,r),console.log(`Saved xoxd cookie to workspace "${n}".`),console.log("RTM WebSocket mode is now available: slack tail @you")}async function nu(e={}){if(e.token){await mn(null,e.token,e.name);return}if(!process.stdin.isTTY){let n=[];for await(let s of process.stdin)n.push(s);let o=Buffer.concat(n).toString("utf8").trim();if(!o)console.error("No token provided on stdin."),process.exit(1);await mn(null,o,e.name);return}let t=He({input:process.stdin,output:process.stdout});try{await eu(t)}finally{t.close()}}async function su(e={}){let t=He({input:process.stdin,output:process.stdout});try{if(e.bot!==void 0){await yo(t,e.bot?"bot":"user");return}console.log("Which token type?"),console.log(" 1) User token (xoxp-) -full access including search [default]"),console.log(" 2) Bot token (xoxb-) -search and news unavailable"),console.log("");let n=await Lt(t,"Choice [1/2, Enter=1]: ");await yo(t,n==="2"?"bot":"user")}finally{t.close()}}function ou(e={}){let t=(s,r)=>{if(/[\r\n]/.test(r))throw Error(`Invalid newline in ${s}.`);return`${s}=${/^[A-Za-z0-9._=-]+$/.test(r)?r:JSON.stringify(r)}`},n=[t("SLACK_TOKEN",Cl(e.workspace))],o=vt(e.workspace);if(o)n.push(t("SLACK_COOKIE",o));if(!e.workspace){let s=no();if(s)n.push(t("SLACK_BOT_TOKEN",s))}console.log(n.join(`
|
|
230
|
+
`))}function ru(e){let t=os(),n=e.workspace?t.find((s)=>s.name===e.workspace):t.find((s)=>s.current)??(t.length===1?t[0]:void 0);if(!n)throw Error(e.workspace?`Workspace "${e.workspace}" not found. Run: slack auth ls`:"Select a workspace with slack auth use <name>, or pass --workspace <name>.");if(!n.profile.cookie)throw Error(`Workspace "${n.name}" has no session cookie. Run: slack auth chrome -w ${n.name} or slack auth firefox -w ${n.name}`);let o=$g(e.envfile);Xr(o,{SLACK_TOKEN:n.profile.token,SLACK_COOKIE:n.profile.cookie}),console.log(`Saved token and cookie for workspace "${n.name}" to ${o}`)}async function ps(e={}){let t=os();if(t.length>0){console.log("Currently logged in:");for(let{name:o,profile:s,current:r}of t)console.log(` ${r?"*":" "} ${o} ${s.team} (${s.user||"unknown"})`);console.log(""),console.log("Adding another workspace:"),console.log("")}if([e.fromChrome,e.fromFirefox,e.fromAll].filter(Boolean).length>1)throw Error("Choose only one browser source: --from-chrome, --from-firefox, or --from-all.");if(e.fromChrome&&!e.fromDesktop){if(!e.yes&&!process.stdin.isTTY)throw Error("Reading browser profiles requires confirmation. Re-run interactively or pass --yes.");let o=process.stdin.isTTY?He({input:process.stdin,output:process.stdout}):void 0;try{if(!await fs(o,e.yes??!1)){console.log("Browser profile scan cancelled.");return}let s=await pi();if(s.length===0)throw Error("No Slack session token found in Chrome profiles.");await wi(s,o,!0)}finally{o?.close()}return}if(e.fromAll&&!e.fromDesktop){if(!e.yes&&!process.stdin.isTTY)throw Error("Reading browser profiles requires confirmation. Re-run interactively or pass --yes.");let o=process.stdin.isTTY?He({input:process.stdin,output:process.stdout}):void 0;try{try{await yi(o,e.yes??!1,"all",!0)}catch(s){if(!(s instanceof Error)||!s.message.startsWith("Slack desktop app LevelDB not found"))throw s;if(!await fs(o,e.yes??!1)){console.log("Browser profile scan cancelled.");return}let r=await pi();if(r.length===0)throw Error("No Slack session token found in Chrome profiles.");if(r.every((i)=>!i.cookie)){let i=go();if(i.length===1)for(let a of r)a.cookie=i[0].cookie}await wi(r,o,!0)}}finally{o?.close()}return}if(e.fromDesktop||e.fromChrome||e.fromFirefox||e.fromAll){let o=e.fromChrome?"chrome":e.fromFirefox?"firefox":e.fromAll?"all":"none";if(o!=="none"&&!e.yes&&!process.stdin.isTTY)throw Error("Reading browser profiles requires confirmation. Re-run interactively or pass --yes.");let s=process.stdin.isTTY?He({input:process.stdin,output:process.stdout}):void 0;try{await yi(s,e.yes??!1,o,!0)}finally{s?.close()}return}if(e.token){await mn(null,e.token,e.name);return}if(!process.stdin.isTTY){let o=[];for await(let r of process.stdin)o.push(r);let s=Buffer.concat(o).toString("utf8").trim();if(!s)console.error("No token provided on stdin."),process.exit(1);await mn(null,s,e.name);return}console.log("How would you like to authenticate with Slack?"),console.log(""),console.log(" 1) Slack desktop app - import session token"),console.log(" Reads the xoxc- token directly from the installed app."),console.log(" Token: all platforms | xoxd cookie: macOS, or Chrome/Firefox on Linux"),console.log(""),console.log(" 2) Chrome browser - import workspaces"),console.log(" Reads xoxc- tokens from Chrome, grouped by account."),console.log(" Token: all platforms | xoxd cookie: macOS only"),console.log(""),console.log(" 3) Connect existing Slack app [recommended if you have one]"),console.log(" Paste a token from an app you already created."),console.log(""),console.log(" 4) Create new Slack app - user token (xoxp-)"),console.log(" Guided setup with manifest. Full access including search."),console.log(""),console.log(" 5) Create new Slack app - bot token (xoxb-)"),console.log(" Bot is invited to channels. Search and news unavailable."),console.log("");let n=He({input:process.stdin,output:process.stdout});try{let o=await Lt(n,"Choice [1/2/3/4/5]: ");if(console.log(""),o==="1")await yi(n,e.yes??!1);else if(o==="2"){n.close(),await bi();return}else if(o==="3")await eu(n);else if(o==="4")await yo(n,"user");else if(o==="5")await yo(n,"bot");else console.error(`Invalid choice: "${o}". Enter 1, 2, 3, 4, or 5.`),process.exit(1)}finally{n.close()}}async function wo(e,t,n,o){let s=t,r=[],i=s,a=0;while(!0){let c=i.indexOf("<@U",a);if(c===-1)break;let l=i.slice(c+2),u=l.search(/[>|]/),d=u===-1?l:l.slice(0,u);if(d.length>=9)r.push(d);a=c+1}for(let c of r){if(!n.has(c))n.set(c,await vn(e,c,o));let l=n.get(c)??c;s=s.replaceAll(`<@${c}>`,`@${l}`),s=s.replace(new RegExp(`<@${c}\\|[^>]*>`,"g"),`@${l}`)}return s}function bo(e){return e.replace(/<!date\^(\d+)\^[^|>]*(?:\|([^>]*))?>/g,(t,n,o)=>{let s=Number(n);if(!Number.isFinite(s))return o??"date";let r=new Date(s*1000);if(Number.isNaN(r.getTime()))return o??"date";let i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],c=i[r.getUTCDay()]??"",l=a[r.getUTCMonth()]??"";return`${c}, ${l} ${String(r.getUTCDate()).padStart(2,"0")}, ${r.getUTCFullYear()}`})}function au(e){let t=typeof e.ts==="string"?e.ts:"",n=typeof e.thread_ts==="string"?e.thread_ts:"";return n!==""&&n!==t}function Pg(e){let[t,n="000000"]=e.split("."),o=new Date(Number(t)*1000),s=o.getUTCFullYear(),r=String(o.getUTCMonth()+1).padStart(2,"0"),i=String(o.getUTCDate()).padStart(2,"0"),a=String(o.getUTCHours()).padStart(2,"0"),c=String(o.getUTCMinutes()).padStart(2,"0"),l=String(o.getUTCSeconds()).padStart(2,"0"),u=n.padEnd(6,"0").slice(0,6);return`${s}-${r}-${i}T${a}:${c}:${l}.${u}`}async function vg(e,t,n){let o=typeof t.ts==="string"?t.ts:"0.000000",s=Pg(o),r="?";if(typeof t.user==="string"){let d=t.user,f="@"+d;if(!n.has(f)){let[,h]=await co(e,d);n.set(f,h)}r=n.get(f)??d}else if(typeof t.username==="string")r=t.username;let i=typeof t.text==="string"?t.text:"",c=bo(await wo(e,i,n)).split(`
|
|
228
231
|
`),l=c[0]+(c.length>1?`
|
|
229
232
|
`+c.slice(1).map((d)=>` ${d}`).join(`
|
|
230
|
-
`):""),u=
|
|
231
|
-
`)}),l.addEventListener("close",()=>c()),l.addEventListener("error",()=>c()),l.addEventListener("message",(u)=>{(async()=>{try{let d;try{d=JSON.parse(String(u.data))}catch{return}let
|
|
233
|
+
`):""),u=au(t)?"↳ ":"";return`${s} ${u}@${r}: ${l}`}async function Lg(e,t,n,o,s,r,i,a){if(a?.aborted)return;return new Promise((c)=>{let l=new e(n);a?.addEventListener("abort",()=>{l.close(),c()},{once:!0}),l.addEventListener("open",()=>{process.stderr.write(`Connected via RTM (experimental).
|
|
234
|
+
`)}),l.addEventListener("close",()=>c()),l.addEventListener("error",()=>c()),l.addEventListener("message",(u)=>{(async()=>{try{let d;try{d=JSON.parse(String(u.data))}catch{return}let f=typeof d.type==="string"?d.type:"";if(f==="ping"){l.send(JSON.stringify({type:"pong",reply_to:d.id??0}));return}if(f!=="message")return;if((typeof d.channel==="string"?d.channel:"")!==o)return;let m=typeof d.ts==="string"?d.ts:"";if(!m||r.has(m))return;let p=typeof d.subtype==="string"?d.subtype:"";if(p==="message_changed"||p==="message_deleted")return;if(s.thread){if((typeof d.thread_ts==="string"?d.thread_ts:m)!==s.thread&&m!==s.thread)return}if(s.watchThread&&au(d)){if((typeof d.thread_ts==="string"?d.thread_ts:"")!==s.watchThread)return}if(s.me&&s.myUserId){if(!(typeof d.text==="string"?d.text:"").includes(`<@${s.myUserId}>`))return}if(r.add(m),r.size>1000){let w=r.values().next().value;if(w!==void 0)r.delete(w)}let g=await vg(t,d,i);process.stdout.write(g+`
|
|
232
235
|
`)}catch(d){process.stderr.write(`RTM message error: ${d instanceof Error?d.message:String(d)}
|
|
233
|
-
`)}})()})})}var
|
|
236
|
+
`)}})()})})}var iu=3,Bg=2000,ki={sleep:(e)=>new Promise((t)=>setTimeout(t,e)),clientBoot:Wl,getWebSocket:()=>{let e=globalThis.WebSocket;return typeof e==="function"?e:void 0}};async function cu(e,t,n,o,s,r,i){let a=ki.getWebSocket();if(!a)return;for(let c=0;c<iu;c++){if(i?.aborted)return;try{let{wsUrl:l}=await ki.clientBoot(e,t);await Lg(a,e,l,n,o,s,r,i)}catch{}if(i?.aborted)return;if(c<iu-1)await ki.sleep(Bg)}}function Bt(e){let t=e.match(/^(\d+(?:\.\d+)?)(s|m|h|d)$/);if(!t)throw Error(`Invalid --since format: "${e}" (expected e.g. 10m, 2h, 1d)`);let n=parseFloat(t[1]);switch(t[2]){case"s":return n;case"m":return n*60;case"h":return n*3600;case"d":return n*86400}}var ft={sleep:(e)=>new Promise((t)=>setTimeout(t,e)),now:()=>Date.now(),tailRTM:cu};function Dt(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function xi(e){return Array.isArray(e)?e:[]}function lu(e){return Number(e)||0}function uu(e){let t=typeof e.ts==="string"?e.ts:"",n=typeof e.thread_ts==="string"?e.thread_ts:"";return n!==""&&n!==t}function Mg(e){let[t,n="000000"]=e.split("."),o=new Date(Number(t)*1000),s=o.getUTCFullYear(),r=String(o.getUTCMonth()+1).padStart(2,"0"),i=String(o.getUTCDate()).padStart(2,"0"),a=String(o.getUTCHours()).padStart(2,"0"),c=String(o.getUTCMinutes()).padStart(2,"0"),l=String(o.getUTCSeconds()).padStart(2,"0"),u=n.padEnd(6,"0").slice(0,6);return`${s}-${r}-${i}T${a}:${c}:${l}.${u}`}async function Ng(e,t,n,o,s){let r=typeof t.ts==="string"?t.ts:"0.000000",i=Mg(r),a="?";if(typeof t.user==="string"){let m=t.user,p="@"+m;if(!n.has(p)){let[,g]=await co(e,m,s);n.set(p,g)}a=n.get(p)??m}else if(typeof t.username==="string")a=t.username;let c=typeof t.text==="string"?t.text:"",u=bo(await wo(e,c,n,s)).split(`
|
|
234
237
|
`),d=u[0]+(u.length>1?`
|
|
235
|
-
`+u.slice(1).map((
|
|
236
|
-
`):""),
|
|
238
|
+
`+u.slice(1).map((m)=>` ${m}`).join(`
|
|
239
|
+
`):""),f=uu(t)?"↳ ":"",h=o?`${o} @${a}`:`@${a}`;return`${i} ${f}${h}: ${d}`}async function jg(e,t,n,o,s,r,i){let a=Dt(await gn(e,t,20,i?void 0:n||void 0,i,o.cookie)),c=xi(a.messages).map(Dt).reverse(),l=Dt(a.response_metadata),u=a.has_more===!0&&typeof l.next_cursor==="string"?l.next_cursor:void 0,d=[];if(o.watchThread&&!i){let g=Dt(await Pl(e,t,o.watchThread,50,o.cookie));d=xi(g.messages).map(Dt).filter((w)=>(typeof w.ts==="string"?w.ts:"")!==o.watchThread)}let f=[...c.map((g)=>({m:g,fromHistory:!0})),...d.map((g)=>({m:g,fromHistory:!1}))].sort((g,w)=>lu(typeof g.m.ts==="string"?g.m.ts:"")-lu(typeof w.m.ts==="string"?w.m.ts:"")),h=[],m=n,p=!1;for(let{m:g,fromHistory:w}of f){let b=typeof g.ts==="string"?g.ts:"";if(!b||s.has(b))continue;let k=typeof g.subtype==="string"?g.subtype:"";if(k==="message_changed"||k==="message_deleted")continue;if(o.thread){if((typeof g.thread_ts==="string"?g.thread_ts:b)!==o.thread&&b!==o.thread)continue}if(o.watchThread&&uu(g)){if((typeof g.thread_ts==="string"?g.thread_ts:"")!==o.watchThread)continue}if(o.me&&o.myUserId){if(!(typeof g.text==="string"?g.text:"").includes(`<@${o.myUserId}>`))continue}if(s.add(b),s.size>1000){let _=s.values().next().value;if(_!==void 0)s.delete(_)}if(h.push(await Ng(e,g,r,void 0,o.cookie)),w)m=b;let x=typeof g.user==="string"?g.user:"";if(!o.myUserId||x!==o.myUserId)p=!0}return{newCursor:m,lines:h,hasMore:a.has_more===!0,nextPageCursor:u,emittedOther:p}}function Wg(e){if(e.includes("slack.com")){let t=oi(e),n=t?.threadTs??t?.ts;if(n)return n;throw Error(`--watch-thread: could not extract a timestamp from "${e}"`)}if(/^\d{10}\.\d{6}$/.test(e))return e;if(/^\d{16}$/.test(e))return`${e.slice(0,10)}.${e.slice(10)}`;throw Error(`--watch-thread: "${e}" is not a valid ts or permalink`)}async function du(e,t,n={},o){if(n.me&&!t)console.error(`slack tail --me requires a <target> channel.
|
|
237
240
|
Cross-channel mention streaming is not yet supported.
|
|
238
|
-
Use: slack tail "#channel" --me`),process.exit(1);if(!t)console.error("Usage: slack tail <#channel|@user>\n Run `slack tail --help` for details."),process.exit(1);let s=await
|
|
239
|
-
`);
|
|
240
|
-
`);if(B)
|
|
241
|
-
`)
|
|
242
|
-
`),
|
|
243
|
-
`)
|
|
244
|
-
`)
|
|
245
|
-
`)}
|
|
241
|
+
Use: slack tail "#channel" --me`),process.exit(1);if(!t)console.error("Usage: slack tail <#channel|@user>\n Run `slack tail --help` for details."),process.exit(1);let s=await ao(e,t,n.cookie),r=n.interval??60000,i=n.timeout?ft.now()+Bt(n.timeout)*1000:1/0,a=new Map,c=new Set;try{let p=Dt(await jl(e,s,n.cookie));if(Dt(p.channel).is_archived===!0)console.error("Warning: this channel is archived — no new messages will arrive.")}catch(p){let g=p instanceof Error?p.message:String(p);if(g.includes("not_in_channel"))console.error("Error: you are not a member of that channel. Join it in Slack first, then retry."),process.exit(1);if(g.includes("missing_scope"))console.error("Error: token lacks the required history scope. Check your token's channels:history (or groups:history) permission."),process.exit(1);if(g.includes("channel_not_found"))console.error("Error: channel not found — it may be a private channel inaccessible with your token."),process.exit(1);console.error(`Warning: preflight check failed: ${g}`)}let l="";if(n.since){let p=Bt(n.since);l=(ft.now()/1000-p).toFixed(6)}else{let p=Dt(await gn(e,s,1,void 0,void 0,n.cookie)),g=xi(p.messages).map(Dt);if(g.length>0&&typeof g[0]?.ts==="string")l=g[0].ts,c.add(l);else l=(ft.now()/1000).toFixed(6)}let u;if(n.me||n.exitOnMessage)u=(await Pn(e,n.cookie)).userId||void 0;let d;if(n.watchThread!==void 0)try{d=Wg(n.watchThread)}catch(p){console.error(p instanceof Error?p.message:String(p)),process.exit(1)}let f={...n.thread!==void 0?{thread:n.thread}:{},...d!==void 0?{watchThread:d}:{},...n.me!==void 0?{me:n.me}:{},...u!==void 0?{myUserId:u}:{},...n.cookie!==void 0?{cookie:n.cookie}:{}};if(e.startsWith("xoxc-")&&n.cookie!==void 0&&n.noRtm!==!0&&n.since===void 0&&n.timeout===void 0&&n.exitOnMessage!==!0){if(await ft.tailRTM(e,n.cookie,s,f,c,a,o),o?.aborted)return;console.error("RTM unavailable — switching to polling.")}let h=!0,m=ft.now();while(!o?.aborted){if(ft.now()>=i)return;let p=!1;try{let b=ft.now()-m,k=r>0&&b>r*5,x,_=!0;do{let{newCursor:F,lines:I,nextPageCursor:S,emittedOther:B}=await jg(e,s,l,f,c,a,x);if(l=F,h&&_&&n.since&&I.length===0)process.stdout.write(`(no messages in the last ${n.since} — watching for new)
|
|
242
|
+
`);_=!1;for(let W of I)process.stdout.write(W+`
|
|
243
|
+
`);if(B)p=!0;x=k?S:void 0}while(x);h=!1}catch(w){if(w instanceof qe){console.error(`Warning: Slack rate limit hit — backing off for ${w.retryAfter}s`),await ft.sleep(w.retryAfter*1000);continue}throw w}if(n.exitOnMessage&&p)return;m=ft.now();let g=i-ft.now();if(g<=0)return;await ft.sleep(Math.min(r,g))}}import{existsSync as Ug,mkdirSync as gu,readFileSync as _i,renameSync as Jg,unlinkSync as fu,writeFileSync as Ci}from"node:fs";import{dirname as mu}from"node:path";class Si extends Error{}function pu(e){let t=e,n=(Array.isArray(t.messages)?t.messages:[]).filter((s)=>!!s&&typeof s==="object"&&!Array.isArray(s)),o=t.has_more===!0?t.response_metadata?.next_cursor:void 0;return typeof o==="string"&&o?{messages:n,nextCursor:o}:{messages:n}}function yu(e,t){return{async listChannels(){return(await Ll(e,"public_channel,private_channel,im,mpim",t)).flatMap((o)=>{if(!o||typeof o!=="object"||Array.isArray(o)||typeof o.id!=="string")return[];let s=o.is_im===!0;return[{id:o.id,name:ee(o.name)||o.id,isIm:s,...o.is_mpim===!0?{isMpim:!0}:{},...s&&typeof o.user==="string"?{user:o.user}:{}}]})},history:async(n,o,s)=>pu(await gn(e,n,200,o,s,t)),replies:async(n,o,s,r)=>pu(await vl(e,n,o,{oldest:s,...r?{cursor:r}:{}},t)),userName:(n)=>vn(e,n,t)}}var Kg="https://github.com/snomiao/slack-term/blob/main/worker/README.md",qg=1.618,Hg=25,Do=2000,zg=8,ae={now:()=>Date.now(),sleep:(e,t)=>new Promise((n)=>{if(t?.aborted)return n();let o=()=>{clearTimeout(s),n()},s=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})}),out:(e)=>{process.stdout.write(e+`
|
|
244
|
+
`)},err:(e)=>{process.stderr.write(e+`
|
|
245
|
+
`)},pidAlive:(e)=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}};function ko(e,t,n){return Math.min(n,Math.round(t*Math.pow(qg,Math.max(0,e-1))))}var Gg=["invalid_auth","not_authed","token_revoked","token_expired","account_inactive","no_permission"],Yg=["channel_not_found","not_in_channel","missing_scope","is_archived"];class Mt extends Error{}function ze(e){return e instanceof Error?e.message:String(e)}function Ei(e){let t=ze(e);if(Gg.some((n)=>t.includes(n)))return"fatal";if(Yg.some((n)=>t.includes(n)))return"channel";return"transient"}var ee=(e)=>typeof e==="string"?e:"",de=(e)=>Number(e)||0,pt=(e)=>e.toFixed(6),Xg=new Set(["message_changed","message_deleted","channel_join","channel_leave","group_join","group_leave"]);function Vg(e){let t=[ee(e.text)];if(Array.isArray(e.attachments)){for(let n of e.attachments)if(n&&typeof n==="object"&&!Array.isArray(n))t.push(ee(n.pretext),ee(n.text),ee(n.fallback))}return t.filter(Boolean).join(`
|
|
246
|
+
`)}function Zg(e,t,n,o){let r=`${e.endsWith("/")?e:e+"/"}archives/${t}/p${n.replace(".","")}`;return o&&o!==n?`${r}?thread_ts=${o}&cid=${t}`:r}function Qg(e,t){if(!Ug(e))return{version:1,identity:t,channels:{}};let n;try{n=JSON.parse(_i(e,"utf8"))}catch(s){throw new Mt(`state file ${e} is unreadable (${ze(s)}); move it aside to start fresh`)}if(!(n&&typeof n==="object"&&n.version===1&&n.channels&&typeof n.channels==="object"&&Object.values(n.channels).every((s)=>s&&typeof s.since==="string"&&typeof s.cursor==="string"&&s.threads&&typeof s.threads==="object")))throw new Mt(`state file ${e} is not a slack stream state; move it aside to start fresh`);if(n.identity!==t)throw new Mt(`state file ${e} belongs to identity ${n.identity}, not ${t}; pass a different --state`);return n}function kt(e,t){gu(mu(e),{recursive:!0});let n=`${e}.tmp-${process.pid}`;Ci(n,JSON.stringify(t)),Jg(n,e)}function em(e){let t=`${e}.lock`;gu(mu(t),{recursive:!0});let n=()=>{try{if(_i(t,"utf8").trim()===String(process.pid))fu(t)}catch{}};try{Ci(t,String(process.pid),{flag:"wx"})}catch{let o=Number(_i(t,"utf8").trim());if(o&&ae.pidAlive(o))throw new Mt(`another slack stream (pid ${o}) already uses ${e}`);fu(t),Ci(t,String(process.pid),{flag:"wx"})}return n}async function hu(e,t){let n=e.names.get(t);if(n===void 0)n=await e.client.userName(t),e.names.set(t,n);return n}async function $i(e,t,n,o,s){if(Xg.has(ee(n.subtype)))return!1;let r=ee(n.user),i=ee(n.bot_id),a=e.opts.repliesTo,c=ee(n.thread_ts);if(o&&a&&c&&(a.has(r)||a.has(i))){let w=e.state.joined??={};w[`${t.id}:${c}`]=Math.max(w[`${t.id}:${c}`]??0,de(ee(n.ts)))}if(r&&e.opts.selfUsers.has(r)||i&&e.opts.selfBots.has(i))return!1;e.opts.grep.lastIndex=0;let l=e.opts.grep.test(Vg(n))?"grep":o&&a&&await tm(e,t,a,n,s)?"replies-to":void 0;if(!l)return!1;let u=ee(n.ts),d=`${t.id}:${u}`;if(e.state.seen?.[d]!==void 0)return!1;if(e.opts.relay&&!e.opts.once)(e.state.seen??={})[d]=de(u);let f=ee(n.thread_ts)||null,h=r||i,m=r?await hu(e,r):ee(n.username)||ee(n.bot_profile?.name)||i,p=t.isIm?`@${t.user?await hu(e,t.user):t.id}`:t.isMpim?t.name:`#${t.name}`,g={type:o?"reply":"message",channel:{id:t.id,name:p},ts:u,thread_ts:f,user:{id:h,name:m},text:ee(n.text).replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"),permalink:Zg(e.opts.teamUrl,t.id,u,f??void 0),match:l};return e.opts.json?ae.out(JSON.stringify(g)):ae.out(nm(g)),e.matches++,!0}async function tm(e,t,n,o,s){if(n.has(ee(o.parent_user_id)))return!0;let r=ee(o.thread_ts),i=wu(e,t,n,r,s);if(i!==void 0)return i;let a=`${t.id}:${r}`,c=e.notJoined?.get(a);if(c!==void 0&&c>=de(ee(o.ts)))return!1;let l=c!==void 0?pt(c):"0";return Fi(e,t,n,r,await xo((u)=>e.client.replies(t.id,r,l,u))),e.state.joined?.[a]!==void 0}function wu(e,t,n,o,s){if(e.state.joined?.[`${t.id}:${o}`]!==void 0)return!0;if(!s)return;if(n.has(ee(s.user))||n.has(ee(s.bot_id)))return!0;let r=Array.isArray(s.reply_users)?s.reply_users.map((a)=>ee(a)):void 0;if(r?.some((a)=>n.has(a)))return!0;let i=typeof s.reply_users_count==="number"?s.reply_users_count:void 0;if(r&&(i!==void 0?i<=r.length:r.length<5))return!1;return}function Fi(e,t,n,o,s){let r=`${t.id}:${o}`,i=s.filter((c)=>n.has(ee(c.user))||n.has(ee(c.bot_id))).map((c)=>de(ee(c.ts)));if(i.length){let c=e.state.joined??={};c[r]=Math.max(c[r]??0,...i),e.notJoined?.delete(r);return}let a=Math.max(e.notJoined?.get(r)??0,...s.map((c)=>de(ee(c.ts))));(e.notJoined??=new Map).set(r,a)}function nm(e){let t=new Date(de(e.ts)*1000).toISOString().replace(/\.\d+Z$/,"Z"),n=e.type==="reply"?"↳ ":"",o=e.text.split(`
|
|
247
|
+
`).join(`
|
|
248
|
+
`);return`${t} ${e.channel.name} ${n}@${e.user.name}: ${o}
|
|
249
|
+
${e.permalink}`}async function xo(e){let t=[],n;do{let o=await e(n);t.push(...o.messages),n=o.nextCursor}while(n);return t}async function sm(e,t,n,o=!0){let s=e.state.channels[t.id],r=n-(e.opts.settleSec??5),i=n-e.opts.threadWindowSec,a=de(s.cursor),c=o?Math.min(a,i):a,l=(await xo((f)=>e.client.history(t.id,pt(c),f))).sort((f,h)=>de(ee(f.ts))-de(ee(h.ts))),u=e.opts.repliesTo?new Map(l.map((f)=>[ee(f.ts),f])):void 0,d=l.at(-1);if(d&&de(ee(d.ts))>de(s.latest??"0"))s.latest=ee(d.ts);if(o)s.scanned=pt(n);for(let f of l){let h=de(ee(f.ts));if(h<=a||h>r)continue;let m=ee(f.thread_ts),p=await $i(e,t,f,m!==""&&m!==ee(f.ts),m?u?.get(m):void 0);if(s.cursor=ee(f.ts),p)kt(e.opts.statePath,e.state)}if(de(s.cursor)<r)s.cursor=pt(r);for(let f of l){let h=ee(f.ts),m=de(ee(f.latest_reply));if(!m||ee(f.thread_ts)!==h)continue;let p=de(s.threads[h]??s.since);if(m<=p)continue;let g=e.opts.repliesTo,w=g!==void 0&&wu(e,t,g,h,f)===void 0,b=w?Math.min(p,e.notJoined?.get(`${t.id}:${h}`)??0):p,k=(await xo((x)=>e.client.replies(t.id,h,pt(b),x))).sort((x,_)=>de(ee(x.ts))-de(ee(_.ts)));if(w)Fi(e,t,g,h,k);for(let x of k){let _=de(ee(x.ts));if(ee(x.ts)===h||_<=p||_>r)continue;let F=ee(x.subtype)!=="thread_broadcast"&&await $i(e,t,x,!0,f);if(s.threads[h]=ee(x.ts),F)kt(e.opts.statePath,e.state)}s.threads[h]=pt(Math.max(de(s.threads[h]??"0"),Math.min(m,r)))}for(let f of Object.keys(s.threads))if(de(f)<i)delete s.threads[f];kt(e.opts.statePath,e.state)}async function om(e,t,n){let o,s,r,i=e.opts.repliesTo,a=`${t.id}:${n.thread_ts??""}`;if(i&&n.thread_ts&&e.state.joined?.[a]===void 0){let m=Math.min(e.notJoined?.get(a)??0,de(n.ts)-1),p=await xo((g)=>e.client.replies(t.id,n.thread_ts,pt(m),g));if(o=p.find((g)=>ee(g.ts)===n.ts),s=p.find((g)=>ee(g.ts)===n.thread_ts),o)Fi(e,t,i,n.thread_ts,p)}for(let m=0;m<5&&!o;m++){let p=await e.client.replies(t.id,n.thread_ts??n.ts,pt(de(n.ts)-1),r);if(o=p.messages.find((g)=>ee(g.ts)===n.ts),s??=n.thread_ts?p.messages.find((g)=>ee(g.ts)===n.thread_ts):void 0,r=p.nextCursor,!r)break}if(!o)return!1;let c=ee(o.thread_ts),l=e.state.channels[t.id],d=c!==""&&c!==n.ts&&ee(o.subtype)!=="thread_broadcast"?l?.threads[c]:l?.cursor;if(d!==void 0&&de(n.ts)<=de(d))return!0;let f=Object.keys(e.state.joined??{}).length;if(await $i(e,t,o,c!==""&&c!==n.ts,s)||Object.keys(e.state.joined??{}).length!==f)kt(e.opts.statePath,e.state);return!0}var rm=2592000;function im(e,t){if(!e.joined)return;for(let[n,o]of Object.entries(e.joined))if(o<t)delete e.joined[n];if(!Object.keys(e.joined).length)delete e.joined}function am(e,t){if(!e.seen)return;for(let[n,o]of Object.entries(e.seen))if(o<t)delete e.seen[n];if(!Object.keys(e.seen).length)delete e.seen}var cm=10;function lm(e,t,n){if(!(t>0))return e;let o=60000/t,s=-1/0,r=async()=>{let i=ae.now();s=Math.max(s,i);let a=s-i-(cm-1)*o;if(s+=o,a>0)await ae.sleep(a,n)};return{listChannels:()=>e.listChannels(),userName:(i)=>e.userName(i),history:async(i,a,c)=>(await r(),e.history(i,a,c)),replies:async(i,a,c,l)=>(await r(),e.replies(i,a,c,l))}}function um(e,t,n,o){let s=n-o.windowSec,r=(f)=>t.channels[f.id],i=(f)=>r(f)?.scanned!==void 0&&de(r(f).latest??"0")<s,a=(f)=>o.once||r(f)?.scanned===void 0||n-de(r(f).scanned)>=o.periodSec,c=new Map,l=e.filter((f)=>!i(f)),u=o.once||o.periodSec<=o.intervalSec?1/0:Math.max(1,Math.ceil(l.length*o.intervalSec/o.periodSec)),d=l.filter(a).sort((f,h)=>de(r(f)?.scanned??"0")-de(r(h)?.scanned??"0")).slice(0,u);for(let f of d)c.set(f.id,"full");for(let f of e){if(c.has(f.id))continue;c.set(f.id,i(f)&&(f.isIm||f.isMpim)&&!a(f)?"skip":"cursor")}return c}async function bu(e,t){let n=t.maxFailures??(t.once?3:12),o=t.backoffBaseMs??2000,s=t.backoffCapMs??300000,r=t.refreshEvery??10,i=t.once?void 0:t.relay;if(!i&&!t.once)ae.err(`slack stream: WARNING: polling mode (${t.pollReason??"no relay configured"}) — this is the fallback, `+`not the intended setup: matches arrive up to ${Math.round(t.intervalMs/1000)}s late (replies under older parents up to ${Math.round(Math.max(t.threadScanSec??180,t.intervalMs/1000))}s) and every cycle spends Slack API calls. For real time, deploy the relay and set SLACK_RELAY_URL + SLACK_RELAY_TOKEN: ${Kg}`);e=lm(e,t.callsPerMin??40,t.signal);let a,c=new AbortController,l=()=>c.abort();t.signal?.addEventListener("abort",l,{once:!0});try{a=em(t.statePath);let u=Qg(t.statePath,t.identity),d=t.repliesTo?[...t.repliesTo].sort().join(","):void 0;if(u.joinedBy!==d)delete u.joined;if(d)u.joinedBy=d;else delete u.joinedBy;let f={opts:t,client:e,state:u,names:new Map,matches:0},h=new Set,m=[],p=ae.now()/1000,g=p,w="",b=0,k=0,x=-1/0,_=0,F=(V)=>{ae.err(`slack stream: rate limited — waiting ${V.retryAfter}s`),_=Math.max(_,ae.now()+V.retryAfter*1000)},I=async(V)=>{if(m=(await e.listChannels()).filter((re)=>!t.channels||t.channels.includes(re.id)),t.channels){for(let re of t.channels)if(!m.some((te)=>te.id===re))throw new Mt(`--channel ${re}: the identity is not a member of it`)}let j=Object.keys(u.channels).length===0;for(let re of m){if(u.channels[re.id])continue;let v=Math.min(j||k===0?V:g,t.sinceSec!==void 0?p-t.sinceSec:1/0);u.channels[re.id]={since:pt(v),cursor:pt(v),threads:{}}}g=V,kt(t.statePath,u)};if(t.sinceSec!==void 0)u.channels={},delete u.seen,delete u.relay;let S={queue:[],retry:[],inflight:void 0,onDrain:void 0,handled:0,live:void 0,full:!1},B=new AbortController,W=()=>B.abort(),P=(V,le="")=>{if(S.live===V)return;S.live=V,ae.err(V?`slack stream: relay connected — polling every ${Math.round(Math.max(t.intervalMs,i.reconcileMs)/1000)}s as a safety net`:`slack stream: relay unavailable${le?` (${le})`:""} — polling every ${Math.round(t.intervalMs/1000)}s`),W()},T=async(V)=>{let le=t.sinceSec===void 0&&u.relay?.url===V.url?{seq:u.relay.seq,...u.relay.epoch?{epoch:u.relay.epoch}:{}}:{seq:0},j=0,re=()=>S.queue.length+S.retry.length+(S.inflight?1:0);while(!c.signal.aborted){while(re()>=Do/2&&!c.signal.aborted)await new Promise((U)=>{let ge=()=>U();S.onDrain=()=>{c.signal.removeEventListener("abort",ge),U()},c.signal.addEventListener("abort",ge,{once:!0})});if(c.signal.aborted)return;let te=new AbortController,v=()=>te.abort();c.signal.addEventListener("abort",v,{once:!0});let q=!1,ne="stream closed";try{await V.subscribe(le,te.signal,{hello:(U)=>{if(j=0,U.gap)S.full=!0;if(U.gap||u.relay?.url!==V.url||u.relay.epoch!==U.epoch){u.relay={url:V.url,seq:U.seq,...U.epoch?{epoch:U.epoch}:{}},S.handled=Math.min(S.handled,U.seq);for(let ge of[...S.queue,...S.retry,...S.inflight?[S.inflight]:[]])ge.seq=Math.min(ge.seq,U.seq)}le={seq:U.seq,...U.epoch?{epoch:U.epoch}:{}},P(!0)},bell:(U,ge)=>{if(q)return;if(re()>=Do){ae.err(`slack stream: relay backlog over ${Do} — pausing the relay until it drains`),q=!0,te.abort(),P(!1,"paused while its backlog drains");return}le={...le,seq:U},S.queue.push({seq:U,bell:ge,tries:0,dueMs:0}),W()}})}catch(U){if(U instanceof Si){if(S.live)P(!1,ze(U));S.live=!1,ae.err(`slack stream: relay disabled for this run: ${ze(U)} — check SLACK_RELAY_TOKEN`);return}ne=ze(U)}finally{c.signal.removeEventListener("abort",v)}if(c.signal.aborted)return;if(q)continue;P(!1,ne),j++,await ae.sleep(ko(j,2000,60000),c.signal)}};if(i)T(i);let A=async(V)=>{if(t.channels&&!t.channels.includes(V.channel))return!0;let le=m.find((re)=>re.id===V.channel);if(!le){if(ae.now()/1000-g<60)return!1;await I(ae.now()/1000),le=m.find((re)=>re.id===V.channel)}let j=le&&u.channels[le.id];if(!le||!j||h.has(le.id))return!0;if(de(V.ts)<de(j.since))return!0;if(V.self&&t.selfUsers.has(V.self)){if(t.repliesTo?.has(V.self)&&V.thread_ts){let re=u.joined??={},te=`${le.id}:${V.thread_ts}`;re[te]=Math.max(re[te]??0,de(V.ts)),f.notJoined?.delete(te),kt(t.statePath,u)}return!0}return om(f,le,V)},L=()=>{if(!u.relay||u.relay.url!==i?.url)return;let V=[...S.queue,...S.retry,...S.inflight?[S.inflight]:[]].map((le)=>le.seq);u.relay.seq=Math.max(0,V.length?Math.min(...V)-1:Math.max(u.relay.seq,S.handled))},K=async()=>{let V=ae.now(),le=S.retry.filter((te)=>te.dueMs<=V);if(le.length)S.retry=S.retry.filter((te)=>te.dueMs>V),S.queue=[...le,...S.queue].sort((te,v)=>te.seq-v.seq);let j=0;while(S.queue.length&&j<Hg&&!t.signal?.aborted&&ae.now()>=_){let te=S.queue.shift();S.inflight=te,j++;let v,q;try{v=await A(te.bell)}catch(ne){if(ne instanceof qe){F(ne),te.dueMs=_,S.retry.push(te),S.inflight=void 0;break}v=!1,q=ne}if(S.inflight=void 0,q!==void 0&&/thread_not_found|message_not_found/.test(ze(q)))q=void 0;if(q!==void 0&&Ei(q)==="channel")ae.err(`slack stream: relay bell for ${te.bell.channel} dropped: ${ze(q)}`),v=!0;if(q===void 0&&ue)ae.err("slack stream: relay bell reads recovered"),ue=!1;if(v)S.handled=Math.max(S.handled,te.seq);else if(q!==void 0){if(te.fails=(te.fails??0)+1,!ue)ae.err(`slack stream: relay bell for ${te.bell.channel} failed (${ze(q)}) — retrying`);ue=!0,te.dueMs=ae.now()+ko(te.fails,1500,60000),S.retry.push(te)}else if(++te.tries>=zg)ae.err(`slack stream: relay bell for ${te.bell.channel} abandoned after ${te.tries} tries (not visible) — only the poll can find it now`),S.handled=Math.max(S.handled,te.seq);else te.dueMs=ae.now()+ko(te.tries,1500,60000),S.retry.push(te)}if(S.onDrain&&S.queue.length+S.retry.length<Do/2)S.onDrain(),S.onDrain=void 0;let re=u.relay?.seq;if(L(),j||u.relay?.seq!==re)kt(t.statePath,u)},ce=()=>S.live===!0&&i?Math.max(t.intervalMs,i.reconcileMs):t.intervalMs,ie=()=>{let V=ae.now();return(V>=x+ce()||S.full)&&V>=_},ye=()=>S.queue.length>0||S.retry.some((V)=>V.dueMs<=ae.now()),ve=!1,ue=!1;while(!t.signal?.aborted){if(ie()&&!(ve&&ye())){S.full=!1;let j=ae.now()/1000;try{if(k%r===0)await I(j);let re=Math.max(0,t.threadScanSec??180),te=um(m.filter((v)=>!h.has(v.id)),u,j,{windowSec:t.threadWindowSec,periodSec:re,intervalSec:ce()/1000,once:t.once});for(let v of m){if(t.signal?.aborted)break;if(h.has(v.id))continue;let q=te.get(v.id)??"full";if(q==="skip")continue;for(;;)try{let ne=u.channels[v.id],U=q==="cursor"&&ne.scanned!==void 0&&de(ne.latest??"0")<j-t.threadWindowSec&&j-de(ne.scanned)>=re;if(await sm(f,v,j,q==="full"),U)ne.scanned=pt(j),kt(t.statePath,u);break}catch(ne){if(ne instanceof qe){if(F(ne),await ae.sleep(_-ae.now(),t.signal),t.signal?.aborted)break;continue}if(Ei(ne)==="channel"){h.add(v.id),w=ze(ne),ae.err(`slack stream: skipping ${v.isIm?v.id:"#"+v.name} (${v.id}): ${ze(ne)}`);break}throw ne}}if(m.length>0&&m.every((v)=>h.has(v.id)))throw new Mt(`every channel failed — nothing left to watch (last: ${w})`);if(b>0)ae.err(`slack stream: recovered after ${b} failed attempt(s)`);b=0}catch(re){if(re instanceof Mt||Ei(re)==="fatal")return ae.err(`slack stream: fatal: ${ze(re)}`),3;if(b++,b>=n)return ae.err(`slack stream: giving up after ${b} consecutive failures: ${ze(re)}`),3;let te=ko(b,o,s);ae.err(`slack stream: ${ze(re)} — reconnecting in ${(te/1000).toFixed(1)}s (attempt ${b}/${n})`),await ae.sleep(te,t.signal),S.full=!0;continue}if(k++,am(u,j-t.threadWindowSec-86400),im(u,j-rm),t.once){if(kt(t.statePath,u),f.matches===0)ae.err(`slack stream: no matches in ${m.length-h.size} channel(s)`);return f.matches>0?0:2}x=j*1000,ve=!0}if(t.signal?.aborted)break;let V=ae.now(),le=Math.max(_,S.queue.length||S.full?V:Math.min(x+ce(),...S.retry.map((j)=>j.dueMs)));if(le>V){B=new AbortController;let j=B,re=()=>j.abort();t.signal?.addEventListener("abort",re,{once:!0}),await ae.sleep(le-V,j.signal),t.signal?.removeEventListener("abort",re)}if(ie()&&!(ve&&ye()))continue;await K(),ve=!1}return 0}catch(u){return ae.err(`slack stream: fatal: ${ze(u)}`),3}finally{c.abort(),t.signal?.removeEventListener("abort",l),a?.()}}class Du extends Error{}function dm(e,t){let n;while((n=e.indexOf(`
|
|
250
|
+
|
|
251
|
+
`))>=0){let o=e.slice(0,n);e=e.slice(n+2);let s="message",r,i=[];for(let a of o.split(`
|
|
252
|
+
`)){if(!a||a.startsWith(":"))continue;let c=a.indexOf(":"),l=c<0?a:a.slice(0,c),u=c<0?"":a.slice(c+1).replace(/^ /,"");if(l==="event")s=u;else if(l==="data")i.push(u);else if(l==="id")r=u}if(i.length)t(s,i.join(`
|
|
253
|
+
`),r)}return e}function ku(e,t,n=70000){let o=e.replace(/\/+$/,"");return async(s,r,i)=>{let a=new AbortController,c=()=>a.abort();r.addEventListener("abort",c,{once:!0});let l,u=!1,d=()=>{clearTimeout(l),l=setTimeout(()=>{u=!0,a.abort()},n)};try{d();let f=s===void 0?"":`?after=${s.seq}${s.epoch?`&epoch=${encodeURIComponent(s.epoch)}`:""}`,h=await fetch(`${o}/stream${f}`,{headers:{authorization:`Bearer ${t}`,accept:"text/event-stream"},signal:a.signal});if(h.status===401)throw new Du("relay rejected the token (401)");if(!h.ok||!h.body)throw Error(`relay: HTTP ${h.status}`);let m=h.body.getReader(),p=new TextDecoder,g="";for(;;){let{done:w,value:b}=await m.read();if(w)return;d(),g=dm((g+p.decode(b,{stream:!0})).replace(/\r\n/g,`
|
|
254
|
+
`),(k,x,_)=>{let F=JSON.parse(x);if(k==="hello")i.hello(F);else if(k==="bell"&&_!==void 0)i.bell(Number(_),F)})}}catch(f){if(r.aborted)return;if(u)throw Error(`relay: no data for ${Math.round(n/1000)}s`);throw f}finally{clearTimeout(l),r.removeEventListener("abort",c)}}}import{spawn as fm}from"node:child_process";import{constants as xu}from"node:os";var pm=["processing","active","suspended","closed"];function Su(e){if(e!==void 0&&!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw Error("--bot-token-env must name an environment variable, not contain a token.");let t=e===void 0?no():process.env[e];if(!t?.startsWith("xoxb-"))throw Error("Agent commands require a bot token (xoxb). Set SLACK_BOT_TOKEN or --bot-token-env NAME; user tokens are refused.");return t}function Eu(e){if(e!==void 0&&(!e.trim()||[...e].length>200))throw Error("--title must contain 1–200 characters.")}async function _u(e,t,n){let{ref:o,threadTs:s}=n(t);if(!s||!/^\d{10}\.\d{6}$/.test(s))throw Error("Target must include a thread root: C00000001:1700000000.000100, #channel:ts, or a message permalink.");return{channel_id:await ao(e,o),thread_ts:s}}function Ai(e,t){console.error(`agent: ${e}: ${t instanceof Error?t.message:"request failed"}`)}async function hm(e,t,n,o){let s,r,i,a,c,l=!1,u=!1,d=1,f=(p)=>{if(r)return;if(r=p,l=!0,s&&s.exitCode===null&&s.signalCode===null)s.kill(p),i=setTimeout(()=>s?.kill("SIGKILL"),5000)},h=()=>f("SIGINT"),m=()=>f("SIGTERM");process.on("SIGINT",h),process.on("SIGTERM",m);try{if(u=!0,await is(e,t,"processing"),!l&&o.title!==void 0)await ni(e,t,o.title);if(!l){s=fm(n[0],n.slice(1),{stdio:"inherit"});let p=new Promise((g)=>{s.once("error",()=>{console.error("agent: could not start command"),g(127)}),s.once("exit",(w,b)=>{g(w??(b?128+xu.signals[b]:1))})});a=setInterval(()=>{if(l||c)return;c=is(e,t,"processing").then(()=>{}).catch((g)=>Ai("heartbeat failed; retrying on next tick",g)).finally(()=>{c=void 0})},o.every*1000),d=await p}}catch(p){Ai("could not start agent session",p)}finally{if(l=!0,clearInterval(a),clearTimeout(i),await c,u)try{await is(e,t,o.close?"closed":"active")}catch(p){if(Ai("final status clear failed",p),d===0)d=1}process.removeListener("SIGINT",h),process.removeListener("SIGTERM",m)}return r?128+xu.signals[r]:d}function Cu(e,t){let n=(o)=>o.positional("target",{type:"string",demandOption:!0,describe:"Thread root: raw channel ID:ts (avoids listing), #channel:ts, or permalink"}).option("title",{type:"string",describe:"Rename the session (1–200 characters)"}).option("bot-token-env",{type:"string",describe:"Environment variable holding an agent-enabled app's xoxb token (default SLACK_BOT_TOKEN); requires chat:write and channel membership"});return e.command("status <target> <status>","Set a bot agent session's status",(o)=>n(o).positional("status",{type:"string",choices:pm,demandOption:!0}),async(o)=>{Eu(o.title);let s=Su(o["bot-token-env"]),r=await _u(s,o.target,t);if(await is(s,r,o.status),o.title!==void 0)await ni(s,r,o.title)}).command("run <target>","Keep a thread working while a command runs: run <target> -- <command...>",(o)=>n(o).parserConfiguration({"populate--":!0}).option("every",{type:"number",default:300,describe:"Heartbeat seconds (>0 and <3600); processing expires after one hour"}).option("close",{type:"boolean",default:!1,describe:"Finish with closed instead of active (also on failure or interrupt)"}),async(o)=>{if(Eu(o.title),!Number.isFinite(o.every)||o.every<=0||o.every>=3600)throw Error("--every must be greater than 0 and less than 3600 seconds.");let s=process.argv.indexOf("--"),r=s<0?[]:process.argv.slice(s+1);if(!r[0])throw Error("agent run requires -- <command...>");let i=Su(o["bot-token-env"]),a=await _u(i,o.target,t);process.exitCode=await hm(i,a,r,{every:o.every,close:o.close,...o.title!==void 0?{title:o.title}:{}})}).demandCommand(1,"Choose agent status or agent run.")}var Re=[{name:"one",glyph:"1️⃣"},{name:"two",glyph:"2️⃣"},{name:"three",glyph:"3️⃣"},{name:"four",glyph:"4️⃣"},{name:"five",glyph:"5️⃣"},{name:"six",glyph:"6️⃣"},{name:"seven",glyph:"7️⃣"},{name:"eight",glyph:"8️⃣"},{name:"nine",glyph:"9️⃣"},{name:"keycap_ten",glyph:"\uD83D\uDD1F"}],xt=Re.length,Nt="question";var jt=["ja","en"];function Ri(e,t=process.env){for(let[r,i]of[[e.flag,"flag"],[t.SLACK_TERM_LANG,"env"]]){if(r===void 0||r.trim()==="")continue;let a=r.trim().toLowerCase();return jt.includes(a)?{lang:a,source:i}:null}let n=(e.readerLocales??[]).map($u);if(n.length&&n[0]&&n.every((r)=>r===n[0]))return{lang:n[0],source:"readers"};let o=Oi((e.content??[]).join(`
|
|
255
|
+
`));if(o)return{lang:o,source:"content"};let s=$u(t.LC_ALL||t.LC_MESSAGES||t.LANG);if(s)return{lang:s,source:"system"};return{lang:"ja",source:"default"}}function $u(e){let t=(e??"").toLowerCase();return jt.find((n)=>t===n||/^[_.\-@]/.test(t.slice(n.length))&&t.startsWith(n))??null}function Oi(e){let t=e.replace(/<[^>\s]*>/g," ").replace(/https?:\/\/\S+/g," ").replace(/:[a-z0-9_+-]+:/g," ");if(/[\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Han}]/u.test(t))return"ja";if(/\p{Script=Latin}/u.test(t))return"en";return null}var et={ja:{instructionReactionThread:"_下のリアクションを 1 つ押すと回答になります。当てはまるものがなければ、このメッセージの *スレッド* で返信してください (チャンネルへの通常投稿は回答として拾いません)。_",instructionReactionHere:"_下のリアクションを 1 つ押すと回答になります。当てはまるものがなければ、このメッセージに返信してください。_",instructionTextThread:"_このメッセージの *スレッド* で返信してください。本文がそのまま回答になります (チャンネルへの通常投稿は回答として拾いません)。_",instructionTextHere:"_このメッセージに返信してください。本文がそのまま回答になります。_",overflowNote:"_11 番目以降はリアクションがないので、返信で答えてください。_",otherThread:`${":question: "}その他 — スレッドで返信してください`,otherHere:`${":question: "}その他 — このメッセージに返信してください`,invalidPrefix:"_:warning: 同時に複数選ばれているため回答として数えていません — どれか 1 つだけ残してください: ",answeredVia:(e,t)=>`_${e}で回答済み${t?` (${t})`:""}_`,howReaction:(e)=>`リアクション ${e}`,howReply:"返信",howReplyN:(e)=>`返信 (${e})`,voidStamp:(e)=>`_無効${e?`: ${e}`:""} — この質問への回答は受け付けません。_`,supersededBy:(e)=>`↪ 新しい質問: ${e}`},en:{instructionReactionThread:"_Press one of the reactions below to answer. If none fits, reply in this message's *thread* (ordinary channel posts are not picked up as answers)._",instructionReactionHere:"_Press one of the reactions below to answer. If none fits, reply to this message._",instructionTextThread:"_Reply in this message's *thread* — your reply is the answer (ordinary channel posts are not picked up as answers)._",instructionTextHere:"_Reply to this message — your reply is the answer._",overflowNote:"_Choices 11 and up have no reaction — answer them with a reply._",otherThread:`${":question: "}Other — reply in the thread`,otherHere:`${":question: "}Other — reply to this message`,invalidPrefix:"_:warning: Several choices are selected, so this is not counted as an answer — keep only one: ",answeredVia:(e,t)=>`_Answered by ${e}${t?` (${t})`:""}_`,howReaction:(e)=>`reaction ${e}`,howReply:"reply",howReplyN:(e)=>`reply (${e})`,voidStamp:(e)=>`_Void${e?`: ${e}`:""} — this question no longer takes answers._`,supersededBy:(e)=>`↪ Replaced by: ${e}`}};function gm(e){return e!==void 0&&(e.startsWith(":question: ")||e.startsWith("❓ "))}var So="_";function Au(e){if(e===void 0||!e.endsWith(So))return null;return jt.find((t)=>e.startsWith(et[t].invalidPrefix))??null}function Eo(e){let t=e.split(`
|
|
256
|
+
`),n=t[t.length-2];if(!Au(n))return[];return[...n.matchAll(/<@([UW][A-Z0-9]+)>/g)].map((o)=>o[1])}function _o(e,t,n="ja"){let o=e.split(`
|
|
257
|
+
`);if(o.length<2)return e;if(Eo(e).length)o.splice(o.length-2,1);if(t.length)o.splice(o.length-1,0,`${et[n].invalidPrefix}${t.map((r)=>`<@${r}>`).join(", ")}${So}`);let s=o.join(`
|
|
258
|
+
`);return s===e?e:s}function Fu(e){return Au(e)!==null}var Pi="white_check_mark",gs=`:${Pi}: `,vi="no_entry_sign",Ii=`:${vi}: `,mm=/^【[^】]*(?:作废|作廢|superseded|void)[^】]*】/i;function Li(e){return`:${Re[e].name}:`}function Tu(e,t){let n=Re[t];for(let o of[Li(t),n.glyph]){if(e.startsWith(`${o} `))return e.slice(o.length+1);if(e===o)return""}return null}function ym(e){return Re.some((t,n)=>Tu(e,n)!==null)}function Oe(e){return e.replace(/\s*\n\s*/g," ")}function Bi(e,t,n,o,s,r="ja"){let i=et[r],a=[`:question: *${e}*`];if(t)a.push("",t);if(n.length){if(a.push(""),a.push(...n.map((c,l)=>`${Li(l)} ${Oe(c)}`)),a.push(s?i.otherThread:i.otherHere),o.length)a.push(""),a.push(...o.map((c,l)=>`(${l+11}) ${Oe(c)}`)),a.push(i.overflowNote);a.push(""),a.push(s?i.instructionReactionThread:i.instructionReactionHere)}else a.push(""),a.push(s?i.instructionTextThread:i.instructionTextHere);return a.join(`
|
|
259
|
+
`)}function Iu(e,t,n,o="ja",s){let r=t.answer.split(`
|
|
246
260
|
`).map((a)=>`> ${a}`).join(`
|
|
247
|
-
`),i=`${
|
|
248
|
-
${
|
|
261
|
+
`),i=`${gs}*${e}*
|
|
262
|
+
${et[o].answeredVia(t.how,n)}
|
|
249
263
|
|
|
250
264
|
${r}`;if(s?.body)i+=`
|
|
251
265
|
|
|
252
266
|
${s.body}`;if(s?.chosenLine)i+=`
|
|
253
267
|
|
|
254
|
-
${s.chosenLine}`;return i}function
|
|
255
|
-
${r.voidStamp(
|
|
268
|
+
${s.chosenLine}`;return i}function Ru(e,t){let n=St(e);if(n.kind!=="open")return;let o={};if(n.body)o.body=n.body;if(t!==void 0&&t>=1){if(t<=n.reactable.length)o.chosenLine=`${Li(t-1)} ${Oe(n.reactable[t-1])}`;else if(t-xt<=n.overflow.length&&t>xt)o.chosenLine=`(${t}) ${Oe(n.overflow[t-xt-1])}`}return o.body||o.chosenLine?o:void 0}function Ou(e,t,n="ja",o,s){let r=et[n],i=`${Ii}*${e}*
|
|
269
|
+
${r.voidStamp(Oe(t.trim()))}`;if(s)i+=`
|
|
256
270
|
${r.supersededBy(s)}`;if(o)i+=`
|
|
257
271
|
|
|
258
|
-
${o}`;return i}function
|
|
259
|
-
`),n=
|
|
260
|
-
`),n=t[t.length-1]??"";if(e.startsWith(
|
|
261
|
-
`),n=(g)=>e.startsWith(`${g}*`)&&t.some((w,
|
|
262
|
-
`).slice(
|
|
263
|
-
`).slice(
|
|
264
|
-
`);if(!
|
|
265
|
-
`).replace(/^\*/,"").replace(/\*$/,""),
|
|
266
|
-
`).replace(/^\n+|\n+$/g,"");return{kind:"open",question:d,body:
|
|
267
|
-
`),n=t[t.length-2];if(!
|
|
268
|
-
`);if(o.length<2)return e;if(
|
|
269
|
-
`);return s===e?e:s}function
|
|
270
|
-
`),s?[]:i)}function
|
|
271
|
-
`)}function
|
|
272
|
-
`);if(e.startsWith(
|
|
273
|
-
`).replace(/^\*/,"").replace(/\*$/,""),i=t.length-2,a=
|
|
272
|
+
${o}`;return i}function Pu(e){if(!e.startsWith(":question: "))return null;let t=e.slice(11),n=t.match(/^\*([\s\S]+?)\*(?=\s|$)/);if(!n)return null;let o=t.slice(n[0].length),s=!1;for(let r of jt){let i=et[r];for(let c of[i.instructionReactionThread,i.instructionReactionHere,i.instructionTextThread,i.instructionTextHere])if(o.includes(c))s=!0;for(let c of[i.instructionReactionThread,i.instructionReactionHere,i.instructionTextThread,i.instructionTextHere,i.overflowNote,i.otherThread,i.otherHere])o=o.split(c).join(" ");let a=o.indexOf(i.invalidPrefix);if(a>=0){let c=o.indexOf(So,a+i.invalidPrefix.length);o=o.slice(0,a)+" "+(c>=0?o.slice(c+So.length):"")}}if(!s)return null;return{question:n[1],body:o.replace(/[ \t]{3,}/g," ").trim()}}function vu(e){if(!e[0]?.startsWith(gs))return-1;let t=(n)=>!!n&&(n.startsWith("> ")||n.startsWith("> "));for(let n=1;n+2<e.length;n++){let o=e[n];if(o.length>1&&o.startsWith("_")&&o.endsWith("_")&&e[n+1]===""&&t(e[n+2]))return n}return-1}function Lu(e){let t=e.split(`
|
|
273
|
+
`),n=vu(t),s=((n>0?t[n]:t[1])??"").match(/^_(?:返信|Answered by reply)(?: \((\d+)\))?/);if(!s)return{byReply:!1};return s[1]?{byReply:!0,n:Number(s[1])}:{byReply:!0}}function hs(e){return e.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&")}function ms(e){if(!e.trim())return"本文が空です (bot 投稿や添付のみのメッセージかもしれません)";let t=e.split(`
|
|
274
|
+
`),n=t[t.length-1]??"";if(e.startsWith(gs))return"回答済みマーク付きですが、引用された回答本文が見つかりません";if(!/_$/.test(n))return"末尾が `ask` の案内文ではありません — このメッセージは `slack ask` で投稿されたものではないか、本文が編集されています";if(!t[0].startsWith(":question: ")&&!t[0].startsWith("*"))return"先頭が質問文 (太字) ではありません — 本文が編集されている可能性があります";return"選択肢の並びを読み取れません — 番号が 1 から連番になっていないか、本文が編集されています"}function St(e){let t=e.split(`
|
|
275
|
+
`),n=(g)=>e.startsWith(`${g}*`)&&t.some((w,b)=>b>0&&w.length>1&&w.startsWith("_")&&w.endsWith("_"));if(n(Ii)){let g=t.findIndex((x,_)=>_>0&&x.startsWith("_")&&x.endsWith("_")),w=hs(t.slice(0,g>0?g:1).join(`
|
|
276
|
+
`).slice(Ii.length).replace(/^\*/,"").replace(/\*$/,"")),b=g>0?t[g].replace(/^_|_$/g,""):"",k=g>0?t[g+1]?.match(/^↪ [^::]*[::] (.+)$/)?.[1]:void 0;return k?{kind:"void",question:w,reason:b,supersededBy:k}:{kind:"void",question:w,reason:b}}let o=t[0].match(mm)?e.match(/:question: \*([^\n]*?)\*/):null;if(o)return{kind:"void",question:hs(o[1]),reason:hs(t[0])};if(n(gs)){let g=(_)=>_.startsWith("> ")?_.slice(2):_.startsWith("> ")?_.slice(5):null,w=vu(t),b;if(w>0){b=[];for(let _=w+2;_<t.length;_++){let F=g(t[_]);if(F===null)break;b.push(F)}}else b=t.map(g).filter((_)=>_!==null);let k=hs(t.slice(0,w>0?w:1).join(`
|
|
277
|
+
`).slice(gs.length).replace(/^\*/,"").replace(/\*$/,"")),x=b.map(hs).join(`
|
|
278
|
+
`);if(!x)return{kind:"other"};return{kind:"resolved",question:k,answer:x}}let s=t[t.length-1]??"",r,i,a=jt.find((g)=>[et[g].instructionReactionThread,et[g].instructionReactionHere,et[g].instructionTextThread,et[g].instructionTextHere].includes(s));if(!a)return{kind:"other"};let c=et[a];r=s===c.instructionReactionThread||s===c.instructionTextThread,i=s===c.instructionReactionThread||s===c.instructionReactionHere;let l=t[0].startsWith(":question: ")?t[0].slice(11):t[0];if(t[0]=l,!t[0].startsWith("*"))return{kind:"other"};let u=0;while(u<t.length&&!(t[u].endsWith("*")&&(u>0||t[0].length>1)))u++;if(u>=t.length)return{kind:"other"};let d=t.slice(0,u+1).join(`
|
|
279
|
+
`).replace(/^\*/,"").replace(/\*$/,""),f=[],h=[],m=t.length-1;if(Fu(t[m-1]))m--;if(i){let g=t.length-2;if(Fu(t[g]))g--;if(t[g]!=="")return{kind:"other"};if(g--,t[g]===c.overflowNote){g--;while(g>=0&&/^\(\d+\) /.test(t[g]))h.unshift(t[g].replace(/^\(\d+\) /,"")),g--;if(t[g]!=="")return{kind:"other"};g--}if(gm(t[g]))g--;let w=[];while(g>=0){let b=t[g];if(!ym(b))break;w.unshift(b),g--}if(!w.length||w.length>xt)return{kind:"other"};for(let b=0;b<w.length;b++){let k=Tu(w[b],b);if(k===null)return{kind:"other"};f.push(k)}if(t[g]!=="")return{kind:"other"};if(g<u+1)return{kind:"other"};m=g;for(let b=0;b<h.length;b++)if(!t.includes(`(${b+11}) ${h[b]}`))return{kind:"other"}}let p=t.slice(u+1,m).join(`
|
|
280
|
+
`).replace(/^\n+|\n+$/g,"");return{kind:"open",question:d,body:p,reactable:f,overflow:h,threadOnly:r,lang:a}}function Ti(e){return e.normalize("NFKC").replace(/[*_`~]/g,"").trim().replace(/^[\s"'`「『((\[]+/,"").replace(/[\s"'`」』))\]。..!!??、,]+$/,"").replace(/\s+/g," ").trim().toLowerCase()}function Bu(e,t,n){let o=Array.from({length:n},(r,i)=>i===n-1?t:""),s=Mi(e,o);return s.kind==="chosen"&&s.index===n}function Mi(e,t){let n=Ti(e);if(!n)return{kind:"none"};let o=t.map(Ti),s=new Set;o.forEach((l,u)=>{if(l&&l===n)s.add(u+1)}),Re.forEach((l,u)=>{if(u<t.length&&e.trim()===l.glyph)s.add(u+1)});let r=0,i="",a=n.match(/^(\d{1,2})$/);if(a)r=Number(a[1]);else if(a=n.match(/^(\d{1,2})(?:\s*[.)::、。\-\]]\s*|\s+)(.*)$/)){if(r=Number(a[1]),i=Ti(a[2]),!i)return{kind:"none"};if(/^\d+$/.test(i))return{kind:"none"}}if(r>=1&&r<=t.length&&(i===""||i===o[r-1]))s.add(r);let c=[...s].sort((l,u)=>l-u);if(!c.length)return{kind:"none"};if(c.length>1)return{kind:"ambiguous",indexes:c};return{kind:"chosen",index:c[0]}}var Ni=[{name:"one",glyph:"1️⃣"},{name:"two",glyph:"2️⃣"},{name:"three",glyph:"3️⃣"},{name:"four",glyph:"4️⃣"},{name:"five",glyph:"5️⃣"},{name:"six",glyph:"6️⃣"},{name:"seven",glyph:"7️⃣"},{name:"eight",glyph:"8️⃣"},{name:"nine",glyph:"9️⃣"},{name:"keycap_ten",glyph:"\uD83D\uDD1F"}],Fk=Ni.length;var wm=["ja","en"];var Mu={ja:{instructionReactionThread:"_下のリアクションを 1 つ押すと回答になります。当てはまるものがなければ、このメッセージの *スレッド* で返信してください (チャンネルへの通常投稿は回答として拾いません)。_",instructionReactionHere:"_下のリアクションを 1 つ押すと回答になります。当てはまるものがなければ、このメッセージに返信してください。_",instructionTextThread:"_このメッセージの *スレッド* で返信してください。本文がそのまま回答になります (チャンネルへの通常投稿は回答として拾いません)。_",instructionTextHere:"_このメッセージに返信してください。本文がそのまま回答になります。_",overflowNote:"_11 番目以降はリアクションがないので、返信で答えてください。_",otherThread:`${":question: "}その他 — スレッドで返信してください`,otherHere:`${":question: "}その他 — このメッセージに返信してください`,invalidPrefix:"_:warning: 同時に複数選ばれているため回答として数えていません — どれか 1 つだけ残してください: ",answeredVia:(e,t)=>`_${e}で回答済み${t?` (${t})`:""}_`,howReaction:(e)=>`リアクション ${e}`,howReply:"返信",howReplyN:(e)=>`返信 (${e})`,voidStamp:(e)=>`_無効${e?`: ${e}`:""} — この質問への回答は受け付けません。_`,supersededBy:(e)=>`↪ 新しい質問: ${e}`},en:{instructionReactionThread:"_Press one of the reactions below to answer. If none fits, reply in this message's *thread* (ordinary channel posts are not picked up as answers)._",instructionReactionHere:"_Press one of the reactions below to answer. If none fits, reply to this message._",instructionTextThread:"_Reply in this message's *thread* — your reply is the answer (ordinary channel posts are not picked up as answers)._",instructionTextHere:"_Reply to this message — your reply is the answer._",overflowNote:"_Choices 11 and up have no reaction — answer them with a reply._",otherThread:`${":question: "}Other — reply in the thread`,otherHere:`${":question: "}Other — reply to this message`,invalidPrefix:"_:warning: Several choices are selected, so this is not counted as an answer — keep only one: ",answeredVia:(e,t)=>`_Answered by ${e}${t?` (${t})`:""}_`,howReaction:(e)=>`reaction ${e}`,howReply:"reply",howReplyN:(e)=>`reply (${e})`,voidStamp:(e)=>`_Void${e?`: ${e}`:""} — this question no longer takes answers._`,supersededBy:(e)=>`↪ Replaced by: ${e}`}};var Nu="_";function ju(e){if(e===void 0||!e.endsWith(Nu))return null;return wm.find((t)=>e.startsWith(Mu[t].invalidPrefix))??null}function ji(e){let t=e.split(`
|
|
281
|
+
`),n=t[t.length-2];if(!ju(n))return[];return[...n.matchAll(/<@([UW][A-Z0-9]+)>/g)].map((o)=>o[1])}function Wu(e,t,n="ja"){let o=e.split(`
|
|
282
|
+
`);if(o.length<2)return e;if(ji(e).length)o.splice(o.length-2,1);if(t.length)o.splice(o.length-1,0,`${Mu[n].invalidPrefix}${t.map((r)=>`<@${r}>`).join(", ")}${Nu}`);let s=o.join(`
|
|
283
|
+
`);return s===e?e:s}function Uu(e){return ju(e)!==null}var bm="white_check_mark",Ak=`:${bm}: `,Dm="no_entry_sign",Tk=`:${Dm}: `;var ht=Ni,Bn=ht.length,ws="ballot_box_with_ballot",Wi=`:${ws}: `,Ku="_下のリアクションで投票してください (1 人 1 票、押し直しで変更できます)。_",qu="_下のリアクションで投票してください (当てはまるものを *いくつでも* 押せます)。_",Co="_締切: ",$o="_",Ji="bar_chart",Ui=`:${Ji}: `;function Fo(e){return`:${ht[e].name}:`}function Ju(e,t){for(let n of[Fo(t),ht[t].glyph])if(e.startsWith(`${n} `))return e.slice(n.length+1);return null}function km(e){return ht.some((t,n)=>e.startsWith(`${Fo(n)} `)||e.startsWith(`${t.glyph} `))}function ys(e){return e.replace(/\s*\n\s*/g," ")}function Hu(e,t,n,o={}){let s=!!o.multi,r=o.deadline??"",i=o.invalid??[];if(!n.length||n.length>Bn)throw Error(`poll needs 1..${Bn} choices, got ${n.length}`);let a=[`${Wi}*${e}*`];if(t)a.push("",t);if(a.push(""),a.push(...n.map((c,l)=>`${Fo(l)} ${ys(c)}`)),a.push(""),r)a.push(`${Co}${ys(r)}${$o}`);return a.push(s?qu:Ku),Wu(a.join(`
|
|
284
|
+
`),s?[]:i)}function zu(e,t){let n=t.reduce((s,r)=>s+r.count,0),o=[`${Ui}*${e}*`,`_投票終了 (計 ${n} 票)_`,""];return o.push(...t.map((s,r)=>`${Fo(r)} ×${s.count} ${ys(s.choice)}`)),o.join(`
|
|
285
|
+
`)}function bs(e){let t=e.split(`
|
|
286
|
+
`);if(e.startsWith(Ui)){let f=t[0].slice(Ui.length).replace(/^\*/,"").replace(/\*$/,""),h=[];for(let m=0;m<ht.length;m++){let p=t.map((w)=>Ju(w,m)).find((w)=>w!==null&&w.startsWith("×"));if(p===void 0)break;let g=/^×(\d+) (.*)$/.exec(p);if(!g)return{kind:"other"};h.push({choice:g[2],count:Number(g[1])})}if(!h.length)return{kind:"other"};return{kind:"closed",question:f,tallies:h}}let n=t[t.length-1]??"",o;if(n===Ku)o=!1;else if(n===qu)o=!0;else return{kind:"other"};if(t[0].startsWith(Wi))t[0]=t[0].slice(Wi.length);if(!t[0].startsWith("*"))return{kind:"other"};let s=0;while(s<t.length&&!(t[s].endsWith("*")&&(s>0||t[0].length>1)))s++;if(s>=t.length)return{kind:"other"};let r=t.slice(0,s+1).join(`
|
|
287
|
+
`).replace(/^\*/,"").replace(/\*$/,""),i=t.length-2,a=ji(e);if(Uu(t[i]))i--;let c="",l=t[i];if(l!==void 0&&l.startsWith(Co)&&l.endsWith($o)&&l.length>Co.length+$o.length)c=l.slice(Co.length,-$o.length),i--;if(t[i]!=="")return{kind:"other"};i--;let u=[];while(i>=0){let f=t[i];if(!km(f))break;u.unshift(f),i--}if(!u.length||u.length>Bn)return{kind:"other"};let d=[];for(let f=0;f<u.length;f++){let h=Ju(u[f],f);if(h===null)return{kind:"other"};d.push(h)}if(t[i]!=="")return{kind:"other"};if(i<s+1)return{kind:"other"};return{kind:"open",question:r,choices:d,multi:o,deadline:c,invalid:a}}function Gu(e,t,n,o){let s=new Map(t.map((l)=>[l.name,l.users])),r=e.map((l,u)=>(s.get(ht[u].name)??[]).filter((d)=>!n.has(d))),i=[];if(!o){let l=new Map;for(let u of r)for(let d of u)l.set(d,(l.get(d)??0)+1);for(let[u,d]of l)if(d>1)i.push(u)}let a=new Set(i),c=r.map((l)=>l.filter((u)=>!a.has(u)));return{tallies:e.map((l,u)=>({choice:l,count:c[u].length})),voters:c,ambiguous:i}}function xm(e=process.env){return!!e.VITEST||e.NODE_ENV==="test"||!!e.BUN_TEST}var Yu={isTestEnv:()=>xm(),sleep:(e)=>Yu.isTestEnv()?Promise.resolve():new Promise((t)=>setTimeout(t,e))};function Sm(e=process.env){let t=e.SLACK_REACTION_SEED_GAP_MS;if(t===void 0||t==="")return 1100;let n=Number(t);if(!Number.isFinite(n)||n<0)return 1100;return n}async function Ao(e,t,n,o=Sm()){for(let s=0;s<e.length;s++){let r=!0;try{await t(e[s])}catch(i){r=!1,n(e[s],i)}if(r&&o>0&&s<e.length-1)await Yu.sleep(o)}}var Xu=["text","select","user","link","date","number","checkbox"];function Zu(e){let t=e.split(":"),n=(t[0]??"").trim(),o=(t[1]??"text").trim();if(!n)throw Error(`--col needs a name: ${e}`);if(!Xu.includes(o))throw Error(`--col ${e}: unknown type "${o}" (expected one of ${Xu.join(", ")})`);if(o==="select"){let s=(t.slice(2).join(":")||"").split(",").map((r)=>r.trim()).filter(Boolean);if(!s.length)throw Error(`--col ${e}: a select column needs choices, e.g. ${n}:select:todo,doing,done`);return{name:n,type:o,choices:s}}if(t.length>2)throw Error(`--col ${e}: only select columns take a third part`);return{name:n,type:o}}var Vu=["gray","blue","green","yellow","red","purple","orange","pink","cyan","indigo","brown"];function Qu(e){if(!e.length)throw Error("at least one --col is required (the first one is the primary text column)");if(e[0].type!=="text")throw Error(`the first --col is the primary column and must be text, got ${e[0].type}`);return e.map((t,n)=>{let o={key:`col${n+1}`,name:t.name,type:t.type};if(n===0)o.is_primary_column=!0;if(t.type==="select")o.options={format:"single_select",choices:t.choices.map((s,r)=>({value:s,label:s,color:Vu[r%Vu.length]}))};if(t.type==="user")o.options={format:"single_entity"};return o})}function ed(e){return((e.list_metadata??e.metadata??{}).schema??e.schema??[]).map((o)=>{let s=o??{},i=((s.options??{}).choices??[]).map((a)=>{let c=a??{};return{value:String(c.value??""),label:String(c.label??c.value??"")}});return{id:String(s.id??""),key:String(s.key??""),name:String(s.name??""),type:String(s.type??""),choices:i}})}function Ki(e,t){let n=e.find((o)=>o.name===t)??e.find((o)=>o.key===t)??e.find((o)=>o.id===t);if(!n)throw Error(`no column "${t}" in this list (columns: ${e.map((o)=>o.name||o.key).join(", ")})`);return n}function qi(e,t){switch(e.type){case"text":return{rich_text:[{type:"rich_text",elements:[{type:"rich_text_section",elements:[{type:"text",text:t}]}]}]};case"select":{let n=e.choices.find((o)=>o.value===t||o.label===t);if(!n)throw Error(`"${t}" is not an option of ${e.name} (options: ${e.choices.map((o)=>o.label).join(", ")})`);return{select:[n.value]}}case"user":return{user:[t]};case"link":return{link:[{original_url:t,display_as_url:!0}]};case"date":return{date:[t]};case"number":{let n=Number(t);if(!Number.isFinite(n))throw Error(`${e.name}: "${t}" is not a number`);return{number:[n]}}case"checkbox":case"todo_completed":if(!["true","false"].includes(t))throw Error(`${e.name}: expected true or false, got "${t}"`);return{checkbox:t==="true"};default:throw Error(`writing a ${e.type} column (${e.name}) from the CLI is not supported`)}}function Hi(e){return e.map((t)=>{let n=t.indexOf("=");if(n<=0)throw Error(`--set expects name=value, got: ${t}`);return{col:t.slice(0,n),value:t.slice(n+1)}})}function td(e){return e.find((t)=>t.key==="todo_completed"||t.type==="todo_completed")}import{spawnSync as Gi}from"node:child_process";import{chmodSync as Em,existsSync as sd,mkdirSync as _m}from"node:fs";import{homedir as Cm,hostname as $m}from"node:os";import{basename as od,dirname as Fm,join as Am}from"node:path";function Io(){return!/^(0|off|false|no)$/i.test(process.env.SLACK_TERM_ATTRIBUTION??"")}var To={claude:"claude-code",codex:"codex",gemini:"gemini",opencode:"opencode","cursor-agent":"cursor-agent",aider:"aider",amp:"amp"};function Tm(e){try{let n=(Gi("ps",["-o","ppid=,comm=","-p",String(e)],{encoding:"utf8",timeout:2000}).stdout??"").trim().match(/^(\d+)\s+(.+)$/);if(!n)return;return{pid:e,ppid:Number(n[1]),comm:od(n[2].trim())}}catch{return}}function Im(){let e=process.ppid;for(let t=0;t<12&&e>1;t++){let n=Tm(e);if(!n)return;if(To[n.comm])return n;e=n.ppid}return}function nd(e){let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function rd(e=process.env){let t={pid:process.pid,host:Rm(),cwd:process.cwd()},n=e.SLACK_TERM_AGENT_CLI||void 0;if(!n&&e.AI_AGENT)n=e.AI_AGENT.split("_")[0]||void 0;if(!n&&e.CLAUDECODE==="1")n="claude-code";let o=nd(e.SLACK_TERM_AGENT_PID)??nd(e.CLAUDE_PID);if(!o||!n){let i=Im();if(i)o??=i.pid,n??=To[i.comm]}if(n)t.cli=n;if(o)t.agentPid=o;let s=e.SLACK_TERM_AGENT_SESSION||e.CLAUDE_CODE_SESSION_ID;if(s)t.sessionId=s;let r=Om(t.cwd);if(r)t.gitBranch=r;return t}function Rm(){try{return $m()}catch{return""}}function Om(e){try{let t=Gi("git",["rev-parse","--abbrev-ref","HEAD"],{cwd:e,encoding:"utf8",timeout:2000});return(t.status===0?(t.stdout??"").trim():"")||void 0}catch{return}}var Pm="slack_term_sent";function id(e,t){let n={kind:e,pid:t.pid,host:t.host,cwd:t.cwd};if(t.agentPid)n.agent_pid=t.agentPid;if(t.gitBranch)n.git_branch=t.gitBranch;if(t.cli)n.cli=t.cli;if(t.sessionId)n.session_id=t.sessionId;return{event_type:Pm,event_payload:n}}function yt(){if(process.env.SLACK_TERM_SENT_DB)return process.env.SLACK_TERM_SENT_DB;return Am(process.env.HOME||Cm(),".config","slack-cli","sent.sqlite")}function vm(e){try{if(typeof globalThis.Bun<"u"){let{Database:n}=zn("bun:sqlite");return new n(e,{create:!0})}let t=process.getBuiltinModule?.("node:sqlite");if(t?.DatabaseSync)return new t.DatabaseSync(e)}catch{}return}var Lm=`
|
|
274
288
|
CREATE TABLE IF NOT EXISTS sent (
|
|
275
289
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
276
290
|
kind TEXT NOT NULL,
|
|
@@ -299,161 +313,161 @@ CREATE TABLE IF NOT EXISTS sent (
|
|
|
299
313
|
);
|
|
300
314
|
CREATE INDEX IF NOT EXISTS sent_msg ON sent(channel, ts);
|
|
301
315
|
CREATE INDEX IF NOT EXISTS sent_at ON sent(sent_at);
|
|
302
|
-
`;function
|
|
303
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.kind,e.team??null,e.channel,e.target??null,e.ts,e.threadTs??null,e.permalink??null,e.text,Date.now(),n.pid,n.agentPid??null,n.host||null,n.cwd,n.gitBranch??null,n.cli??null,n.sessionId??null,e.asBot?1:0),!0}catch(n){return console.error(` (送信ログに記録できませんでした: ${n instanceof Error?n.message:String(n)})`),!1}finally{try{t.close()}catch{}}}var
|
|
316
|
+
`;function Ro(){let e=yt();try{_m(Fm(e),{recursive:!0})}catch{}let t=vm(e);if(!t)return;try{Em(e,384)}catch{}try{t.exec(Lm);for(let n of["delivered_answer TEXT","delivered_cursor TEXT"])try{t.exec(`ALTER TABLE sent ADD COLUMN ${n}`)}catch{}return t}catch{try{t.close()}catch{}return}}function ad(e){if(!Io())return!1;let t=Ro();if(!t)return console.error(` (送信ログに記録できませんでした: ${Ds} — ${yt()})`),!1;try{let n=e.attribution;return t.prepare(`INSERT INTO sent (kind, team, channel, target, ts, thread_ts, permalink, text, sent_at, pid, agent_pid, host, cwd, git_branch, cli, session_id, as_bot)
|
|
317
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.kind,e.team??null,e.channel,e.target??null,e.ts,e.threadTs??null,e.permalink??null,e.text,Date.now(),n.pid,n.agentPid??null,n.host||null,n.cwd,n.gitBranch??null,n.cli??null,n.sessionId??null,e.asBot?1:0),!0}catch(n){return console.error(` (送信ログに記録できませんでした: ${n instanceof Error?n.message:String(n)})`),!1}finally{try{t.close()}catch{}}}var Ds="送信ログを開けません: SQLite が使えないランタイムです (bun、または node >= 22.5 の node:sqlite が必要)";function Yi(e){let t=Ro();if(!t)return;try{let n=[],o=[];if(e.text)n.push("text LIKE ? ESCAPE '\\'"),o.push(`%${zi(e.text)}%`);if(e.channel)n.push("(channel = ? OR target = ?)"),o.push(e.channel,e.channel);if(e.sinceMs!==void 0)n.push("sent_at >= ?"),o.push(e.sinceMs);if(e.session)n.push("session_id LIKE ? ESCAPE '\\'"),o.push(`${zi(e.session)}%`);if(e.cwd)n.push("cwd LIKE ? ESCAPE '\\'"),o.push(`${zi(e.cwd)}%`);if(e.kind)n.push("kind = ?"),o.push(e.kind);let s=`SELECT * FROM sent${n.length?` WHERE ${n.join(" AND ")}`:""} ORDER BY sent_at DESC, id DESC LIMIT ?`;return o.push(e.limit??50),t.prepare(s).all(...o)}finally{try{t.close()}catch{}}}function zi(e){return e.replace(/[\\%_]/g,(t)=>`\\${t}`)}function Oo(e,t=Date.now()){let n=e.trim().match(/^(\d+(?:\.\d+)?)\s*(s|m|h|d|w)$/i);if(n){let s={s:1000,m:60000,h:3600000,d:86400000,w:604800000}[n[2].toLowerCase()];return t-Number(n[1])*s}let o=Date.parse(e);return Number.isNaN(o)?void 0:o}function cd(e,...t){if(!Io()||!sd(yt()))return;let n=Ro();if(!n)return;try{n.prepare(e).run(...t)}catch{}finally{try{n.close()}catch{}}}function Xi(e,t,n,o){let s=Date.now();cd(`UPDATE sent SET collected_at = COALESCE(collected_at, ?), answer = ?, answer_exit = 0,
|
|
304
318
|
delivered_at = ?, delivered_answer = ?, delivered_cursor = ?
|
|
305
|
-
WHERE kind = 'ask' AND channel = ? AND ts = ?`,s,n,s,n,o,e,t)}function
|
|
306
|
-
WHERE kind = 'ask' AND channel = ? AND ts = ? AND collected_at IS NULL`,Date.now(),n,o,e,t)}function
|
|
319
|
+
WHERE kind = 'ask' AND channel = ? AND ts = ?`,s,n,s,n,o,e,t)}function ld(e,t,n,o){cd(`UPDATE sent SET delivered_at = ?, delivered_answer = ?, delivered_cursor = ?
|
|
320
|
+
WHERE kind = 'ask' AND channel = ? AND ts = ? AND collected_at IS NULL`,Date.now(),n,o,e,t)}function ud(e){if(!sd(yt()))return[];let t=Ro();if(!t)return;try{return t.prepare("SELECT * FROM sent WHERE kind = 'ask' AND collected_at IS NULL AND sent_at >= ? ORDER BY sent_at ASC, id ASC").all(e)}finally{try{t.close()}catch{}}}function dd(e){let t=e.agent_pid??e.pid;if(!Bm(t))return!1;try{let o=(Gi("ps",["-o","lstart=,comm=","-p",String(t)],{encoding:"utf8",timeout:2000}).stdout??"").trim(),s=Date.parse(o.slice(0,24));if(!Number.isNaN(s)&&s>e.sent_at+1000)return!1;let r=od(o.slice(24).trim()),i=new Set(Object.values(To));if(e.cli&&i.has(e.cli)&&r&&To[r]!==e.cli)return!1}catch{}return!0}function Bm(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}class Et extends Error{retryAfter;method;constructor(e,t){super(t?`Slack rate limited on ${t} — retry after ${e}s`:`Slack rate limited — retry after ${e}s`);if(this.name="RateLimitError",this.retryAfter=e,t)this.method=t}}function Qi(){return(process.env.SLACK_API_BASE??"https://slack.com/api").replace(/\/$/,"")}async function hd(e,t,n,o){o=e.startsWith("xoxc-")?o??vt():void 0;let s={};if(o)s.Cookie=`d=${o}`;let r=await fetch(`${Qi()}/${t}`,{...n,headers:{...n.headers??{},Authorization:`Bearer ${e}`,...s}});if(r.status===429){let a=parseInt(r.headers.get("retry-after")??"60",10);throw new Et(isNaN(a)?60:a,t)}let i=await r.json();if(i.ok!==!0){let a=i.error??"unknown";if(a==="ratelimited")throw new Et(60,t);if(a==="invalid_auth"&&e.startsWith("xoxc-")&&!o)throw Error(`Desktop app token (xoxc-) needs its session cookie to be accepted by the public Slack API.
|
|
307
321
|
Attach it: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)
|
|
308
322
|
Or replace the token with an xoxp- user token:
|
|
309
323
|
slack auth login`);if((a==="missing_scope"||a==="cannot_dm_bot")&&e.startsWith("xoxb-")){if(t.startsWith("agents.sessions."))throw Error(`Slack error on ${t}: ${a}. Agent sessions need a granular bot token with chat:write and app membership in the channel.`);throw Error(`Slack error on ${t}: ${a} — ${a==="cannot_dm_bot"?`you're authenticated as a bot, so "@you" is the bot itself and it can't DM itself`:"this bot token lacks the user scope this action needs"}.
|
|
310
324
|
Tailing/DMing people and listing users need a user session, not a bot token.
|
|
311
325
|
Switch workspace: slack auth ls then slack auth use <name>
|
|
312
|
-
Or import your Slack desktop session: slack auth login`)}throw Error(`Slack error on ${t}: ${a}`)}return i}async function
|
|
326
|
+
Or import your Slack desktop session: slack auth login`)}throw Error(`Slack error on ${t}: ${a}`)}return i}async function Mm(e,t,n,o){let s={};if(o)s.Cookie=`d=${o}`;let r=await fetch(`${Qi()}/${t}`,{...n,headers:{...n.headers??{},Authorization:`Bearer ${e}`,...s}});if(r.status===429){let a=parseInt(r.headers.get("retry-after")??"60",10);throw new Et(isNaN(a)?60:a,t)}let i=await r.json();if(i.ok!==!0){let a=i.error??"unknown";if(a==="ratelimited")throw new Et(60,t);if((a==="invalid_auth"||a==="not_authed")&&!e.startsWith("xoxc-"))throw Error(`${t} requires a desktop app session token (xoxc-).
|
|
313
327
|
Import from Slack desktop: slack auth login`);if((a==="invalid_auth"||a==="not_authed")&&!o)throw Error(`${t} also requires the xoxd session cookie.
|
|
314
|
-
Attach it with: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)`);throw Error(`Slack error on ${t}: ${a}`)}return i}function
|
|
328
|
+
Attach it with: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)`);throw Error(`Slack error on ${t}: ${a}`)}return i}function Wt(e,t,n={},o){let s=new URLSearchParams({token:e,...n});return Mm(e,t,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:s.toString()},o)}function he(e,t,n,o){let s=new URLSearchParams(n).toString();return hd(e,`${t}?${s}`,{method:"GET"},o)}function Ae(e,t,n,o){return hd(e,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},o)}async function ea(e,t){let n=await he(e,"auth.test",{},t);return{team:n.team??"",teamId:n.team_id??"",url:n.url??"",user:n.user??"",userId:n.user_id??""}}async function Ut(e,t){t=e.startsWith("xoxc-")?t??vt():void 0;let n={Authorization:`Bearer ${e}`};if(t)n.Cookie=`d=${t}`;let o=await fetch(`${Qi()}/auth.test`,{method:"GET",headers:n});if(o.status===429){let i=parseInt(o.headers.get("retry-after")??"60",10);throw new Et(isNaN(i)?60:i,"auth.test")}let s=o.headers.get("x-oauth-scopes")??"",r=await o.json();if(r.ok!==!0)throw Error(`Slack error on auth.test: ${r.error??"unknown"}`);return{userId:r.user_id??"",user:r.user??"",botId:r.bot_id??"",team:r.team??"",url:r.url??"",scopes:s.split(",").map((i)=>i.trim()).filter(Boolean)}}async function gd(e,t,n){let o=await he(e,"bots.info",{bot:t},n);return{appId:o.bot?.app_id??"",userId:o.bot?.user_id??""}}async function tt(e,t,n=20,o,s,r,i){let a={channel:t,limit:String(n)};if(o!==void 0)a.oldest=o;if(s!==void 0)a.cursor=s;if(i)a.inclusive="true";return ta(await he(e,"conversations.history",a,r))}function ta(e){let t=e,n=Array.isArray(t.messages)?t.messages:t.messages&&typeof t.messages==="object"&&Array.isArray(t.messages.matches)?t.messages.matches:[];for(let o of n)oo(o);return e}async function We(e,t,n,o=50,s){return ta(await he(e,"conversations.replies",{channel:t,ts:n,limit:String(o)},s))}async function md(e,t,n){return he(e,"files.info",{file:t},n)}async function yd(e,t={},n){let o={count:String(Math.min(Math.max(t.count??100,1),200)),page:String(Math.max(t.page??1,1))};if(t.types)o.types=t.types;if(t.channel)o.channel=t.channel;if(t.user)o.user=t.user;return he(e,"files.list",o,n)}async function wd(e,t,n,o){let s={name:t,schema:n};if(o)s.todo_mode=!0;return await Ae(e,"slackLists.create",s)}async function na(e,t,n={}){let o={list_id:t};if(n.limit)o.limit=n.limit;if(n.cursor)o.cursor=n.cursor;if(n.includeList)o.include_list=!0;return await Ae(e,"slackLists.items.list",o)}async function bd(e,t,n){return await Ae(e,"slackLists.items.create",{list_id:t,initial_fields:n})}async function Dd(e,t,n,o){let s={list_id:t,access_level:n};if(o.userIds?.length)s.user_ids=o.userIds;if(o.channelIds?.length)s.channel_ids=o.channelIds;return await Ae(e,"slackLists.access.set",s)}async function kd(e,t,n){return await Ae(e,"slackLists.items.update",{list_id:t,cells:n})}async function xd(e,t,n={},o){let s={list_id:t};if(n.limit)s.limit=String(n.limit);if(n.cursor)s.cursor=n.cursor;return Wt(e,"lists.records.list",s,o)}async function Sd(e,t,n,o,s){return ta(await he(e,"search.messages",{query:t,sort:"timestamp",sort_dir:"desc",count:String(Math.min(Math.max(n,1),100)),page:String(Math.max(o,1))},s))}async function Ed(e,t,n){return Sd(e,t,100,1,n)}async function sa(e,t,n,o){let r=1,i=[],a={ok:!0,messages:{}};while(!0){let l=await Sd(e,t,100,r,o),u=ks(l,["messages","matches"]),d=Array.isArray(u)?u:[];i.push(...d);let f=Number(ks(l,["messages","paging","pages"])??1);if(a=l,d.length===0||r>=f||i.length>=n)break;r+=1}let c=a;if(!c.messages)c.messages={};return c.messages.matches=i.slice(0,n),c}async function wn(e,t,n,o,s,r,i,a){let c=i?{channel:t,text:n}:{channel:t,text:n,blocks:[{type:"markdown",text:n}]};if(o!==void 0)c.thread_ts=o;if(s&&o!==void 0)c.reply_broadcast=!0;return(await _d(e,"chat.postMessage",c,a,r)).ts??""}function Nm(e){return e instanceof Error&&/: (invalid_metadata\w*|metadata_\w+)$/.test(e.message)}async function _d(e,t,n,o,s){if(!o)return Ae(e,t,n,s);try{return await Ae(e,t,{...n,metadata:o},s)}catch(r){if(!Nm(r))throw r;return Ae(e,t,n,s)}}async function Cd(e,t,n,o,s,r){let i={channel:t,text:n,post_at:o,blocks:[{type:"markdown",text:n}]};if(s!==void 0)i.thread_ts=s;return(await Ae(e,"chat.scheduleMessage",i,r)).scheduled_message_id??""}async function $d(e,t,n){let o={};if(t)o.channel=t;return he(e,"chat.scheduledMessages.list",o,n)}async function Fd(e,t,n,o){await Ae(e,"chat.deleteScheduledMessage",{channel:t,scheduled_message_id:n},o)}async function Mn(e,t,n,o){return(await he(e,"chat.getPermalink",{channel:t,message_ts:n},o)).permalink??""}async function _t(e,t,n,o,s,r,i){return(await _d(e,"chat.update",r?{channel:t,ts:n,text:o}:{channel:t,ts:n,text:o,blocks:[{type:"markdown",text:o}]},i,s)).ts??n}async function Ad(e,t,n,o){await Ae(e,"chat.delete",{channel:t,ts:n},o)}async function Td(e,t,n,o,s=200,r){let i={channel:t,ts:n,limit:String(s)};if(o!==void 0)i.cursor=o;return he(e,"conversations.replies",i,r)}async function oa(e,t,n,o){await Ae(e,"pins.add",{channel:t,timestamp:n},o)}async function Jt(e,t,n,o,s){await Ae(e,"reactions.add",{channel:t,timestamp:n,name:o},s)}async function Id(e,t,n,o){return((await he(e,"reactions.get",{channel:t,timestamp:n,full:"true"},o)).message?.reactions??[]).map((r)=>({name:String(r.name??""),users:Array.isArray(r.users)?r.users.map(String):[]}))}async function bn(e,t,n,o,s){await Ae(e,"reactions.remove",{channel:t,timestamp:n,name:o},s)}async function Rd(e,t,n=!1,o){let s=await Ae(e,"conversations.create",{name:t,is_private:n},o);return{id:s.channel?.id??"",name:s.channel?.name??t}}async function Od(e,t,n,o){let s=await Ae(e,"conversations.rename",{channel:t,name:n},o);return{id:s.channel?.id??t,name:s.channel?.name??n}}async function Pd(e,t,n,o){await Ae(e,"conversations.invite",{channel:t,users:n.join(",")},o)}async function xs(e,t){let n=[],o="";while(!0){let s={limit:"200",types:"public_channel,private_channel,im,mpim"};if(o)s.cursor=o;let r=await he(e,"conversations.list",s,t);if(n.push(...r.channels??[]),o=r.response_metadata?.next_cursor??"",!o)break}return{channels:n}}async function Ct(e,t,n){let s=(await Ae(e,"conversations.open",{users:t},n)).channel?.id;if(!s)throw Error(`Failed to open DM with user ${t}`);return s}async function vd(e,t,n){let o="";while(!0){let s={types:"im",limit:"200"};if(o)s.cursor=o;let r=await he(e,"conversations.list",s,n);for(let i of r.channels??[])if(i.user===t)return String(i.id??"");if(o=r.response_metadata?.next_cursor??"",!o)break}return""}async function Vi(e,t,n,o){let s=await vd(e,t,n);if(s)return s;let r=o?`${o} (${t})`:t;throw Error(`No existing DM with ${r}. Open it once in Slack first.`)}function yn(e){return e.toLowerCase().replace(/[-_\s]/g,"")}function fd(e,t){let n=yn(e.name??""),o=yn(e.real_name??e.profile?.real_name??""),s=yn(e.profile?.display_name??"");return n===t||o===t||!!s&&s===t}var Ld=200;async function Bd(e,t,n){let o=0,s=new Set,r="";while(!0){let u={limit:"200"};if(r)u.cursor=r;let d=await he(e,"users.list",u,n);for(let f of d.members??[]){if(o++,f.id)s.add(f.id);if(fd(f,t))return{id:f.id??"",workspaceCount:o,connectCount:0,skipped:0,capped:!1}}if(r=d.response_metadata?.next_cursor??"",!r)break}let i=0,a=0,c=!1,l="";while(!0){let u={types:"im",limit:"200"};if(l)u.cursor=l;let d=await he(e,"conversations.list",u,n);for(let f of d.channels??[]){let h=f.user;if(!h||s.has(h))continue;if(i>=Ld){c=!0;break}s.add(h),i++;let m;try{m=(await he(e,"users.info",{user:h},n)).user}catch(p){if(p instanceof Et)throw p;a++;continue}if(m&&fd(m,t))return{id:h,dm:String(f.id??""),workspaceCount:o,connectCount:i,skipped:a,capped:c}}if(c)break;if(l=d.response_metadata?.next_cursor??"",!l)break}return{id:"",workspaceCount:o,connectCount:i,skipped:a,capped:c}}function Md(e,t){if(t.workspaceCount===0)return Error(`Cannot resolve ${e}: users.list returned no members at all, so nothing could have matched.
|
|
315
329
|
`+`That is a token or scope fault, not a wrong handle — this says nothing about whether ${e} exists.
|
|
316
|
-
Check who you are: slack auth ls`);let n=t.connectCount?`${t.workspaceCount} workspace account(s) and ${t.connectCount} Slack Connect DM partner(s)`:`${t.workspaceCount} workspace account(s)`,o=[];if(t.capped)o.push(`stopped after ${
|
|
330
|
+
Check who you are: slack auth ls`);let n=t.connectCount?`${t.workspaceCount} workspace account(s) and ${t.connectCount} Slack Connect DM partner(s)`:`${t.workspaceCount} workspace account(s)`,o=[];if(t.capped)o.push(`stopped after ${Ld} Slack Connect DM partners, so there may be more`);if(t.skipped)o.push(`${t.skipped} DM partner profile(s) could not be read and were never compared`);return Error(`User not found: ${e} — searched ${n}, none matched.
|
|
317
331
|
`+(o.length?`This search was incomplete: ${o.join("; ")}.
|
|
318
332
|
`:"")+`Slack Connect people from another workspace are not in users.list, so if they never
|
|
319
333
|
DMed you they cannot be found by name at all. Look them up and use their ID:
|
|
320
|
-
slack user ls --external`)}async function
|
|
321
|
-
`)}catch{}}function
|
|
322
|
-
`)[0]??"",emoji:
|
|
323
|
-
`;case"t":return"\t";case"\\":case"¥":return n==="¥"?"¥":"\\";default:return t}})}function
|
|
324
|
-
`)}function
|
|
334
|
+
slack user ls --external`)}async function $t(e,t,n){let o=t.startsWith("@")?t.slice(1):t;if(Zi(o))return o;if(!t.startsWith("@"))throw Error(`Expected @user or a user ID, got: ${t}`);let s=yn(o),r=await he(e,"auth.test",{},n);if(s==="you"||s==="me"||yn(r.user??"")===s){if(!r.user_id)throw Error("auth.test did not return user_id");return r.user_id}let i=await Bd(e,s,n);if(i.id)return i.id;throw Md(t,i)}function Kt(e){let t=e.match(/(?:app\.slack\.com\/client\/T[A-Za-z0-9]+|[A-Za-z0-9-]+\.slack\.com\/archives)\/([A-Za-z0-9]+)(?:\/p(\d{10})(\d{6}))?/);if(!t)return;let n=t[1],o=t[2]&&t[3]?`${t[2]}.${t[3]}`:void 0,s=e.indexOf("?"),r=s>=0?new URLSearchParams(e.slice(s)):void 0,i=r?.get("thread_ts")??void 0,l={channel:r?.get("cid")??void 0??n};if(o)l.ts=o;if(i)l.threadTs=i;return l}function jm(e){return Kt(e)?.channel}function pd(e){return/^[CDG][A-Z0-9]{8,}$/.test(e)}function Zi(e){return/^[UW][A-Z0-9]{6,}$/.test(e)}async function be(e,t,n){let o=jm(t);if(o)return o;if(!t.startsWith("@")&&!t.startsWith("#")){if(pd(t))return t;if(Zi(t))return Vi(e,t,n);throw Error(`Target must start with # or @ (or be a Slack URL/ID), got: ${t}`)}if(t.startsWith("#")&&pd(t.slice(1)))return t.slice(1);let s=t.startsWith("@"),r=t.slice(1),i=yn(r);if(s){if(Zi(r))return Vi(e,r,n);let l=await he(e,"auth.test",{},n);if(i==="you"||i==="me"||yn(l.user??"")===i){let f=l.user_id;if(!f)throw Error("auth.test did not return user_id");return await vd(e,f,n)||Ct(e,f,n)}let d=await Bd(e,i,n);if(!d.id)throw Md(t,d);if(d.dm)return d.dm;return Vi(e,d.id,n,t)}let a=r.toLowerCase(),c="";while(!0){let l={limit:"200",types:"public_channel,private_channel",exclude_archived:"true"};if(c)l.cursor=c;let u=await he(e,"conversations.list",l,n);for(let d of u.channels??[])if(String(d.name??"").toLowerCase()===a)return String(d.id??"");if(c=u.response_metadata?.next_cursor??"",!c)break}throw Error(`channel not found: ${t}`)}async function Ss(e,t,n){try{let o=await he(e,"users.info",{user:t},n),s=o.user?.profile?.display_name,r=s&&s.length>0?s:o.user?.real_name??o.user?.name??t,i=o.user?.name??t;return[r,i]}catch{return[t,t]}}async function Pe(e,t,n){try{let o=await he(e,"users.info",{user:t},n),s=o.user?.profile?.display_name;if(s&&s.length>0)return s;return o.user?.real_name??o.user?.name??t}catch{return t}}async function Nd(e,t){let n=[],o="";while(!0){let s={limit:"200"};if(o)s.cursor=o;let r=await he(e,"users.list",s,t);if(n.push(...r.members??[]),o=r.response_metadata?.next_cursor??"",!o)break}return{members:n}}async function jd(e,t,n){let o=[],s="";while(!0){let r={channel:t,limit:"200"};if(s)r.cursor=s;let i=await he(e,"conversations.members",r,n);if(o.push(...i.members??[]),s=i.response_metadata?.next_cursor??"",!s)break}return o}async function Wd(e,t={},n){let o={limit:String(t.limit??50)};if(t.filter)o.filter=t.filter;if(t.cursor)o.cursor=t.cursor;return Wt(e,"saved.list",o,n)}async function Es(e,t){return Wt(e,"drafts.list",{},t)}async function Ud(e,t,n,o){let{randomUUID:s}=await import("node:crypto"),r=JSON.stringify([{type:"rich_text",elements:[{type:"rich_text_section",elements:so(n)}]}]);return Wt(e,"drafts.create",{client_msg_id:s(),destinations:JSON.stringify([{channel_id:t}]),blocks:r,file_ids:JSON.stringify([]),is_from_composer:"true"},o)}async function Jd(e,t,n,o,s){let r=JSON.stringify([{type:"rich_text",elements:[{type:"rich_text_section",elements:so(o)}]}]),i=(Date.now()/1000).toFixed(6);return Wt(e,"drafts.update",{draft_id:t,client_last_updated_ts:i,destinations:JSON.stringify([{channel_id:n}]),blocks:r,file_ids:JSON.stringify([])},s)}async function Kd(e,t,n){return Wt(e,"conversations.info",{channel:t},n)}async function _s(e,t,n){return he(e,"users.info",{user:t},n)}async function qd(e,t,n){try{let o=await he(e,"users.info",{user:t,include_locale:"true"},n);return typeof o.user?.locale==="string"?o.user.locale:void 0}catch{return}}async function Dn(e,t,n){return he(e,"conversations.info",{channel:t},n)}async function Hd(e,t,n){let o=(Date.now()/1000).toFixed(6);return Wt(e,"drafts.delete",{draft_id:t,client_last_updated_ts:o},n)}async function ra(e,t){let n=await Wt(e,"auth.test",{},t);return{userId:String(n.user_id??""),teamId:String(n.team_id??"")}}async function zd(e,t,n,o={},s){let{statSync:r,readFileSync:i}=await import("node:fs"),{basename:a}=await import("node:path"),c=r(n),l=a(n),u=await he(e,"files.getUploadURLExternal",{filename:l,length:String(c.size)},s),{upload_url:d,file_id:f}=u;if(!d||!f)throw Error("files.getUploadURLExternal returned no upload_url/file_id");let h=i(n),m=await fetch(d,{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:h});if(!m.ok)throw Error(`Upload PUT failed: ${m.status} ${m.statusText}`);let p={files:[{id:f,title:o.title??l}],channel_id:t};if(o.threadTs)p.thread_ts=o.threadTs;if(o.initialComment)p.initial_comment=o.initialComment;let g=await Ae(e,"files.completeUploadExternal",p,s),w={fileId:f},b=g.files?.[0]?.permalink;if(b)w.permalink=b;return w}function ks(e,t){let n=e;for(let o of t){if(n===void 0||n===null)return;if(typeof o==="number"){if(!Array.isArray(n))return;n=n[o]??void 0}else{if(typeof n!=="object"||Array.isArray(n))return;n=n[o]}}return n}var Yd=["todo","saved","completed","archived"],Cs=(e)=>typeof e==="string"?e:"",Gd=(e)=>{let t=typeof e==="number"||typeof e==="string"?Number(e):0;return Number.isFinite(t)?t:0};function Xd(e){let t=e&&typeof e==="object"&&!Array.isArray(e)?e:{};return(Array.isArray(t.saved_items)?t.saved_items:[]).filter((o)=>!!o&&typeof o==="object"&&!Array.isArray(o)).map((o)=>({channel:Cs(o.item_id),ts:Cs(o.ts),due:Gd(o.date_due),completed:Gd(o.date_completed),todoState:Cs(o.todo_state),state:Cs(o.state),archived:o.is_archived===!0,itemType:Cs(o.item_type)}))}function Vd(e){return[...e].sort((t,n)=>{if(t.due&&n.due)return t.due-n.due;if(t.due!==n.due)return t.due?-1:1;return Number(n.ts)-Number(t.ts)})}function Po(e){return e.completed>0||e.state==="completed"}function Zd(e,t,n){let o=Po(e)?"☑":e.todoState==="to_do"?"☐":"·";if(!e.due)return`${o} no due date`;let s=!Po(e)&&e.due<t?" OVERDUE":"";return`${o} due ${n(e.due)}${s}`}function Qd(e,t,n){return`${e.replace(/\/+$/,"")}/archives/${t}/p${n.replace(".","")}`}import{existsSync as Xm,readFileSync as Vm}from"node:fs";import{homedir as Zm}from"node:os";import{join as Qm}from"node:path";import{existsSync as Wm,mkdirSync as Um,readFileSync as Jm,writeFileSync as Km}from"node:fs";import{homedir as qm}from"node:os";import{dirname as Hm,join as zm}from"node:path";var Gm=3600000,vo={now:()=>Date.now(),path:()=>zm(process.env.HOME||qm(),".config","slack-cli","cache.json")},Lo=!0,qt;function ef(){return{channels:{},users:{}}}function ia(){if(qt)return qt;if(qt=ef(),!Lo)return qt;try{let e=vo.path();if(!Wm(e))return qt;let t=JSON.parse(Jm(e,"utf8"));for(let n of["channels","users"]){let o=t?.[n];if(!o||typeof o!=="object"||Array.isArray(o))continue;for(let[s,r]of Object.entries(o))if(r&&typeof r==="object"&&typeof r.value==="string"&&typeof r.expires==="number")qt[n][s]={value:r.value,expires:r.expires}}}catch{qt=ef()}return qt}function Ym(e){if(!Lo)return;try{let t=vo.path();Um(Hm(t),{recursive:!0}),Km(t,JSON.stringify(e,null,2)+`
|
|
335
|
+
`)}catch{}}function tf(e,t){return e?`${e} ${t}`:void 0}function Bo(e,t,n){if(!Lo)return;let o=tf(t,n);if(!o)return;let s=ia()[e][o];if(!s)return;if(s.expires<=vo.now()){delete ia()[e][o];return}return s.value}function Mo(e,t,n,o,s=Gm){if(!Lo)return;let r=tf(t,n);if(!r)return;let i=ia();i[e][r]={value:o,expires:vo.now()+s},Ym(i)}var aa={marker:"pushpin",progress:{done:"white_check_mark",dropped:"no_entry_sign",doing:"eyes",pending:"hourglass_flowing_sand"},flags:{alert:"exclamation","needs-discussion":"thinking_face",waiting:"speech_balloon",blocked:"lock"}},Nn=["done","dropped","doing","pending"],rf=["alert","needs-discussion","waiting","blocked"];function ey(){return Qm(process.env.HOME||Zm(),".config","slack-cli","todo.json")}function No(e){return e.replace(/^:+|:+$/g,"")}function $s(e=ey()){let t={marker:aa.marker,progress:{...aa.progress},flags:{...aa.flags}};try{if(!Xm(e))return t;let n=JSON.parse(Vm(e,"utf8"));if(typeof n.marker==="string"&&n.marker.trim())t.marker=No(n.marker.trim());for(let o of Nn){let s=n.progress?.[o];if(typeof s==="string"&&s.trim())t.progress[o]=No(s.trim())}for(let o of rf){let s=n.flags?.[o];if(typeof s==="string"&&s.trim())t.flags[o]=No(s.trim())}}catch{}return t}function nf(e,t,n=!1){return`${n?"-":""}${t?"has":"hasmy"}::${No(e)}:`}function af(e,t,n={}){let o=n.shared===!0,s=(a)=>nf(a,o),r=(a)=>nf(a,o,!0),i=[];if(e==="untriaged")i.push(s(t.marker),...Nn.map((a)=>r(t.progress[a])));else if(e==="stuck")i.push(s(t.marker),r(t.progress.done),r(t.progress.dropped),`(${rf.map((a)=>s(t.flags[a])).join(" OR ")})`);else if(e==="open")i.push(s(t.marker),r(t.progress.done),r(t.progress.dropped));else{let a=Nn.indexOf(e);i.push(s(t.progress[e]));for(let c of Nn.slice(0,a))i.push(r(t.progress[c]))}if(n.in){let a=n.in.startsWith("#")||n.in.startsWith("@")?n.in:`#${n.in}`;i.push(`in:${a}`)}if(n.from){let a=n.from==="me"||n.from.startsWith("@")?n.from:`@${n.from}`;i.push(`from:${a}`)}return i.join(" ")}var ty=3,ny={sleep:(e)=>sy()?Promise.resolve():new Promise((t)=>setTimeout(t,e))};function sy(){return!!process.env.VITEST||!1||!!process.env.BUN_TEST}async function Ge(e,t,n=ty){for(let o=0;;o++)try{return await t()}catch(s){if(!(s instanceof qe))throw s;if(o>=n)throw Error(`Slack rate limit hit on ${e} — gave up after ${n} retries. Try again in a minute.`);console.error(`Warning: Slack rate limit hit on ${e} — backing off for ${s.retryAfter}s`),await ny.sleep(s.retryAfter*1000)}}var sf=new Map;async function cf(e,t){let n=sf.get(e);if(n)return n;let o=await Ge("auth.test",()=>Pn(e,t)),s={userId:o.userId,teamId:o.teamId};return sf.set(e,s),s}async function lf(e,t){return(await cf(e,t)).userId}async function ca(e,t){try{return(await cf(e,t)).teamId}catch{return""}}async function la(e,t,n,o){if(!t.startsWith("#"))return n(e,t,o);let s=await ca(e,o),r=Bo("channels",s,t);if(r)return r;let i=await Ge("resolveChannel",()=>n(e,t,o));return Mo("channels",s,t,i),i}async function uf(e,t,n,o){let s=await ca(e,o),r=Bo("users",s,t);if(r)return r;let i=await Ge("users.info",()=>n(e,t,o));if(i&&i!==t)Mo("users",s,t,i);return i}async function df(e,t,n,o){let s=await ca(e,o),r=Bo("users",s,`tz:${t}`);if(r)return r==="?"?null:r;let i=null;try{let a=await Ge("users.info",()=>n(e,t,o));if(a?.user?.is_bot===!0||t==="USLACKBOT")return of(s,t,null);let c=a?.user?.tz;i=typeof c==="string"&&c?c:null}catch{return null}return of(s,t,i)}function of(e,t,n){return Mo("users",e,`tz:${t}`,n??"?"),n}async function ff(e,t,n,o,s,r){let i=s.progress[o],a=await lf(e,r),c=await Ge("reactions.get",()=>Bl(e,t,n,r)),l=new Set(c.filter((h)=>h.users.includes(a)).map((h)=>h.name)),u=Nn.map((h)=>s.progress[h]).filter((h)=>l.has(h));if(u.length===1&&u[0]===i)return{noop:!0,removed:[],leftover:[]};if(!l.has(i))await Ge("reactions.add",()=>ro(e,t,n,i,r));let d=[],f=[];for(let h of u){if(h===i)continue;try{await Ge("reactions.remove",()=>io(e,t,n,h,r)),d.push(h)}catch{f.push(h)}}return{noop:!1,added:o,removed:d,leftover:f}}async function pf(e,t,n,o,s,r,i){let a=s.flags[o];if(r)await Ge("reactions.remove",()=>io(e,t,n,a,i));else await Ge("reactions.add",()=>ro(e,t,n,a,i));return a}var ua=1000;async function hf(e,t,n,o={}){let s=o.limit??ua,r=o.cookie,i=await lf(e,r),a=Nn.map((f)=>n.progress[f]),c=[],l=0,u,d=!1;while(l<s){let f=Math.min(200,s-l),h=await Ge("conversations.history",()=>gn(e,t,f,void 0,u,r)),m=h.messages??[];l+=m.length;for(let p of m){let g=String(p.ts??"");if(!g)continue;let w=new Set((p.reactions??[]).filter((k)=>(k.users??[]).map(String).includes(i)).map((k)=>String(k.name??""))),b=a.filter((k)=>w.has(k));if(b.length<2)continue;c.push({ts:g,text:String(p.text??"").split(`
|
|
336
|
+
`)[0]??"",emoji:b,keep:b[0]})}if(u=h.response_metadata?.next_cursor||void 0,!u||m.length===0)break;if(l>=s){d=!0;break}}if(o.fix)for(let f of c)try{try{await Ge("reactions.add",()=>ro(e,t,f.ts,f.keep,r))}catch(h){if(!(h instanceof Error)||!/already_reacted/.test(h.message))throw h}for(let h of f.emoji){if(h===f.keep)continue;await Ge("reactions.remove",()=>io(e,t,f.ts,h,r))}f.fixed=!0}catch(h){f.fixed=!1,f.error=h instanceof Error?h.message:String(h)}return{scanned:l,findings:c,truncated:d}}var oy=!0,ry;function da(e){if(oy=e,!e)ry=void 0}function Le(e){return e.replace(new RegExp(`[${"\\\\¥"}](.)`,"gs"),(t,n)=>{switch(n){case"n":return`
|
|
337
|
+
`;case"t":return"\t";case"\\":case"¥":return n==="¥"?"¥":"\\";default:return t}})}function jn(e){return e.replace(new RegExp(`[${"\\\\¥"}]`,"g"),(t)=>`\\${t}`).replace(/\n/g,"\\n").replace(/\t/g,"\\t")}var Wn=(e)=>e&&typeof e==="object"&&!Array.isArray(e)?e:{},Be=(e)=>typeof e==="string"?e:"";function iy(e){return(Array.isArray(e.message_blocks)?e.message_blocks:[]).map((n)=>Be(Wn(Wn(n).message).text)).filter(Boolean).join(`
|
|
338
|
+
`)}function fa(e){return(Array.isArray(e.attachments)?e.attachments:[]).map(Wn).map((n)=>{let o=n.is_share===!0||n.is_msg_unfurl===!0||Array.isArray(n.message_blocks),s=Wn(Wn((Array.isArray(n.message_blocks)?n.message_blocks:[])[0]));return{shared:o,unfurl:!o&&!!Be(n.original_url),author_id:Be(n.author_id)||Be(Wn(s.message).user)||null,author_name:Be(n.author_name)||null,channel_id:Be(n.channel_id)||Be(s.channel)||null,ts:Be(n.ts)||Be(s.ts)||null,title:Be(n.title)||null,text:Be(n.text)||iy(n)||Be(n.pretext)||Be(n.fallback),permalink:Be(n.from_url)||Be(n.title_link)||Be(n.original_url)||null}})}function gf(e,t){return e.filter((n)=>!n.unfurl&&(n.text||n.title)).map((n)=>{let o=n.author_name??n.author_id,s=n.shared?`↪ shared message${o?` from @${o}`:""}${n.channel_id?` in <#${n.channel_id}>`:""}${n.ts?` · ${t(n.ts)}`:""}`:`▸ ${n.title??"attachment"}`,r=n.text?n.text.replace(/\n+$/,"").split(`
|
|
325
339
|
`).map((a)=>`
|
|
326
340
|
│ ${a}`).join(""):"",i=n.permalink?`
|
|
327
341
|
${n.permalink}`:"";return`
|
|
328
|
-
${s}${r}${i}`}).join("")}var
|
|
329
|
-
`)}function
|
|
330
|
-
`)),r=await
|
|
331
|
-
⚠ QUIET HOURS (${r}:00-${i}:00) — this will buzz a phone.${o?"":" Their local time may differ."} Send only for a production incident; otherwise hold it until morning.`}function
|
|
332
|
-
`)}catch{}process.exit(1)}}function
|
|
333
|
-
`),console.info=console.log;if(!
|
|
334
|
-
`),console.warn=console.error}import{closeSync as
|
|
342
|
+
${s}${r}${i}`}).join("")}var mf=new Set(["send","ask","poll","vote","edit","delete","react","upload","schedule send","schedule rm","pinlog new","pinlog set","pinlog note","pinlog pin","todo set","todo flag","lists create","lists add","lists set","lists share","drafts new","drafts save","drafts edit","drafts update","drafts delete","drafts rm","channel create","channel new","channel rename","channel mv"]),ay={channels:"channel",ch:"channel"};function cy(e){let[t="",n=""]=e.map(String),o=ay[t]??t;return mf.has(o)||mf.has(`${o} ${n}`)}function ly(e,t){return String(e[0]??"")==="ask"&&t.ls===!0}function yf(e,t,n){let o=n.botTokenSource;if(!o||n.globalPaths.includes(o))return null;if(n.slackTokenSet||n.activeTokenIsBot)return null;if(!cy(e)||ly(e,t)||t["as-bot"]===!0)return null;let s=o==="shell"?"exported in the environment":`set in ${o}`,r="as-bot"in t;return[`Error: refusing to act as YOU — SLACK_BOT_TOKEN is ${s}, but \`${e.slice(0,2).join(" ")}\` would use your user session, not the bot.`,r?" As the app: add --as-bot":" This command has no --as-bot: it can only act as a user."," As yourself: set SLACK_TOKEN, or clear the bot token for this run (SLACK_BOT_TOKEN= slack ...)"].join(`
|
|
343
|
+
`)}function kn(e){return e.toLowerCase().replace(/[-_\s]/g,"")}function Ht(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function uy(e,t){let n=kn(t),o=Ht(e.profile);for(let r of[e.name,e.real_name,o.display_name,o.real_name])if(typeof r==="string"&&r&&kn(r)===n)return!0;let s=typeof o.email==="string"?o.email.toLowerCase():"";return s!==""&&s===t.toLowerCase()}function dy(e){let t=Ht(e.profile),n=new Set;for(let o of[t.display_name,e.real_name,e.name,t.real_name])if(typeof o==="string"&&o){let s=kn(o);if(s.length>=2)n.add(s)}return[...n]}function fy(e,t){let n=kn(e),o,s=!1;for(let r of t){let i=typeof r.id==="string"?r.id:"";if(!i)continue;for(let a of dy(r)){let c=-1;if(n===a)c=e.length;else for(let l of bf)if(e.length>l.length&&e.endsWith(l)&&kn(e.slice(0,e.length-l.length))===a){c=e.length-l.length;break}if(c<0)continue;if(!o||a.length>o.formLen)o={userId:i,matchLen:c,formLen:a.length,display:ga(r)},s=!1;else if(a.length===o.formLen&&o.userId!==i)s=!0}}if(!o)return;return s?"ambiguous":{userId:o.userId,matchLen:o.matchLen,display:o.display}}async function zt(e,t,n,o){let s=`[${Df}ー]+`,r=`${s}(?:[._-]+${s})*`,i=new RegExp(`(?<![A-Za-z0-9._@<-])@(${r})`,"gu"),a=new Set;for(let b of t.matchAll(i))a.add(b[1]);if(a.size===0)return{text:t,resolved:[],unresolved:[]};let c=new Map;for(let b of a)c.set(b,{status:"pending"});let l=(b)=>{for(let k of a){if(c.get(k).status!=="pending")continue;if(ha(k)){let x=fy(k,b);if(x==="ambiguous")c.set(k,{status:"ambiguous"});else if(x)c.set(k,{status:"resolved",userId:x.userId,matchLen:x.matchLen,display:x.display})}else{let x=b.filter((F)=>uy(F,k)),_=new Set(x.map((F)=>typeof F.id==="string"?F.id:"").filter(Boolean));if(_.size===1){let F=x.find((I)=>typeof I.id==="string");c.set(k,{status:"resolved",userId:F.id,matchLen:k.length,display:ga(F)})}else if(_.size>1)c.set(k,{status:"ambiguous"})}}},u=!1;try{let b=await lo(e,o);l((b.members??[]).map(Ht)),u=!0}catch{u=!1}let d=[...a].some((b)=>c.get(b).status==="pending"),f=!1,h=!0;if(d&&n){f=!0;try{let b=await ri(e,n,o),k=[];for(let x of b){let _=Ht(await ii(e,x,o)),F=Ht(_.user);if(typeof F.id!=="string")F.id=x;k.push(F)}l(k)}catch{h=!1}}let m=u&&(n?f&&h:!0),p=[],g=[];for(let b of a){let k=c.get(b);if(k.status==="resolved")p.push({surface:`@${b.slice(0,k.matchLen)}`,display:k.display,userId:k.userId});else if(k.status==="ambiguous")g.push({surface:`@${b}`,reason:"ambiguous"});else g.push({surface:`@${b}`,reason:m?"no-match":"unavailable"})}return{text:t.replace(i,(b,k)=>{let x=c.get(k);if(x&&x.status==="resolved")return`<@${x.userId}>${k.slice(x.matchLen)}`;return b}),resolved:p,unresolved:g}}function jo(e){let t=[],n=!1;for(let o of e)if(o.reason==="ambiguous")t.push(`${o.surface} matches multiple people — not tagged, sent as plain text (use <@USERID> to tag)`);else if(o.reason==="unavailable"){if(n)continue;t.push("could not fetch the user list (users:read missing or an API/connection error) — @mentions not tagged, sent as plain text"),n=!0}else t.push(`${o.surface} matched no one — not tagged, sent as plain text`);return t}async function wf(e,t,n,o={}){let s=o.warn??((i)=>process.stderr.write(`${i}
|
|
344
|
+
`)),r=await zt(e,t,n,o.cookie);for(let i of jo(r.unresolved))s(`warn: ${i}`);return r.text}var bf=["さん","さま","様","君","くん","ちゃん","氏","先生","先輩","殿","老师","老師","兄","姐","哥","姐妹"],Df="\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}A-Za-z0-9";function ha(e){return/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]/u.test(e)}function py(e){let t=[],n=new RegExp(`([${Df}]{1,12})(${bf.join("|")})`,"gu");for(let o of e.matchAll(n))t.push({ref:o[1],honorific:o[2]});for(let o of e.matchAll(/\b(?:dear|hi|hello|hey)\b[ \t]+([A-Z][A-Za-z'’-]{1,20})/gi))t.push({ref:o[1],honorific:""});for(let o of e.matchAll(/(?:^|\n)[ \t]*([A-Z][A-Za-z'’-]{1,20}),/g))t.push({ref:o[1],honorific:""});return t}function hy(e){let t=Ht(e.profile),n=new Set;for(let o of[e.name,e.real_name,t.display_name,t.real_name]){if(typeof o!=="string"||!o)continue;for(let s of[o,...o.split(/\s+/)]){let r=kn(s);if(r.length>=2)n.add(r)}}return[...n]}function gy(e,t){let n=kn(e);if(n.length<2)return;for(let o of t)if(n===o)return o;if(ha(e)){for(let o of t)if(n.includes(o)||o.includes(n))return o}return}function ga(e){return[Ht(e.profile).display_name,e.real_name,e.name].filter((o)=>typeof o==="string"&&o!=="")[0]??String(e.id??"?")}async function kf(e,t,n){let o=py(t);if(o.length===0)return[];let s=new Set;for(let l of t.matchAll(/<@([A-Z0-9]+)(?:\|[^>]*)?>/g))s.add(l[1]);let i=((await lo(e,n)).members??[]).map(Ht).filter((l)=>l.deleted!==!0&&l.is_bot!==!0&&l.id!=="USLACKBOT").map((l)=>({id:typeof l.id==="string"?l.id:"",forms:hy(l),display:ga(l)})).filter((l)=>l.id!==""),a=[],c=new Set;for(let{ref:l,honorific:u}of o)for(let d of i){let f=gy(l,d.forms);if(!f)continue;if(s.has(d.id)||c.has(d.id))break;c.add(d.id),a.push({surface:ha(l)?`${f}${u}`:l,display:d.display,userId:d.id});break}return a}async function xn(e,t,n,o){let s=t,r=[],i=s,a=0;while(!0){let c=i.indexOf("<@U",a);if(c===-1)break;let l=i.slice(c+2),u=l.search(/[>|]/),d=u===-1?l:l.slice(0,u);if(d.length>=9)r.push(d);a=c+1}for(let c of r){if(!n.has(c))n.set(c,await vn(e,c,o));let l=n.get(c)??c;s=s.replaceAll(`<@${c}>`,`@${l}`),s=s.replace(new RegExp(`<@${c}\\|[^>]*>`,"g"),`@${l}`)}return s}function Un(e){return e.replace(/<!date\^(\d+)\^[^|>]*(?:\|([^>]*))?>/g,(t,n,o)=>{let s=Number(n);if(!Number.isFinite(s))return o??"date";let r=new Date(s*1000);if(Number.isNaN(r.getTime()))return o??"date";let i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],c=i[r.getUTCDay()]??"",l=a[r.getUTCMonth()]??"";return`${c}, ${l} ${String(r.getUTCDate()).padStart(2,"0")}, ${r.getUTCFullYear()}`})}function xf(e,t=new Date){let n=new Date(e*1000),o=pa(t),s=pa(new Date(t.getTime()-86400000)),r=pa(n);if(r===o)return"Today";if(r===s)return"Yesterday";let i=n.toLocaleDateString("en-US",{weekday:"long"}),a=n.toLocaleDateString("en-US",{month:"short"});return`${i}, ${a} ${String(n.getDate()).padStart(2,"0")}`}function pa(e){return`${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`}function Fs(e){let t=new Date(e*1000),n=t.getFullYear(),o=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0"),r=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0");return`${n}-${o}-${s} ${r}:${i}`}var my=/[A-Za-z0-9_-]{32,}/g;function As(e){return e.replace(my,(t)=>`${t.slice(0,4)}…(${t.length-4} masked)`)}function ma(e=new Date,t){let n=process.env.SLACK_QUIET_TZ??"Asia/Tokyo",o=!!t&&yy(t),s=o?t:n,r=Number(process.env.SLACK_QUIET_START??23),i=Number(process.env.SLACK_QUIET_END??8),a,c;try{let h=new Intl.DateTimeFormat("en-GB",{timeZone:s,hour12:!1,weekday:"short",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"});c=h.format(e),a=Number(h.formatToParts(e).find((m)=>m.type==="hour")?.value??"12")}catch{return null}let l=r>i?a>=r||a<i:a>=r&&a<i,u=o?`${s}, recipient`:`${s}, sender — recipient's timezone unknown`,d=`\uD83D\uDD50 ${c} (${u})`;if(!l)return d;return`${d}
|
|
345
|
+
⚠ QUIET HOURS (${r}:00-${i}:00) — this will buzz a phone.${o?"":" Their local time may differ."} Send only for a production incident; otherwise hold it until morning.`}function yy(e){try{return new Intl.DateTimeFormat("en-GB",{timeZone:e}),!0}catch{return!1}}import{writeSync as Sf}from"node:fs";import{isatty as Ef}from"node:tty";import{format as _f}from"node:util";var wy=new Int32Array(new SharedArrayBuffer(4)),by=141;function Cf(e,t){let n=Buffer.from(t,"utf8"),o=0;while(o<n.length)try{o+=Sf(e,n,o,n.length-o)}catch(s){let r=s.code;if(r==="EAGAIN"||r==="EWOULDBLOCK"){Atomics.wait(wy,0,0,2);continue}if(r==="EPIPE")process.exit(by);if(e!==2)try{Sf(2,`slack: cannot write output (${r??String(s)}); output is incomplete
|
|
346
|
+
`)}catch{}process.exit(1)}}function $f(){if(!Ef(1))console.log=(...e)=>Cf(1,_f(...e)+`
|
|
347
|
+
`),console.info=console.log;if(!Ef(2))console.error=(...e)=>Cf(2,_f(...e)+`
|
|
348
|
+
`),console.warn=console.error}import{closeSync as Ff,mkdirSync as Dy,openSync as Af,readFileSync as Jn,statSync as Tf,unlinkSync as Wo,writeFileSync as If}from"node:fs";import{homedir as ky}from"node:os";import{join as Rf}from"node:path";var Is="Pinlog · 最終更新";function ya(e){let t=new Intl.DateTimeFormat("en-GB",{timeZone:"Asia/Tokyo",hour12:!1,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).formatToParts(e),n=(s)=>t.find((r)=>r.type===s)?.value??"??",o=n("hour")==="24"?"00":n("hour");return`${n("year")}-${n("month")}-${n("day")} ${o}:${n("minute")} JST`}function xy(e){return`_${Is} ${ya(e)} · 更新はスレッドに_`}var wa=new RegExp(`(^|\\n+)_?${Is} \\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2} JST · 更新はスレッドに_?[ \\t]*\\n*$`);function Kn(e){return wa.test(e)}function Rs(e){return e.replace(wa,"")}function ba(e,t){return`${Rs(e).trimEnd()}
|
|
335
349
|
|
|
336
|
-
${
|
|
337
|
-
`,s;try{s=
|
|
338
|
-
`;for(let i=0;i<3;i++)try{let a=
|
|
339
|
-
`)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s===-1)continue;let r=o.slice(0,s).trim(),i=o.slice(s+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);if(
|
|
340
|
-
`)}function
|
|
350
|
+
${xy(t)}`}function Da(e){let n=e.match(wa)?.[0]?.match(/(\d{4}-\d{2}-\d{2} \d{2}:\d{2} JST)/);return n?n[1]:null}class Ts extends Error{holder;constructor(e){super(`locked by ${e}`);this.holder=e;this.name="LockBusyError"}}function Sy(){return Rf(process.env.HOME||ky(),".config","slack-cli","locks")}function Of(e){let t=e.match(/^pid=(\d+)/);if(!t)return!0;try{return process.kill(Number(t[1]),0),!0}catch(n){return n.code==="EPERM"}}function Ey(e,t){let n=`${e}.break`,o=`pid=${process.pid} nonce=${Math.random().toString(36).slice(2)}${Date.now()}
|
|
351
|
+
`,s;try{s=Af(n,"wx"),If(s,o)}catch(r){if(r.code!=="EEXIST")throw r;try{let i=Jn(n,"utf8");if((/^pid=\d+/.test(i)?!Of(i):Date.now()-Tf(n).mtimeMs>1e4)&&Jn(n,"utf8")===i)Wo(n)}catch{}return}try{if(Jn(e,"utf8")===t)Wo(e)}catch{}finally{Ff(s);try{if(Jn(n,"utf8")===o)Wo(n)}catch{}}}function Pf(e,t={}){let n=t.dir??Sy(),o=t.staleMs??120000;Dy(n,{recursive:!0});let s=Rf(n,`${e.replace(/[^A-Za-z0-9._-]/g,"_")}.lock`),r=`pid=${process.pid} since=${new Date().toISOString()} nonce=${Math.random().toString(36).slice(2)}${Date.now()}
|
|
352
|
+
`;for(let i=0;i<3;i++)try{let a=Af(s,"wx");If(a,r),Ff(a);let c=!0,l=()=>{if(!c)return;c=!1;try{if(Jn(s,"utf8")===r)Wo(s)}catch{}};return process.once("exit",l),l}catch(a){if(a.code!=="EEXIST")throw a;let c,l;try{c=Jn(s,"utf8"),l=Date.now()-Tf(s).mtimeMs}catch{continue}if(/^pid=\d+/.test(c)?!Of(c):l>o){Ey(s,c);continue}throw new Ts(c.trim().replace(/ nonce=\S+/,"")||"another process")}throw new Ts("another process")}function at(e,t){return`${e}:${t}`}function Uo(e){let t=e.match(/^([CDG][A-Z0-9]{8,}):(\d{10}\.\d{6})$/);return t?{channel:t[1],ts:t[2]}:null}var Xf=new Map,xa=new Map,Ca=[wt(ka(),".slack-cli",".env.local"),wt(ka(),".config/slack-cli",".env")];function Jo(e){if(!zf(e))return;let t=Gf(e,"utf8");for(let n of t.split(`
|
|
353
|
+
`)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s===-1)continue;let r=o.slice(0,s).trim(),i=o.slice(s+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);if(Ca.includes(e))xa.set(r,[...xa.get(r)??[],{path:e,val:i}]);if(!(r in process.env))process.env[r]=i,Xf.set(r,e)}}function Fy(e){_y(e,{recursive:!0});let t=wt(e,".gitignore");if(!zf(t))Yf(t,`*
|
|
354
|
+
`)}function Ay(){for(let e of Ca)Jo(e);Jo(wt(process.cwd(),".slack-cli",".env.local")),Jo(wt(process.cwd(),".env.local")),Jo(wt(process.cwd(),".env"))}function Ty(e){return Hf("sha256").update(e).digest("hex")}function R(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function Y(e){return Array.isArray(e)?e:[]}function Ho(e){return Number(e.ts??0)}async function Vf(e,t,n){let o=t.user;if(typeof o==="string"){if(!n.has(o))n.set(o,await Pe(e,o));return n.get(o)??o}return typeof t.username==="string"?t.username:"bot"}function Sa(e){let t=new Date(e*1000),n=t.getUTCFullYear(),o=String(t.getUTCMonth()+1).padStart(2,"0"),s=String(t.getUTCDate()).padStart(2,"0"),r=String(t.getUTCHours()).padStart(2,"0"),i=String(t.getUTCMinutes()).padStart(2,"0"),a=String(t.getUTCSeconds()).padStart(2,"0");return`${n}-${o}-${s} ${r}:${i}:${a}`}function zo(e){let[t,n="000000"]=e.split("."),o=Number(t),s=new Date(o*1000),r=s.getUTCFullYear(),i=String(s.getUTCMonth()+1).padStart(2,"0"),a=String(s.getUTCDate()).padStart(2,"0"),c=String(s.getUTCHours()).padStart(2,"0"),l=String(s.getUTCMinutes()).padStart(2,"0"),u=String(s.getUTCSeconds()).padStart(2,"0"),d=n.padEnd(6,"0").slice(0,6);return`${r}-${i}-${a}T${c}:${l}:${u}.${d}`}function $a(e){let t=e.match(/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\.(\d{6})$/);if(!t)throw Error(`Invalid message timestamp "${e}" \u2014 expected 2026-05-11T06:01:04.000100`);let n=Date.parse(t[1]+"Z");if(isNaN(n))throw Error(`Cannot parse date in "${e}"`);return`${Math.floor(n/1000)}.${t[2]}`}function Iy(e){return/^\d{4}-\d{2}-\d{2}T/.test(e)?$a(e):e}async function Vo(e,t,n,o,s){let r=typeof t.ts==="string"?t.ts:`${Ho(t)}.000000`,i=zo(r),a="?";if(typeof t.user==="string"){let k=t.user,x="@"+k;if(!n.has(x)){let _=await uf(e,k,async(F,I,S)=>(await Ss(F,I,S))[1],s);n.set(x,_)}a=n.get(x)??k}else if(typeof t.username==="string")a=t.username;let c=typeof t.text==="string"?t.text:"",u=Un(await xn(e,c,n,s)).split(`
|
|
341
355
|
`),d=u[0]+(u.length>1?`
|
|
342
356
|
`+u.slice(1).map((k)=>` ${k}`).join(`
|
|
343
|
-
`):""),
|
|
344
|
-
\uD83D\uDCCE ${
|
|
345
|
-
${h}`:"")+
|
|
346
|
-
`)[0]??"",
|
|
347
|
-
`)[0]?.slice(0,60)}`:"";console.log(`${h}${u} ${l}${
|
|
357
|
+
`):""),f=o?`${o} @${a}`:`@${a}`,h=Y(t.reactions).map(R).map((k)=>{let x=typeof k.name==="string"?k.name:"",_=Number(k.count??Y(k.users).length??0);return x?`:${x}:\xD7${_}`:""}).filter(Boolean).join(" "),m=Y(t.files).map(R).map((k)=>{let x=typeof k.name==="string"?k.name:typeof k.title==="string"?k.title:"(file)",_=typeof k.size==="number"?` (${Zo(k.size)})`:"",F=typeof k.id==="string"?` [${k.id}]`:"";return`
|
|
358
|
+
\uD83D\uDCCE ${x}${_}${F}`}).join(""),p=Number(t.reply_count??0),g=p>0?` [+${p} ${p===1?"reply":"replies"}]`:"",w=await Promise.all(fa(t).map(async(k)=>({...k,text:k.text?Un(await xn(e,k.text,n,s)):""}))),b=(h?`
|
|
359
|
+
${h}`:"")+m+gf(w,zo);return`${i} ${f}: ${d}${g}${b}`}function Zo(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function Ry(e){return Y(e.files).map(R).map((t)=>({id:t.id??null,name:t.name??t.title??null,mimetype:t.mimetype??null,size:t.size??null,url_private_download:t.url_private_download??t.url_private??null,permalink:t.permalink??null}))}function Zf(e){let t=Ry(e),n=fa(e);return{ts:e.ts??null,user:e.user??null,username:e.username??null,bot_id:e.bot_id??null,thread_ts:e.thread_ts??null,text:typeof e.text==="string"?e.text:"",...Array.isArray(e.reactions)&&e.reactions.length?{reactions:Y(e.reactions).map(R).map((o)=>({name:o.name??null,count:o.count??null,users:Array.isArray(o.users)?o.users:[]}))}:{},...e.reply_count!==void 0?{reply_count:e.reply_count}:{},...e.reply_users_count!==void 0?{reply_users_count:e.reply_users_count}:{},...e.latest_reply!==void 0?{latest_reply:e.latest_reply}:{},...t.length>0?{files:t}:{},...n.length>0?{attachments:n}:{}}}async function Oy(e,t,n,o,s){let r=[];for(let i of n){let a=i;if(Number(i.reply_count??0)>0&&typeof i.ts==="string"){let c=await We(e,t,i.ts,200,s),l=Y(c.messages).map(R);a=l[l.length-1]??i}if(a.user!==o)r.push(i)}return r}async function Py(e,t,n,o="text",s=!1,r){let i=Kt(t),a=await be(e,t,r),c=new Map,u=await(async()=>{if(i?.threadTs){let f=await We(e,a,i.threadTs,n,r);return Y(f.messages).map(R)}let d=await tt(e,a,n,void 0,void 0,r);return Y(d.messages).map(R).reverse()})();if(s){let{userId:d}=await ea(e,r);u=await Oy(e,a,u,d,r)}if(o==="jsonl"){for(let d of u)console.log(JSON.stringify(Zf(d)));return}for(let d of u)console.log(await Vo(e,d,c,void 0,r))}async function vy(e,t,n,o,s="text",r){let i=await be(e,t,r),a=await We(e,i,Iy(n),o,r),c=Y(a.messages).map(R);if(s==="jsonl"){for(let u of c)console.log(JSON.stringify(Zf(u)));return}let l=new Map;for(let u of c)console.log(await Vo(e,u,l,void 0,r))}async function Ly(e){let t=await xs(e),n=Y(t.channels).map(R).filter((s)=>s.is_member===!0).sort((s,r)=>Number(r.updated??0)-Number(s.updated??0)).slice(0,10),o=new Map;for(let s of n){let r=String(s.id??""),i=typeof s.name==="string"?s.name:typeof s.user==="string"?s.user:r,a=await tt(e,r,5),c=Y(a.messages).map(R).filter((l)=>l.subtype===void 0||l.subtype===null).filter((l)=>{let u=typeof l.text==="string"?l.text:"";return u.length>0&&!u.startsWith("<@")}).slice(0,3).reverse();if(c.length===0)continue;console.log(`-- #${i} --------------------------------`);for(let l of c){let u=await Vf(e,l,o),d=(typeof l.text==="string"?l.text:"").split(`
|
|
360
|
+
`)[0]??"",f=await xn(e,d,o);console.log(` ${u}: ${f}`)}}}async function By(e,t){let n=await Ed(e,"to:me"),o=Y(ks(n,["messages","matches"])).map(R).slice(0,t),s=new Map,r=[];for(let i of o){let a=xf(Ho(i)),c=r[r.length-1];if(c?.label===a)c.msgs.push(i);else r.push({label:a,msgs:[i]})}for(let i=0;i<r.length;i++){let{label:a,msgs:c}=r[i];if(i>0)console.log("");console.log(` ${a}`),console.log(" ----------------------------");for(let l of[...c].reverse()){let u=R(l.channel),d=u.is_im===!0,f=typeof u.name==="string"?u.name:"dm",h;if(d&&f.startsWith("U")){let m="@"+f;if(!s.has(m)){let[,p]=await Ss(e,f);s.set(m,p)}h=`@${s.get(m)??f}`}else if(d)h=`@${f}`;else h=`#${f}`;console.log(await Vo(e,l,s,h))}}}async function My(e,t,n,o,s="text",r){let i=await xs(e,r),a=Y(i.channels).map(R).filter((c)=>o||c.is_member===!0).filter((c)=>{if(!n)return!0;return(typeof c.name==="string"?c.name:"").toLowerCase().includes(n.toLowerCase())}).sort((c,l)=>Number(l.updated??0)-Number(c.updated??0)).slice(0,t);if(s==="jsonl"){for(let c of a)console.log(JSON.stringify(c));return}for(let c of a){let l=String(c.id??""),u=typeof c.name==="string"?c.name:typeof c.user==="string"?c.user:l,d=c.is_im===!0,f=c.is_mpim===!0,h=d||f?"@":"#",m=c.is_member===!0?"":" (not joined)",p=typeof R(c.purpose).value==="string"?String(R(c.purpose).value):"",g=p?` ${p.split(`
|
|
361
|
+
`)[0]?.slice(0,60)}`:"";console.log(`${h}${u} ${l}${m}${g}`)}}function Ny(e){let t=(s)=>s.startsWith("xoxp-")||s.startsWith("xoxc-"),n=Ur(),o=n.find((s)=>s.profile.token===e);if(!o)return;return n.find((s)=>t(s.profile.token)&&s.profile.teamId===o.profile.teamId)}async function Qf(e,t,n,o,s){let r=e,i=s,a;try{a=await sa(r,t,n,i)}catch(u){let d=u instanceof Error?u.message:String(u);if(e.startsWith("xoxb-")&&d.includes("not_allowed_token_type")){let f=Ny(e);if(f)console.error(`Note: search.messages needs a user token \u2014 the active profile is a bot token (xoxb-); falling back to profile "${f.name}".`),r=f.profile.token,i=f.profile.cookie,a=await sa(r,t,n,i);else console.error(`Error: search requires a user token (xoxp-/xoxc-) \u2014 the active profile is a bot token (xoxb-), which Slack rejects for search.messages.
|
|
348
362
|
`+` Add a user-token profile: slack auth login (or slack auth login --token <token>)
|
|
349
|
-
Then select it: slack auth use <name> (or pass --workspace <name>)`),process.exit(1)}else throw u}if(o){console.log(JSON.stringify(a,null,2));return}let c=
|
|
350
|
-
`);for(let
|
|
351
|
-
`).join(" \u21B5 ");console.log(`[${
|
|
352
|
-
`))console.log(` ${
|
|
353
|
-
`)[0]??"":"(message not readable)",g=
|
|
354
|
-
`)).slice(0,4)}function
|
|
355
|
-
`)[0]??"").slice(0,100),n=e.permalink||`${e.channel}:${e.ts}`,o=[e.cli??"?",e.session_id?`session=${e.session_id}`:"",e.agent_pid?`pid=${e.agent_pid}`:`pid=${e.pid}`,e.git_branch?`branch=${e.git_branch}`:"",`cwd=${e.cwd}`].filter(Boolean).join(" ");return`${
|
|
363
|
+
Then select it: slack auth use <name> (or pass --workspace <name>)`),process.exit(1)}else throw u}if(o){console.log(JSON.stringify(a,null,2));return}let c=Y(ks(a,["messages","matches"])).map(R),l=new Map;for(let u of c){let d=R(u.channel),f=d.is_im===!0,h=typeof d.name==="string"?d.name:"dm",m;if(f&&h.startsWith("U")){let p="@"+h;if(!l.has(p)){let[,g]=await Ss(r,h,i);l.set(p,g)}m=`@${l.get(p)??h}`}else if(f)m=`@${h}`;else m=`#${h}`;console.log(await Vo(r,u,l,m,i))}}async function ep(e,t,n,o){let{ref:s,ts:r}=Vt(t);if(!r)console.error("Error: target must embed a message ts (e.g. #chan:1700000000.000100 or a Slack permalink URL)"),process.exit(2);return{channelId:n??await la(e,s,be,o),ts:r}}async function jy(e,t){let n=$s(),o={};if(!t.mine)o.shared=!0;if(t.in)o.in=t.in;if(t.from)o.from=t.from;let s=af(t.state,n,o);if(!t.json){let r=await Me(e,t.cookie),i=t.mine?"your reactions only [hasmy:]":"anyone's reactions [has:]";console.error(`(From: ${er(r)} \xB7 matching ${i})`),console.error(`(query: ${s})`)}await Ge("search.messages",()=>Qf(e,s,t.count,t.json,t.cookie))}async function Wy(e,t){let n=$s(),{channelId:o,ts:s}=await ep(e,t.target,t.channelId,t.cookie),r=await ff(e,o,s,t.state,n,t.cookie);if(r.noop){console.log(`= Already ${t.state} (ts: ${s})`);return}let i=r.removed.length?`, removed ${r.removed.map((a)=>`:${a}:`).join(" ")}`:"";if(console.log(`\u2713 ${t.state} :${n.progress[t.state]}: (ts: ${s})${i}`),r.leftover.length)console.error(`\u26A0 ${r.leftover.map((a)=>`:${a}:`).join(" ")} could not be removed \u2014 this message now carries more than one `+"progress reaction. Readers collapse by priority so nothing is lost; repair with: slack todo doctor --in <#chan> --fix")}async function Uy(e,t){let n=$s(),{channelId:o,ts:s}=await ep(e,t.target,t.channelId,t.cookie),r=await pf(e,o,s,t.flag,n,t.remove===!0,t.cookie);console.log(`\u2713 ${t.remove?"Cleared":"Flagged"} ${t.flag} :${r}: (ts: ${s})`)}async function Jy(e,t){let n=$s(),o=t.channelId??await la(e,t.channel,be,t.cookie),s={limit:t.limit};if(t.fix)s.fix=!0;if(t.cookie)s.cookie=t.cookie;let r=await hf(e,o,n,s);if(r.findings.length===0)console.log(`\u2713 No multi-state tasks in ${r.scanned} message(s).`);else{for(let i of r.findings){let a=i.fixed===!0?"fixed":i.fixed===!1?`FAILED: ${i.error??"?"}`:"needs --fix";console.log(`${i.ts} ${i.emoji.map((c)=>`:${c}:`).join(" ")} \u2192 keep :${i.keep}: [${a}] ${M(i.text).slice(0,60)}`)}console.log(`${r.findings.length} multi-state task(s) in ${r.scanned} message(s).`)}if(r.truncated)console.error(`\u26A0 Scan limit reached (${t.limit} messages) \u2014 older history was NOT checked. Raise it with --limit N.`)}async function Ky(e,t,n,o){let s=Math.floor(Date.now()/1000)-t*86400,r=await xs(e),i=Y(r.channels).map(R).filter((u)=>u.is_member===!0&&u.is_im!==!0&&u.is_mpim!==!0).filter((u)=>{if(!o)return!0;return(typeof u.name==="string"?u.name:"").toLowerCase().includes(o.toLowerCase())}).sort((u,d)=>Number(d.updated??0)-Number(u.updated??0)),a=new Map,c=0,l=0;for(let u of i){let d=String(u.id??""),f=typeof u.name==="string"?u.name:d,h;try{h=await tt(e,d,n)}catch(p){console.error(` SKIP #${f}: ${p.message}`);continue}let m=Y(h.messages).map(R).filter((p)=>(p.subtype===void 0||p.subtype===null)&&Ho(p)>=s);if(m.length===0)continue;l+=1,c+=m.length,console.log(`## #${f} (${m.length} msgs)
|
|
364
|
+
`);for(let p of[...m].reverse()){let g=await Vf(e,p,a),w=typeof p.text==="string"?p.text:"",k=Un(await xn(e,w,a)).split(`
|
|
365
|
+
`).join(" \u21B5 ");console.log(`[${Fs(Ho(p))}] ${g}: ${k}`)}console.log("")}console.error(`Dumped ${c} messages across ${l} channels (cutoff: ${t}d)`)}function qy(e){let t=[];function n(o){if(typeof o==="string"){t.push(o);return}if(Array.isArray(o)){for(let s of o)n(s);return}if(o&&typeof o==="object"){let s=o;if(typeof s.text==="string"){t.push(s.text);return}if(s.type==="link"&&typeof s.url==="string"){t.push(s.url);return}if(Array.isArray(s.elements))n(s.elements);else if(Array.isArray(s.content))n(s.content)}}for(let o of e)n(o);return t.join("").trim()}async function Fa(e,t,n){let o=new Map;return async(s)=>{if(!s)return"(unknown)";if(o.has(s))return o.get(s);try{let r=await Kd(e,s,t),i=R(r.channel),a;if(i.is_im===!0){let c=typeof i.user==="string"?i.user:"";if(!c||c===n)a="@self";else{let[l]=await Ss(e,c);a=`@${l}`}}else a=`#${typeof i.name==="string"?i.name:s}`;return o.set(s,a),a}catch{return s}}}function Aa(e){let t=R(Y(e.destinations)[0]);return String(t.channel_id??e.channel_id??e.channel??"")}function Go(e){return qy(Y(e.blocks))||(typeof e.text==="string"?e.text:"(no text)")}async function Hy(e,t,n=!1){let o=await Es(e,t),s=Y(o.drafts??o.messages??[]).map(R).filter((l)=>l.is_deleted!==!0),r=n?s:s.filter((l)=>l.is_sent!==!0);if(r.length===0){console.log(n?"No drafts.":"No pending drafts. Run with --all to include sent.");return}let i="";try{({userId:i}=await ra(e,t))}catch{}let a=await Fa(e,t,i),c=new Map;for(let l of r){let u=Aa(l),d=Go(l),f=Number(l.date_created??l.date_create??0),h=f?Sa(f):"?",m=await a(u),p=typeof l.id==="string"?l.id:"",g=l.is_sent===!0?" [SENT]":"",w=Un(await xn(e,d,c));console.log(`-- ${p} ${m} [${h}]${g}`);for(let b of w.split(`
|
|
366
|
+
`))console.log(` ${b}`)}}async function zy(e,t,n){let o=[],s;do{let u=R(await Wd(e,{filter:n.filter,limit:Math.min(n.limit,100),cursor:s},t));o.push(...Xd(u));let d=R(u.response_metadata).next_cursor;s=typeof d==="string"&&d?d:void 0}while(s&&o.length<n.limit);let r=Vd(o).slice(0,n.limit);if(r.length===0){(n.json?console.error:console.log)(`No ${n.filter==="todo"?"to-dos":`${n.filter} items`}.`);return}let i="",a="";try{({url:i,userId:a}=await Ut(e,t))}catch{}let c=await Fa(e,t,a),l=Date.now()/1000;for(let u of r){let d;if(u.channel&&u.ts)try{let w=R(await We(e,u.channel,u.ts,1,t));d=Y(w.messages).map(R).find((b)=>b.ts===u.ts)}catch{}let f=u.channel&&u.ts?i?Qd(i,u.channel,u.ts):`${u.channel}:${u.ts}`:"";if(n.json){console.log(JSON.stringify({...u,done:Po(u),permalink:f,user:d?.user??null,text:d?.text??null}));continue}let h=u.channel?await c(u.channel):`(${u.itemType||"item"})`,m=typeof d?.user==="string"?`@${await Pe(e,d.user,t)}: `:"",p=typeof d?.text==="string"?d.text.split(`
|
|
367
|
+
`)[0]??"":"(message not readable)",g=p.length>100?`${p.slice(0,100)}\u2026`:p;if(console.log(`${Zd(u,l,Fs)} ${M(h)}`),console.log(` ${M(m+g)}`),f)console.log(` ${f}`)}}async function Gy(e,t,n){let o=await Es(e,t),s=Y(o.drafts).map(R).find((m)=>String(m.id)===n);if(!s)console.error(`Draft not found: ${n}`),process.exit(1);let r="";try{({userId:r}=await ra(e,t))}catch{}let i=await Fa(e,t,r),a=Aa(s),c=Go(s),l=Number(s.date_created??0),u=String(s.last_updated_ts??"?"),d=await i(a),h=Un(await xn(e,c,new Map));console.log(`id: ${s.id}`),console.log(`channel: ${d} (${a})`),console.log(`created: ${l?Sa(l):"?"}`),console.log(`updated: ${Sa(Number(u.split(".")[0]))}`),console.log(`status: ${s.is_sent===!0?"sent":"pending"}`),console.log("---"),console.log(h)}function De(...e){return Ty(e.join(`
|
|
368
|
+
`)).slice(0,4)}function M(e){return e.replace(/\x1b\[[0-9;:?]*[ -/]*[@-~]/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"").replace(/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/g,"")}var Yy={"reactions.add":"reactions:write","reactions.remove":"reactions:write","chat.postMessage":"chat:write","chat.update":"chat:write","chat.delete":"chat:write","pins.add":"pins:write","slackLists.create":"lists:write","slackLists.items.create":"lists:write","slackLists.items.update":"lists:write","slackLists.items.list":"lists:read","slackLists.access.set":"lists:write","conversations.rename":"channels:manage (or groups:write for a private channel)","conversations.replies":"channels:history (or groups:history)","conversations.history":"channels:history (or groups:history)"};function pe(e){let t=e instanceof Error?e.message:String(e),n=t.match(/Slack error on (\S+): (\w+)/);if(!n)return t;let[,o,s]=n;switch(s){case"missing_scope":return`Error: token lacks the ${Yy[o]??"the required"} scope (needed for ${o}). Add it to your Slack App's User Token Scopes (or Bot Token Scopes if you use a bot token / --as-bot) \u2014 it must be on the token type the CLI actually uses \u2014 then reinstall to the workspace.`;case"invalid_name":return"Error: not a valid emoji shortcode \u2014 use the name without colons (e.g. white_check_mark), and make sure it exists in the workspace.";case"already_reacted":return"Error: you've already added that reaction to the message.";case"no_reaction":return"Error: that reaction isn't on the message \u2014 nothing to remove.";case"message_not_found":return"Error: no message found at that timestamp in the channel \u2014 check the target ts/permalink.";case"channel_not_found":return"Error: channel not found \u2014 check the target.";default:return t}}async function Qo(e,t,n){if(!t.startsWith("D"))return null;try{let o=await tr(e,t,n);if(!o)return null;return await df(e,o,_s,n)}catch{return null}}function xe(e,t,n,o,s=new Date){for(let i of n)console.log(i);let r=ma(s,o);if(r)console.log(r);if(e!==void 0)console.error(`Code mismatch (got ${e}, expected ${t})`);console.error(`Rerun with --code=${t}`),process.exit(1)}function Vt(e){let t=Kt(e);if(t)return t.ts?{ref:t.channel,ts:t.ts}:{ref:t.channel};if(e.startsWith("#")||e.startsWith("@")){let n=e.indexOf(":");if(n>0){let o=e.slice(n+1);if(/^\d{10}\.\d{6}$/.test(o))return{ref:e.slice(0,n),ts:o};if(/^\d{4}-\d{2}-\d{2}T/.test(o))return{ref:e.slice(0,n),ts:$a(o)}}}return{ref:e}}function Hn(e,t=!0){let n=Kt(e);if(n){if(!t)return{ref:n.channel};let s=n.threadTs??n.ts;return s?{ref:n.channel,threadTs:s}:{ref:n.channel}}let o=e.indexOf(":");if(o>0){let s=e.slice(o+1);if(/^\d{10}\.\d{6}$/.test(s))return{ref:e.slice(0,o),threadTs:s};if(/^\d{4}-\d{2}-\d{2}T/.test(s))return{ref:e.slice(0,o),threadTs:$a(s)}}return{ref:e}}async function Xt(e,t,n,o){let s=n;if(/^#?[CDG][A-Z0-9]{8,}$/.test(n)||!n.startsWith("#")&&!n.startsWith("@"))try{let i=R(await Dn(e,t,o)),a=R(i.channel);if(a.is_im===!0){let c=typeof a.user==="string"?a.user:"";s=c?`@${await Pe(e,c,o)}`:t}else s=typeof a.name==="string"?`#${a.name}`:t}catch{s=t}return s===t?t:`${s} (${t})`}async function Me(e,t){try{return await Ut(e,t)}catch{return null}}function Ft(e,t){let n;return async()=>{if(n===void 0)n=await Me(e,t);return n}}function En(e){if(!Io())return{record:()=>{}};let t=rd();return{metadata:id(e,t),record:(n)=>{ad({...n,kind:e,attribution:t})}}}function Xy(e){let t=M(e.text.split(`
|
|
369
|
+
`)[0]??"").slice(0,100),n=e.permalink||`${e.channel}:${e.ts}`,o=[e.cli??"?",e.session_id?`session=${e.session_id}`:"",e.agent_pid?`pid=${e.agent_pid}`:`pid=${e.pid}`,e.git_branch?`branch=${e.git_branch}`:"",`cwd=${e.cwd}`].filter(Boolean).join(" ");return`${Fs(e.sent_at/1000)} ${e.kind.padEnd(4)} ${M(e.target??e.channel)} ${n}
|
|
356
370
|
${t}
|
|
357
|
-
${
|
|
358
|
-
`)[0]??""),i=r.length>n?`${r.slice(0,n)}\u2026`:r,a=typeof t.ts==="string"?t.ts:"";return`${a?
|
|
359
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);if(o)return{botToken:s};let{ref:r}=
|
|
371
|
+
${M(o)}`}function er(e,t){let n=t?" [as bot]":"";if(!e)return`(unknown \u2014 auth.test failed)${n}`;let o=M(e.user||e.userId||"?"),s=e.userId?` (${e.userId})`:"",r=e.team?` \u2014 ${M(e.team)}`:"";return`@${o}${s}${r}${n}`}function Se(e,t={}){return` ${"From:".padEnd(t.pad??6)}${er(e,t.asBot)}`}async function Ea(e,t,n=60,o){let s=typeof t.user==="string"?await Pe(e,t.user,o):typeof t.username==="string"?t.username:"?",r=As((typeof t.text==="string"?t.text:"").split(`
|
|
372
|
+
`)[0]??""),i=r.length>n?`${r.slice(0,n)}\u2026`:r,a=typeof t.ts==="string"?t.ts:"";return`${a?zo(a).slice(0,16).replace("T"," "):""} @${s}${i?`: ${i}`:""}`}async function Vy(e,t,n,o){let s=n.find((r)=>String(r.ts)===t)??n[0];if(!s)return t;return Ea(e,s,40,o)}function vf(e){return e.toLowerCase().replace(/<[@#!][^>]+>/g," ").replace(/[^\p{L}\p{N}\s]/gu," ").replace(/\s+/g," ").trim()}function Zy(e,t){let n=vf(e),o=vf(t);if(!n||!o)return 0;if(n===o)return 1;let s=(l)=>{let u=new Map;for(let d=0;d<l.length-1;d++){let f=l.slice(d,d+2);u.set(f,(u.get(f)??0)+1)}return u},r=s(n),i=s(o);if(r.size===0||i.size===0)return 0;let a=0;for(let[l,u]of r){let d=i.get(l);if(d)a+=Math.min(u,d)}let c=Lf(r)+Lf(i);return c===0?0:2*a/c}function Lf(e){let t=0;for(let n of e.values())t+=n;return t}async function Bf(e,t,n,o){let s=Ke();if(!s)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
373
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);if(o)return{botToken:s};let{ref:r}=Vt(e);if(!r.startsWith("@"))return{botToken:s};try{let i=await $t(t,r,n);return{botToken:s,channelId:await Ct(s,i)}}catch(i){console.error(`Error: could not resolve ${M(r)} to the bot's DM.
|
|
360
374
|
${i instanceof Error?i.message:String(i)}
|
|
361
|
-
`+" Tip: pass the message permalink, or --channel-id <D\u2026>, to skip the lookup."),process.exit(1)}}async function
|
|
362
|
-
`+(
|
|
363
|
-
Edit it anyway with --force.`)),process.exit(1);let g=
|
|
375
|
+
`+" Tip: pass the message permalink, or --channel-id <D\u2026>, to skip the lookup."),process.exit(1)}}async function Qy(e,t){let n=Ft(e,t.cookie),{ref:o,ts:s}=Vt(t.target);if(!s)console.error("Error: target must embed a message ts (e.g. #chan:2026-05-11T06:01:04.000100 or a Slack permalink URL)"),process.exit(2);let r;if(t.channelId)r=t.channelId;else r=await be(e,o,t.cookie);let i=await We(e,r,s,1,t.cookie),c=Y(i.messages).map(R).find((F)=>String(F.ts)===s);if(!c)console.error(`Message not found at ts=${s} in channel ${r}`),process.exit(1);let l=typeof c.text==="string"?c.text:"",u=t.mentionCookie??t.cookie,d=t.mentions?await wf(t.mentionToken??e,t.newText,r,u?{cookie:u}:{}):t.newText;Je(d,t.allowUrlAdjacent);let f=St(l).kind,h=St(d).kind,m=bs(l).kind!=="other",p=m?bs(d).kind==="other":f!=="other"&&(h==="other"||f!=="open"&&h==="open");if(p&&!t.force)console.error(`Error: this message is ${m?"a `slack poll`":`a \`slack ask\` question (${f==="open"?"open":f==="resolved"?"answered":"void"})`}, and ${m||h==="other"?"the new text would no longer read back as one (collect could not find the question, the pills or the answer)":"the new text would turn it back into an OPEN question"}.
|
|
376
|
+
`+(m?" Edit it anyway with --force.":` To retire it: slack ask --void='${t.target}' --reason '\u2026'
|
|
377
|
+
Edit it anyway with --force.`)),process.exit(1);let g=p,w=await n(),b=g?De("force-edit-ask-poll",l,d,w?.userId??""):De(l,d,w?.userId??"");if(t.code!==b)xe(t.code,b,[...g?[`\u26A0 --force: rewriting a \`slack ${m?"poll":"ask"}\` message by hand \u2014 collect may no longer read it back`]:[],"--- Editing as -------------------------------",Se(w,{asBot:t.asBot}),"--- Original message -------------------------",...l.split(`
|
|
364
378
|
`).map((F)=>` ${F}`),"--- Replacing with ---------------------------",...d.split(`
|
|
365
|
-
`).map((F)=>` ${F}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let k=
|
|
366
|
-
`).map((h)=>` ${h}`),"---------------------------------------------"])}await
|
|
367
|
-
`).map((w)=>` ${
|
|
368
|
-
`).map((w)=>` ${
|
|
369
|
-
Check before retrying, or you will have two boards: slack pinlog ls ${
|
|
379
|
+
`).map((F)=>` ${F}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let k=En("edit"),x=f!=="other"||h!=="other"||m||bs(d).kind!=="other",_=await _t(e,r,s,d,t.cookie,x?!0:void 0,k.metadata);console.log(`\u2713 Edited (ts: ${_})`),k.record({team:w?.team,channel:r,target:t.target,ts:s,text:d,asBot:t.asBot})}async function ew(e,t){let n=Ft(e,t.cookie),{ref:o,ts:s}=Vt(t.target);if(!s)console.error("Error: target must embed a message ts (e.g. #chan:2026-05-11T06:01:04.000100 or a Slack permalink URL)"),process.exit(2);let r;if(t.channelId)r=t.channelId;else r=await be(e,o,t.cookie);let i=await We(e,r,s,1,t.cookie),c=Y(i.messages).map(R).find((f)=>String(f.ts)===s);if(!c)console.error(`Message not found at ts=${s} in channel ${r}`),process.exit(1);let l=typeof c.text==="string"?c.text:"",u=await n(),d=De(r,s,l,u?.userId??"");if(t.code!==d){let f=await Xt(e,r,o,t.cookie);xe(t.code,d,["--- Deleting message -------------------------",Se(u,{asBot:t.asBot}),` \u2192 ${f} at ${zo(s)}`,...l.split(`
|
|
380
|
+
`).map((h)=>` ${h}`),"---------------------------------------------"])}await Ad(e,r,s,t.cookie),console.log(`\u2713 Deleted (ts: ${s})`)}function Yt(e){return`'${e.replace(/'/g,"'\\''")}'`}async function Ta(e,t,n){let o=Uo(t);if(o)return{...o,ref:o.channel};let{ref:s,ts:r}=Vt(t);if(!r)console.error(`Error: ${M(t)} is a channel, not a board \u2014 pass the board's permalink, `+`#chan:ts, or the id \`new\` printed (C\u2026:ts). Boards in a channel: slack pinlog ls ${Yt(t)}`),process.exit(2);return{channel:await be(e,s,n),ts:r,ref:s}}async function tw(e,t,n,o){let s=R(await We(e,t,n,1,o)),r=Y(s.messages).map(R).find((i)=>String(i.ts)===n);if(!r)console.error(`Error: no message at ts=${n} in ${t}.`),process.exit(1);return r}function Ko(e,t){if(t!==void 0)try{return Gf(t==="-"?0:t,"utf8").replace(/\n+$/,"")}catch(n){console.error(`Error: cannot read --file ${t}: ${n instanceof Error?n.message:String(n)}`),process.exit(2)}return e===void 0?void 0:Le(e)}var Mf=40000;function Yo(e,t){if(t.length>Mf)console.error(`Error: the ${e} is ${t.length} characters; Slack truncates past ${Mf}. Shorten it \u2014 move detail to a linked page.`),process.exit(2)}function Xo(e){let n=(e instanceof Error?e.message:String(e)).match(/Slack error on \S+: (\w+)/);if(e instanceof Et)return!0;return!!n&&!["internal_error","fatal_error","request_timeout","service_unavailable"].includes(n[1])}function tp(e,t){let n=ma(e);return n&&n.includes("QUIET HOURS")?`\u26A0 Quiet hours (JST): ${t}.`:null}async function nw(e,t){let{ref:n,ts:o}=Vt(t.target);if(o||Uo(t.target))console.error("Error: `pinlog new` posts a NEW board \u2014 pass a channel (#chan or C\u2026), not a message.\n"+` To change an existing board: slack pinlog set ${Yt(t.target)} '<new state>' '<reason>'`),process.exit(2);if(!t.state.trim())console.error("Error: the initial state is empty \u2014 a board has to say something."),process.exit(2);if(Je(t.state,t.allowUrlAdjacent),t.log!==void 0)Je(t.log,t.allowUrlAdjacent),Yo("reason",t.log);let s=`${t.workspace?` -w ${Yt(t.workspace)}`:""}${t.asBot?" --as-bot":""}`,r=Ft(e,t.cookie),i=await be(e,n,t.cookie),a=await r(),c=De("pinlog-create",i,t.state,t.log??"",a?.userId??""),l=new Date,u=ba(t.state,l);if(Yo("HEAD (state + footer)",u),t.code!==c){let p=await Xt(e,i,n,t.cookie),g=(await np(e,i,200,t.cookie)).found;xe(t.code,c,["--- New pinlog -------------------------------",Se(a,{asBot:t.asBot}),` \u2192 ${p} \u2014 NEW top-level message, then pinned`,...g.length?[`\u26A0 ${g.length} board(s) already in this channel \u2014 to change one, use \`slack pinlog set <board> \u2026\` instead:`,...g.slice(0,5).map((w)=>` ${at(i,String(w.ts))} ${sp(String(w.text))}`)]:[" (no other boards in the last 200 messages of this channel)"],"--- State (the top-level message) ------------",...u.split(`
|
|
381
|
+
`).map((w)=>` ${M(w)}`),...t.log?["--- Reason (first thread reply \u2014 notifies) ---",...t.log.split(`
|
|
382
|
+
`).map((w)=>` ${M(w)}`)]:[],"---------------------------------------------"])}let d=En("send"),f;try{f=await wn(e,i,u,void 0,!1,t.cookie,!0,d.metadata)}catch(p){if(Xo(p))console.error(`\u2717 HEAD was NOT posted: ${pe(p)}`);else console.error(`\u26A0 UNKNOWN whether the HEAD was posted: ${pe(p)}
|
|
383
|
+
Check before retrying, or you will have two boards: slack pinlog ls ${Yt(t.target)}${s}`);process.exit(1)}if(!f)console.error("\u2717 Slack accepted the post but returned no ts \u2014 check the channel before retrying, it may have landed."),process.exit(1);d.record({team:a?.team,channel:i,target:t.target,ts:f,text:u,asBot:t.asBot});let h=at(i,f);console.log(`\u2713 Posted HEAD: ${h}`);let m=tp(l,"this new top-level post notified everyone who follows the channel");if(m)console.error(m);try{await oa(e,i,f,t.cookie),console.log("\u2713 Pinned")}catch(p){let g=p instanceof Error?p.message:String(p),w=/missing_scope/.test(g)?`the ${t.asBot?"bot":"user"} token lacks the pins:write scope`:pe(p);console.error(`\u26A0 NOT pinned: ${w}.`),console.error(` The board works unpinned; pin it later with: slack pinlog pin ${h}${s}`)}if(t.log)try{let p=await wn(e,i,t.log,f,!1,t.cookie,!0);console.log(`\u2713 Reason posted in the thread (ts: ${p})`)}catch(p){let g=De("pinlog-log",i,f,t.log,a?.userId??"");console.error(`${Xo(p)?"\u2717 The reason was NOT posted":"\u26A0 UNKNOWN whether the reason was posted"}: ${pe(p)}
|
|
370
384
|
The board IS posted. Retry just the reason (check the thread first):
|
|
371
|
-
slack pinlog note ${h} ${
|
|
372
|
-
`+" Refusing to overwrite it \u2014 check the id. To turn this message into a board on purpose, add --adopt."),process.exit(1);let c=await n(),l=
|
|
373
|
-
`).map((
|
|
374
|
-
`).map((
|
|
375
|
-
`).map((
|
|
376
|
-
`).map((
|
|
377
|
-
Only the HEAD's author can edit it${t.asBot?"":" \u2014 if the bot created this board, add --as-bot"}.`:"",
|
|
378
|
-
Check it first: slack pinlog get ${l}${d}`;console.error(`${
|
|
379
|
-
The log reply was NOT posted (a log line for a change the board may not show would be a lie).`),process.exit(1)}
|
|
380
|
-
`:`\u26A0 UNKNOWN whether the log reply was posted: ${
|
|
381
|
-
`)+(t.logOnly?"":` The HEAD IS updated \u2014 only the log line ${
|
|
382
|
-
`)+(
|
|
383
|
-
`)+` Retry just the log line${
|
|
384
|
-
${h}`),process.exit(1)}if(
|
|
385
|
-
`))console.log(
|
|
386
|
-
`).map((k)=>
|
|
387
|
-
`).find((t)=>t.trim())??"").slice(0,80)}async function
|
|
388
|
-
`+` To reach yourself with a notification, send as the bot: slack send '${t.target}' '...' --as-bot`);let a=
|
|
389
|
-
`)[0]??"").slice(0,100)}`,...u,"--- Sending ----------------------------------",
|
|
385
|
+
slack pinlog note ${h} ${Yt(jn(t.log))}${t.allowUrlAdjacent?" --allow-url-adjacent":""}${s} --code=${g}`),process.exit(1)}}async function Nf(e,t){if(!t.log.trim())console.error("Error: the reason is required \u2014 one short line saying what changed. The thread log is the point of a pinlog."),process.exit(2);if(!t.logOnly&&(t.state===void 0||!t.state.trim()))console.error("Error: the new state is required (positional or --file). To post only a reason: slack pinlog note <board> <reason>"),process.exit(2);if(Je(t.log,t.allowUrlAdjacent),t.state!==void 0)Je(t.state,t.allowUrlAdjacent);Yo("log line",t.log);let n=Ft(e,t.cookie),{channel:o,ts:s,ref:r}=await Ta(e,t.target,t.cookie);try{Pf(`pinlog-${o}-${s}`)}catch(w){if(!(w instanceof Ts))throw w;console.error(`Error: another update of ${at(o,s)} is running (${w.holder}). Re-run when it has finished \u2014 then re-read the board, it has changed.`),process.exit(1)}let i=await tw(e,o,s,t.cookie),a=typeof i.text==="string"?i.text:"";if(t.adopt&&t.logOnly)console.error("Error: --adopt rewrites the state with a footer \u2014 it does not apply to note."),process.exit(2);if(!Kn(a)&&!t.adopt)console.error(`Error: the message at ${at(o,s)} is not a pinlog HEAD (no "${Is}" footer).
|
|
386
|
+
`+" Refusing to overwrite it \u2014 check the id. To turn this message into a board on purpose, add --adopt."),process.exit(1);let c=await n(),l=at(o,s),u=new Date,d=`${t.workspace?` -w ${Yt(t.workspace)}`:""}${t.asBot?" --as-bot":""}`,f=De("pinlog-log",o,s,t.log,c?.userId??""),h=`slack pinlog note ${l} ${Yt(jn(t.log))}${t.allowUrlAdjacent?" --allow-url-adjacent":""}${d} --code=${f}`,m=tp(u,"the log reply notified everyone following this thread \u2014 hold non-urgent updates until 08:00");if(t.logOnly){if(t.code!==f){let w=await Xt(e,o,r,t.cookie);xe(t.code,f,["--- Pinlog log reply (HEAD unchanged) --------",Se(c,{asBot:t.asBot}),` \u2192 ${w}, thread of ${l}`,...t.log.split(`
|
|
387
|
+
`).map((b)=>` ${M(b)}`),"---------------------------------------------"])}}else{let w=ba(t.state,u);Yo("new HEAD (state + footer)",w);let b=!Kn(a),k=De("pinlog-update",o,s,a,t.state,t.log,c?.userId??"");if(t.code!==k){let _=await Xt(e,o,r,t.cookie),F=Rs(a).trim()===Rs(t.state).trim();xe(t.code,k,["--- Updating pinlog --------------------------",Se(c,{asBot:t.asBot}),` \u2192 ${_}, ${l}`,"--- Current HEAD -----------------------------",...a.split(`
|
|
388
|
+
`).map((I)=>` ${M(I)}`),"--- New HEAD (edited in place \u2014 silent) ------",...w.split(`
|
|
389
|
+
`).map((I)=>` ${M(I)}`),"--- Log reply (in the thread \u2014 notifies) -----",...t.log.split(`
|
|
390
|
+
`).map((I)=>` ${M(I)}`),"---------------------------------------------",...F?["\u26A0 The state text is unchanged \u2014 only the footer time moves. Replies are for real changes."]:[],...b?["\u26A0 Adopting: this message has no pinlog footer yet \u2014 it becomes a board now."]:[]])}let x=En("edit");try{await _t(e,o,s,w,t.cookie,!0,x.metadata)}catch(_){let F=_ instanceof Error?_.message:String(_),I=/cant_update_message/.test(F)?`
|
|
391
|
+
Only the HEAD's author can edit it${t.asBot?"":" \u2014 if the bot created this board, add --as-bot"}.`:"",S=Xo(_)?`\u2717 HEAD was NOT updated: ${pe(_)}${I}`:`\u26A0 UNKNOWN whether the HEAD was updated: ${pe(_)}
|
|
392
|
+
Check it first: slack pinlog get ${l}${d}`;console.error(`${S}
|
|
393
|
+
The log reply was NOT posted (a log line for a change the board may not show would be a lie).`),process.exit(1)}x.record({team:c?.team,channel:o,target:t.target,ts:s,text:w,asBot:t.asBot}),console.log(`\u2713 HEAD updated: ${l}`)}let p=En("send"),g;try{g=await wn(e,o,t.log,s,!1,t.cookie,!0,p.metadata)}catch(w){let b=Xo(w);console.error((b?`\u2717 Log reply was NOT posted: ${pe(w)}
|
|
394
|
+
`:`\u26A0 UNKNOWN whether the log reply was posted: ${pe(w)}
|
|
395
|
+
`)+(t.logOnly?"":` The HEAD IS updated \u2014 only the log line ${b?"is":"may be"} missing.
|
|
396
|
+
`)+(b?"":` Check the thread first (retrying a reply that landed notifies everyone twice): slack pinlog get ${l}${d}
|
|
397
|
+
`)+` Retry just the log line${b?"":" (only if it is not there)"}:
|
|
398
|
+
${h}`),process.exit(1)}if(p.record({team:c?.team,channel:o,target:t.target,ts:g,text:t.log,asBot:t.asBot}),console.log(`\u2713 Logged (ts: ${g})`),m)console.error(m)}function jf(e){return e.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&")}function sw(e){return ya(new Date(Number(e.split(".")[0])*1000))}async function ow(e,t,n,o){if(typeof t.user==="string"){let r=n.get(t.user);if(r!==void 0)return r;let i;try{i=await Pe(e,t.user,o)}catch{i=t.user}return n.set(t.user,i),i}let s=R(t.bot_profile);if(typeof s.name==="string")return s.name;return typeof t.username==="string"?t.username:"bot"}async function rw(e,t,n,o){let{channel:s,ts:r}=await Ta(e,t,n),i=[],a,c=0;do{let p=R(await Td(e,s,r,a,200,n));for(let w of Y(p.messages).map(R)){if(String(w.ts)===r&&i.some((b)=>String(b.ts)===r))continue;i.push(w)}let g=R(p.response_metadata).next_cursor;a=typeof g==="string"&&g?g:void 0,c++}while(a&&c<50);let l=a===void 0,u=i.find((p)=>String(p.ts)===r);if(!u)console.error(`Error: no message at ts=${r} in ${s}.`),process.exit(1);let d=typeof u.text==="string"?u.text:"",f=i.filter((p)=>String(p.ts)!==r);if(o){console.log(JSON.stringify({id:at(s,r),isPinlog:Kn(d),updated:Da(d),complete:l,head:d,log:f.map((p)=>({ts:String(p.ts),user:p.user??null,text:typeof p.text==="string"?p.text:""}))}));return}if(!Kn(d))console.error(`\u26A0 ${at(s,r)} has no "${Is}" footer \u2014 showing it anyway, but it is not a pinlog HEAD.`);console.log(`=== HEAD ${at(s,r)} ===`);for(let p of jf(d).split(`
|
|
399
|
+
`))console.log(M(p));let h=l?"":" \u2014 INCOMPLETE: the newest entries are not shown";console.log(`=== log (${f.length}${h}) ===`);let m=new Map;for(let p of f){let g=typeof p.text==="string"?p.text:"",w=M(await ow(e,p,m,n)),b=jf(g).split(`
|
|
400
|
+
`).map((k)=>M(k));console.log(`${sw(String(p.ts))} @${w}: ${b[0]??""}`);for(let k of b.slice(1))console.log(` ${k}`)}}async function np(e,t,n,o){let s=0,r,i=[];do{let a=R(await tt(e,t,Math.min(200,n-s),void 0,r,o)),c=Y(a.messages).map(R);s+=c.length;for(let u of c)if(typeof u.text==="string"&&Kn(u.text))i.push(u);let l=R(a.response_metadata).next_cursor;r=typeof l==="string"&&l?l:void 0}while(r&&s<n);return{found:i,scanned:s}}function sp(e){return M(Rs(e).split(`
|
|
401
|
+
`).find((t)=>t.trim())??"").slice(0,80)}async function iw(e,t,n,o){let{ref:s,ts:r}=Vt(t);if(r||Uo(t))console.error(`Error: \`pinlog ls\` takes a channel. For one board: slack pinlog get ${Yt(t)}`),process.exit(2);let i=await be(e,s,o),{found:a,scanned:c}=await np(e,i,n,o),l=await Xt(e,i,s,o);if(a.length===0){console.log(`No pinlogs in the last ${c} messages of ${l}.${c>=n?` (Older ones: --limit ${n*2})`:""}`);return}for(let u of a){let d=String(u.ts),f=at(i,d),h=String(u.text),m=Y(u.pinned_to).some((w)=>w===i)?"\uD83D\uDCCC":" ",p=sp(h),g=typeof u.reply_count==="number"?u.reply_count:0;console.log(`${m} ${f} updated ${Da(h)??"?"} log ${g}`),console.log(` ${p}`)}}async function aw(e,t,n){let{channel:o,ts:s}=await Ta(e,t,n);try{await oa(e,o,s,n),console.log(`\u2713 Pinned ${at(o,s)}`)}catch(r){let i=r instanceof Error?r.message:String(r);if(/already_pinned/.test(i)){console.log(`\u2713 Already pinned: ${at(o,s)}`);return}console.error(`\u2717 NOT pinned: ${pe(r)}`),process.exit(1)}}async function cw(e,t){let{ref:n,ts:o}=Vt(t.target);if(!o)console.error("Error: target must embed a message ts (e.g. #chan:2026-05-11T06:01:04.000100 or a Slack permalink URL)"),process.exit(2);let s=t.emoji.replace(/^:|:$/g,""),r;if(t.channelId)r=t.channelId;else r=await be(e,n,t.cookie);if(t.remove)await bn(e,r,o,s,t.cookie),console.log(`\u2713 Removed :${s}: (ts: ${o})`);else await Jt(e,r,o,s,t.cookie),console.log(`\u2713 Reacted :${s}: (ts: ${o})`)}async function Ia(e,t,n,o){if(!n||!t.startsWith("D"))return!1;try{let s=R(await Dn(e,t,o)),r=R(s.channel);return r.is_im===!0&&r.user===n}catch{return!1}}function lw(e){let t=new Set;for(let n of e){if(typeof n.user==="string")t.add(n.user);if(typeof n.parent_user_id==="string")t.add(n.parent_user_id);for(let o of Y(n.reply_users))if(typeof o==="string")t.add(o)}return t}async function uw(e,t,n){if(!t.startsWith("D"))return;try{let o=R(R(await Dn(e,t,n)).channel);return o.is_im===!0&&typeof o.user==="string"?o.user:void 0}catch{return}}async function dw(e,t){let{ref:n,threadTs:o}=Hn(t.target),s=t.cookie,r=Ft(e,s),i;if(t.channelId)i=t.channelId;else if(t.userId)i=await Ct(e,t.userId,s);else i=await be(e,n,s);if(!t.asBot&&await Ia(e,i,(await r())?.userId,s))console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you of your own message.
|
|
402
|
+
`+` To reach yourself with a notification, send as the bot: slack send '${t.target}' '...' --as-bot`);let a=Le(t.message);Je(a,t.allowUrlAdjacent);let c=a,l=null;if(t.mentions){l=await zt(t.mentionToken??e,a,i,t.mentionCookie),c=l.text;for(let I of jo(l.unresolved))console.error(`\u26A0 ${M(I)}`)}let u=[];if(l&&(l.resolved.length>0||l.unresolved.length>0)){u.push("--- Mentions ---------------------------------");for(let I of l.resolved)u.push(` \u2713 ${M(I.surface)} \u2192 @${M(I.display)} (${I.userId}) \u2014 will notify`);for(let I of l.unresolved){let S=I.reason==="ambiguous"?"ambiguous":I.reason==="unavailable"?"lookup unavailable":"no match";u.push(` \u26A0 ${M(I.surface)} \u2014 plain text, NOT notified (${S})`)}}let d="",f="?",h=[],m,p,g;if(o)try{let I=await We(e,i,o,100,s);h=Y(I.messages).map(R);let S=h[h.length-1];d=typeof S?.text==="string"?S.text:"",m=typeof S?.user==="string"?S.user:void 0,p=typeof S?.bot_id==="string"?S.bot_id:void 0,g=typeof S?.ts==="string"?S.ts:void 0}catch{}else try{let I=await tt(e,i,1,void 0,void 0,s),S=Y(I.messages).map(R),B=S.filter((P)=>P.subtype===void 0||P.subtype===null)[0];d=typeof B?.text==="string"?B.text:"",f=typeof B?.user==="string"?await Pe(e,B.user,s):typeof B?.username==="string"?B.username:"?";let W=S[0];m=typeof W?.user==="string"?W.user:void 0,p=typeof W?.bot_id==="string"?W.bot_id:void 0,g=typeof W?.ts==="string"?W.ts:void 0}catch{}try{let I=o?lw(h):new Set([await uw(e,i,s)].filter((S)=>!!S));for(let S of await kf(t.mentionToken??e,c,t.mentionCookie)){if(I.has(S.userId))continue;console.error(`\u26A0 possible untagged mention: ${M(S.surface)} \u2014 @${M(S.display)} won't be notified (did you mean <@${S.userId}>?)`)}}catch{}if(process.env.SLACK_UNREPLIED_WARN!=="0"&&g&&(m||p))try{let I=await r();if(!!I&&(!!m&&!!I.userId&&I.userId===m||!!p&&!!I.botId&&I.botId===p)){let B=`slack edit "#${i}:${g}" "<\u65B0\u3057\u3044\u672C\u6587>" --channel-id ${i}`;try{let W=await Mn(e,i,g,s);if(W)B=`slack edit "${W}" "<\u65B0\u3057\u3044\u672C\u6587>"`}catch{}console.error("\u26A0 \u76F8\u624B\u306F\u307E\u3060\u8FD4\u4FE1\u3057\u3066\u3044\u307E\u305B\u3093(\u6700\u5F8C\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u3042\u306A\u305F\u306E\u3082\u306E\u3067\u3059)\u3002"),console.error(" \u9023\u6295\u3092\u907F\u3051\u308B\u305F\u3081\u3001\u65B0\u898F\u9001\u4FE1\u3067\u306A\u304F\u76F4\u524D\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306E edit \u3092\u691C\u8A0E\u3057\u3066\u304F\u3060\u3055\u3044:"),console.error(` ${B}`),console.error(" \u3053\u306E\u307E\u307E\u9001\u4FE1\u3059\u308B\u5834\u5408\u306F --code=XXXX \u3067\u78BA\u5B9A\u3002")}}catch{}if(o&&h.length){let I={sim:0,msg:null};for(let S of h){let B=typeof S.text==="string"?S.text:"";if(!B)continue;let W=Zy(c,B);if(W>I.sim)I={sim:W,msg:S}}if(I.msg&&I.sim>=0.82){let S=Math.round(I.sim*100);console.error(`\u26A0 possible duplicate: ${S}% similar to an existing thread message \u2014 ${await Ea(e,I.msg,60,s)}`)}}let w=await r(),b=await Qo(e,i,s),k=De(i,o??"",d,c,w?.userId??"");if(t.code!==k){let I=await Xt(e,i,n,s),S=Se(w,{asBot:t.asBot});if(o){let B=await Vy(e,o,h,s),W=h.slice(-3),P=W.length?await Promise.all(W.map(async(T)=>` ${await Ea(e,T,60,s)}`)):[" (thread context unavailable)"];xe(t.code,k,["--- Recent messages in thread ----------------",...P,...u,"--- Sending ----------------------------------",S,` \u2192 ${I} thread of ${B} \u2014 THREAD REPLY`,` Message: ${c}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],b)}else xe(t.code,k,["--- Last message in channel ------------------",` ${f}: ${As(d.split(`
|
|
403
|
+
`)[0]??"").slice(0,100)}`,...u,"--- Sending ----------------------------------",S,` \u2192 ${I} \u2014 NEW top-level message`,` Message: ${c}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],b)}let x=En("send"),_=await wn(e,i,c,o,t.broadcast,s,void 0,x.metadata),F="";try{F=await Mn(e,i,_,s)}catch{}if(x.record({team:(await r())?.team,channel:i,target:t.target,ts:_,threadTs:o,permalink:F,text:c,asBot:t.asBot}),F)console.log(`\u2713 Sent: ${F}`);else console.log(`\u2713 Sent (ts: ${_})`);if(t.asBot&&i.startsWith("D"))try{let I=await uo(e);if(!I.ok)for(let S of fo(I,!0))console.error(S);else{let S=I.appId?`https://api.slack.com/apps/${I.appId}`:"https://api.slack.com/apps";console.error(`Note: if ${t.target} can't reply (app messaging may be off), enable Messages Tab: ${S} \u2192 App Home.`)}}catch{}}var fw=2,se=3,pw=4,hw=5,op=6,gw=1.618033988749895,mw=1000,yw=5000,Wf=8,ww=(e)=>new Promise((t)=>setTimeout(t,e)),rp=new Set(["thread_broadcast"]),bw=/(?<![A-Za-z0-9._@<-])@(here|channel|everyone)(?![A-Za-z0-9._-])/giu;function ip(e){if(!e.length)return;let t=e.map((n)=>{let o=M(n.surface);if(n.reason==="unavailable")return`${o}: could not fetch the user list or channel members (users:read missing or an API/connection error)`;if(n.reason==="ambiguous")return`${o}: matches multiple people \u2014 use an explicit <@USERID> tag`;return`${o}: matched no one`});console.error(`Error: \`ask\` will not post with unresolved answerer tags.
|
|
390
404
|
${t.join(`
|
|
391
|
-
`)}`),process.exit(
|
|
392
|
-
`).entries())console.error(` ${r?" ".repeat(
|
|
393
|
-
`+` To reach yourself with a notification, ask as the bot: slack ask '${t.target}' '...' --as-bot`);let l=
|
|
394
|
-
${u.text}`.matchAll(/<!(here|channel|everyone)(?:\|[^>]*)?>/g))d.add(
|
|
395
|
-
${g}`.matchAll(/<@([UW][A-Z0-9]+)(?:\|[^>]*)?>/g)){let
|
|
405
|
+
`)}`),process.exit(se)}function Os(e){let t=new Set;return{text:e.replace(bw,(o,s)=>{let r=s.toLowerCase();return t.add(r),`<!${r}>`}),kinds:t}}async function tr(e,t,n){if(!t.startsWith("D"))return;try{let o=R(await Dn(e,t,n)),s=R(o.channel);return s.is_im===!0&&typeof s.user==="string"?s.user:void 0}catch{return}}async function ap(e,t,n,o){let s=new Map;if(t.threadParentTs||t.replyCount!==0)try{let a=R(await We(e,t.channelId,t.threadParentTs??t.ts,100,t.cookie));for(let c of Y(a.messages).map(R))s.set(String(c.ts),c)}catch(a){console.error(` (\u30B9\u30EC\u30C3\u30C9\u306E\u8FFD\u8A18\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F: ${a instanceof Error?a.message:String(a)})`)}if(!t.threadOnly&&!t.threadParentTs)try{let a=R(await tt(e,t.channelId,30,t.ts,void 0,t.cookie,!0)),c=Y(a.messages).map(R),l=c.filter((u)=>Number(u.ts)>Number(t.ts)&&(t.askerBotId&&u.bot_id===t.askerBotId||t.askerUserId&&u.user===t.askerUserId)).reduce((u,d)=>Math.min(u,Number(d.ts)),1/0);for(let u of c)if(Number(u.ts)<l&&!s.has(String(u.ts)))s.set(String(u.ts),u)}catch(a){console.error(` (DM \u306E\u8FFD\u8A18\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F: ${a instanceof Error?a.message:String(a)})`)}let r=[...s.values()].filter((a)=>Number(a.ts)>Number(t.ts)).filter((a)=>!n||Number(a.ts)>Number(n)).filter((a)=>t.isAnswerer(a.user)&&!a.bot_id).filter((a)=>typeof a.subtype!=="string"||rp.has(a.subtype)).filter((a)=>typeof a.text==="string"&&a.text.trim()!=="").sort((a,c)=>Number(a.ts)-Number(c.ts)).filter((a)=>!o(a)),i=[];for(let a of r){let c="";try{c=await Mn(e,t.channelId,String(a.ts),t.cookie)}catch{}i.push({ts:String(a.ts),user:String(a.user),text:a.text.trim(),permalink:c})}return i}function Gt(...e){return e.filter((t)=>!!t).reduce((t,n)=>!t||Number(n)>Number(t)?n:t,"")}async function Sn(e,t,n){if(t.json){console.log(JSON.stringify({status:n.status,answer:n.answer,how:n.how??null,who:n.who??null,...n.status==="void"?{reason:n.reason??"",supersededBy:n.supersededBy??null}:{},notes:n.notes,cursor:n.cursor,permalink:t.shown}));return}if(n.notes.length){console.error(` \u30B9\u30EC\u30C3\u30C9\u306E\u8FFD\u8A18 ${n.notes.length} \u4EF6 (\u56DE\u7B54\u3068\u306F\u5225):`);for(let o of n.notes){let s=o.user;try{s=await Pe(e,o.user,t.cookie)}catch{}for(let[r,i]of o.text.split(`
|
|
406
|
+
`).entries())console.error(` ${r?" ".repeat(M(s).length+2):`${M(s)}: `}${M(i)}`)}}if(n.status==="answered")console.error(` \u3053\u306E\u5F8C\u306E\u8FFD\u8A18\u3092\u62FE\u3046: ${qn(t.shown,t.asBot,n.cursor)}`);if(n.answer!==null)console.log(n.answer)}function cp(e,t,n=!1){let{channelId:o,ts:s,reactable:r,threadOnly:i,audience:a,broadcast:c,cookie:l}=t,u=et[t.lang],d={},{askerUserId:f,askerBotId:h}=t,m=(B)=>typeof B==="string"&&!!B&&B!==f&&(c||a.has(B)),p=(B)=>{if(d.replyCount=Number(B.reply_count)||0,typeof B.text==="string")d.ownText=B.text},g=(B)=>{let W=typeof B.text==="string"?St(B.text):void 0;if(W?.kind==="void")d.voided=W;return!!d.voided};function w(B){let W=Y(B.reactions).map(R),P=[];for(let T=0;T<r.length;T++){let A=W.find((K)=>K.name===Re[T].name),L=A?Y(A.users).filter(m):[];if(L.length)P.push({index:T,users:L})}return P}async function b(B,W){if(n)return;let P=typeof B.text==="string"?B.text:"";if(!P)return;let T=_o(P,W,t.lang);if(T===P)return;try{await _t(e,o,s,T,l,!0)}catch(A){console.error(` (\u8CEA\u554F\u6587\u306B\u6CE8\u610F\u66F8\u304D\u3092\u5165\u308C\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: ${A instanceof Error?A.message:String(A)})`)}}let k=new Set;function x(B){let W=Y(B.reactions).map(R).find((P)=>P.name===Nt);for(let P of W?Y(W.users).filter(m):[]){if(k.has(P))continue;if(k.add(P),!n)console.error(` (<@${P}> \u304C \u2753 \u305D\u306E\u4ED6 \u3092\u62BC\u3057\u307E\u3057\u305F\u3002\u8FD4\u4FE1\u3092\u5F85\u3061\u307E\u3059)`)}}async function _(B){if(r.length)x(B);let W=w(B);if(W.length<=1&&Eo(typeof B.text==="string"?B.text:"").length)await b(B,[]);if(!W.length)return null;if(W.length===1){let{index:K,users:ce}=W[0];return{answer:r[K],how:u.howReaction(Re[K].glyph),who:ce[0],choice:K+1}}let P=W.map((K)=>Re[K.index].glyph).join(" / "),T=new Map;for(let K of W)for(let ce of K.users)T.set(ce,(T.get(ce)??0)+1);let A=[...T].filter(([,K])=>K>1).map(([K])=>K);if(!n)console.error(A.length?` (${P} \u304C\u540C\u6642\u306B\u9078\u3070\u308C\u3066\u3044\u307E\u3059\u30021 \u3064\u306B\u7D5E\u3063\u3066\u3082\u3089\u3046\u307E\u3067\u5F85\u3061\u307E\u3059)`:` (\u56DE\u7B54\u304C\u5206\u304B\u308C\u3066\u3044\u307E\u3059: ${P}\u3002\u3069\u3061\u3089\u304B\u4E00\u65B9\u306B\u305D\u308D\u3046\u307E\u3067\u5F85\u3061\u307E\u3059)`);let L=A.sort();return await b(B,L),null}let F=[...r,...t.overflow];function I(B,W=1/0){let P=[...B].sort((T,A)=>Number(T.ts)-Number(A.ts));for(let T of P){if(!(Number(T.ts)>Number(s)))continue;if(t.after&&!(Number(T.ts)>Number(t.after)))continue;if(!m(T.user))continue;if(typeof T.subtype==="string"&&!rp.has(T.subtype))continue;if(Number(T.ts)>=W)break;let A=typeof T.text==="string"?T.text.trim():"";if(!A)continue;if(!F.length)return{answer:A,how:u.howReply,who:T.user,ts:String(T.ts)};let L=Mi(A,F);if(L.kind==="chosen")return{answer:F[L.index-1],how:u.howReplyN(L.index),who:T.user,ts:String(T.ts),choice:L.index};let K=L.kind==="ambiguous",ce=d.unchosen;if(!ce||ce.ambiguous&&!K||ce.ambiguous===K&&Number(T.ts)<Number(ce.ts))d.unchosen={text:A,who:typeof T.user==="string"?T.user:"",ts:String(T.ts),ambiguous:K}}return null}async function S(){if(delete d.unchosen,t.threadParentTs){let T=R(await We(e,o,t.threadParentTs,100,l)),A=Y(T.messages).map(R),L=A.find((K)=>K.ts===s);if(L){if(p(L),g(L))return null;let K=await _(L);if(K)return K}return I(A)}let B=R(await tt(e,o,30,s,void 0,l,!0)),W=Y(B.messages).map(R),P=W.find((T)=>T.ts===s);if(P){if(p(P),g(P))return null}if(P){let T=await _(P);if(T)return T}if(!i){let T=W.filter((L)=>Number(L.ts)>Number(s)&&(h&&L.bot_id===h||f&&L.user===f)).reduce((L,K)=>Math.min(L,Number(K.ts)),1/0),A=I(W,T);if(A)return A}if(P&&Number(P.reply_count)>0){let T=R(await We(e,o,s,30,l)),A=I(Y(T.messages).map(R));if(A)return A}return null}return{poll:S,state:d,isAnswerer:m,candidates:F}}async function lp(e,t){let{channelId:n,ts:o,question:s,reactable:r,threadOnly:i,cookie:a,timeout:c,shown:l}=t,{askerUserId:u,askerBotId:d}=t,{poll:f,state:h,isAnswerer:m,candidates:p}=cp(e,t),g="";async function w(F){for(let S=0;S<r.length;S++)try{await bn(e,n,o,Re[S].name,a)}catch{}let I="";if(F.who)try{I=await Pe(e,F.who,a)}catch{I=F.who}if(I)console.error(` \u56DE\u7B54\u8005: ${M(I)}`);try{let S=h.ownText?Ru(h.ownText,F.choice):void 0;await _t(e,n,o,Iu(s,F,I,t.lang,S),a,!0);try{await Jt(e,n,o,Pi,a),await bn(e,n,o,Nt,a)}catch{}}catch(S){console.error(` (\u5143\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u66F4\u65B0\u306B\u5931\u6557: ${S instanceof Error?S.message:String(S)})`)}}let b=Date.now()+c*1000,k=0,x=mw,_;for(;;){let F=null;try{F=await f(),k=0}catch(S){if(k++,k>=Wf)console.error(`Error: Slack \u3078\u306E\u554F\u3044\u5408\u308F\u305B\u306B ${k} \u56DE\u9023\u7D9A\u3067\u5931\u6557\u3057\u307E\u3057\u305F: ${S instanceof Error?S.message:String(S)}`),process.exit(se);console.error(` (Slack \u30A8\u30E9\u30FC ${k}/${Wf}, \u518D\u8A66\u884C\u3057\u307E\u3059: ${S instanceof Error?S.message:String(S)})`)}_=h.unchosen;let I=h.voided;if(I){if(up(I,l),t.json)await Sn(e,t,{status:"void",answer:null,reason:I.reason,...I.supersededBy?{supersededBy:I.supersededBy}:{},notes:[],cursor:Gt(o,t.after)});process.exit(op)}if(F){let S=await ap(e,{channelId:n,ts:o,threadOnly:i,replyCount:h.replyCount,isAnswerer:m,askerUserId:u,askerBotId:d,...t.threadParentTs?{threadParentTs:t.threadParentTs}:{},...a?{cookie:a}:{}},t.after,(W)=>W.ts===F.ts);await w(F);let B={status:"answered",answer:F.answer,how:F.how,notes:S,cursor:Gt(o,t.after,F.ts,...S.map((W)=>W.ts))};if(Xi(n,o,F.answer,B.cursor),F.who)B.who=F.who;await Sn(e,t,B),process.exit(0)}if(_&&!_.ambiguous){let S=_.who;try{if(S)S=await Pe(e,S,a)}catch{}if(console.error(` (${M(S)} \u304C\u9078\u629E\u80A2\u5916\u306E\u8FD4\u4FE1\u3092\u3057\u307E\u3057\u305F \u2014 \u6C7A\u5B9A\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u672C\u6587\u3092 stdout \u306B\u51FA\u3057\u307E\u3059)`),console.error(` \u9078\u629E\u80A2: ${p.map((B,W)=>`${W+1}. ${M(Oe(B))}`).join(" ")}`),console.error(` ${l}`),console.error(` \u3053\u306E\u8FD4\u4FE1\u306E\u5F8C\u3092\u5F85\u3064: ${qn(l,t.asBot,_.ts)}`),ld(n,o,_.text,Gt(o,t.after,_.ts)),t.json)await Sn(e,t,{status:"freetext",answer:_.text,who:_.who,notes:[],cursor:Gt(o,t.after,_.ts)});else console.log(_.text);process.exit(hw)}if(_&&_.ts!==g){g=_.ts;let S=_.who;try{if(S)S=await Pe(e,S,a)}catch{}console.error(` (${M(S)} \u306E\u8FD4\u4FE1\u306F\u8907\u6570\u306E\u9078\u629E\u80A2\u306B\u4E00\u81F4\u3057\u307E\u3059\u30021 \u3064\u306B\u7D5E\u3063\u3066\u3082\u3089\u3046\u307E\u3067\u5F85\u3061\u307E\u3059)`),console.error(` \u300C${M(_.text)}\u300D`)}if(Date.now()>=b)break;await ww(Math.min(x,Math.max(0,b-Date.now()))),x=Math.min(x*gw,yw)}if(_){if(console.error("Error: \u8FD4\u4FE1\u306F\u3042\u308A\u307E\u3057\u305F\u304C\u3001\u8907\u6570\u306E\u9078\u629E\u80A2\u306B\u4E00\u81F4\u3059\u308B\u305F\u3081\u78BA\u5B9A\u3067\u304D\u307E\u305B\u3093 (\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u305D\u306E\u307E\u307E\u6B8B\u3063\u3066\u3044\u307E\u3059)"),console.error(` \u8FD4\u4FE1: \u300C${M(_.text)}\u300D`),console.error(` \u9078\u629E\u80A2: ${p.map((F,I)=>`${I+1}. ${M(Oe(F))}`).join(" ")}`),console.error(` ${l}`),console.error(` \u8FD4\u7B54\u3057\u3066\u304B\u3089\u56DE\u53CE\u3059\u308B: ${qn(l,t.asBot,t.after)}`),t.json)await Sn(e,t,{status:"ambiguous",answer:null,notes:[],cursor:Gt(o,t.after)});process.exit(pw)}if(c===0)console.error(`\u307E\u3060\u56DE\u7B54\u304C\u3042\u308A\u307E\u305B\u3093: ${l}`);else console.error(`Error: ${c}s \u4EE5\u5185\u306B\u56DE\u7B54\u304C\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F (\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u305D\u306E\u307E\u307E\u6B8B\u3063\u3066\u3044\u307E\u3059)`),console.error(` ${l}`),console.error(` \u3042\u3068\u3067\u56DE\u53CE\u3059\u308B: ${qn(l,t.asBot,t.after)}`);if(t.json)await Sn(e,t,{status:"timeout",answer:null,notes:[],cursor:Gt(o,t.after)});process.exit(fw)}function qn(e,t,n){return`slack ask --waitFor='${e}'${t?" --as-bot":""}${n?` --after=${n}`:""}`}async function Dw(e,t){let{ref:n,threadTs:o}=Hn(t.target,!1),s=t.cookie,r=Ft(e,s),i;if(t.channelId)i=t.channelId;else if(t.userId)i=await Ct(e,t.userId,s);else i=await be(e,n,s);let a=(await r())?.userId??"",c=await tr(e,i,s);if(!t.asBot&&!!a&&c===a)console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you of your own message.
|
|
407
|
+
`+` To reach yourself with a notification, ask as the bot: slack ask '${t.target}' '...' --as-bot`);let l=Os(Le(t.question)),u=Os(Le(t.body??"")),d=new Set([...l.kinds,...u.kinds]);for(let v of`${l.text}
|
|
408
|
+
${u.text}`.matchAll(/<!(here|channel|everyone)(?:\|[^>]*)?>/g))d.add(v[1]);let f=t.mentionToken??e,h=await zt(f,l.text,i,t.mentionCookie),m=u.text?await zt(f,u.text,i,t.mentionCookie):{text:"",resolved:[],unresolved:[]},p=h.text,g=m.text,w=[...h.resolved,...m.resolved],b=[...h.unresolved,...m.unresolved];ip(b);let k=d.size>0,x=new Set(w.map((v)=>v.userId).filter((v)=>v!==a)),_=new Map(w.map((v)=>[v.userId,v.display]));for(let v of`${p}
|
|
409
|
+
${g}`.matchAll(/<@([UW][A-Z0-9]+)(?:\|[^>]*)?>/g)){let q=v[1];if(q===a||x.has(q))continue;x.add(q),_.set(q,await Pe(f,q,t.mentionCookie))}let F;if(k)F=`anyone in ${n} (${[...d].map((v)=>`@${v}`).join(", ")})`;else{if(!x.size&&c&&c!==a)x.add(c),_.set(c,await Pe(e,c,s));if(!x.size)console.error("Error: `ask` will not post a question nobody is addressed to \u2014 no one is tagged.\n"+` Tag the person who should answer: slack ask '${t.target}' '@alice ${t.question}' ...
|
|
396
410
|
Or open it to the whole channel: slack ask '${t.target}' '@here ${t.question}' ...
|
|
397
|
-
(In a 1:1 DM the other person counts automatically.)`),process.exit(
|
|
398
|
-
`)[0]??"").slice(0,100)}`,...
|
|
399
|
-
`)[0]??"")}\uFF09\u2014 \u5909\u66F4\u3067\u304D\u307E\u305B\u3093`),null;if(u.kind!=="open")return console.error(`\u2717 ${r}: \`slack ask\` \u306E\u8CEA\u554F\u3068\u3057\u3066\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093 \u2014 ${
|
|
411
|
+
(In a 1:1 DM the other person counts automatically.)`),process.exit(se);F=[...x].map((v)=>`@${M(_.get(v)??v)} (${v})`).join(", ")}let I=t.choices.map(Le),S=I.slice(0,xt),B=I.slice(xt),W=!i.startsWith("D")||!!o,P=k?[]:await Promise.all([...x].map((v)=>qd(f,v,t.mentionCookie))),T=Ri({flag:t.lang,readerLocales:P,content:[p,g,...S,...B]});if(!T)console.error(`Error: unsupported language "${M(t.lang??process.env.SLACK_TERM_LANG??"")}" \u2014 use one of: ${jt.join(", ")}`),process.exit(se);let A=T.lang,L=Bi(p,g,S,B,W,A);Je(L,t.allowUrlAdjacent);let K="",ce="?";try{let v=await tt(e,i,1,void 0,void 0,s),q=Y(v.messages).map(R).filter((ne)=>ne.subtype===void 0||ne.subtype===null)[0];K=typeof q?.text==="string"?q.text:"",ce=typeof q?.user==="string"?await Pe(e,q.user,s):typeof q?.username==="string"?q.username:"?"}catch{}let ie=await r(),ye=await Qo(e,i,s),ve=De(i,o??"",K,L,ie?.userId??"",...t.voidAfter?["reask",`${t.voidAfter.channelId}:${t.voidAfter.ts}`,t.voidAfter.reason]:[]);if(t.code!==ve){let v=await Xt(e,i,n,s),q=S.length?["--- Choices (seeded as reactions) ------------",...S.map((ne,U)=>` ${Re[U].glyph} ${Oe(ne)}`),...B.map((ne,U)=>` (${U+11}) ${Oe(ne)} \u2014 text answer only`)]:["--- Choices ----------------------------------"," (none \u2014 free-text reply)"];xe(t.code,ve,["--- Last message in channel ------------------",` ${ce}: ${As(K.split(`
|
|
412
|
+
`)[0]??"").slice(0,100)}`,...q,"--- Asking -----------------------------------",Se(ie,{asBot:t.asBot}),` \u2192 ${v}${o?" \u2014 THREAD REPLY":" \u2014 NEW top-level message"}`,` Question: ${p}`,` Answerable by: ${F}`,` Via: ${W?"reactions or thread replies":"reactions or replies in this DM"}`,...t.voidAfter?[` Then \u7121\u52B9\u5316: ${M(t.voidAfter.link)} (reason: ${M(t.voidAfter.reason||"none")}) \u2014 replaced by this question`]:[],` Language: ${A} (${{flag:"--lang",env:"SLACK_TERM_LANG",readers:"answerers' Slack locale",content:"the question's text",system:"system locale",default:"default"}[T.source]}; override with --lang)`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],ye)}let ue=En("ask"),V=await wn(e,i,L,o,!1,s,!0,ue.metadata);await Ao([...S.map((v,q)=>Re[q].name),Nt],(v)=>Jt(e,i,V,v,s),(v,q)=>{let ne=q instanceof Error?q.message:String(q);if(v===Nt)console.error(` (marker ${v} \u3092\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: ${ne})`);else console.error(` (\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3 ${v} \u3092\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: ${ne})`)});let le="";try{le=await Mn(e,i,V,s)}catch{}let j=le||`${i}:${V}`;if(console.error(`\u2713 Asked: ${j}`),ue.record({team:ie?.team,channel:i,target:t.target,ts:V,threadTs:o,permalink:le,text:L,asBot:t.asBot}),t.voidAfter){if(!await fp(e,t.voidAfter,t.voidAfter.reason,j,s))console.error(` \u26A0 \u65B0\u3057\u3044\u8CEA\u554F\u306F\u51FA\u307E\u3057\u305F\u304C\u3001\u53E4\u3044\u8CEA\u554F\u3092\u7121\u52B9\u5316\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2014 \u624B\u3067: slack ask --void='${M(t.voidAfter.link)}' --superseded-by='${j}'`)}if(!t.wait){console.log(qn(j,!!t.asBot));return}let re=t.timeout??3600;console.error(` \u56DE\u7B54\u3092\u5F85\u3063\u3066\u3044\u307E\u3059 (\u6700\u5927 ${re}s)\u2026 Ctrl-C \u3067\u4E2D\u65AD`);let te={channelId:i,ts:V,question:p,reactable:S,overflow:B,threadOnly:W,lang:A,audience:x,broadcast:k,askerUserId:ie?.userId??"",askerBotId:ie?.botId??"",timeout:re,shown:j,asBot:!!t.asBot,json:!!t.json};if(o)te.threadParentTs=o;if(s)te.cookie=s;await lp(e,te)}function up(e,t){if(console.error(`\u3053\u306E\u8CEA\u554F\u306F\u7121\u52B9\u3067\u3059 \u2014 \u56DE\u7B54\u3055\u308C\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u5F85\u3064\u306E\u3092\u3084\u3081\u3066\u304F\u3060\u3055\u3044: ${M(t)}`),e.reason)console.error(` ${M(e.reason)}`);if(e.supersededBy)console.error(` \u65B0\u3057\u3044\u8CEA\u554F: ${M(e.supersededBy)}`)}async function _a(e,t,n){let o=Kt(t),s,r,i;if(o?.ts)s=o.channel,r=o.ts,i=o.threadTs&&o.threadTs!==o.ts?o.threadTs:void 0;else{let a=t.match(/^([A-Za-z0-9]+):(\d{10}\.\d{6})$/);if(!a)return null;s=a[1],r=a[2]}return nr(e,{channelId:s,ts:r,threadTs:i},n)}async function nr(e,t,n){let{channelId:o,ts:s}=t,r=t.threadTs&&t.threadTs!==t.ts?t.threadTs:void 0,i;if(r){let c=R(await We(e,o,r,100,n));i=Y(c.messages).map(R).find((l)=>l.ts===s)}else{let c=R(await tt(e,o,1,s,void 0,n,!0));i=Y(c.messages).map(R).find((l)=>l.ts===s)}let a={channelId:o,ts:s};if(r)a.threadTs=r;if(i)a.msg=i;return a}async function dp(e,t,n,o,s){let r=M(t),i=await _a(e,t,s);if(!i)return console.error(`\u2717 ${r}: permalink (\u307E\u305F\u306F 'C\u2026:1700000000.000100') \u3067\u306F\u3042\u308A\u307E\u305B\u3093`),null;if(!i.msg)return console.error(`\u2717 ${r}: \u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093`),null;let a=i.msg;if(!(!!n?.userId&&a.user===n.userId||!!n?.botId&&a.bot_id===n.botId))return console.error(`\u2717 ${r}: \u81EA\u5206\uFF08${er(n,o)}\uFF09\u304C\u6295\u7A3F\u3057\u305F\u8CEA\u554F\u3067\u306F\u3042\u308A\u307E\u305B\u3093`+`${o?"":" \u2014 bot \u304C\u51FA\u3057\u305F\u8CEA\u554F\u306A\u3089 --as-bot \u3067"}`),null;let l=typeof a.text==="string"?a.text:"",u=St(l);if(u.kind==="void")return"void";if(u.kind==="resolved")return console.error(`\u2717 ${r}: \u56DE\u7B54\u6E08\u307F\u306E\u8CEA\u554F\u3067\u3059\uFF08\u56DE\u7B54: ${M(u.answer.split(`
|
|
413
|
+
`)[0]??"")}\uFF09\u2014 \u5909\u66F4\u3067\u304D\u307E\u305B\u3093`),null;if(u.kind!=="open")return console.error(`\u2717 ${r}: \`slack ask\` \u306E\u8CEA\u554F\u3068\u3057\u3066\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093 \u2014 ${ms(l)}`),null;let d={link:t,channelId:i.channelId,ts:i.ts,parsed:u,msg:a};if(i.threadTs)d.threadTs=i.threadTs;return d}async function kw(e,t,n,o){let s=(i)=>typeof i==="string"&&i!==n?.userId;if(Y(t.msg.reactions).map(R).some((i)=>Re.some((a)=>a.name===i.name)&&Y(i.users).some(s)))return!0;if(Number(t.msg.reply_count)>0){let i=R(await We(e,t.channelId,t.ts,100,o));if(Y(i.messages).map(R).some((a)=>Number(a.ts)>Number(t.ts)&&s(a.user)&&!a.bot_id))return!0}if(t.channelId.startsWith("D")){let i=R(await tt(e,t.channelId,30,t.ts,void 0,o,!0));if(Y(i.messages).map(R).some((a)=>Number(a.ts)>Number(t.ts)&&s(a.user)&&!a.bot_id))return!0}return!1}async function xw(e,t){let n=await Me(e,t.cookie),o=await dp(e,t.link,n,t.asBot,t.cookie);if(o==="void")console.error(`\u2717 ${M(t.link)}: \u7121\u52B9\u5316\u6E08\u307F\u306E\u8CEA\u554F\u306F\u7DE8\u96C6\u3067\u304D\u307E\u305B\u3093`),process.exit(se);if(!o)process.exit(se);let s=o.parsed,r=async(x)=>{let _=Os(Le(x)),F=await zt(t.mentionToken,_.text,o.channelId,t.mentionCookie);return ip(F.unresolved),F.text},i=t.question!==void 0?await r(t.question):s.question,a=t.body!==void 0?await r(t.body):s.body,c=[...s.reactable,...s.overflow],l=t.choices?t.choices.map(Le):c,u=JSON.stringify(l.map(Oe))!==JSON.stringify(c.map(Oe));if(u&&await kw(e,o,n,t.cookie))console.error(`\u2717 \u3053\u306E\u8CEA\u554F\u306B\u306F\u3082\u3046\u56DE\u7B54\uFF08\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3\u304B\u8FD4\u4FE1\uFF09\u304C\u3042\u308A\u307E\u3059 \u2014 \u9078\u629E\u80A2\u3092\u5909\u3048\u308B\u3068\u3001\u62BC\u3055\u308C\u305F\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u610F\u5473\u304C\u5909\u308F\u3063\u3066\u3057\u307E\u3044\u307E\u3059\u3002
|
|
400
414
|
`+` \u8CEA\u554F\u6587\u3068\u672C\u6587\u306F\u5909\u3048\u3089\u308C\u307E\u3059\u3002\u9078\u629E\u80A2\u3092\u5909\u3048\u308B\u306A\u3089\u7121\u52B9\u5316\u3057\u3066\u51FA\u3057\u76F4\u3057\u3066\u304F\u3060\u3055\u3044:
|
|
401
|
-
`+` slack ask --void='${
|
|
402
|
-
${a}`.matchAll(/<@([UW][A-Z0-9]+)(?:\|[^>]*)?>/g)].some((
|
|
403
|
-
${a}`)||o.channelId.startsWith("D")))console.error("\u2717 \u8AB0\u306B\u3082\u5B9B\u3066\u3089\u308C\u3066\u3044\u306A\u3044\u8CEA\u554F\u306B\u306A\u308A\u307E\u3059 \u2014 \u56DE\u7B54\u3067\u304D\u308B\u4EBA\u3092 @ \u3067\u6B8B\u3057\u3066\u304F\u3060\u3055\u3044"),process.exit(
|
|
404
|
-
`).map((
|
|
405
|
-
`).map((
|
|
406
|
-
(${
|
|
407
|
-
`)[0]??"").replace(/^:question: /,""),
|
|
408
|
-
${
|
|
409
|
-
slack ask ${c.map((l)=>`--void='${l.link}'`).join(" ")} --reason 'stale'${a?" --as-bot":""}`)}}async function
|
|
410
|
-
(${
|
|
411
|
-
`)[0]??"")}\uFF09`),s++;continue}if(h.kind!=="open"){let g=
|
|
412
|
-
${
|
|
415
|
+
`+` slack ask --void='${M(t.link)}' --reask${t.asBot?" --as-bot":""} \u2026`),process.exit(se);if(!([...`${i}
|
|
416
|
+
${a}`.matchAll(/<@([UW][A-Z0-9]+)(?:\|[^>]*)?>/g)].some((x)=>x[1]!==n?.userId)||/<!(?:here|channel|everyone)/.test(`${i}
|
|
417
|
+
${a}`)||o.channelId.startsWith("D")))console.error("\u2717 \u8AB0\u306B\u3082\u5B9B\u3066\u3089\u308C\u3066\u3044\u306A\u3044\u8CEA\u554F\u306B\u306A\u308A\u307E\u3059 \u2014 \u56DE\u7B54\u3067\u304D\u308B\u4EBA\u3092 @ \u3067\u6B8B\u3057\u3066\u304F\u3060\u3055\u3044"),process.exit(se);let h=t.lang?Ri({flag:t.lang})?.lang??s.lang:s.lang,m=l.slice(0,xt),p=l.slice(xt),g=typeof o.msg.text==="string"?o.msg.text:"",w=Bi(i,a,m,p,s.threadOnly,h),b=Eo(g);if(b.length)w=_o(w,b,h);if(Je(w,t.allowUrlAdjacent),w===g){console.error("\u5909\u66F4\u306F\u3042\u308A\u307E\u305B\u3093\u3002");return}let k=De("ask-edit",`${o.channelId}:${o.ts}`,w,n?.userId??"");if(t.code!==k){let x=(_,F,I)=>F===I?[` ${_}: (unchanged)`]:[` ${_}:`,...F.split(`
|
|
418
|
+
`).map((S)=>` - ${S}`),...I.split(`
|
|
419
|
+
`).map((S)=>` + ${S}`)];xe(t.code,k,["--- Editing question --------------------------",Se(n,{asBot:t.asBot}),` ${M(t.link)}`,...x("Question",s.question,i),...x("Body",s.body,a),...u?[" Choices (nobody has answered yet \u2014 pills are re-seeded):",...c.map((_,F)=>` - ${F+1}. ${Oe(_)}`),...l.map((_,F)=>` + ${F+1}. ${Oe(_)}`)]:[" Choices: (unchanged)"],...h!==s.lang?[` Language: ${s.lang} \u2192 ${h} (the instructions are rewritten)`]:[],"----------------------------------------------"])}if(await _t(e,o.channelId,o.ts,w,t.cookie,!0),u){for(let x of[...s.reactable.map((_,F)=>Re[F].name),Nt])try{await bn(e,o.channelId,o.ts,x,t.cookie)}catch{}await Ao([...m.map((x,_)=>Re[_].name),Nt],(x)=>Jt(e,o.channelId,o.ts,x,t.cookie),(x,_)=>console.error(` (\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3 ${x} \u3092\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: ${_ instanceof Error?_.message:String(_)})`))}console.error(`\u2713 \u7DE8\u96C6\u3057\u307E\u3057\u305F: ${M(t.link)}`)}async function Sw(e,t){let n={kind:"ask",limit:t.limit};if(t.channel)n.channel=t.channel;let o=Yi(n);if(!o)console.error(`Error: ${Ds}
|
|
420
|
+
(${yt()})`),process.exit(se);let s;if(t.stale){if(s=Oo(t.stale),s===void 0)console.error(`Error: --stale needs a duration like 24h / 3d (got ${M(t.stale)})`),process.exit(se)}let r=[];for(let a of o){if(s!==void 0&&a.sent_at>s)continue;let c=a.as_bot?e.bot:e.user,l=a.permalink||`${a.channel}:${a.ts}`,u="unknown",d=(a.text.split(`
|
|
421
|
+
`)[0]??"").replace(/^:question: /,""),f;if(c)try{let m=await nr(c,{channelId:a.channel,ts:a.ts,threadTs:a.thread_ts??void 0},a.as_bot?void 0:e.cookie);if(!m.msg)u="gone";else{let p=St(typeof m.msg.text==="string"?m.msg.text:"");if(u=p.kind==="resolved"?"answered":p.kind==="other"?"edited":p.kind,p.kind!=="other"&&p.question)d=p.question;if(p.kind==="resolved")f=p.answer}}catch{u="unknown"}if(t.state!=="all"&&u!==t.state)continue;let h={state:u,age_h:Math.round((Date.now()-a.sent_at)/3600000),asBot:!!a.as_bot,channel:a.channel,target:a.target??a.channel,link:l,question:Oe(d)};if(f!==void 0)h.answer=f;r.push(h)}if(t.json)console.log(JSON.stringify(r));else{for(let a of r)console.log(`${a.state.padEnd(8)} ${String(a.age_h).padStart(4)}h ${a.asBot?"bot ":"user"} ${M(a.target)} ${a.link}
|
|
422
|
+
${M(a.question).slice(0,100)}`);console.error(`${r.length} question(s)${t.state==="all"?"":` in state "${t.state}"`}${t.stale?`, older than ${t.stale}`:""}.`)}let i=r.filter((a)=>a.state==="open");if(t.stale&&i.length)for(let a of[!1,!0]){let c=i.filter((l)=>l.asBot===a);if(!c.length)continue;console.error(`\u7121\u52B9\u5316\u3059\u308B\u306A\u3089 (${c.length} \u4EF6, ${a?"bot":"user"}):
|
|
423
|
+
slack ask ${c.map((l)=>`--void='${l.link}'`).join(" ")} --reason 'stale'${a?" --as-bot":""}`)}}async function Ew(e,t){let n=ud(t.sinceMs);if(!n)console.error(`Error: ${Ds}
|
|
424
|
+
(${yt()})`),process.exit(se);let o=t.channel?n.filter((l)=>l.channel===t.channel||l.target===t.channel):n,s=[],r={unanswered:0,ambiguous:0,resolved:0,void:0},i=[],a=e.user?(await Me(e.user,e.cookie))?.team??"":e.bot?(await Me(e.bot))?.team??"":"",c=new Map;for(let l of o){if(l.team&&a&&l.team!==a){c.set(l.team,(c.get(l.team)??0)+1);continue}let u=l.permalink||`${l.channel}:${l.ts}`,d=!!l.as_bot,f=d?e.bot:e.user;if(!f){i.push(`${u}: ${d?"--as-bot \u3067\u805E\u3044\u305F\u8CEA\u554F\u3067\u3059\u304C bot token \u304C\u3042\u308A\u307E\u305B\u3093":"user token \u304C\u3042\u308A\u307E\u305B\u3093"}`);continue}let h=d?void 0:e.cookie,m=l.delivered_cursor??void 0;try{let p={channelId:l.channel,ts:l.ts,threadTs:l.thread_ts??void 0},g=await nr(f,p,h);if(!g.msg){i.push(`${u}: \u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 (\u524A\u9664?)`);continue}let w=await pp(f,{channelId:l.channel,ts:l.ts,msg:g.msg},h),b=w.parsed;if(b.kind==="resolved"){r.resolved++;continue}if(b.kind==="void"){r.void++;continue}if(b.kind==="other"){i.push(`${u}: \`slack ask\` \u306E\u8CEA\u554F\u3068\u3057\u3066\u8AAD\u3081\u307E\u305B\u3093 \u2014 ${ms(w.text)}`);continue}if(!w.audience.size&&!w.broadcast){i.push(`${u}: \u8AB0\u306B\u3082\u5B9B\u3066\u3089\u308C\u3066\u3044\u306A\u3044\u8CEA\u554F\u3067\u3059`);continue}let k=hp(w,b,p,{timeout:0,link:u,asBot:d,json:!1,cookie:h,after:m}),x=cp(f,k,!0),_=await x.poll(),F=x.state.unchosen;if(x.state.voided){r.void++;continue}let I=qn(u,d,m),S={row:l,link:u,question:b.question,collect:I,alive:dd(l)};if(_)s.push({...S,answer:_.answer,how:_.how,freeText:!1});else if(F&&!F.ambiguous&&F.text!==l.delivered_answer)s.push({...S,answer:F.text,how:"\u8FD4\u4FE1 (\u9078\u629E\u80A2\u5916)",freeText:!0});else if(F?.ambiguous)r.ambiguous++;else r.unanswered++}catch(p){i.push(`${u}: ${p instanceof Error?p.message:String(p)}`)}}if(t.json)for(let l of s){let u=l.row;console.log(JSON.stringify({id:u.id,link:l.link,channel:u.channel,ts:u.ts,asked_at:u.sent_at,question:l.question,answer:l.answer,how:l.how,free_text:l.freeText,sender:{session_id:u.session_id??null,cli:u.cli??null,agent_pid:u.agent_pid??null,pid:u.pid,alive:l.alive,cwd:u.cwd,git_branch:u.git_branch??null,host:u.host??null},delivered_at:u.delivered_at??null,collect:l.collect}))}else{let l=new Map;for(let u of s){let d=u.row.session_id?`session ${u.row.session_id}`:`pid ${u.row.agent_pid??u.row.pid}`;l.set(d,[...l.get(d)??[],u])}for(let[u,d]of l){let f=d[0].row;console.log(`${M(u)} ${M(f.cli??"?")} pid ${f.agent_pid??f.pid} ${d[0].alive?"(alive)":"(gone)"}${f.git_branch?` branch=${M(f.git_branch)}`:""} cwd=${M(f.cwd)}`);for(let h of d)console.log(` ${M(h.link)} (${Fs(h.row.sent_at/1000)})`),console.log(` Q: ${M(Oe(h.question))}`),console.log(` A: ${M(Oe(h.answer))} \u2014 ${M(h.how)}${h.freeText?" \u2014 \u6C7A\u5B9A\u3067\u306F\u3042\u308A\u307E\u305B\u3093":""}`),console.log(` collect: ${M(h.collect)}`)}}for(let l of i)console.error(` (${M(l)})`);for(let[l,u]of c)console.error(` (${u} \u4EF6\u306F\u5225\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u300C${M(l)}\u300D\u306E\u8CEA\u554F\u3067\u3059 \u2014 slack -w <name> ask --pending \u3067\u78BA\u8A8D)`);console.error(`${s.length} \u4EF6\u304C\u56DE\u7B54\u6E08\u307F\u30FB\u672A\u56DE\u53CE, ${r.unanswered} \u4EF6\u304C\u672A\u56DE\u7B54`+(r.ambiguous?`, ${r.ambiguous} \u4EF6\u306F\u8FD4\u4FE1\u304C\u8907\u6570\u306E\u9078\u629E\u80A2\u306B\u4E00\u81F4 (\u672A\u78BA\u5B9A)`:"")+(r.resolved?`, ${r.resolved} \u4EF6\u306F \u2705 \u56DE\u53CE\u6E08\u307F`:"")+(r.void?`, ${r.void} \u4EF6\u306F\u7121\u52B9\u5316\u6E08\u307F`:"")+` \u2014 ${o.length} \u4EF6\u306E\u672A\u56DE\u53CE\u306E\u8CEA\u554F\u3092\u78BA\u8A8D (log: ${yt()})`)}async function fp(e,t,n,o,s){let r=M(t.link);try{let i=Ou(t.parsed.question,n,t.parsed.lang,t.parsed.body||void 0,o);await _t(e,t.channelId,t.ts,i,s,!0)}catch(i){return console.error(`\u2717 ${r}: \u66F8\u304D\u63DB\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${i instanceof Error?i.message:String(i)}`),!1}for(let i of[...t.parsed.reactable.map((a,c)=>Re[c].name),Nt])try{await bn(e,t.channelId,t.ts,i,s)}catch{}try{await Jt(e,t.channelId,t.ts,vi,s)}catch(i){console.error(` (${r}: \uD83D\uDEAB \u30EA\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: ${i instanceof Error?i.message:String(i)})`)}return console.error(`\u2713 \u7121\u52B9\u5316: ${r}`),!0}async function _w(e,t){let n=await Me(e,t.cookie);if(t.supersededBy){let a=M(t.supersededBy),c=!1;try{let l=await _a(e,t.supersededBy,t.cookie);if(c=!!l?.msg,!l)console.error(`Error: --superseded-by must be a message permalink (or 'C\u2026:1700000000.000100'): ${a}`),process.exit(se)}catch(l){console.error(`Error: --superseded-by \u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093: ${a} (${l instanceof Error?l.message:String(l)})`),process.exit(se)}if(!c)console.error(`Error: --superseded-by \u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${a}`),process.exit(se)}let o=[],s=0;for(let a of t.links){let c=M(a),l=await _a(e,a,t.cookie);if(!l){console.error(`\u2717 ${c}: permalink (\u307E\u305F\u306F 'C\u2026:1700000000.000100') \u3067\u306F\u3042\u308A\u307E\u305B\u3093`),s++;continue}if(!l.msg){console.error(`\u2717 ${c}: \u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093`),s++;continue}let u=l.msg;if(!(!!n?.userId&&u.user===n.userId||!!n?.botId&&u.bot_id===n.botId)){console.error(`\u2717 ${c}: \u81EA\u5206\uFF08${er(n,t.asBot)}\uFF09\u304C\u6295\u7A3F\u3057\u305F\u8CEA\u554F\u3067\u306F\u306A\u3044\u306E\u3067\u7121\u52B9\u5316\u3067\u304D\u307E\u305B\u3093`+`${t.asBot?"":" \u2014 bot \u304C\u51FA\u3057\u305F\u8CEA\u554F\u306A\u3089 --as-bot \u3067"}`),s++;continue}let f=typeof u.text==="string"?u.text:"",h=St(f),m=!1;if(h.kind==="void"){console.error(`- ${c}: \u3059\u3067\u306B\u7121\u52B9\u5316\u6E08\u307F\u3067\u3059\uFF08\u4F55\u3082\u3057\u307E\u305B\u3093\uFF09`);continue}if(h.kind==="resolved"){console.error(`\u2717 ${c}: \u56DE\u7B54\u6E08\u307F\u306E\u8CEA\u554F\u306F\u7121\u52B9\u5316\u3067\u304D\u307E\u305B\u3093\uFF08\u56DE\u7B54: ${M(h.answer.split(`
|
|
425
|
+
`)[0]??"")}\uFF09`),s++;continue}if(h.kind!=="open"){let g=Pu(f);if(!g){console.error(`\u2717 ${c}: \`slack ask\` \u306E\u8CEA\u554F\u3068\u3057\u3066\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093 \u2014 ${ms(f)}`),s++;continue}let w=Y(u.reactions).map(R).filter((b)=>Y(b.users).includes(n?.userId??"\x00")).map((b)=>Re.findIndex((k)=>k.name===b.name)).filter((b)=>b>=0);h={kind:"open",question:g.question,body:g.body,reactable:Array.from({length:w.length?Math.max(...w)+1:0},()=>""),overflow:[],threadOnly:!0,lang:Oi(f)??"ja"},m=!0}let p=Y(u.reactions).map(R).filter((g)=>typeof g.name==="string"&&Re.some((w)=>w.name===g.name)).filter((g)=>Y(g.users).some((w)=>w!==n?.userId)).map((g)=>`:${String(g.name)}:`);o.push({link:a,channelId:l.channelId,ts:l.ts,text:f,parsed:h,pressed:p,...m?{unreadable:m}:{}})}if(!o.length)console.error(s?"\u7121\u52B9\u5316\u3067\u304D\u308B\u8CEA\u554F\u304C\u3042\u308A\u307E\u305B\u3093\u3002":"\u4F55\u3082\u3059\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u305B\u3093\u3002"),process.exit(s?se:0);let r=De("ask-void",...o.map((a)=>`${a.channelId}:${a.ts}`),t.reason,t.supersededBy??"",n?.userId??"");if(t.code!==r)xe(t.code,r,["--- \u7121\u52B9\u5316 (void) -------------------------------",Se(n,{asBot:t.asBot}),` Reason: ${t.reason?M(t.reason):"(none)"}`,...t.supersededBy?[` Replaced: ${M(t.supersededBy)}`]:[],` ${o.length} question(s):`,...o.map((a)=>` \u2022 ${M(a.link)}
|
|
426
|
+
${M(a.parsed.question.split(`
|
|
413
427
|
`)[0]??"").slice(0,100)}`+(a.pressed.length?`
|
|
414
428
|
(already pressed: ${a.pressed.join(" ")} \u2014 left in place, never collected)`:"")+(a.unreadable?`
|
|
415
|
-
\u26A0 its layout no longer reads as an ask (edited by hand?) \u2014 voided from a best-effort read: question and the rest of the text kept as they are`:""))," Each becomes \uD83D\uDEAB (body kept, options and instructions removed); our pills and \u2753 come off; a \uD83D\uDEAB reaction is added.",...s?[` (${s} link(s) above were refused and will be skipped)`]:[],"----------------------------------------------"]);let i=0;for(let a of o)if(!await
|
|
416
|
-
`+` Got: ${
|
|
417
|
-
${
|
|
418
|
-
`+` (\u62BC\u3055\u308C\u305F\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u6B8B\u3063\u3066\u3044\u307E\u3059: slack read '${
|
|
419
|
-
`+` To reach yourself with a notification, post as the bot: slack poll '${t.target}' '...' --as-bot`);let l=
|
|
420
|
-
`)[0]??"").slice(0,100)}`,"--- Ballot (seeded as reactions) -------------",...g.map((L,
|
|
421
|
-
`+` Got: ${
|
|
422
|
-
`+" \u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u66F8\u304D\u63DB\u3048\u3089\u308C\u308B\u306E\u306F\u6295\u7A3F\u8005\u3060\u3051\u3067\u3059 \u2014 bot \u304C\u6295\u7A3F\u3057\u305F\u6295\u7968\u306A\u3089 --as-bot \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002")}if(l.ambiguous.length){let h=await Promise.all(l.ambiguous.map((
|
|
423
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);return e}async function
|
|
424
|
-
`+` To be notified, schedule it as the bot: slack schedule send '${t.target}' '...' --at '${t.at}' --as-bot`);let l=
|
|
429
|
+
\u26A0 its layout no longer reads as an ask (edited by hand?) \u2014 voided from a best-effort read: question and the rest of the text kept as they are`:""))," Each becomes \uD83D\uDEAB (body kept, options and instructions removed); our pills and \u2753 come off; a \uD83D\uDEAB reaction is added.",...s?[` (${s} link(s) above were refused and will be skipped)`]:[],"----------------------------------------------"]);let i=0;for(let a of o)if(!await fp(e,a,t.reason,t.supersededBy,t.cookie))i++;process.exit(i||s?se:0)}async function Cw(e,t){let n=Kt(t.link),o,s,r;if(n?.ts)o=n.channel,s=n.ts,r=n.threadTs&&n.threadTs!==n.ts?n.threadTs:void 0;else{let p=t.link.match(/^([A-Za-z0-9]+):(\d{10}\.\d{6})$/);if(!p)console.error(`Error: --waitFor needs the permalink of a question (or 'C\u2026:1700000000.000100').
|
|
430
|
+
`+` Got: ${M(t.link)}`),process.exit(se);o=p[1],s=p[2]}let i=await nr(e,{channelId:o,ts:s,threadTs:r},t.cookie);if(!i.msg)console.error(`Error: \u305D\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${M(t.link)}`),process.exit(se);let a=i.msg,c=await pp(e,{channelId:o,ts:s,msg:a},t.cookie),{text:l,parsed:u,audience:d,broadcast:f,askerUserId:h,askerBotId:m}=c;if(u.kind==="other")console.error("Error: \u3053\u308C\u306F `slack ask` \u306E\u8CEA\u554F\u3068\u3057\u3066\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3002\n"+` \u7406\u7531: ${ms(l)}
|
|
431
|
+
${M(t.link)}
|
|
432
|
+
`+` (\u62BC\u3055\u308C\u305F\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u6B8B\u3063\u3066\u3044\u307E\u3059: slack read '${M(t.link)}' \u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059)`),process.exit(se);if(u.kind==="void"){if(up(u,t.link),t.json)await Sn(e,{json:!0,shown:t.link,asBot:t.asBot,cookie:t.cookie},{status:"void",answer:null,reason:u.reason,...u.supersededBy?{supersededBy:u.supersededBy}:{},notes:[],cursor:Gt(s,t.after)});process.exit(op)}if(u.kind==="resolved"){console.error(`\u2713 \u56DE\u7B54\u6E08\u307F: ${M(u.question)}`);let p=typeof R(a.edited).ts==="string"?String(R(a.edited).ts):void 0,g=Lu(l),w=!1,b=(F)=>{if(w||!g.byReply)return!1;if(p&&Number(F.ts)>Number(p))return!1;let I=typeof F.text==="string"?F.text.trim():"",S=I===u.answer||g.n!==void 0&&(new RegExp(`^[(\uFF08]?${g.n}(?![0-9])`).test(I)||Bu(I,u.answer,g.n));if(S)w=!0;return S},k=t.after,x=[];if(d.size||f){let F=(I)=>typeof I==="string"&&!!I&&I!==h&&(f||d.has(I));x=await ap(e,{channelId:o,ts:s,threadOnly:!!r||!o.startsWith("D"),replyCount:Number(a.reply_count)||0,isAnswerer:F,askerUserId:h,askerBotId:m,...r?{threadParentTs:r}:{},...t.cookie?{cookie:t.cookie}:{}},k,b)}let _=Gt(s,k,...x.map((F)=>F.ts));await Sn(e,{json:t.json,shown:t.link,asBot:t.asBot,cookie:t.cookie},{status:"answered",answer:u.answer,notes:x,cursor:_}),Xi(o,s,u.answer,_);return}if(!d.size&&!f)console.error(`Error: \u3053\u306E\u8CEA\u554F\u306F\u8AB0\u306B\u3082\u5B9B\u3066\u3089\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u3001\u6709\u52B9\u306A\u56DE\u7B54\u8005\u3092\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093: ${M(t.link)}`),process.exit(se);if(t.timeout>0)console.error(` \u56DE\u7B54\u3092\u5F85\u3063\u3066\u3044\u307E\u3059 (\u6700\u5927 ${t.timeout}s)\u2026 Ctrl-C \u3067\u4E2D\u65AD`);await lp(e,hp(c,u,{channelId:o,ts:s,threadTs:r},t))}async function pp(e,t,n){let{msg:o}=t,s=typeof o.text==="string"?o.text:"",r=St(s),i=typeof o.user==="string"?o.user:"",a=typeof o.bot_id==="string"?o.bot_id:"",c=/<!(here|channel|everyone)(\^[^>]*)?(\|[^>]*)?>/.test(s),l=new Set;for(let u of s.matchAll(/<@([UW][A-Z0-9]+)>/g))if(u[1]!==i)l.add(u[1]);if(r.kind!=="other"&&!l.size&&!c){let u=await tr(e,t.channelId,n);if(u&&u!==i)l.add(u)}return{text:s,parsed:r,audience:l,broadcast:c,askerUserId:i,askerBotId:a}}function hp(e,t,n,o){let s={channelId:n.channelId,ts:n.ts,question:t.question,reactable:t.reactable,overflow:t.overflow,threadOnly:t.threadOnly,lang:t.lang,audience:e.audience,broadcast:e.broadcast,askerUserId:e.askerUserId,askerBotId:e.askerBotId,timeout:o.timeout,shown:o.link,asBot:o.asBot,json:o.json};if(n.threadTs)s.threadParentTs=n.threadTs;if(o.cookie)s.cookie=o.cookie;if(o.after)s.after=o.after;return s}var ct=3;function $w(e){return`slack poll --results='${e}'`}async function Fw(e,t){let{ref:n,threadTs:o}=Hn(t.target,!1),s=t.cookie,r=Ft(e,s),i;if(t.channelId)i=t.channelId;else if(t.userId)i=await Ct(e,t.userId,s);else i=await be(e,n,s);let a=(await r())?.userId??"",c=await tr(e,i,s);if(!t.asBot&&!!a&&c===a)console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you of your own message.
|
|
433
|
+
`+` To reach yourself with a notification, post as the bot: slack poll '${t.target}' '...' --as-bot`);let l=Os(Le(t.question)),u=Os(Le(t.body??"")),d=t.mentionToken??e,f=await zt(d,l.text,i,t.mentionCookie),h=u.text?await zt(d,u.text,i,t.mentionCookie):{text:"",resolved:[],unresolved:[]},m=f.text,p=h.text;for(let A of jo([...f.unresolved,...h.unresolved]))console.error(`\u26A0 ${M(A)}`);let g=t.choices.map(Le),w=!!t.multi,b=t.until??"",k=Hu(m,p,g,{multi:w,deadline:b});Je(k,t.allowUrlAdjacent);let x="",_="?";try{let A=await tt(e,i,1,void 0,void 0,s),L=Y(A.messages).map(R).filter((K)=>K.subtype===void 0||K.subtype===null)[0];x=typeof L?.text==="string"?L.text:"",_=typeof L?.user==="string"?await Pe(e,L.user,s):typeof L?.username==="string"?L.username:"?"}catch{}let F=await r(),I=await Qo(e,i,s),S=De(i,o??"",x,k,F?.userId??"");if(t.code!==S){let A=await Xt(e,i,n,s);xe(t.code,S,["--- Last message in channel ------------------",` ${_}: ${As(x.split(`
|
|
434
|
+
`)[0]??"").slice(0,100)}`,"--- Ballot (seeded as reactions) -------------",...g.map((L,K)=>` ${ht[K].glyph} ${ys(L)}`),"--- Posting ----------------------------------",Se(F,{asBot:t.asBot}),` \u2192 ${A}${o?" \u2014 THREAD REPLY":" \u2014 NEW top-level message"}`,` Question: ${m}`,` Rule: ${w?"1 \u4EBA \u4F55\u7968\u3067\u3082 (--multi)":"1 \u4EBA 1 \u7968"}${b?` \u2014 \u7DE0\u5207 ${b}`:""}`," Note: \u3042\u306A\u305F\u81EA\u8EAB\u306E\u7968\u306F\u6570\u3048\u307E\u305B\u3093 (\u30D4\u30EB\u306F\u3042\u306A\u305F\u304C\u4ED8\u3051\u305F\u7A2E\u306A\u306E\u3067\u533A\u5225\u3067\u304D\u307E\u305B\u3093)","--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],I)}let B=En("poll"),W=await wn(e,i,k,o,!1,s,!0,B.metadata);await Ao([ws,...g.map((A,L)=>ht[L].name)],(A)=>Jt(e,i,W,A,s),(A,L)=>{let K=L instanceof Error?L.message:String(L);if(A===ws)console.error(` (marker ${A} \u3092\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: ${K})`);else console.error(` (\u30EA\u30A2\u30AF\u30B7\u30E7\u30F3 ${A} \u3092\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: ${K})`)});let P="";try{P=await Mn(e,i,W,s)}catch{}let T=P||`${i}:${W}`;console.error(`\u2713 Posted: ${T}`),B.record({team:F?.team,channel:i,target:t.target,ts:W,threadTs:o,permalink:P,text:k,asBot:t.asBot}),console.log($w(T)),console.error(` \u7DE0\u3081\u5207\u308B: slack poll --close='${T}'${t.asBot?" --as-bot":""}`)}async function Aw(e,t,n){let o=Kt(t),s,r,i;if(o?.ts)s=o.channel,r=o.ts,i=o.threadTs&&o.threadTs!==o.ts?o.threadTs:void 0;else{let c=t.match(/^([A-Za-z0-9]+):(\d{10}\.\d{6})$/);if(!c)console.error(`Error: --results/--close needs the permalink of a poll (or 'C\u2026:1700000000.000100').
|
|
435
|
+
`+` Got: ${M(t)}`),process.exit(ct);s=c[1],r=c[2]}let a;if(i){let c=R(await We(e,s,i,100,n));a=Y(c.messages).map(R).find((l)=>l.ts===r)}else{let c=R(await tt(e,s,1,r,void 0,n,!0));a=Y(c.messages).map(R).find((l)=>l.ts===r)}if(!a)console.error(`Error: \u305D\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${M(t)}`),process.exit(ct);return{channelId:s,ts:r,msg:a}}function Uf(e){let t=Math.max(1,...e.map((n)=>n.count));return e.map((n,o)=>`${ht[o].glyph} ${String(n.count).padStart(3)} ${"\u2588".repeat(Math.round(n.count/t*20))}${n.count?" ":""}${n.choice}`)}async function Tw(e,t){let{channelId:n,ts:o,msg:s}=await Aw(e,t.link,t.cookie),r=typeof s.text==="string"?s.text:"",i=bs(r);if(i.kind==="other")console.error("Error: \u3053\u308C\u306F `slack poll` \u306E\u6295\u7968\u3067\u306F\u3042\u308A\u307E\u305B\u3093 (\u7968\u306E\u6570\u3048\u65B9\u304C\u5206\u304B\u308A\u307E\u305B\u3093)\u3002\n"+` ${M(t.link)}`),process.exit(ct);if(i.kind==="closed"){console.error(`\u2713 \u6295\u7968\u7D42\u4E86: ${M(i.question)}`);for(let h of Uf(i.tallies))console.log(h);return}let a=new Set;if(typeof s.user==="string"&&s.user)a.add(s.user);let c=await Id(e,n,o,t.cookie),l=Gu(i.choices,c,a,i.multi);console.error(`${M(i.question)}${i.deadline?` (\u7DE0\u5207 ${i.deadline})`:""}`);for(let h of Uf(l.tallies))console.log(h);let u=l.tallies.reduce((h,m)=>h+m.count,0);if(console.error(` \u8A08 ${u} \u7968${i.multi?" (\u8907\u6570\u9078\u629E\u53EF)":""}`),t.names)for(let h=0;h<l.voters.length;h++){if(!l.voters[h].length)continue;let m=await Promise.all(l.voters[h].map((p)=>Pe(e,p,t.cookie)));console.error(` ${ht[h].glyph} ${m.map((p)=>`@${M(p)}`).join(", ")}`)}let d=i.multi?[]:l.ambiguous,f=_o(r,d);if(f!==r&&!t.noNotify)try{await _t(t.writeToken??e,n,o,f,t.writeToken?t.writeCookie:t.cookie,!0)}catch(h){console.error(` (\u6295\u7968\u6587\u306B\u6CE8\u610F\u66F8\u304D\u3092\u5165\u308C\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: ${h instanceof Error?h.message:String(h)})
|
|
436
|
+
`+" \u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u66F8\u304D\u63DB\u3048\u3089\u308C\u308B\u306E\u306F\u6295\u7A3F\u8005\u3060\u3051\u3067\u3059 \u2014 bot \u304C\u6295\u7A3F\u3057\u305F\u6295\u7968\u306A\u3089 --as-bot \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002")}if(l.ambiguous.length){let h=await Promise.all(l.ambiguous.map((m)=>Pe(e,m,t.cookie)));console.error(`\u26A0 1 \u4EBA 1 \u7968\u306A\u306E\u306B\u8907\u6570\u62BC\u3057\u3066\u3044\u308B\u4EBA\u304C\u3044\u307E\u3059 (\u7121\u52B9\u7968): ${h.map((m)=>`@${M(m)}`).join(", ")}`)}if(!t.close)return;await _t(t.writeToken??e,n,o,zu(i.question,l.tallies),t.writeToken?t.writeCookie:t.cookie,!0);try{await Jt(t.writeToken??e,n,o,Ji,t.writeToken?t.writeCookie:t.cookie),await bn(t.writeToken??e,n,o,ws,t.writeToken?t.writeCookie:t.cookie)}catch{}console.error(`\u2713 \u6295\u7968\u3092\u7DE0\u3081\u5207\u308A\u307E\u3057\u305F: ${M(t.link)}`)}async function Iw(e){let t=await uo(e);for(let n of fo(t,!1))console.log(n);if(!t.ok)process.exit(1)}function qo(){let e=Ke();if(!e)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
437
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);return e}async function Jf(e,t,n,o){let s=await $t(n,e,o);return Ct(t,s)}function Rw(e){if(/^\d{10,}$/.test(e))return parseInt(e,10);let t=new Date(e.replace(" ","T"));if(isNaN(t.getTime()))throw Error(`Cannot parse time: ${e}`);return Math.floor(t.getTime()/1000)}function Ow(e){let t=new Date(e*1000);return`${new Intl.DateTimeFormat("sv-SE",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZoneName:"short"}).format(t).replace(/\u2212/g,"-")} (local) / ${t.toISOString()} (Unix: ${e})`}async function Pw(e,t){Je(t.message,t.allowUrlAdjacent);let n=Ft(e,t.cookie),{ref:o,threadTs:s}=Hn(t.target),r;if(t.channelId)r=t.channelId;else if(t.userId)r=await Ct(e,t.userId,t.cookie);else r=await be(e,o,t.cookie);let i=Rw(t.at),a=new Date(i*1000).toISOString(),c=await n();if(!t.asBot&&await Ia(e,r,c?.userId,t.cookie))console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you when this fires.
|
|
438
|
+
`+` To be notified, schedule it as the bot: slack schedule send '${t.target}' '...' --at '${t.at}' --as-bot`);let l=De(r,t.message,String(i),c?.userId??""),u=t.targetOverride?` [${t.targetOverride} \u2192 ${r}]`:"";if(t.code!==l){let f=await Qo(e,r,t.cookie);xe(t.code,l,["--- Scheduling message -----------------------",Se(c,{asBot:t.asBot,pad:9}),` To: ${o}${s?` (thread ${s})`:""}${u}`,` At: ${Ow(i)}`,` Message: ${t.message}`,"---------------------------------------------"],f,new Date(i*1000))}let d=await Cd(e,r,t.message,i,s,t.cookie);if(console.log(`\u2713 Scheduled (id: ${d}, at: ${a})`),t.asBot){if(console.error(` Scheduled as the bot \u2014 the user token cannot see or cancel it. Use the same flag:
|
|
425
439
|
`+` slack schedule ls --as-bot
|
|
426
|
-
slack schedule rm '${t.target}' ${d} --as-bot`),r.startsWith("D"))try{let
|
|
427
|
-
`)[0]?.slice(0,80)??""}`)}}async function
|
|
428
|
-
`+"Expected F\u2026 or https://<ws>.slack.com/lists/<TEAM>/<F-id>");let r=[],i;do{let c={limit:200};if(i)c.cursor=i;let l=o.asBot?await
|
|
429
|
-
`+" Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell)."),process.exit(1);return e}async function
|
|
430
|
-
`+" Add it under OAuth & Permissions \u2192 Bot Token Scopes in the Slack app config, then reinstall the app."),process.exit(1)}async function
|
|
431
|
-
`+"Expected F\u2026 or https://<ws>.slack.com/files/<UID>/<FID>/<name>");let r=
|
|
432
|
-
`),await
|
|
440
|
+
slack schedule rm '${t.target}' ${d} --as-bot`),r.startsWith("D"))try{let f=await uo(e);if(!f.ok)for(let h of fo(f,!0))console.error(h);else{let h=f.appId?`https://api.slack.com/apps/${f.appId}`:"https://api.slack.com/apps";console.error(`Note: if ${t.target} can't reply (app messaging may be off), enable Messages Tab: ${h} \u2192 App Home.`)}}catch{}}}async function Kf(e,t,n,o){let s;if(n)s=n;else if(t)s=await be(e,t,o);let i=(await $d(e,s,o)).scheduled_messages??[];if(i.length===0){console.log("(no scheduled messages)");return}for(let a of i){let c=new Date(a.post_at*1000).toISOString();console.log(`${a.id} ${c} [${a.channel_id}] ${a.text.split(`
|
|
441
|
+
`)[0]?.slice(0,80)??""}`)}}async function qf(e,t){let n;if(t.channelId)n=t.channelId;else n=await be(e,t.target,t.cookie);let o=await Me(e,t.cookie),s=De(n,t.id,o?.userId??"");if(t.code!==s)xe(t.code,s,["--- Deleting scheduled message ---------------",Se(o,{asBot:t.asBot,pad:9}),` Channel: ${t.target}${t.targetOverride?` [${t.targetOverride} \u2192 ${n}]`:""}`,` ID: ${t.id}`,"---------------------------------------------"]);await Fd(e,n,t.id,t.cookie),console.log(`\u2713 Deleted scheduled message ${t.id}`)}async function vw(e,t){if(t.comment!==void 0)Je(t.comment,t.allowUrlAdjacent);let n=Ft(e,t.cookie),{statSync:o,existsSync:s}=await import("fs"),{basename:r}=await import("path");for(let m of t.filePaths)if(!s(m))console.error(`Error: file not found: ${m}`),process.exit(1);let{ref:i,threadTs:a}=Hn(t.target),c;if(t.channelId)c=t.channelId;else if(t.userId)c=await Ct(e,t.userId,t.cookie);else c=await be(e,i,t.cookie);if(await Ia(e,c,(await n())?.userId,t.cookie))console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you of your own upload.`);let l=t.filePaths.length>1,u=t.filePaths.map((m)=>{let p=r(m),g=l?p:t.title??p;return{fp:m,filename:p,title:g,sizeFmt:Zo(o(m).size)}}),d=await n(),f=De(c,...u.flatMap((m)=>[m.fp,m.title]),d?.userId??"");if(t.code!==f){let m=` To: ${i}${a?` (thread ${a})`:""}`,p=l?[`--- Uploading ${u.length} files ------------------------`,Se(d,{pad:7}),m,...u.map((g)=>` ${g.filename} (${g.sizeFmt})`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]:["--- Uploading file ---------------------------",Se(d,{pad:7}),m,` File: ${u[0].fp}`,` Title: ${u[0].title}`,` Size: ${u[0].sizeFmt}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];xe(t.code,f,p)}let h=u.length;for(let m=0;m<h;m++){let p=u[m],g={title:p.title};if(a!==void 0)g.threadTs=a;if(t.comment!==void 0&&m===0)g.initialComment=t.comment;let{fileId:w,permalink:b}=await zd(e,c,p.fp,g,t.cookie),k=h>1?`[${m+1}/${h}] `:"";console.log(`${k}\u2713 Uploaded (file_id: ${w}${b?`, url: ${b}`:""})`)}}async function Lw(e,t,n){let o=n.channel?await be(e,n.channel,t):void 0,s=[],r=1,i=1;do{let c={page:r,count:200};if(n.types)c.types=n.types;if(o)c.channel=o;if(n.user)c.user=n.user;let l=R(await yd(e,c,t));for(let u of Y(l.files))s.push(R(u));i=Number(R(l.paging).pages??1),r++}while(s.length<n.limit&&r<=i);let a=s.slice(0,n.limit);if(n.format==="jsonl"){for(let c of a)console.log(JSON.stringify({id:c.id??null,name:c.name??c.title??null,filetype:c.filetype??null,size:c.size??null,user:c.user??null,created:c.created??null,permalink:c.permalink??null}));return}for(let c of a){let l=String(c.id??""),u=typeof c.name==="string"?c.name:typeof c.title==="string"?c.title:l,d=typeof c.filetype==="string"?c.filetype:"?",f=typeof c.size==="number"?Zo(c.size):"";console.log(`${l} ${d.padEnd(7)} ${f.padStart(9)} ${u}`)}}function sr(e){if(/^F[A-Z0-9]+$/i.test(e))return e;return e.match(/\/lists\/[A-Za-z0-9]+\/(F[A-Za-z0-9]+)/i)?.[1]??e.match(/\/lists\/(F[A-Za-z0-9]+)/i)?.[1]}function Bw(e){if(typeof e.text==="string"&&e.text)return e.text;let t=e.value;if(typeof t==="string"||typeof t==="number"||typeof t==="boolean")return String(t);if(Array.isArray(t))return t.map((n)=>typeof n==="string"?n:String(R(n).text??R(n).name??R(n).value??"")).filter(Boolean).join(", ");for(let n of["rich_text","select","user","date","number","checkbox","email","phone"]){let o=e[n];if(o!=null)return typeof o==="object"?JSON.stringify(o):String(o)}return""}async function Mw(e,t,n,o){let s=sr(n);if(!s)throw Error(`Not a list ID or list URL: ${n}
|
|
442
|
+
`+"Expected F\u2026 or https://<ws>.slack.com/lists/<TEAM>/<F-id>");let r=[],i;do{let c={limit:200};if(i)c.cursor=i;let l=o.asBot?await na(Ps(),s,c):R(await xd(e,s,c,t));for(let d of Y(l.items??l.records))r.push(R(d));let u=R(l.response_metadata).next_cursor;i=typeof u==="string"&&u?u:void 0}while(i&&r.length<o.limit);let a=r.slice(0,o.limit);if(o.format==="jsonl"){for(let c of a)console.log(JSON.stringify(c));return}for(let c of a){let l=String(c.id??""),u=Y(c.fields).map(R).map((d)=>{let f=String(d.key??d.column_id??"?"),h=Bw(d);return h?`${f}=${h}`:""}).filter(Boolean);console.log(`${l} ${u.join(" | ")}`)}}function Ps(){let e=Ke();if(!e)console.error(`Error: Slack List writes go through the public slackLists.* API, which needs a bot token (xoxb-) \u2014 none was found.
|
|
443
|
+
`+" Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell)."),process.exit(1);return e}async function or(e){let t=[];try{t=(await Ut(e)).scopes}catch{return}if(t.length&&!t.includes("lists:write"))console.error(`Error: the bot token lacks the lists:write scope (needed for slackLists.* writes).
|
|
444
|
+
`+" Add it under OAuth & Permissions \u2192 Bot Token Scopes in the Slack app config, then reinstall the app."),process.exit(1)}async function Nw(e,t){try{let n=await ea(e);if(n.url&&n.teamId)return`${n.url.replace(/\/$/,"")}/lists/${n.teamId}/${t}`}catch{}return t}async function gp(e,t){let n=await na(e,t,{limit:1,includeList:!0}),o=ed(R(n.list));if(!o.length)throw Error(`could not read the column schema of list ${t}`);return o}function rr(e){console.error(pe(e)),process.exit(1)}async function jw(e){let t=e.cols.map(Zu),n=Qu(t),o=Ps();await or(o);let s=await Me(o),r=De("lists-create",e.name,JSON.stringify(n),String(e.todo),s?.userId??"");if(e.code!==r)xe(e.code,r,["--- Creating Slack List ----------------------",Se(s,{asBot:!0,pad:9}),` name: ${e.name}`,...t.map((c,l)=>` column: ${c.name} (${c.type}${c.choices?`: ${c.choices.join("/")}`:""})${l===0?" [primary]":""}`),` todo: ${e.todo?"on (adds Completed / Assignee / Due date)":"off"}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let i;try{i=await wd(o,e.name,n,e.todo)}catch(c){rr(c)}let a=String(i.list_id??R(i.list).id??"");console.log(`\u2713 Created list ${e.name} (${a})`),console.log(await Nw(o,a))}async function Ww(e){let t=sr(e.list);if(!t)throw Error(`Not a list ID or list URL: ${e.list}`);let n=Ps();await or(n);let o=await gp(n,t),r=[{col:o.find((u)=>u.type==="text")??o[0],value:e.text},...Hi(e.sets).map((u)=>({col:Ki(o,u.col),value:u.value}))],i=r.map((u)=>({column_id:u.col.id,...qi(u.col,u.value)})),a=await Me(n),c=De("lists-add",t,JSON.stringify(i),a?.userId??"");if(e.code!==c)xe(e.code,c,["--- Adding a row to Slack List ---------------",Se(a,{asBot:!0,pad:9}),` list: ${t}`,...r.map((u)=>` ${(u.col.name||u.col.key).padEnd(8)} ${u.value}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let l;try{l=await bd(n,t,i)}catch(u){rr(u)}console.log(`\u2713 Added row ${String(R(l.item).id??"")} ${e.text}`)}async function Uw(e){let t=sr(e.list);if(!t)throw Error(`Not a list ID or list URL: ${e.list}`);let n=Ps();await or(n);let o=await gp(n,t),s=Hi(e.sets).map((c)=>({col:Ki(o,c.col),value:c.value}));if(e.done!==void 0){let c=td(o);if(!c)throw Error(`list ${t} has no Completed column \u2014 it was not created with todo mode`);s.push({col:{...c,type:"checkbox"},value:String(e.done)})}if(!s.length)throw Error("nothing to set \u2014 pass --set name=value and/or --done / --no-done");let r=s.map((c)=>({row_id:e.row,column_id:c.col.id,...qi(c.col,c.value)})),i=await Me(n),a=De("lists-set",t,e.row,JSON.stringify(r),i?.userId??"");if(e.code!==a)xe(e.code,a,["--- Updating Slack List row -----------------",Se(i,{asBot:!0,pad:9}),` list: ${t}`,` row: ${e.row}`,...s.map((c)=>` ${(c.col.name||c.col.key).padEnd(8)} ${c.value}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);try{await kd(n,t,r)}catch(c){rr(c)}console.log(`\u2713 Updated row ${e.row}`)}async function Jw(e){let t=sr(e.list);if(!t)throw Error(`Not a list ID or list URL: ${e.list}`);if(!e.users.length===!e.channels.length)throw Error("pass --user or --channel (Slack takes one kind per call, not both)");if(e.level==="owner"&&e.channels.length)throw Error("only a user can be made owner");let n=Ps();await or(n);let o=e.users.length?e.users:e.channels,s=await Me(n),r=De("lists-share",t,e.level,o.join(","),s?.userId??"");if(e.code!==r)xe(e.code,r,["--- Sharing Slack List ----------------------",Se(s,{asBot:!0,pad:9}),` list: ${t}`,` ${e.users.length?"users: ":"channels:"} ${o.join(", ")}`,` access: ${e.level}${e.level==="owner"?" \u26A0 transfers ownership":""}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);try{await Dd(n,t,e.level,e.users.length?{userIds:e.users}:{channelIds:e.channels})}catch(i){rr(i)}console.log(`\u2713 Granted ${e.level} on ${t} to ${o.join(", ")}`)}function Kw(e){if(/^F[A-Z0-9]+$/i.test(e))return e;return e.match(/\/files\/[A-Za-z0-9]+\/(F[A-Za-z0-9]+)/)?.[1]}async function qw(e,t,n,o){let s=Kw(n);if(!s)throw Error(`Not a file ID or file permalink: ${n}
|
|
445
|
+
`+"Expected F\u2026 or https://<ws>.slack.com/files/<UID>/<FID>/<name>");let r=R(await md(e,s,t)),i=R(r.file),a=typeof i.name==="string"?i.name:typeof i.title==="string"?i.title:s,c=typeof i.url_private_download==="string"?i.url_private_download:typeof i.url_private==="string"?i.url_private:"";if(!c)throw Error(`files.info returned no download URL for ${s}`);let l={Authorization:`Bearer ${e}`};if(t)l.Cookie=`d=${t}`;let u=await fetch(c,{headers:l});if(!u.ok)throw Error(`Download failed: HTTP ${u.status} ${u.statusText}`);let d=Buffer.from(await u.arrayBuffer()),{statSync:f,existsSync:h}=await import("fs"),{basename:m}=await import("path"),p=o??a;if(o&&h(o)&&f(o).isDirectory())p=wt(o,m(a));Yf(p,d),console.log(`\u2713 Downloaded ${a} (${Zo(d.length)}) \u2192 ${p}`)}async function Hw(){$f(),Ay();let e=(s)=>ns(s.workspace),t=(s)=>Jr(s.workspace),n={state:{type:"string",choices:["open","untriaged","pending","doing","done","dropped","stuck"],default:"open",describe:"open (default) = marked and not done/dropped; untriaged = marked with no progress; stuck = unfinished with a reason flag"},in:{type:"string",describe:"Limit to a channel (#chan)"},from:{type:"string",describe:"Limit to a sender (@user, or 'me') \u2014 usually the person a task is waiting on"},n:{alias:"count",type:"number",default:50,describe:"Max results"},json:{type:"boolean",default:!1}},o=async(s,r)=>{let i={state:s.state??"open",mine:r||s.mine===!0,count:s.n??50,json:s.json===!0};if(s.in)i.in=s.in;if(s.from)i.from=s.from;let a=t(s);if(a)i.cookie=a;await jy(e(s),i)};await pl(Dr(process.argv)).scriptName("slack").showHelpOnFail(!1).fail((s,r,i)=>{if(r)console.error(r.message),process.exit(1);console.error(s),console.error(""),i.showHelp(),process.exit(1)}).option("workspace",{alias:"w",type:"string",describe:"Workspace name"}).middleware(async(s)=>{let r=String((s._??[])[0]??"");if(!r||r==="auth"||r==="login"||r==="agent"||r==="sent")return;try{let i=ns(s.workspace),a=Ke(),c=yf(s._??[],s,{botTokenSource:a?Xf.get("SLACK_BOT_TOKEN")??xa.get("SLACK_BOT_TOKEN")?.find((l)=>l.val===a)?.path??"shell":void 0,globalPaths:Ca,slackTokenSet:!!process.env.SLACK_TOKEN,activeTokenIsBot:!!a&&i===a});if(c)console.error(c),process.exit(2)}catch(i){if((i instanceof Error?i.message:String(i)).startsWith("No profiles configured"))console.log(`No workspace configured. Let's set that up:
|
|
446
|
+
`),await ps(),process.exit(0);throw i}},!0).command("agent","Bot agent session status and command heartbeat",(s)=>Cu(s,Hn)).command(["read [target]","msgs [target]"],"Browse messages",(s)=>s.positional("target",{type:"string",describe:"#channel, @user, or URL"}).option("limit",{alias:"n",type:"number",default:20,describe:"Number of messages"}).option("format",{type:"string",choices:["text","jsonl"],default:"text",describe:"jsonl exposes raw ts/user/text (incl. external-guest user IDs)"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl"}).option("unreplied",{type:"boolean",default:!1,describe:"Only messages whose last word (incl. thread replies) is not yours \u2014 i.e. awaiting your answer"}),async(s)=>{let r=e(s),i=s.json?"jsonl":s.format;if(s.target)await Py(r,s.target,s.limit,i,s.unreplied,t(s));else await Ly(r)}).command("thread <target> <ts>","Show thread messages",(s)=>s.positional("target",{type:"string",demandOption:!0}).positional("ts",{type:"string",demandOption:!0}).option("limit",{alias:"n",type:"number",default:100}).option("format",{type:"string",choices:["text","jsonl"],default:"text",describe:"jsonl exposes raw ts/user/text (incl. external-guest user IDs)"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl"}),async(s)=>{let r=s.json?"jsonl":s.format;await vy(e(s),s.target,s.ts,s.limit,r,t(s))}).command(["channel","channels","ch"],"Channel commands",(s)=>s.command(["ls","list"],"List channels",(r)=>r.option("limit",{alias:"n",type:"number",default:200}).option("filter",{alias:"f",type:"string"}).option("all",{type:"boolean",default:!1}).option("format",{type:"string",choices:["text","jsonl"],default:"text"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl"}),async(r)=>{await My(e(r),r.limit,r.filter,r.all,r.json?"jsonl":r.format,t(r))}).command("get <channel>","Show channel details",(r)=>r.positional("channel",{type:"string",demandOption:!0,describe:"#name or channel ID"}),async(r)=>{let i=e(r),a=t(r),c=r.channel,l=c.startsWith("#")||c.startsWith("@")||c.startsWith("C")||c.startsWith("G")||c.startsWith("D")?c:`#${c}`,u=await be(i,l,a),d=R(await Dn(i,u,a)),f=R(d.channel),h=typeof f.name==="string"?f.name:u,p=f.is_im===!0?"@":"#",g=String(R(f.purpose).value??""),w=String(R(f.topic).value??""),b=f.num_members??f.member_count??"";if(console.log(`${p}${h} ${u}`),w)console.log(`topic: ${w}`);if(g)console.log(`purpose: ${g}`);if(b)console.log(`members: ${b}`);console.log(`private: ${f.is_private===!0}`)}).command(["create <name>","new <name>"],"Create a channel (confirm-hash safety gate)",(r)=>r.positional("name",{type:"string",demandOption:!0,describe:"Channel name (Slack lowercases it; no spaces)"}).option("private",{type:"boolean",default:!1,describe:"Create a private channel"}).option("invite",{type:"string",array:!0,default:[],describe:"Users to invite after creating (@handle or Uxxxx, repeatable)"}).option("code",{type:"string",describe:"Safety hash to confirm create"}),async(r)=>{let i=e(r),a=t(r),c=r.name.replace(/^#/,"").toLowerCase(),l=r.private===!0,u=r.invite.filter(Boolean),d=await Me(i,a),f=De(c,String(l),u.join(","),d?.userId??"");if(r.code!==f)xe(r.code,f,["--- Creating channel -------------------------",Se(d,{pad:9}),` name: ${l?"\uD83D\uDD12 ":"#"}${c}`,` private: ${l}`,...u.length?[` invite: ${u.join(", ")}`]:[],"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let h;try{h=await Rd(i,c,l,a)}catch(m){console.error(m instanceof Error?m.message:String(m)),process.exit(1)}if(console.log(`\u2713 Created ${l?"\uD83D\uDD12 ":"#"}${h.name} (${h.id})`),u.length){let m=[];for(let p of u)try{m.push(p.startsWith("U")||p.startsWith("W")?p:await $t(i,p,a))}catch(g){console.error(` ! could not resolve ${p}: ${g instanceof Error?g.message:String(g)}`)}for(let p of m)try{let g=R(await _s(i,p,a)),w=R(g.user);if(w.is_ultra_restricted===!0)console.error(`\u26A0 ${p} is a single-channel guest \u2014 Slack restricts them to their one existing channel; this invite will likely report success but not actually add them.`);else if(w.is_restricted===!0)console.error(`\u26A0 ${p} is a multi-channel guest \u2014 double-check they were actually added (guest invites can silently no-op depending on workspace restrictions).`)}catch{}if(m.length)try{await Pd(i,h.id,m,a),console.log(`\u2713 Invited ${m.length} member${m.length===1?"":"s"}`)}catch(p){console.error(` ! invite failed: ${p instanceof Error?p.message:String(p)}`)}}}).command(["rename <channel> <new-name>","mv <channel> <new-name>"],"Rename a channel (confirm-hash safety gate)",(r)=>r.positional("channel",{type:"string",demandOption:!0,describe:"#name, name, or channel ID (C\u2026/G\u2026)"}).positional("new-name",{type:"string",demandOption:!0,describe:"New channel name (Slack lowercases it; no spaces)"}).option("dry-run",{type:"boolean",default:!1,describe:"Resolve the channel and print old -> new without renaming"}).option("code",{type:"string",describe:"Safety hash to confirm rename"}),async(r)=>{let i=e(r),a=t(r),c=r.channel;if(c.startsWith("@"))console.error(`Error: ${c} is a DM \u2014 only channels can be renamed.`),process.exit(1);let l=c.startsWith("#")||/^[CG][A-Z0-9]{8,}$/.test(c)?c:`#${c}`,u=r.newName.replace(/^#/,"").toLowerCase(),d,f;try{d=await be(i,l,a)}catch(g){console.error(`Error: could not resolve channel ${c}: ${g instanceof Error?g.message:String(g)}`),process.exit(1)}try{let g=R(R(await Dn(i,d,a)).channel);if(g.is_im===!0||g.is_mpim===!0)console.error(`Error: ${d} is a DM \u2014 only channels can be renamed.`),process.exit(1);f=typeof g.name==="string"?g.name:l.replace(/^#/,"")}catch(g){let w=g instanceof Error?g.message:String(g);if(/channel_not_found/.test(w))console.error(`Error: could not resolve channel ${c}: channel not found (or not visible to this token).`),process.exit(1);f=l.replace(/^#/,"")}if(r.dryRun===!0){console.log(`#${f} -> #${u} (${d})`),console.log("(dry run \u2014 conversations.rename not called)");return}let h=await Me(i,a),m=De("rename",d,u,h?.userId??"");if(r.code!==m)xe(r.code,m,["--- Renaming channel -------------------------",Se(h,{pad:9}),` channel: ${d}`,` from: #${f}`,` to: #${u}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let p;try{p=await Od(i,d,u,a)}catch(g){let b=(g instanceof Error?g.message:String(g)).match(/Slack error on conversations\.rename: (\w+)/)?.[1],k={name_taken:`Error: a channel named #${u} already exists.`,invalid_name:`Error: "${u}" is not a valid channel name (lowercase letters, numbers, hyphens, underscores; max 80 chars).`,invalid_name_specials:`Error: "${u}" contains characters Slack doesn't allow in channel names.`,invalid_name_maxlength:`Error: "${u}" is too long (max 80 chars).`,invalid_name_required:"Error: the new channel name can't be empty.",not_authorized:`Error: this token isn't allowed to rename #${f} (workspace settings may restrict renaming to admins or the channel creator).`,not_in_channel:`Error: this token isn't a member of #${f} \u2014 join it first.`,is_archived:`Error: #${f} is archived \u2014 unarchive it before renaming.`};console.error((b&&k[b])??pe(g)),process.exit(1)}console.log(`\u2713 Renamed #${f} -> #${p.name} (${p.id})`)}).demandCommand(1,"").showHelpOnFail(!0)).command(["user","usr"],"User commands",(s)=>s.command(["ls","list"],"List workspace members",(r)=>r.option("limit",{alias:"n",type:"number",default:200}).option("filter",{alias:"f",type:"string"}).option("format",{type:"string",choices:["text","jsonl","yaml"],default:"text"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl"}).option("external",{type:"boolean",default:!1,describe:"Also include people reachable only through Slack Connect shared channels \u2014 they are in ANOTHER workspace, so users.list never returns them (costs one API call per shared channel)"}),async(r)=>{let i=r.json?"jsonl":r.format,a=e(r),c=t(r),l=await Nd(a,c),u=r.filter?.toLowerCase(),d=Y(l.members).map(R);if(r.external){let p=new Set(d.map((k)=>String(k.id))),g=R(await xs(a,c)),w=Y(g.channels).map(R).filter((k)=>k.is_ext_shared===!0&&!!k.name),b=new Set;for(let k of w)try{for(let x of await jd(a,String(k.id),c))if(!p.has(x))b.add(x)}catch{}for(let k of b)try{let x=R(await _s(a,k,c)),_=R(x.user);if(_.id)d.push(_)}catch{}}let f=d.filter((p)=>p.deleted!==!0&&p.is_bot!==!0&&String(p.id)!=="USLACKBOT").filter((p)=>{if(!u)return!0;let g=String(p.name??"").toLowerCase(),w=String(R(p.profile).real_name??"").toLowerCase(),b=String(R(p.profile).email??"").toLowerCase();return g.includes(u)||w.includes(u)||b.includes(u)}).slice(0,r.limit);if(i==="jsonl"){for(let p of f)console.log(JSON.stringify(p));return}if(i==="yaml"){for(let p of f){let g=function(w,b=""){if(w===null)return"null";if(typeof w==="string")return w.includes(`
|
|
433
447
|
`)?`|
|
|
434
448
|
${w.split(`
|
|
435
449
|
`).join(`
|
|
436
450
|
`)}`:w;if(typeof w!=="object")return String(w);if(Array.isArray(w))return w.map((k)=>`
|
|
437
|
-
${
|
|
438
|
-
${
|
|
439
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);if(!r.channelId&&!r.userId&&r.target.startsWith("@"))try{r.userId=await
|
|
451
|
+
${b} - ${g(k,b+" ")}`).join("");return Object.entries(w).map(([k,x])=>`
|
|
452
|
+
${b} ${k}: ${g(x,b+" ")}`).join("")};console.log("---");for(let[w,b]of Object.entries(p))console.log(`${w}: ${g(b)}`)}return}let h=Intl.DateTimeFormat().resolvedOptions().timeZone,m=f.length?String(R(Y(l.members).map(R)[0]??{}).team_id??""):"";for(let p of f){let g=R(p.profile),w=String(p.name??p.id),b=String(p.id??""),k=String(g.display_name||""),x=String(g.real_name||""),_=String(g.email||""),F=String(p.tz??""),S=[...new Set([k,x].filter((A)=>A&&A!==w))].join(" / "),B=F&&F!==h?F:"",W=String(p.team_id??""),P=p.is_stranger===!0||m&&W&&W!==m?`external:${W||"?"}`:p.is_ultra_restricted===!0?"single-channel guest":p.is_restricted===!0?"guest":"",T=[_,B].filter(Boolean).join(" ");console.log(`@${w} ${b} ${S}${T?" "+T:""}${P?` [${P}]`:""}`)}}).command("get <user>","Show user details",(r)=>r.positional("user",{type:"string",demandOption:!0,describe:"@handle or user ID"}),async(r)=>{let i=e(r),a=t(r),c=r.user.startsWith("@")?r.user:`@${r.user}`,l="";try{l=await $t(i,c,a)}catch(I){console.error(I instanceof Error?I.message:String(I)),process.exit(1)}let u=R(await _s(i,l,a)),d=R(u.user),f=R(d.profile),h=Intl.DateTimeFormat().resolvedOptions().timeZone,m=String(d.name??l),p=String(d.id??l),g=String(f.display_name||""),w=String(f.real_name||""),b=String(f.email||""),k=String(d.tz??""),x=String(f.phone||""),_=String(f.title||"");console.log(`@${m} ${p}`);let F=[...new Set([g,w].filter((I)=>I&&I!==m))];if(F.length)console.log(`name: ${F.join(" / ")}`);if(b)console.log(`email: ${b}`);if(x)console.log(`phone: ${x}`);if(_)console.log(`title: ${_}`);if(k&&k!==h)console.log(`tz: ${k}`)}).demandCommand(1,"").showHelpOnFail(!0)).command("news","Activity feed (mentions to you)",(s)=>s.option("limit",{alias:"l",type:"number",default:20}),async(s)=>{await By(e(s),s.limit)}).command("search <query>","Full-text search",(s)=>s.positional("query",{type:"string",demandOption:!0}).option("count",{alias:"n",type:"number",default:100}).option("json",{type:"boolean",default:!1,describe:"Output raw JSON"}),async(s)=>{await Qf(e(s),s.query,s.count,s.json,t(s))}).command("send <target> <message>","Send a message (confirm-hash safety gate)",(s)=>s.positional("target",{type:"string",demandOption:!0,describe:"#chan, @user, #chan:thread_ts, or permalink (a message permalink replies in its thread)"}).positional("message",{type:"string",demandOption:!0}).option("code",{type:"string",describe:"Safety hash to confirm send"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("user-id",{type:"string",describe:"Raw user ID (opens DM)"}).option("as-bot",{type:"boolean",default:!1,describe:"Send via the bot token (xoxb / SLACK_BOT_TOKEN) so a DM notifies the recipient and can be two-way"}).option("broadcast",{type:"boolean",default:!1,describe:`Also send to channel: broadcast a threaded reply back to the channel (Slack's "Also send to #channel" checkbox). Only effective with a thread target.`}).option("mentions",{type:"boolean",default:!0,describe:"Convert @handle tokens to real <@USERID> mentions (on by default; resolves via users.list, then channel members for Slack Connect guests). Unresolved handles stay as plain text. The confirm preview shows the converted message before sending. Disable with --no-mentions for literal @text."}),async(s)=>{if(!String(s.message??"").trim())console.error("Error: message is empty"),process.exit(1);let r={target:s.target,message:s.message,allowUrlAdjacent:s["allow-url-adjacent"]};if(s.code)r.code=s.code;if(s["channel-id"])r.channelId=s["channel-id"];if(s["user-id"])r.userId=s["user-id"];if(s.broadcast)r.broadcast=!0;if(s.mentions!==!1){r.mentions=!0,r.mentionToken=e(s);let a=t(s);if(a)r.mentionCookie=a}let i;if(s["as-bot"]){let a=Ke();if(!a)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
453
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);if(!r.channelId&&!r.userId&&r.target.startsWith("@"))try{r.userId=await $t(e(s),r.target,t(s))}catch(c){console.error(`Error: could not resolve ${r.target} to a user for the bot DM.
|
|
440
454
|
${c instanceof Error?c.message:String(c)}
|
|
441
|
-
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(1)}i=a,r.asBot=!0}else{i=e(s);let a=t(s);if(a)r.cookie=a}try{await
|
|
442
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(
|
|
443
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(
|
|
444
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(
|
|
445
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(
|
|
455
|
+
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(1)}i=a,r.asBot=!0}else{i=e(s);let a=t(s);if(a)r.cookie=a}try{await dw(i,r)}catch(a){console.error(pe(a)),process.exit(1)}}).command("ask [target] [question] [choices..]","Ask a question with its choices pre-seeded as 1\uFE0F\u20E3..\uD83D\uDD1F reactions (confirm-hash safety gate). Lifecycle: --waitFor=<link> collect, --void=<link> \u7121\u52B9\u5316 (verb aliases: `ask collect <link>`, `ask void <link\u2026>`)",(s)=>s.positional("target",{type:"string",describe:"#chan, @user, #chan:thread_ts, or permalink (omit with --waitFor)"}).positional("question",{type:"string",describe:"The question. Must @tag whoever may answer (@alice), or the whole channel (@here / @channel / @everyone) \u2014 only their answer counts. In a 1:1 DM the other party counts automatically."}).positional("choices",{type:"string",array:!0,describe:"Up to 10 choices, seeded as 1\uFE0F\u20E3..\uD83D\uDD1F reactions. Beyond 10 they are listed but answerable only by text. With none, the question asks for a free-text reply."}).option("code",{type:"string",describe:"Safety hash to confirm the ask"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("body",{type:"string",describe:"Extra context shown under the question"}).option("lang",{type:"string",choices:[...jt],describe:"Language of the instructions in the posted body. Default: $SLACK_TERM_LANG, else the answerers' Slack locale, else the question's own language, else the system locale, else ja"}).option("wait",{type:"boolean",default:!1,describe:"Block until answered; print ONLY the answer on stdout. Exit 0 = answered, 2 = nobody replied, 3 = transport failure, 4 = a reply matched several choices (stdout empty), 5 = a free-text reply that picked none of the choices (the reply is on stdout; NOT a decision \u2014 the question stays open), 6 = the question was voided (\u7121\u52B9\u5316, `slack ask void`) \u2014 stop waiting."}).option("waitFor",{type:"string",describe:"Collect the answer to a question already posted: pass its permalink. Nothing is posted. Same stdout/exit contract as --wait; --timeout 0 checks once and exits 2 if still open."}).option("after",{type:"string",describe:"With --waitFor: the cursor \u2014 everything at or before this ts was already delivered. Text replies there are neither answers nor notes again (pass the `cursor` a previous --json result gave you, or the reply ts an exit 5 printed). Reactions still count."}).option("void",{type:"string",array:!0,describe:"\u7121\u52B9\u5316: void question(s) you posted that expired or stopped meaning anything \u2014 --void=<permalink>, repeatable. The text becomes \uD83D\uDEAB with --reason (body kept, options removed), our pills come off, and --wait/--waitFor on it exits 6. Same --code gate. Only your own questions (--as-bot for the bot's). Alias: `slack ask void <link\u2026>`."}).option("reask",{type:"boolean",default:!1,describe:"With ONE --void: post the question again (same channel/thread, same text and choices unless you give new ones as positionals / --body) and void the old one as replaced by it \u2014 one gate for both. The way to change the options of a question someone already answered."}).option("edit",{type:"string",describe:'Change an open question you posted: --edit=<permalink> ["new question" [choices\u2026]] [--body \u2026]. Rebuilt with the ask layout so collect still reads it. Options can change only while nobody has answered (then: --void=<link> --reask). Same --code gate.'}).option("ls",{type:"boolean",default:!1,describe:"List the questions you posted (local sent-log) with their LIVE state: --state open|answered|void|all (default open), --stale 24h, --channel, --json. With --stale it prints the --void command that would retire them."}).option("pending",{type:"boolean",default:!1,describe:"List questions THIS machine asked (local sent-log) that somebody answered but nobody collected, grouped by the asking session, with whether that agent is still alive and the --waitFor line that collects each. Read-only: --since 7d, --channel, --json."}).option("since",{type:"string",default:"7d",describe:"With --pending: how far back to look (30m, 2h, 7d, or an ISO date)"}).option("stale",{type:"string",describe:"With --ls: only open questions older than this (24h, 3d)"}).option("state",{type:"string",default:"open",choices:["open","answered","void","edited","gone","unknown","all"],describe:"With --ls: which state to list"}).option("channel",{type:"string",describe:"With --ls / --pending: only this channel (id, or the target as typed)"}).option("limit",{type:"number",default:50,describe:"With --ls: how many recent asks to check"}).option("reason",{type:"string",describe:"With --void: why it is void (written into the message)"}).option("superseded-by",{type:"string",describe:"With --void: permalink of the question that replaces it"}).option("json",{type:"boolean",default:!1,describe:"With --pending: one JSON object per answered question (sender, answer, collect command). With --wait / --waitFor: print ONE JSON object on stdout \u2014 {status, answer, how, who, notes:[{ts,user,text,permalink}], cursor, permalink} \u2014 instead of the bare answer. `notes` are the audience's replies that are not the answer (thread replies; plain replies too in a 1:1 DM). Exit codes unchanged."}).option("timeout",{type:"number",default:3600,describe:"Overall limit for --wait / --waitFor, in seconds (0 with --waitFor = check once)"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("user-id",{type:"string",describe:"Raw user ID (opens DM)"}).option("as-bot",{type:"boolean",default:!1,describe:"Ask via the bot token (xoxb / SLACK_BOT_TOKEN) so a DM notifies the recipient. @tags and an @user target then resolve with the bot token too (needs users:read)."}),async(s)=>{if(s.ls||s.pending){if(s.ls&&s.pending)console.error("Error: --ls and --pending are separate lists \u2014 pick one."),process.exit(se);let p=(()=>{try{return e(s)}catch{return}})(),g={};if(p)g.user=p;let w=Ke();if(w)g.bot=w;let b=t(s);if(b)g.cookie=b;if(s.pending){if(s.target||s.question||s.waitFor||s.wait||s.void||s.edit)console.error("Error: --pending reads the local log \u2014 do not also pass a target/question or another ask action."),process.exit(se);let x=Oo(String(s.since));if(x===void 0)console.error(`Error: --since needs 30m / 2h / 7d / 1w or an ISO date (got ${M(String(s.since))})`),process.exit(se);let _={sinceMs:x,json:!!s.json};if(s.channel)_.channel=String(s.channel);try{await Ew(g,_)}catch(F){console.error(pe(F)),process.exit(se)}return}let k={state:String(s.state??"open"),json:!!s.json,limit:Number(s.limit)||50};if(s.stale)k.stale=String(s.stale);if(s.channel)k.channel=String(s.channel);await Sw(g,k);return}let r=(p)=>{if(!p){let w=t(s);return w?{token:e(s),cookie:w}:{token:e(s)}}let g=Ke();if(!g)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
456
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(se);return{token:g}},i=s.target!==void 0&&s.target!=="void"&&s.target!=="collect"?String(s.target):void 0,a=[s.question,...s.choices??[]].filter((p)=>p!==void 0).map(String);if(s.edit){if(s.void||s.wait||s.waitFor)console.error("Error: --edit changes one open question \u2014 do not combine it with --void/--wait/--waitFor."),process.exit(se);let{token:p,cookie:g}=r(!!s["as-bot"]),w={link:String(s.edit),asBot:!!s["as-bot"],mentionToken:p,allowUrlAdjacent:!!s["allow-url-adjacent"]};if(i!==void 0)w.question=i;if(a.length)w.choices=a.map((b)=>b.trim()).filter(Boolean);if(s.body!==void 0)w.body=String(s.body);if(s.lang)w.lang=String(s.lang);if(s.code)w.code=String(s.code);if(g)w.cookie=g,w.mentionCookie=g;try{await xw(p,w)}catch(b){console.error(pe(b)),process.exit(se)}return}let c,l=(s.void??[]).map(String).filter(Boolean);if(s.reask){if(l.length!==1||s.target==="void")console.error("Error: --reask goes with exactly one --void=<permalink> (the question to replace)."),process.exit(se);if(s.waitFor)console.error("Error: --reask posts a new question \u2014 --wait works, --waitFor does not."),process.exit(se);let{token:p,cookie:g}=r(!!s["as-bot"]),w=await Me(p,g),b=await dp(p,l[0],w,!!s["as-bot"],g);if(b==="void")console.error(`\u2717 ${M(l[0])}: \u3059\u3067\u306B\u7121\u52B9\u5316\u6E08\u307F\u3067\u3059 \u2014 \u65B0\u3057\u304F\u805E\u304F\u306A\u3089\u666E\u901A\u306B slack ask \u3067`),process.exit(se);if(!b)process.exit(se);if(c={...b,reason:Le(String(s.reason??"")).trim()},s.target=b.threadTs?`${b.channelId}:${b.threadTs}`:b.channelId,s["channel-id"]=b.channelId,s.question=i??jn(b.parsed.question),s.choices=a.length?a:[...b.parsed.reactable,...b.parsed.overflow].map(jn),s.body===void 0&&b.parsed.body)s.body=jn(b.parsed.body);if(!s.lang)s.lang=b.parsed.lang;s.void=void 0}if(!c&&(s.target==="void"||l.length)){let p=s.target==="void"?[s.question,...s.choices??[]]:[];if(s.target!=="void"&&(s.target||s.question||s.choices?.length))console.error("Error: --void voids existing questions \u2014 do not also pass a target/question/choices."),process.exit(se);let g=[...l,...p.map((x)=>String(x??""))].filter(Boolean);if(!g.length)console.error("Error: --void=<permalink> \u2014 which question(s)?"),process.exit(se);if(s.wait||s.waitFor)console.error("Error: --void voids existing questions \u2014 do not also pass --wait/--waitFor."),process.exit(se);let w,b;if(s["as-bot"]){let x=Ke();if(!x)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
457
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(se);w=x}else w=e(s),b=t(s);let k={links:g,reason:Le(String(s.reason??"")).trim(),asBot:!!s["as-bot"]};if(s["superseded-by"])k.supersededBy=String(s["superseded-by"]);if(s.code)k.code=String(s.code);if(b)k.cookie=b;try{await _w(w,k)}catch(x){console.error(pe(x)),process.exit(se)}return}if(s.target==="collect"){if(!s.question||s.choices?.length)console.error("Error: slack ask collect <permalink> \u2014 exactly one question."),process.exit(se);s.waitFor=String(s.question),s.target=void 0,s.question=void 0}let u=s.waitFor?String(s.waitFor):"",d=Number(s.timeout);if(!Number.isFinite(d)||d<0||d===0&&!u)console.error("Error: --timeout must be a positive number of seconds"),process.exit(se);if(u){if(s.target||s.question||s.choices?.length)console.error("Error: --waitFor collects an existing question \u2014 do not also pass a target/question/choices."),process.exit(se);let p,g;if(s["as-bot"]){let w=Ke();if(!w)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
458
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(se);p=w}else p=e(s),g=t(s);try{let w={link:u,timeout:d,asBot:!!s["as-bot"],json:!!s.json};if(g)w.cookie=g;if(s.after){let b=String(s.after);if(!/^\d{10}\.\d{6}$/.test(b))console.error(`Error: --after needs a message ts like 1700000000.000100 (got ${M(b)})`),process.exit(se);w.after=b}await Cw(p,w)}catch(w){console.error(pe(w)),process.exit(se)}return}if(!s.target)console.error("Error: target is required (or use --waitFor <permalink> to collect an answer)"),process.exit(se);let f=String(s.question??"").trim();if(!f)console.error("Error: question is empty"),process.exit(se);let h={allowUrlAdjacent:s["allow-url-adjacent"],target:s.target,question:f,choices:(s.choices??[]).map((p)=>String(p).trim()).filter(Boolean),timeout:d};if(s.code)h.code=s.code;if(s.body)h.body=s.body;if(s.lang)h.lang=String(s.lang);if(s.wait)h.wait=!0;if(s.json)h.json=!0;if(c)h.voidAfter=c;if(s["channel-id"])h.channelId=s["channel-id"];if(s["user-id"])h.userId=s["user-id"];let m;if(s["as-bot"]){let p=Ke();if(!p)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
459
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(se);if(!h.channelId&&!h.userId&&h.target.startsWith("@"))try{h.userId=await $t(p,h.target)}catch(g){console.error(`Error: could not resolve ${h.target} to a user for the bot DM.
|
|
446
460
|
${g instanceof Error?g.message:String(g)}
|
|
447
|
-
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(
|
|
448
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(
|
|
449
|
-
${
|
|
450
|
-
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(
|
|
451
|
-
(${
|
|
452
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);await
|
|
461
|
+
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(se)}m=p,h.mentionToken=p,h.asBot=!0}else{m=e(s),h.mentionToken=m;let p=t(s);if(p)h.cookie=p,h.mentionCookie=p}try{await Dw(m,h)}catch(p){console.error(pe(p)),process.exit(se)}}).command(["poll [target] [question] [choices..]","vote [target] [question] [choices..]"],"Post a poll with its choices pre-seeded as 1\uFE0F\u20E3..\uD83D\uDD1F reactions, then count them (confirm-hash safety gate)",(s)=>s.positional("target",{type:"string",describe:"#chan, @user, #chan:thread_ts, or permalink (omit with --results/--close)"}).positional("question",{type:"string",describe:"The question. @tags are optional here \u2014 unlike `ask`, a poll needs no addressee: anyone who can see it may vote."}).positional("choices",{type:"string",array:!0,describe:"2..10 choices, seeded as 1\uFE0F\u20E3..\uD83D\uDD1F reactions for voters to click"}).option("multi",{type:"boolean",default:!1,describe:"Let one person pick several choices (default: 1 \u4EBA 1 \u7968)"}).option("until",{type:"string",describe:"Deadline shown in the message (display only \u2014 closing is still `--close`)"}).option("results",{type:"string",describe:"Count an existing poll: pass its permalink. Posts nothing; only edit is the invalid-ballot notice in the poll itself (--no-notify to suppress)."}).option("close",{type:"string",describe:"Count an existing poll AND freeze the tally into the message. Only the poster can do this."}).option("names",{type:"boolean",default:!1,describe:"Also list who voted for what (stderr)"}).option("no-notify",{type:"boolean",default:!1,describe:"With --results: do not write the invalid-ballot notice back into the message (keeps it strictly read-only)"}).option("code",{type:"string",describe:"Safety hash to confirm the post"}).option("body",{type:"string",describe:"Extra context shown under the question"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("user-id",{type:"string",describe:"Raw user ID (opens DM)"}).option("as-bot",{type:"boolean",default:!1,describe:"Post via the bot token (xoxb / SLACK_BOT_TOKEN) so a DM notifies the recipient \u2014 and so YOUR OWN vote counts, since the seeds are then the bot's. @tags and an @user target then resolve with the bot token too (needs users:read)."}),async(s)=>{let r=s.close?String(s.close):s.results?String(s.results):"";if(s.results&&s.close)console.error("Error: pass --results or --close, not both (--close counts as well)."),process.exit(ct);let i=()=>{let d=Ke();if(!d)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
462
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(ct);return d};if(r){if(s.target||s.question||s.choices?.length)console.error("Error: --results/--close reads an existing poll \u2014 do not also pass a target/question/choices."),process.exit(ct);let d=e(s),f=t(s);try{let h={link:r};if(s.close)h.close=!0;if(s.names)h.names=!0;if(s["no-notify"])h.noNotify=!0;if(f)h.cookie=f;if(s["as-bot"])h.writeToken=i();await Tw(d,h)}catch(h){console.error(pe(h)),process.exit(ct)}return}if(!s.target)console.error("Error: target is required (or use --results <permalink> to count a poll)"),process.exit(ct);let a=String(s.question??"").trim();if(!a)console.error("Error: question is empty"),process.exit(ct);let c=(s.choices??[]).map((d)=>String(d).trim()).filter(Boolean);if(c.length<2||c.length>Bn)console.error(`Error: poll needs 2..${Bn} choices (got ${c.length}). For a free-text question use \`slack ask\`.`),process.exit(ct);let l={target:s.target,question:a,choices:c};if(s.multi)l.multi=!0;if(s.until)l.until=String(s.until);if(s.code)l.code=s.code;if(s.body)l.body=s.body;if(s["allow-url-adjacent"])l.allowUrlAdjacent=!0;if(s["channel-id"])l.channelId=s["channel-id"];if(s["user-id"])l.userId=s["user-id"];let u;if(s["as-bot"]){let d=i();if(!l.channelId&&!l.userId&&l.target.startsWith("@"))try{l.userId=await $t(d,l.target)}catch(f){console.error(`Error: could not resolve ${l.target} to a user for the bot DM.
|
|
463
|
+
${f instanceof Error?f.message:String(f)}
|
|
464
|
+
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(ct)}u=d,l.mentionToken=d,l.asBot=!0}else{u=e(s),l.mentionToken=u;let d=t(s);if(d)l.cookie=d,l.mentionCookie=d}try{await Fw(u,l)}catch(d){console.error(pe(d)),process.exit(ct)}}).command("sent [query]","Search what THIS machine posted/edited (send, ask, poll, edit) and who sent it \u2014 read-only, local log",(s)=>s.positional("query",{type:"string",describe:"Substring of the message text (case-insensitive)"}).option("channel",{type:"string",describe:"Channel/DM id (C\u2026/D\u2026) or the target as typed (#eng, @bob)"}).option("since",{type:"string",describe:"Only newer than this: 30m, 2h, 7d, 1w, or an ISO date"}).option("session",{type:"string",describe:"Agent session id (prefix match)"}).option("cwd",{type:"string",describe:"Working directory the sender ran in (prefix match)"}).option("kind",{type:"string",choices:["send","ask","poll","edit"],describe:"Only this kind of write"}).option("json",{type:"boolean",default:!1,describe:"One JSON object per line (every recorded field)"}).option("count",{alias:"n",type:"number",default:50,describe:"Max rows (newest first)"}),(s)=>{let r;if(s.since!==void 0){if(r=Oo(String(s.since)),r===void 0)console.error(`Error: --since needs 30m / 2h / 7d / 1w or an ISO date (got ${M(String(s.since))})`),process.exit(1)}let i={limit:Number(s.count)||50};if(s.query)i.text=String(s.query);if(s.channel)i.channel=String(s.channel);if(r!==void 0)i.sinceMs=r;if(s.session)i.session=String(s.session);if(s.cwd){let c=$y(String(s.cwd));try{i.cwd=Cy(c)}catch{i.cwd=c}}if(s.kind)i.kind=s.kind;let a=Yi(i);if(!a)console.error(`Error: ${Ds}
|
|
465
|
+
(${yt()})`),process.exit(1);if(s.json){for(let c of a)console.log(JSON.stringify(c));return}if(!a.length){console.error(`No sent messages match (log: ${yt()}).`);return}for(let c of a)console.log(Xy(c))}).command("doctor","Check the bot token (xoxb) can carry a two-way DM (scopes + Messages Tab)",(s)=>s,async()=>{let s=Ke();if(!s)console.error(`Error: slack doctor checks the bot token, but no xoxb- token was found.
|
|
466
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);await Iw(s)}).command("schedule","Manage scheduled messages",(s)=>s.command("send <target> <message>","Schedule a message for later delivery",(r)=>r.positional("target",{type:"string",demandOption:!0,describe:"#chan, @user, #chan:thread_ts, or permalink (a message permalink replies in its thread)"}).positional("message",{type:"string",demandOption:!0}).option("at",{type:"string",demandOption:!0,describe:"Delivery time (ISO datetime or Unix ts)"}).option("code",{type:"string",describe:"Safety hash to confirm"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("user-id",{type:"string",describe:"Raw user ID (opens DM)"}).option("as-bot",{type:"boolean",default:!1,describe:"Schedule via the bot token (xoxb / SLACK_BOT_TOKEN) so a DM notifies the recipient. Without it a scheduled DM to yourself is posted by you, and Slack never notifies you of your own message \u2014 it fires into silence."}),async(r)=>{if(!String(r.message??"").trim())console.error("Error: message is empty"),process.exit(1);let i={target:r.target,message:r.message,at:r.at};if(r.code)i.code=r.code;if(r["allow-url-adjacent"])i.allowUrlAdjacent=!0;if(r["channel-id"])i.channelId=r["channel-id"],i.targetOverride=`--channel-id ${r["channel-id"]}`;if(r["user-id"])i.userId=r["user-id"],i.targetOverride=`--user-id ${r["user-id"]}`;let a;if(r["as-bot"]){let c=qo();if(!i.channelId&&!i.userId&&i.target.startsWith("@"))try{i.userId=await $t(e(r),i.target,t(r))}catch(l){console.error(`Error: could not resolve ${i.target} to a user for the bot DM.
|
|
453
467
|
${l instanceof Error?l.message:String(l)}
|
|
454
|
-
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(1)}a=c,i.asBot=!0}else{a=e(r);let c=t(r);if(c)i.cookie=c}await
|
|
455
|
-
Drop -w, or set SLACK_BOT_TOKEN to that workspace's bot token.`),process.exit(2)}return{token:u,asBot:!0}}let l=t(c);return{token:e(c),...l?{cookie:l}:{},asBot:!1}},a=(c)=>{console.error(ie(c)),process.exit(1)};return s.command("new <channel> [state] [reason]","Post a NEW board in a channel and pin it \u2014 the state is the top-level message; prints the board's id (C\u2026:ts)",(c)=>c.positional("channel",{type:"string",demandOption:!0,describe:"#chan or channel ID"}).positional("state",{type:"string",describe:"The whole state (\\n for newlines), or use --file"}).positional("reason",{type:"string",describe:"Optional: why the board exists \u2014 its first thread reply"}).option("file",{type:"string",describe:"Read the state from a file (- = stdin); then the only positional after <channel> is the reason"}).option("code",{type:"string",describe:"Safety hash to confirm (printed by the preview)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("as-bot",r).example('slack pinlog new "#gtm" "\u8CA9\u58F2\u30D6\u30ED\u30C3\u30AB\u30FC\\n1. \u898B\u7A4D\u30C6\u30F3\u30D7\u30EC \u2014 \u672A"',"preview, then rerun with --code"),async(c)=>{let l=c.file!==void 0;if(l&&c.state!==void 0&&c.reason!==void 0)console.error("Error: with --file, pass only the reason after <channel> (the state comes from the file)."),process.exit(2);let u=l?Oo(void 0,c.file):Oo(c.state,void 0),d=l?c.state:c.reason;if(u===void 0)console.error("Error: the state is required (positional or --file)."),process.exit(2);let p=await i(c),h={target:c.channel,state:u,asBot:p.asBot,allowUrlAdjacent:c["allow-url-adjacent"]};if(d!==void 0)h.log=Fe(d);if(p.cookie)h.cookie=p.cookie;if(typeof c.workspace==="string")h.workspace=c.workspace;if(c.code)h.code=c.code;await Ym(p.token,h).catch(a)}).command("set <board> [state] [reason]","Change a board: replace its state (silent edit) AND post the reason in its thread (notifies)",(c)=>c.positional("board",{type:"string",demandOption:!0,describe:"The board: permalink, #chan:ts, or the id `new` printed"}).positional("state",{type:"string",describe:"The WHOLE new state, not a diff (or --file)"}).positional("reason",{type:"string",describe:"One short line: what changed and why (required)"}).option("file",{type:"string",describe:"Read the state from a file (- = stdin); then the only positional after <board> is the reason"}).option("adopt",{type:"boolean",default:!1,describe:"Allow a message WITHOUT the pinlog footer: turn a hand-run board into one"}).option("code",{type:"string",describe:"Safety hash to confirm (printed by the preview)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("as-bot",r).example('slack pinlog set <board-link> "\u8CA9\u58F2\u30D6\u30ED\u30C3\u30AB\u30FC\\n1. \u898B\u7A4D\u30C6\u30F3\u30D7\u30EC \u2014 \u6E08" "\u898B\u7A4D\u30C6\u30F3\u30D7\u30EC: \u672A \u2192 \u6E08"',"").example('slack pinlog set <board-link> --file board.md "\u898B\u7A4D\u30C6\u30F3\u30D7\u30EC: \u672A \u2192 \u6E08"',"state from a file"),async(c)=>{let l=c.file!==void 0;if(l&&c.state!==void 0&&c.reason!==void 0)console.error("Error: with --file, pass only the reason after <board> (the state comes from the file)."),process.exit(2);let u=l?Oo(void 0,c.file):Oo(c.state,void 0),d=l?c.state:c.reason;if(u===void 0||d===void 0)console.error("Error: `pinlog set` needs the whole new state AND the reason: slack pinlog set <board> '<state>' '<reason>'\n Only a reason, state unchanged: slack pinlog note <board> '<reason>'"),process.exit(2);let p=await i(c),h={target:c.board,state:u,log:Fe(d),adopt:c.adopt,asBot:p.asBot,allowUrlAdjacent:c["allow-url-adjacent"]};if(typeof c.workspace==="string")h.workspace=c.workspace;if(p.cookie)h.cookie=p.cookie;if(c.code)h.code=c.code;await af(p.token,h).catch(a)}).command("note <board> <reason>","Post only a reason in a board's thread (notifies); the state stays as is",(c)=>c.positional("board",{type:"string",demandOption:!0,describe:"The board: permalink, #chan:ts, or the id `new` printed"}).positional("reason",{type:"string",demandOption:!0,describe:"One short line, e.g. still blocked \u2014 chased X"}).option("code",{type:"string",describe:"Safety hash to confirm (printed by the preview)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("as-bot",r),async(c)=>{let l=await i(c),u={target:c.board,log:Fe(c.reason),logOnly:!0,asBot:l.asBot,allowUrlAdjacent:c["allow-url-adjacent"]};if(typeof c.workspace==="string")u.workspace=c.workspace;if(l.cookie)u.cookie=l.cookie;if(c.code)u.code=c.code;await af(l.token,u).catch(a)}).command(["get <board>","show <board>"],"Show a board's state and its log (read-only)",(c)=>c.positional("board",{type:"string",demandOption:!0,describe:"The board: permalink, #chan:ts, or C\u2026:ts"}).option("json",{type:"boolean",default:!1,describe:"One JSON object: {id, isPinlog, updated, head, log[]}"}).option("as-bot",r),async(c)=>{let l=await i(c);await Zm(l.token,c.board,l.cookie,c.json).catch(a)}).command(["ls <channel>","list <channel>"],"List the boards in a channel, found by their footer (read-only)",(c)=>c.positional("channel",{type:"string",demandOption:!0}).option("limit",{alias:"n",type:"number",default:500,describe:"How many recent channel messages to scan"}).option("as-bot",r),async(c)=>{let l=await i(c);await Qm(l.token,c.channel,c.limit,l.cookie).catch(a)}).command("pin <board>",!1,(c)=>c.positional("board",{type:"string",demandOption:!0}).option("as-bot",r),async(c)=>{let l=await i(c);await ey(l.token,c.board,l.cookie).catch(a)}).demandCommand(1,"Pick one: ls | get | new | set | note")},()=>{}).command("react <target> <emoji>","Add (or --remove) an emoji reaction \u2014 a lightweight ack that doesn't grow the thread",(s)=>s.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts, @user:ts, or permalink"}).positional("emoji",{type:"string",demandOption:!0,describe:"Emoji shortcode without colons (e.g. eyes, white_check_mark, hourglass)"}).option("remove",{type:"boolean",default:!1,describe:"Remove the reaction instead of adding it"}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(s)=>{let r={target:s.target,emoji:s.emoji};if(s.remove)r.remove=!0;if(s["channel-id"])r.channelId=s["channel-id"];let i=t(s);if(i)r.cookie=i;try{await ty(e(s),r)}catch(a){console.error(ie(a)),process.exit(1)}}).command("todo","Reaction-backed task tracking (:pushpin: marks a task, progress lives in a second reaction)",(s)=>s.option("cache",{type:"boolean",default:!0,describe:"Use ~/.config/slack-cli/cache.json for channel/user lookups (--no-cache to bypass)"}).middleware((r)=>{if(r.cache===!1)qi(!1)}).command(["ls","list"],"List everyone's tasks (has: \u2014 read-only, one search per run)",(r)=>r.options(n).option("mine",{type:"boolean",default:!1,describe:"Only your own reactions (hasmy:) \u2014 same as `slack mytodo ls`"}).option("shared",{type:"boolean",default:!1,hidden:!0,describe:"Deprecated \u2014 anyone's reactions is the default for `todo ls`"}),async(r)=>{await o(r,!1)}).command("set <target> <state>","Move a task to a progress state (adds the new reaction before removing the old one)",(r)=>r.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts or permalink"}).positional("state",{type:"string",demandOption:!0,choices:["pending","doing","done","dropped"]}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(r)=>{let i={target:r.target,state:r.state};if(r["channel-id"])i.channelId=r["channel-id"];let a=t(r);if(a)i.cookie=a;try{await Pm(e(r),i)}catch(c){console.error(ie(c)),process.exit(1)}}).command("flag <target> <flag>","Add (or --remove) a reason flag (alert | needs-discussion | waiting | blocked) \u2014 flags stack, independent of progress",(r)=>r.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts or permalink"}).positional("flag",{type:"string",demandOption:!0,choices:["alert","needs-discussion","waiting","blocked"],describe:"waiting = the other party in this conversation owes a reply; blocked = stuck on something outside it"}).option("remove",{type:"boolean",default:!1,describe:"Remove the flag instead of adding it"}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(r)=>{let i={target:r.target,flag:r.flag};if(r.remove)i.remove=!0;if(r["channel-id"])i.channelId=r["channel-id"];let a=t(r);if(a)i.cookie=a;try{await vm(e(r),i)}catch(c){console.error(ie(c)),process.exit(1)}}).command("doctor","Find messages carrying two or more progress reactions (--fix repairs them)",(r)=>r.option("in",{type:"string",demandOption:!0,describe:"Channel to scan (#chan)"}).option("fix",{type:"boolean",default:!1,describe:"Repair findings (keeps the highest-priority state)"}).option("limit",{type:"number",default:Ki,describe:"Max messages to scan"}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(r)=>{let i={channel:r.in,limit:r.limit};if(r.fix)i.fix=!0;if(r["channel-id"])i.channelId=r["channel-id"];let a=t(r);if(a)i.cookie=a;await Bm(e(r),i)}).demandCommand(1,"Specify a todo subcommand (ls, set, flag, doctor)"),()=>{}).command("mytodo","Tasks carrying YOUR reactions (hasmy:) \u2014 the my-only half of `todo`",(s)=>s.option("cache",{type:"boolean",default:!0,describe:"Use ~/.config/slack-cli/cache.json for channel/user lookups (--no-cache to bypass)"}).middleware((r)=>{if(r.cache===!1)qi(!1)}).command(["ls","list"],"List tasks you have reacted to (hasmy: \u2014 read-only, one search per run)",(r)=>r.options(n),async(r)=>{await o(r,!0)}).demandCommand(1,"Specify a mytodo subcommand (ls)"),()=>{}).command("upload <target> <file..>","Upload one or more files to a channel or DM",(s)=>s.positional("target",{type:"string",demandOption:!0,describe:"#chan, @user, #chan:thread_ts, or permalink (a message permalink replies in its thread)"}).positional("file",{type:"string",array:!0,demandOption:!0,describe:"Path(s) to file(s)"}).option("title",{type:"string",describe:"Title (single file only)"}).option("comment",{type:"string",describe:"Initial comment (first file)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("code",{type:"string",describe:"4-hex safety code to confirm upload"}).option("channel-id",{type:"string"}).option("user-id",{type:"string"}),async(s)=>{let r={target:s.target,filePaths:s.file};if(s.title)r.title=s.title;if(s.comment)r.comment=s.comment;if(s["allow-url-adjacent"])r.allowUrlAdjacent=!0;if(s.code)r.code=s.code;if(s["channel-id"])r.channelId=s["channel-id"];if(s["user-id"])r.userId=s["user-id"];let i=t(s);if(i)r.cookie=i;await Fy(e(s),r)}).command("files","File commands",(s)=>s.command(["ls","list"],"List files visible to you (files.list)",(r)=>r.option("limit",{alias:"l",type:"number",default:100,describe:"Max files to list"}).option("type",{alias:"t",type:"string",describe:"Slack type filter: images, pdfs, gdocs, snippets, zips, spaces, all"}).option("channel",{alias:"c",type:"string",describe:"Only files in this channel (#name, @user, ID, or permalink)"}).option("user",{alias:"u",type:"string",describe:"Only files from this raw user ID"}).option("format",{type:"string",choices:["text","jsonl"],default:"text"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl"}),async(r)=>{let i={limit:r.limit,format:r.json?"jsonl":r.format};if(r.type)i.types=r.type;if(r.channel)i.channel=r.channel;if(r.user)i.user=r.user;await Ay(e(r),t(r),i)}).demandCommand(1,"").showHelpOnFail(!0),()=>{}).command("lists","Slack Lists \u2014 read rows (lists <ref>), or create / add / set (gated, as the bot)",(s)=>s.command("create <name>","Create a Slack List (confirm-hash safety gate; bot token, lists:write)",(r)=>r.positional("name",{type:"string",demandOption:!0,describe:"List name"}).option("col",{type:"string",array:!0,default:[],describe:"Column name:type (text|select|user|link|date|number|checkbox); select takes name:select:a,b,c. First is the primary text column. Repeatable"}).option("todo",{type:"boolean",default:!1,describe:"Todo mode: adds Completed / Assignee / Due date columns"}).option("code",{type:"string",describe:"Safety hash to confirm create"}),async(r)=>{try{let i={name:r.name,cols:r.col,todo:r.todo===!0};if(r.code!==void 0)i.code=r.code;await Ry(i)}catch(i){console.error(ie(i)),process.exit(1)}}).command("add <list> <text>","Add a row to a Slack List (confirm-hash safety gate; bot token)",(r)=>r.positional("list",{type:"string",demandOption:!0,describe:"List URL or F-id"}).positional("text",{type:"string",demandOption:!0,describe:"Primary (first text) column value"}).option("set",{type:"string",array:!0,default:[],describe:"Other cells: column=value (repeatable)"}).option("code",{type:"string",describe:"Safety hash to confirm add"}),async(r)=>{try{let i={list:r.list,text:r.text,sets:r.set};if(r.code!==void 0)i.code=r.code;await Py(i)}catch(i){console.error(ie(i)),process.exit(1)}}).command("set <list> <row>","Update cells of a Slack List row; --done checks it off (confirm-hash safety gate; bot token)",(r)=>r.positional("list",{type:"string",demandOption:!0,describe:"List URL or F-id"}).positional("row",{type:"string",demandOption:!0,describe:"Row id (Rec\u2026), as printed by lists add / lists <ref>"}).option("set",{type:"string",array:!0,default:[],describe:"column=value (repeatable)"}).option("done",{type:"boolean",describe:"Check the row off (--no-done to uncheck); needs a todo-mode list"}).option("code",{type:"string",describe:"Safety hash to confirm update"}),async(r)=>{try{let i={list:r.list,row:r.row,sets:r.set};if(r.done!==void 0)i.done=r.done;if(r.code!==void 0)i.code=r.code;await vy(i)}catch(i){console.error(ie(i)),process.exit(1)}}).command("share <list>","Grant users or channels access to a Slack List (confirm-hash safety gate; bot token)",(r)=>r.positional("list",{type:"string",demandOption:!0,describe:"List URL or F-id"}).option("user",{type:"string",array:!0,default:[],describe:"User ID (U\u2026), repeatable"}).option("channel",{type:"string",array:!0,default:[],describe:"Channel ID (C\u2026), repeatable"}).option("level",{type:"string",choices:["read","write","owner"],default:"write"}).option("code",{type:"string",describe:"Safety hash to confirm share"}),async(r)=>{try{let i={list:r.list,users:r.user,channels:r.channel,level:r.level};if(r.code!==void 0)i.code=r.code;await By(i)}catch(i){console.error(ie(i)),process.exit(1)}}).command("$0 <ref>","Read a Slack List's rows (by list URL or F-id) \u2014 read-only",(r)=>r.positional("ref",{type:"string",demandOption:!0,describe:"List URL (\u2026/lists/<TEAM>/<F-id>) or bare F-id"}).option("limit",{alias:"l",type:"number",default:100,describe:"Max rows to show"}).option("format",{type:"string",choices:["text","jsonl"],default:"text"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl (raw records)"}).option("as-bot",{type:"boolean",default:!1,describe:"Read with the bot token (SLACK_BOT_TOKEN, lists:read) via the public API instead of the user session"}),async(r)=>{let i=r.json?"jsonl":r.format;try{let a=r.asBot===!0;await Iy(a?"":e(r),a?void 0:t(r),r.ref,{limit:r.limit,format:i,asBot:a})}catch(a){console.error(ie(a)),process.exit(1)}})).command("download <ref> [dest]","Download a file attachment (by file ID or file permalink) to disk",(s)=>s.positional("ref",{type:"string",demandOption:!0,describe:"File ID (F\u2026) or Slack file permalink"}).positional("dest",{type:"string",describe:"Output path or directory (default: ./<filename>)"}),async(s)=>{await Ny(e(s),t(s),s.ref,s.dest)}).command("dump","Bulk export channel history as markdown",(s)=>s.option("days",{alias:"d",type:"number",default:7,describe:"Days of history"}).option("limit",{alias:"l",type:"number",default:200}).option("filter",{alias:"f",type:"string",describe:"Filter channel names"}),async(s)=>{await Lm(e(s),s.days,s.limit,s.filter)}).command("todos","Slack's To-dos tab \u2014 your personal to-dos (read-only; requires xoxc desktop token). Not `slack todo` (reaction tasks)",(s)=>s.command(["$0","ls","list"],"List your To-dos, soonest due first",(r)=>r.option("filter",{type:"string",choices:[...md],default:"todo",describe:"todo = open to-dos; saved = everything saved; completed; archived"}).option("limit",{alias:"n",type:"number",default:50,describe:"At most this many items"}).option("json",{type:"boolean",default:!1,describe:"One JSON object per item (raw fields + permalink + message text)"}),async(r)=>{if(!Number.isInteger(r.limit)||r.limit<1)console.error(`Error: --limit must be a whole number of at least 1 (got ${r.limit}).`),process.exit(2);await jm(e(r),t(r),{filter:r.filter,limit:r.limit,json:r.json})})).command("drafts","Manage message drafts (requires xoxc desktop token)",(s)=>s.command(["$0","ls","list"],"List pending drafts",(r)=>r.option("all",{alias:"a",type:"boolean",default:!1,describe:"Include sent drafts"}),async(r)=>{await Mm(e(r),t(r),r.all)}).command(["new <channel> [text..]","save <channel> [text..]"],"Create a draft",(r)=>r.positional("channel",{type:"string",demandOption:!0}).positional("text",{type:"string",array:!0,default:[]}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing a bare URL that runs into non-ASCII text (it would link only up to that point)"}),async(r)=>{let i=e(r),a=t(r),c=r.text.join(" ");if(!c)console.error("Usage: slack drafts new <#channel|@user> <text>"),process.exit(2);Be(c,r["allow-url-adjacent"],void 0,{sides:["after"],markdown:!1});let l=await fe(i,r.channel,a),u=await ld(i,l,c,a);console.log(`\u2713 Draft created (id: ${T(u.draft).id??"?"})`)}).command("get <id>","Show a draft",(r)=>r.positional("id",{type:"string",demandOption:!0}),async(r)=>{await Wm(e(r),t(r),r.id)}).command(["edit <id> [text..]","update <id> [text..]"],"Edit a draft",(r)=>r.positional("id",{type:"string",demandOption:!0}).positional("text",{type:"string",array:!0,default:[]}).option("code",{type:"string"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing a bare URL that runs into non-ASCII text (it would link only up to that point)"}),async(r)=>{let i=e(r),a=t(r),c=r.text.join(" ");if(!c)console.error("Usage: slack drafts edit <id> <new-text>"),process.exit(2);Be(c,r["allow-url-adjacent"],void 0,{sides:["after"],markdown:!1});let l=await gs(i,a),u=H(l.drafts).map(T).find((f)=>String(f.id)===r.id);if(!u)console.error(`Draft not found: ${r.id}`),process.exit(1);let d=Bo(u),p=await Te(i,a),h=ue(d,c,p?.userId??"");if(r.code!==h)pe(r.code,h,["--- Editing draft as -------------------------",he(p),"--- Current draft ----------------------------",...d.split(`
|
|
456
|
-
`).map((
|
|
457
|
-
`).map((
|
|
458
|
-
`).map((h)=>` ${h}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);await
|
|
459
|
-
`))}).command("app","Create a new Slack app and obtain a token (guided wizard)",(r)=>r.option("bot",{type:"boolean",describe:"Create a bot token (xoxb-) instead of user (xoxp-)"}),async(r)=>{await Pl({...r.bot!==void 0?{bot:r.bot}:{}})}).command("login","Log in: interactive wizard, or a source (chrome, firefox)",(r)=>r.command("chrome","Import workspaces from Chrome, grouped by account (all platforms)",(i)=>i.option("profile",{type:"string",alias:"p",describe:'Chrome profile email or dir (e.g. "you@example.com" or "Profile 3")'}),async(i)=>{await ii({...i.profile!==void 0?{profile:i.profile}:{}})}).command("firefox","Import the xoxd cookie from Firefox into a workspace",(i)=>i.option("workspace",{type:"string",alias:"w",describe:"Workspace name to update (default: active)"}),async(i)=>{await ai({...i.workspace!==void 0?{workspace:i.workspace}:{}})}).option("token",{type:"string",describe:"Token to save directly (non-interactive)"}).option("name",{type:"string",describe:"Workspace name (used with --token)"}).option("yes",{type:"boolean",default:!1,describe:"Allow reading browser profiles without a confirmation prompt"}).option("from-desktop",{type:"boolean",default:!1,describe:"Import the Slack Desktop token without scanning a browser"}).option("from-chrome",{type:"boolean",default:!1,describe:"Import the desktop token and Chrome cookie"}).option("from-firefox",{type:"boolean",default:!1,describe:"Import the desktop token and Firefox cookie"}).option("from-all",{type:"boolean",default:!1,describe:"Import the desktop token and scan Chrome and Firefox"}).command("$0",!1,()=>{},async(i)=>{await os({...i.token!==void 0?{token:i.token}:{},...i.name!==void 0?{name:i.name}:{},yes:i.yes,fromDesktop:i.fromDesktop,fromChrome:i.fromChrome,fromFirefox:i.fromFirefox,fromAll:i.fromAll})}),async(r)=>{await os({...r.token!==void 0?{token:r.token}:{},...r.name!==void 0?{name:r.name}:{},yes:r.yes,fromDesktop:r.fromDesktop,fromChrome:r.fromChrome,fromFirefox:r.fromFirefox,fromAll:r.fromAll})}).command("tokens","Print the selected credentials as dotenv assignments",(r)=>r.option("workspace",{type:"string",alias:"w",describe:"Workspace name (default: active)"}),(r)=>vl({...r.workspace!==void 0?{workspace:r.workspace}:{}})).command("save","Save the active profile token and cookie to an env file",(r)=>r.option("envfile",{type:"string",demandOption:!0,describe:"Destination env file (e.g. ./.env.local)"}).option("workspace",{type:"string",alias:"w",describe:"Workspace name (default: active)"}),(r)=>Bl({envfile:r.envfile,...r.workspace!==void 0?{workspace:r.workspace}:{}})).command(["ls","status"],"Show auth status",()=>{},()=>{let r=Tr();if(r.length===0){console.log("No workspaces configured. Run: slack auth login");return}for(let{name:i,profile:a,current:c}of r)console.log(`${c?"* ":" "}${i} ${a.team} (${a.user}) ${a.url??""}`)}).command("use <name>","Switch active workspace",(r)=>r.positional("name",{type:"string",demandOption:!0}).option("g",{type:"boolean",default:!1,describe:"Write global lockfile (~/.slack-cli/workspace)"}),(r)=>{if(!r.g)km(Mt(process.cwd(),".slack-cli"));Qc(r.name,r.g),console.log(`Switched to workspace "${r.name}" ${r.g?"globally":"locally"}`)}).command(["logout <name>","rm <name>","remove <name>"],"Remove a workspace",(r)=>r.positional("name",{type:"string",demandOption:!0}),(r)=>{Zc(r.name),console.log(`Removed workspace "${r.name}"`)}).command(["cookie","chrome"],"Attach a Chrome xoxd cookie to a workspace (macOS/Linux/Windows). To import workspaces, use: slack auth login chrome",(r)=>r.option("workspace",{type:"string",alias:"w",describe:"Workspace name to update (default: active)"}).option("profile",{type:"string",alias:"p",describe:"Chrome profile email or dir (Windows, when several have a session)"}).option("yes",{type:"boolean",default:!1,describe:"Allow reading browser profiles without a confirmation prompt"}),async(r)=>{await Ol({...r.workspace!==void 0?{workspace:r.workspace}:{},...r.profile!==void 0?{profile:r.profile}:{},yes:r.yes})}).command("firefox","Attach Firefox browser xoxd cookie to a workspace (all platforms)",(r)=>r.option("workspace",{type:"string",alias:"w",describe:"Workspace name to update (default: active)"}).option("yes",{type:"boolean",default:!1,describe:"Allow reading browser profiles without a confirmation prompt"}),async(r)=>{await ai({...r.workspace!==void 0?{workspace:r.workspace}:{},yes:r.yes})}).command("$0",!1,()=>{},()=>{s.showHelp(),process.exit(0)})).command("tail [target]","Stream new messages in real time (like tail -f)",(s)=>s.positional("target",{type:"string",describe:"#channel or @user to follow"}).option("since",{type:"string",describe:"Backfill from N ago (e.g. 10m, 2h, 1d)"}).option("thread",{type:"string",describe:"Follow a single thread by timestamp"}).option("watch-thread",{type:"string",describe:"Watch the channel's top-level timeline AND one thread's replies together (ts or permalink)"}).option("me",{type:"boolean",default:!1,describe:"Filter to messages that mention you"}).option("interval",{type:"number",default:60000,describe:"Poll interval in ms (default 60s; use --interval=3000 for near-real-time)"}).option("timeout",{type:"string",describe:"Auto-stop after this long (e.g. 30m, 2h). Exit code 0 even if nothing arrived."}).option("exit-on-message",{type:"boolean",default:!1,describe:"Stop as soon as the first new message from someone else arrives (wait-for-reply)"}).option("rtm",{type:"boolean",default:!0,describe:"Use RTM WebSocket when available (xoxc + cookie); pass --no-rtm to force polling"}),async(s)=>{let r=e(s),i=t(s),a=new AbortController;process.on("SIGINT",()=>{a.abort(),process.exit(0)}),await Jl(r,s.target,{...s.since!==void 0?{since:s.since}:{},...s.thread!==void 0?{thread:s.thread}:{},...s["watch-thread"]!==void 0?{watchThread:s["watch-thread"]}:{},me:s.me,interval:s.interval,...s.timeout!==void 0?{timeout:s.timeout}:{},...s["exit-on-message"]===!0?{exitOnMessage:!0}:{},...i!==void 0?{cookie:i}:{},...s.rtm===!1?{noRtm:!0}:{}},a.signal)}).command("login",!1,(s)=>s.option("token",{type:"string"}).option("name",{type:"string"}).option("yes",{type:"boolean",default:!1}).option("from-desktop",{type:"boolean",default:!1}).option("from-chrome",{type:"boolean",default:!1}).option("from-firefox",{type:"boolean",default:!1}).option("from-all",{type:"boolean",default:!1}),async(s)=>{await os({...s.token!==void 0?{token:s.token}:{},...s.name!==void 0?{name:s.name}:{},yes:s.yes,fromDesktop:s.fromDesktop,fromChrome:s.fromChrome,fromFirefox:s.fromFirefox,fromAll:s.fromAll})}).demandCommand(1,"Specify a command. Run with --help for usage.").strict().help().alias("help","h").parseAsync()}My().catch((e)=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});
|
|
468
|
+
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(1)}a=c,i.asBot=!0}else{a=e(r);let c=t(r);if(c)i.cookie=c}await Pw(a,i)}).command(["ls","list"],"List pending scheduled messages",(r)=>r.positional("target",{type:"string",describe:"#channel to filter by"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("as-bot",{type:"boolean",default:!1,describe:"List what the BOT token scheduled. A message from `schedule send --as-bot` belongs to the app, so the user token's listing does not contain it \u2014 and an invisible pending message cannot be cancelled."}),async(r)=>{let i=r.target;if(r["as-bot"]){let a=qo(),c=r["channel-id"];if(!c&&i?.startsWith("@"))c=await Jf(i,a,e(r),t(r));await Kf(a,i,c);return}await Kf(e(r),i,r["channel-id"],t(r))}).command("rm <target> <id>","Delete a scheduled message",(r)=>r.positional("target",{type:"string",demandOption:!0,describe:"#channel or @user"}).positional("id",{type:"string",demandOption:!0,describe:"Scheduled message ID"}).option("code",{type:"string",describe:"Safety hash to confirm"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("as-bot",{type:"boolean",default:!1,describe:"Cancel a message scheduled with `schedule send --as-bot`. It belongs to the bot token, so the user token cannot delete it."}),async(r)=>{let i={target:r.target,id:r.id};if(r.code)i.code=r.code;if(r["channel-id"])i.channelId=r["channel-id"],i.targetOverride=`--channel-id ${r["channel-id"]}`;if(r["as-bot"]){let c=qo();if(!i.channelId&&i.target.startsWith("@"))i.channelId=await Jf(i.target,c,e(r),t(r));i.asBot=!0,await qf(c,i);return}let a=t(r);if(a)i.cookie=a;await qf(e(r),i)}).demandCommand(1,"").showHelpOnFail(!0),()=>{}).command("edit <target> <newText>","Edit a sent message",(s)=>s.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts, @user:ts, or permalink"}).positional("newText",{type:"string",demandOption:!0}).option("code",{type:"string",describe:"Safety hash to confirm edit"}).option("force",{type:"boolean",default:!1,describe:"Apply an edit that BREAKS a `slack ask` / `slack poll` message (new text no longer reads as one, or an answered/void question made open again). Refused by default because collect reads that body back; edits that keep it readable (e.g. writing the \u2705 form) need no flag. Prefer `slack ask --edit=` / `--void=`."}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("mentions",{type:"boolean",default:!0,describe:"Convert @handle tokens in the new text to real <@USERID> mentions (on by default). Unresolved handles stay as plain text. Disable with --no-mentions for literal @text."}).option("as-bot",{type:"boolean",default:!1,describe:"Edit as the bot (xoxb / SLACK_BOT_TOKEN). REQUIRED to correct a message the bot posted: Slack only lets a token edit its OWN messages, so a bot-authored message is uneditable by the user token and chat.update returns cant_update_message. Address it by permalink or --channel-id; an @user target resolves against the BOT's DM list, which is where a bot-authored DM actually lives."}),async(s)=>{let r={target:s.target,newText:s.newText,allowUrlAdjacent:s["allow-url-adjacent"]};if(s.force)r.force=!0;if(s.code)r.code=s.code;if(s["channel-id"])r.channelId=s["channel-id"];if(s.mentions!==!1)r.mentions=!0;let i;if(s["as-bot"]){let a=await Bf(r.target,e(s),t(s),r.channelId);if(i=a.botToken,a.channelId&&!r.channelId)r.channelId=a.channelId;r.asBot=!0,r.mentionToken=e(s);let c=t(s);if(c)r.mentionCookie=c}else{i=e(s);let a=t(s);if(a)r.cookie=a}await Qy(i,r)}).command("delete <target>","Delete a sent message (confirm-hash safety gate)",(s)=>s.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts, @user:ts, or permalink"}).option("code",{type:"string",describe:"Safety hash to confirm delete"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("as-bot",{type:"boolean",default:!1,describe:"Delete as the bot (xoxb / SLACK_BOT_TOKEN). REQUIRED for a message the bot posted: chat.delete refuses another token's message exactly as chat.update does."}),async(s)=>{let r={target:s.target};if(s.code)r.code=s.code;if(s["channel-id"])r.channelId=s["channel-id"];let i;if(s["as-bot"]){let a=await Bf(r.target,e(s),t(s),r.channelId);if(i=a.botToken,a.channelId&&!r.channelId)r.channelId=a.channelId;r.asBot=!0}else{i=e(s);let a=t(s);if(a)r.cookie=a}await ew(i,r)}).command("pinlog","Pinned status board: the pinned top-level message is the current state (edited in place, silent); each change is one thread reply (the log, notifies)",(s)=>{let r={type:"boolean",default:!1,describe:"Act via the bot token (xoxb / SLACK_BOT_TOKEN). A board the bot created can only be updated --as-bot: Slack lets a token edit only its own messages."},i=async(c)=>{if(c["as-bot"]){let u=qo();if(typeof c.workspace==="string"){let d=t(c),[f,h]=await Promise.all([Ut(e(c),d),Ut(u)]);if(f.url!==h.url)console.error(`Error: --as-bot acts with SLACK_BOT_TOKEN, which belongs to ${h.url}, but -w ${c.workspace} is ${f.url}.
|
|
469
|
+
Drop -w, or set SLACK_BOT_TOKEN to that workspace's bot token.`),process.exit(2)}return{token:u,asBot:!0}}let l=t(c);return{token:e(c),...l?{cookie:l}:{},asBot:!1}},a=(c)=>{console.error(pe(c)),process.exit(1)};return s.command("new <channel> [state] [reason]","Post a NEW board in a channel and pin it \u2014 the state is the top-level message; prints the board's id (C\u2026:ts)",(c)=>c.positional("channel",{type:"string",demandOption:!0,describe:"#chan or channel ID"}).positional("state",{type:"string",describe:"The whole state (\\n for newlines), or use --file"}).positional("reason",{type:"string",describe:"Optional: why the board exists \u2014 its first thread reply"}).option("file",{type:"string",describe:"Read the state from a file (- = stdin); then the only positional after <channel> is the reason"}).option("code",{type:"string",describe:"Safety hash to confirm (printed by the preview)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("as-bot",r).example('slack pinlog new "#gtm" "\u8CA9\u58F2\u30D6\u30ED\u30C3\u30AB\u30FC\\n1. \u898B\u7A4D\u30C6\u30F3\u30D7\u30EC \u2014 \u672A"',"preview, then rerun with --code"),async(c)=>{let l=c.file!==void 0;if(l&&c.state!==void 0&&c.reason!==void 0)console.error("Error: with --file, pass only the reason after <channel> (the state comes from the file)."),process.exit(2);let u=l?Ko(void 0,c.file):Ko(c.state,void 0),d=l?c.state:c.reason;if(u===void 0)console.error("Error: the state is required (positional or --file)."),process.exit(2);let f=await i(c),h={target:c.channel,state:u,asBot:f.asBot,allowUrlAdjacent:c["allow-url-adjacent"]};if(d!==void 0)h.log=Le(d);if(f.cookie)h.cookie=f.cookie;if(typeof c.workspace==="string")h.workspace=c.workspace;if(c.code)h.code=c.code;await nw(f.token,h).catch(a)}).command("set <board> [state] [reason]","Change a board: replace its state (silent edit) AND post the reason in its thread (notifies)",(c)=>c.positional("board",{type:"string",demandOption:!0,describe:"The board: permalink, #chan:ts, or the id `new` printed"}).positional("state",{type:"string",describe:"The WHOLE new state, not a diff (or --file)"}).positional("reason",{type:"string",describe:"One short line: what changed and why (required)"}).option("file",{type:"string",describe:"Read the state from a file (- = stdin); then the only positional after <board> is the reason"}).option("adopt",{type:"boolean",default:!1,describe:"Allow a message WITHOUT the pinlog footer: turn a hand-run board into one"}).option("code",{type:"string",describe:"Safety hash to confirm (printed by the preview)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("as-bot",r).example('slack pinlog set <board-link> "\u8CA9\u58F2\u30D6\u30ED\u30C3\u30AB\u30FC\\n1. \u898B\u7A4D\u30C6\u30F3\u30D7\u30EC \u2014 \u6E08" "\u898B\u7A4D\u30C6\u30F3\u30D7\u30EC: \u672A \u2192 \u6E08"',"").example('slack pinlog set <board-link> --file board.md "\u898B\u7A4D\u30C6\u30F3\u30D7\u30EC: \u672A \u2192 \u6E08"',"state from a file"),async(c)=>{let l=c.file!==void 0;if(l&&c.state!==void 0&&c.reason!==void 0)console.error("Error: with --file, pass only the reason after <board> (the state comes from the file)."),process.exit(2);let u=l?Ko(void 0,c.file):Ko(c.state,void 0),d=l?c.state:c.reason;if(u===void 0||d===void 0)console.error("Error: `pinlog set` needs the whole new state AND the reason: slack pinlog set <board> '<state>' '<reason>'\n Only a reason, state unchanged: slack pinlog note <board> '<reason>'"),process.exit(2);let f=await i(c),h={target:c.board,state:u,log:Le(d),adopt:c.adopt,asBot:f.asBot,allowUrlAdjacent:c["allow-url-adjacent"]};if(typeof c.workspace==="string")h.workspace=c.workspace;if(f.cookie)h.cookie=f.cookie;if(c.code)h.code=c.code;await Nf(f.token,h).catch(a)}).command("note <board> <reason>","Post only a reason in a board's thread (notifies); the state stays as is",(c)=>c.positional("board",{type:"string",demandOption:!0,describe:"The board: permalink, #chan:ts, or the id `new` printed"}).positional("reason",{type:"string",demandOption:!0,describe:"One short line, e.g. still blocked \u2014 chased X"}).option("code",{type:"string",describe:"Safety hash to confirm (printed by the preview)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("as-bot",r),async(c)=>{let l=await i(c),u={target:c.board,log:Le(c.reason),logOnly:!0,asBot:l.asBot,allowUrlAdjacent:c["allow-url-adjacent"]};if(typeof c.workspace==="string")u.workspace=c.workspace;if(l.cookie)u.cookie=l.cookie;if(c.code)u.code=c.code;await Nf(l.token,u).catch(a)}).command(["get <board>","show <board>"],"Show a board's state and its log (read-only)",(c)=>c.positional("board",{type:"string",demandOption:!0,describe:"The board: permalink, #chan:ts, or C\u2026:ts"}).option("json",{type:"boolean",default:!1,describe:"One JSON object: {id, isPinlog, updated, head, log[]}"}).option("as-bot",r),async(c)=>{let l=await i(c);await rw(l.token,c.board,l.cookie,c.json).catch(a)}).command(["ls <channel>","list <channel>"],"List the boards in a channel, found by their footer (read-only)",(c)=>c.positional("channel",{type:"string",demandOption:!0}).option("limit",{alias:"n",type:"number",default:500,describe:"How many recent channel messages to scan"}).option("as-bot",r),async(c)=>{let l=await i(c);await iw(l.token,c.channel,c.limit,l.cookie).catch(a)}).command("pin <board>",!1,(c)=>c.positional("board",{type:"string",demandOption:!0}).option("as-bot",r),async(c)=>{let l=await i(c);await aw(l.token,c.board,l.cookie).catch(a)}).demandCommand(1,"Pick one: ls | get | new | set | note")},()=>{}).command("react <target> <emoji>","Add (or --remove) an emoji reaction \u2014 a lightweight ack that doesn't grow the thread",(s)=>s.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts, @user:ts, or permalink"}).positional("emoji",{type:"string",demandOption:!0,describe:"Emoji shortcode without colons (e.g. eyes, white_check_mark, hourglass)"}).option("remove",{type:"boolean",default:!1,describe:"Remove the reaction instead of adding it"}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(s)=>{let r={target:s.target,emoji:s.emoji};if(s.remove)r.remove=!0;if(s["channel-id"])r.channelId=s["channel-id"];let i=t(s);if(i)r.cookie=i;try{await cw(e(s),r)}catch(a){console.error(pe(a)),process.exit(1)}}).command("todo","Reaction-backed task tracking (:pushpin: marks a task, progress lives in a second reaction)",(s)=>s.option("cache",{type:"boolean",default:!0,describe:"Use ~/.config/slack-cli/cache.json for channel/user lookups (--no-cache to bypass)"}).middleware((r)=>{if(r.cache===!1)da(!1)}).command(["ls","list"],"List everyone's tasks (has: \u2014 read-only, one search per run)",(r)=>r.options(n).option("mine",{type:"boolean",default:!1,describe:"Only your own reactions (hasmy:) \u2014 same as `slack mytodo ls`"}).option("shared",{type:"boolean",default:!1,hidden:!0,describe:"Deprecated \u2014 anyone's reactions is the default for `todo ls`"}),async(r)=>{await o(r,!1)}).command("set <target> <state>","Move a task to a progress state (adds the new reaction before removing the old one)",(r)=>r.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts or permalink"}).positional("state",{type:"string",demandOption:!0,choices:["pending","doing","done","dropped"]}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(r)=>{let i={target:r.target,state:r.state};if(r["channel-id"])i.channelId=r["channel-id"];let a=t(r);if(a)i.cookie=a;try{await Wy(e(r),i)}catch(c){console.error(pe(c)),process.exit(1)}}).command("flag <target> <flag>","Add (or --remove) a reason flag (alert | needs-discussion | waiting | blocked) \u2014 flags stack, independent of progress",(r)=>r.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts or permalink"}).positional("flag",{type:"string",demandOption:!0,choices:["alert","needs-discussion","waiting","blocked"],describe:"waiting = the other party in this conversation owes a reply; blocked = stuck on something outside it"}).option("remove",{type:"boolean",default:!1,describe:"Remove the flag instead of adding it"}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(r)=>{let i={target:r.target,flag:r.flag};if(r.remove)i.remove=!0;if(r["channel-id"])i.channelId=r["channel-id"];let a=t(r);if(a)i.cookie=a;try{await Uy(e(r),i)}catch(c){console.error(pe(c)),process.exit(1)}}).command("doctor","Find messages carrying two or more progress reactions (--fix repairs them)",(r)=>r.option("in",{type:"string",demandOption:!0,describe:"Channel to scan (#chan)"}).option("fix",{type:"boolean",default:!1,describe:"Repair findings (keeps the highest-priority state)"}).option("limit",{type:"number",default:ua,describe:"Max messages to scan"}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(r)=>{let i={channel:r.in,limit:r.limit};if(r.fix)i.fix=!0;if(r["channel-id"])i.channelId=r["channel-id"];let a=t(r);if(a)i.cookie=a;await Jy(e(r),i)}).demandCommand(1,"Specify a todo subcommand (ls, set, flag, doctor)"),()=>{}).command("mytodo","Tasks carrying YOUR reactions (hasmy:) \u2014 the my-only half of `todo`",(s)=>s.option("cache",{type:"boolean",default:!0,describe:"Use ~/.config/slack-cli/cache.json for channel/user lookups (--no-cache to bypass)"}).middleware((r)=>{if(r.cache===!1)da(!1)}).command(["ls","list"],"List tasks you have reacted to (hasmy: \u2014 read-only, one search per run)",(r)=>r.options(n),async(r)=>{await o(r,!0)}).demandCommand(1,"Specify a mytodo subcommand (ls)"),()=>{}).command("upload <target> <file..>","Upload one or more files to a channel or DM",(s)=>s.positional("target",{type:"string",demandOption:!0,describe:"#chan, @user, #chan:thread_ts, or permalink (a message permalink replies in its thread)"}).positional("file",{type:"string",array:!0,demandOption:!0,describe:"Path(s) to file(s)"}).option("title",{type:"string",describe:"Title (single file only)"}).option("comment",{type:"string",describe:"Initial comment (first file)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("code",{type:"string",describe:"4-hex safety code to confirm upload"}).option("channel-id",{type:"string"}).option("user-id",{type:"string"}),async(s)=>{let r={target:s.target,filePaths:s.file};if(s.title)r.title=s.title;if(s.comment)r.comment=s.comment;if(s["allow-url-adjacent"])r.allowUrlAdjacent=!0;if(s.code)r.code=s.code;if(s["channel-id"])r.channelId=s["channel-id"];if(s["user-id"])r.userId=s["user-id"];let i=t(s);if(i)r.cookie=i;await vw(e(s),r)}).command("files","File commands",(s)=>s.command(["ls","list"],"List files visible to you (files.list)",(r)=>r.option("limit",{alias:"l",type:"number",default:100,describe:"Max files to list"}).option("type",{alias:"t",type:"string",describe:"Slack type filter: images, pdfs, gdocs, snippets, zips, spaces, all"}).option("channel",{alias:"c",type:"string",describe:"Only files in this channel (#name, @user, ID, or permalink)"}).option("user",{alias:"u",type:"string",describe:"Only files from this raw user ID"}).option("format",{type:"string",choices:["text","jsonl"],default:"text"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl"}),async(r)=>{let i={limit:r.limit,format:r.json?"jsonl":r.format};if(r.type)i.types=r.type;if(r.channel)i.channel=r.channel;if(r.user)i.user=r.user;await Lw(e(r),t(r),i)}).demandCommand(1,"").showHelpOnFail(!0),()=>{}).command("lists","Slack Lists \u2014 read rows (lists <ref>), or create / add / set (gated, as the bot)",(s)=>s.command("create <name>","Create a Slack List (confirm-hash safety gate; bot token, lists:write)",(r)=>r.positional("name",{type:"string",demandOption:!0,describe:"List name"}).option("col",{type:"string",array:!0,default:[],describe:"Column name:type (text|select|user|link|date|number|checkbox); select takes name:select:a,b,c. First is the primary text column. Repeatable"}).option("todo",{type:"boolean",default:!1,describe:"Todo mode: adds Completed / Assignee / Due date columns"}).option("code",{type:"string",describe:"Safety hash to confirm create"}),async(r)=>{try{let i={name:r.name,cols:r.col,todo:r.todo===!0};if(r.code!==void 0)i.code=r.code;await jw(i)}catch(i){console.error(pe(i)),process.exit(1)}}).command("add <list> <text>","Add a row to a Slack List (confirm-hash safety gate; bot token)",(r)=>r.positional("list",{type:"string",demandOption:!0,describe:"List URL or F-id"}).positional("text",{type:"string",demandOption:!0,describe:"Primary (first text) column value"}).option("set",{type:"string",array:!0,default:[],describe:"Other cells: column=value (repeatable)"}).option("code",{type:"string",describe:"Safety hash to confirm add"}),async(r)=>{try{let i={list:r.list,text:r.text,sets:r.set};if(r.code!==void 0)i.code=r.code;await Ww(i)}catch(i){console.error(pe(i)),process.exit(1)}}).command("set <list> <row>","Update cells of a Slack List row; --done checks it off (confirm-hash safety gate; bot token)",(r)=>r.positional("list",{type:"string",demandOption:!0,describe:"List URL or F-id"}).positional("row",{type:"string",demandOption:!0,describe:"Row id (Rec\u2026), as printed by lists add / lists <ref>"}).option("set",{type:"string",array:!0,default:[],describe:"column=value (repeatable)"}).option("done",{type:"boolean",describe:"Check the row off (--no-done to uncheck); needs a todo-mode list"}).option("code",{type:"string",describe:"Safety hash to confirm update"}),async(r)=>{try{let i={list:r.list,row:r.row,sets:r.set};if(r.done!==void 0)i.done=r.done;if(r.code!==void 0)i.code=r.code;await Uw(i)}catch(i){console.error(pe(i)),process.exit(1)}}).command("share <list>","Grant users or channels access to a Slack List (confirm-hash safety gate; bot token)",(r)=>r.positional("list",{type:"string",demandOption:!0,describe:"List URL or F-id"}).option("user",{type:"string",array:!0,default:[],describe:"User ID (U\u2026), repeatable"}).option("channel",{type:"string",array:!0,default:[],describe:"Channel ID (C\u2026), repeatable"}).option("level",{type:"string",choices:["read","write","owner"],default:"write"}).option("code",{type:"string",describe:"Safety hash to confirm share"}),async(r)=>{try{let i={list:r.list,users:r.user,channels:r.channel,level:r.level};if(r.code!==void 0)i.code=r.code;await Jw(i)}catch(i){console.error(pe(i)),process.exit(1)}}).command("$0 <ref>","Read a Slack List's rows (by list URL or F-id) \u2014 read-only",(r)=>r.positional("ref",{type:"string",demandOption:!0,describe:"List URL (\u2026/lists/<TEAM>/<F-id>) or bare F-id"}).option("limit",{alias:"l",type:"number",default:100,describe:"Max rows to show"}).option("format",{type:"string",choices:["text","jsonl"],default:"text"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl (raw records)"}).option("as-bot",{type:"boolean",default:!1,describe:"Read with the bot token (SLACK_BOT_TOKEN, lists:read) via the public API instead of the user session"}),async(r)=>{let i=r.json?"jsonl":r.format;try{let a=r.asBot===!0;await Mw(a?"":e(r),a?void 0:t(r),r.ref,{limit:r.limit,format:i,asBot:a})}catch(a){console.error(pe(a)),process.exit(1)}})).command("download <ref> [dest]","Download a file attachment (by file ID or file permalink) to disk",(s)=>s.positional("ref",{type:"string",demandOption:!0,describe:"File ID (F\u2026) or Slack file permalink"}).positional("dest",{type:"string",describe:"Output path or directory (default: ./<filename>)"}),async(s)=>{await qw(e(s),t(s),s.ref,s.dest)}).command("dump","Bulk export channel history as markdown",(s)=>s.option("days",{alias:"d",type:"number",default:7,describe:"Days of history"}).option("limit",{alias:"l",type:"number",default:200}).option("filter",{alias:"f",type:"string",describe:"Filter channel names"}),async(s)=>{await Ky(e(s),s.days,s.limit,s.filter)}).command("todos","Slack's To-dos tab \u2014 your personal to-dos (read-only; requires xoxc desktop token). Not `slack todo` (reaction tasks)",(s)=>s.command(["$0","ls","list"],"List your To-dos, soonest due first",(r)=>r.option("filter",{type:"string",choices:[...Yd],default:"todo",describe:"todo = open to-dos; saved = everything saved; completed; archived"}).option("limit",{alias:"n",type:"number",default:50,describe:"At most this many items"}).option("json",{type:"boolean",default:!1,describe:"One JSON object per item (raw fields + permalink + message text)"}),async(r)=>{if(!Number.isInteger(r.limit)||r.limit<1)console.error(`Error: --limit must be a whole number of at least 1 (got ${r.limit}).`),process.exit(2);await zy(e(r),t(r),{filter:r.filter,limit:r.limit,json:r.json})})).command("drafts","Manage message drafts (requires xoxc desktop token)",(s)=>s.command(["$0","ls","list"],"List pending drafts",(r)=>r.option("all",{alias:"a",type:"boolean",default:!1,describe:"Include sent drafts"}),async(r)=>{await Hy(e(r),t(r),r.all)}).command(["new <channel> [text..]","save <channel> [text..]"],"Create a draft",(r)=>r.positional("channel",{type:"string",demandOption:!0}).positional("text",{type:"string",array:!0,default:[]}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing a bare URL that runs into non-ASCII text (it would link only up to that point)"}),async(r)=>{let i=e(r),a=t(r),c=r.text.join(" ");if(!c)console.error("Usage: slack drafts new <#channel|@user> <text>"),process.exit(2);Je(c,r["allow-url-adjacent"],void 0,{sides:["after"],markdown:!1});let l=await be(i,r.channel,a),u=await Ud(i,l,c,a);console.log(`\u2713 Draft created (id: ${R(u.draft).id??"?"})`)}).command("get <id>","Show a draft",(r)=>r.positional("id",{type:"string",demandOption:!0}),async(r)=>{await Gy(e(r),t(r),r.id)}).command(["edit <id> [text..]","update <id> [text..]"],"Edit a draft",(r)=>r.positional("id",{type:"string",demandOption:!0}).positional("text",{type:"string",array:!0,default:[]}).option("code",{type:"string"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing a bare URL that runs into non-ASCII text (it would link only up to that point)"}),async(r)=>{let i=e(r),a=t(r),c=r.text.join(" ");if(!c)console.error("Usage: slack drafts edit <id> <new-text>"),process.exit(2);Je(c,r["allow-url-adjacent"],void 0,{sides:["after"],markdown:!1});let l=await Es(i,a),u=Y(l.drafts).map(R).find((p)=>String(p.id)===r.id);if(!u)console.error(`Draft not found: ${r.id}`),process.exit(1);let d=Go(u),f=await Me(i,a),h=De(d,c,f?.userId??"");if(r.code!==h)xe(r.code,h,["--- Editing draft as -------------------------",Se(f),"--- Current draft ----------------------------",...d.split(`
|
|
470
|
+
`).map((p)=>` ${p}`),"--- Replacing with ---------------------------",...c.split(`
|
|
471
|
+
`).map((p)=>` ${p}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let m=await Jd(i,r.id,Aa(u),c,a);console.log(`\u2713 Draft updated (id: ${R(m.draft).id??"?"})`)}).command(["delete <id>","rm <id>"],"Delete a draft",(r)=>r.positional("id",{type:"string",demandOption:!0}).option("code",{type:"string"}),async(r)=>{let i=e(r),a=t(r),c=await Es(i,a),l=Y(c.drafts).map(R).find((h)=>String(h.id)===r.id);if(!l)console.error(`Draft not found: ${r.id}`),process.exit(1);let u=Go(l),d=await Me(i,a),f=De(r.id,u,d?.userId??"");if(r.code!==f)xe(r.code,f,["\u2500-- Deleting draft \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",Se(d),` id: ${r.id}`,...u.split(`
|
|
472
|
+
`).map((h)=>` ${h}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);await Hd(i,r.id,a),console.log(`\u2713 Draft deleted (id: ${r.id})`)})).command("auth","Authentication and workspace management",(s)=>s.command("token","Print the active token (or save one with --token)",(r)=>r.option("token",{type:"string",describe:"Token to save directly (non-interactive)"}).option("name",{type:"string",describe:"Workspace name (used with --token)"}),async(r)=>{if(r.token===void 0){console.log(ns(r.workspace));return}await nu({...r.token!==void 0?{token:r.token}:{},...r.name!==void 0?{name:r.name}:{}})}).command("env","Print active workspace credentials in dotenv format",()=>{},(r)=>{let i=ns(r.workspace),a=i.startsWith("xoxc-")?Jr(r.workspace):void 0,c=[["SLACK_TOKEN",i]];if(a)c.push(["SLACK_COOKIE",a]);let l=c.map(([u,d])=>{if(/[\r\n\0']/.test(d))throw Error(`Cannot export ${u}: unsupported characters in credential`);return`${u}='${d}'`});console.log(l.join(`
|
|
473
|
+
`))}).command("app","Create a new Slack app and obtain a token (guided wizard)",(r)=>r.option("bot",{type:"boolean",describe:"Create a bot token (xoxb-) instead of user (xoxp-)"}),async(r)=>{await su({...r.bot!==void 0?{bot:r.bot}:{}})}).command("login","Log in: interactive wizard, or a source (chrome, firefox)",(r)=>r.command("chrome","Import workspaces from Chrome, grouped by account (all platforms)",(i)=>i.option("profile",{type:"string",alias:"p",describe:'Chrome profile email or dir (e.g. "you@example.com" or "Profile 3")'}),async(i)=>{await bi({...i.profile!==void 0?{profile:i.profile}:{}})}).command("firefox","Import the xoxd cookie from Firefox into a workspace",(i)=>i.option("workspace",{type:"string",alias:"w",describe:"Workspace name to update (default: active)"}),async(i)=>{await Di({...i.workspace!==void 0?{workspace:i.workspace}:{}})}).option("token",{type:"string",describe:"Token to save directly (non-interactive)"}).option("name",{type:"string",describe:"Workspace name (used with --token)"}).option("yes",{type:"boolean",default:!1,describe:"Allow reading browser profiles without a confirmation prompt"}).option("from-desktop",{type:"boolean",default:!1,describe:"Import the Slack Desktop token without scanning a browser"}).option("from-chrome",{type:"boolean",default:!1,describe:"Import the desktop token and Chrome cookie"}).option("from-firefox",{type:"boolean",default:!1,describe:"Import the desktop token and Firefox cookie"}).option("from-all",{type:"boolean",default:!1,describe:"Import the desktop token and scan Chrome and Firefox"}).command("$0",!1,()=>{},async(i)=>{await ps({...i.token!==void 0?{token:i.token}:{},...i.name!==void 0?{name:i.name}:{},yes:i.yes,fromDesktop:i.fromDesktop,fromChrome:i.fromChrome,fromFirefox:i.fromFirefox,fromAll:i.fromAll})}),async(r)=>{await ps({...r.token!==void 0?{token:r.token}:{},...r.name!==void 0?{name:r.name}:{},yes:r.yes,fromDesktop:r.fromDesktop,fromChrome:r.fromChrome,fromFirefox:r.fromFirefox,fromAll:r.fromAll})}).command("tokens","Print the selected credentials as dotenv assignments",(r)=>r.option("workspace",{type:"string",alias:"w",describe:"Workspace name (default: active)"}),(r)=>ou({...r.workspace!==void 0?{workspace:r.workspace}:{}})).command("save","Save the active profile token and cookie to an env file",(r)=>r.option("envfile",{type:"string",demandOption:!0,describe:"Destination env file (e.g. ./.env.local)"}).option("workspace",{type:"string",alias:"w",describe:"Workspace name (default: active)"}),(r)=>ru({envfile:r.envfile,...r.workspace!==void 0?{workspace:r.workspace}:{}})).command(["ls","status"],"Show auth status",()=>{},()=>{let r=Ur();if(r.length===0){console.log("No workspaces configured. Run: slack auth login");return}for(let{name:i,profile:a,current:c}of r)console.log(`${c?"* ":" "}${i} ${a.team} (${a.user}) ${a.url??""}`)}).command("use <name>","Switch active workspace",(r)=>r.positional("name",{type:"string",demandOption:!0}).option("g",{type:"boolean",default:!1,describe:"Write global lockfile (~/.slack-cli/workspace)"}),(r)=>{if(!r.g)Fy(wt(process.cwd(),".slack-cli"));Dl(r.name,r.g),console.log(`Switched to workspace "${r.name}" ${r.g?"globally":"locally"}`)}).command(["logout <name>","rm <name>","remove <name>"],"Remove a workspace",(r)=>r.positional("name",{type:"string",demandOption:!0}),(r)=>{bl(r.name),console.log(`Removed workspace "${r.name}"`)}).command(["cookie","chrome"],"Attach a Chrome xoxd cookie to a workspace (macOS/Linux/Windows). To import workspaces, use: slack auth login chrome",(r)=>r.option("workspace",{type:"string",alias:"w",describe:"Workspace name to update (default: active)"}).option("profile",{type:"string",alias:"p",describe:"Chrome profile email or dir (Windows, when several have a session)"}).option("yes",{type:"boolean",default:!1,describe:"Allow reading browser profiles without a confirmation prompt"}),async(r)=>{await tu({...r.workspace!==void 0?{workspace:r.workspace}:{},...r.profile!==void 0?{profile:r.profile}:{},yes:r.yes})}).command("firefox","Attach Firefox browser xoxd cookie to a workspace (all platforms)",(r)=>r.option("workspace",{type:"string",alias:"w",describe:"Workspace name to update (default: active)"}).option("yes",{type:"boolean",default:!1,describe:"Allow reading browser profiles without a confirmation prompt"}),async(r)=>{await Di({...r.workspace!==void 0?{workspace:r.workspace}:{},yes:r.yes})}).command("$0",!1,()=>{},()=>{s.showHelp(),process.exit(0)})).command("stream","Print every new message matching --grep, across all channels the identity is in (threads included); resumable",(s)=>s.option("grep",{alias:"e",type:"string",demandOption:!0,describe:"Regex matched against each message's text (raw, e.g. <@U00000001>). Non-matching messages are never printed or logged"}).option("ignore-case",{alias:"i",type:"boolean",default:!1,describe:"Case-insensitive --grep"}).option("channel",{type:"array",string:!0,describe:"Only these channels (#name, id or permalink); repeatable"}).option("replies-to",{type:"array",string:!0,describe:"Also print replies in threads this id started or replied in (user U\u2026/bot B\u2026; `self` = the streaming identity), --grep or not; repeatable"}).option("json",{type:"boolean",default:!1,describe:"One JSON object per match: type, channel{id,name}, ts, thread_ts, user{id,name}, text, permalink, match (grep | replies-to)"}).option("once",{type:"boolean",default:!1,describe:"Scan once from the saved cursor (or --since) and exit: 0 = matches printed, 2 = none, 3 = failure"}).option("since",{type:"string",describe:"Replay from this long ago (e.g. 30m, 2h), ignoring the saved cursor"}).option("interval",{type:"string",default:"45s",describe:"Poll interval (e.g. 30s, 2m)"}).option("thread-window",{type:"string",default:"3d",describe:"Watch replies in threads whose parent is at most this old"}).option("thread-scan",{type:"string",default:"3m",describe:"Polling: re-read each channel's whole --thread-window this often (cycles in between read only what is new)"}).option("calls-per-min",{type:"number",default:40,describe:"Polling: pace conversations.history/replies to this many calls per minute (0 = unpaced)"}).option("state",{type:"string",describe:"Cursor file (default: one per identity+grep+channels under $XDG_STATE_HOME/slack-term/stream/)"}).option("as-user",{type:"boolean",default:!1,describe:"Stream as the user identity (sees the user's DMs) instead of the bot"}).option("relay",{type:"boolean",default:!0,describe:"Use the doorbell relay (worker/) when SLACK_RELAY_URL and SLACK_RELAY_TOKEN are set; --no-relay polls only"}).option("reconcile",{type:"string",default:"5m",describe:"While the relay is connected, poll this rarely as a safety net"}),async(s)=>{let r,i,a,c,l,u;try{r=new RegExp(s.grep,s["ignore-case"]?"i":""),a=Bt(s.interval)*1000,c=Bt(s["thread-window"]),l=Bt(s["thread-scan"]),u=s.since!==void 0?Bt(s.since):void 0,i=Bt(s.reconcile)*1000}catch(A){console.error(`slack stream: ${A instanceof Error?A.message:String(A)}`),process.exit(1)}let d=Ke(),f=s["as-user"]===!0||!d,h=f?e(s):d,m=f?t(s):void 0;if(!d&&s["as-user"]!==!0)console.error("slack stream: no bot token (SLACK_BOT_TOKEN) \u2014 streaming as the USER identity, which includes its DMs.");let p;try{p=await Ut(h,m)}catch(A){console.error(`slack stream: fatal: ${A instanceof Error?A.message:String(A)}`),process.exit(3)}let g=new Set([p.userId].filter(Boolean)),w=new Set([p.botId].filter(Boolean));if(f&&d)try{let A=await Ut(d);if(A.userId)g.add(A.userId);if(A.botId)w.add(A.botId)}catch{}let b;if(s["replies-to"]?.length){b=new Set;for(let A of s["replies-to"].map(String)){if(A==="self"){for(let L of[p.userId,p.botId])if(L)b.add(L);continue}if(!/^[UWB][A-Z0-9]{2,}$/.test(A))console.error(`slack stream: --replies-to: "${A}" is not a user or bot id (U\u2026/W\u2026/B\u2026) or "self"`),process.exit(1);if(b.add(A),A.startsWith("B"))try{let{userId:L}=await gd(h,A,m);if(L)b.add(L)}catch(L){console.error(`slack stream: --replies-to ${A}: cannot resolve its bot user id (${L instanceof Error?L.message:String(L)}); threads where it shows as a user id are missed`)}}}let k;if(s.channel?.length)try{k=[];for(let A of s.channel)k.push(await be(h,String(A),m))}catch(A){console.error(`slack stream: --channel: ${A instanceof Error?A.message:String(A)}`),process.exit(1)}let x=Hf("sha256").update(JSON.stringify([p.url,p.userId,r.source,r.flags,[...k??[]].sort(),...s["replies-to"]?.length?[[...s["replies-to"].map(String)].sort()]:[]])).digest("hex").slice(0,16),_=process.env.XDG_STATE_HOME||wt(ka(),".local","state"),F=s.state??wt(_,"slack-term","stream",`${x}.json`);console.error(`slack stream: as ${f?"user":"bot"} @${p.user} (${p.userId}); state ${F}`);let I=process.env.SLACK_RELAY_URL,S=process.env.SLACK_RELAY_TOKEN,B=s.relay&&!f&&!s.once&&I&&S?{url:I,subscribe:ku(I,S),reconcileMs:i}:void 0;if(s.relay&&f&&I)console.error("slack stream: relay not used with --as-user (it only sees the bot's channels)");let W=!s.relay?"--no-relay":f?I?"--as-user: the relay only rings for the bot's channels":"streaming as the user; the relay serves the bot identity":"SLACK_RELAY_URL / SLACK_RELAY_TOKEN not set",P=new AbortController;process.on("SIGINT",()=>P.abort()),process.on("SIGTERM",()=>P.abort());let T=await bu(yu(h,m),{grep:r,...b?{repliesTo:b}:{},...k?{channels:k}:{},selfUsers:g,selfBots:w,json:s.json,once:s.once,...u!==void 0?{sinceSec:u}:{},intervalMs:a,threadWindowSec:c,threadScanSec:l,callsPerMin:s["calls-per-min"],...B?{}:{pollReason:W},statePath:F,teamUrl:p.url,identity:p.userId,signal:P.signal,...B?{relay:B}:{}});process.exit(T)}).command("tail [target]","Stream new messages in real time (like tail -f)",(s)=>s.positional("target",{type:"string",describe:"#channel or @user to follow"}).option("since",{type:"string",describe:"Backfill from N ago (e.g. 10m, 2h, 1d)"}).option("thread",{type:"string",describe:"Follow a single thread by timestamp"}).option("watch-thread",{type:"string",describe:"Watch the channel's top-level timeline AND one thread's replies together (ts or permalink)"}).option("me",{type:"boolean",default:!1,describe:"Filter to messages that mention you"}).option("interval",{type:"number",default:60000,describe:"Poll interval in ms (default 60s; use --interval=3000 for near-real-time)"}).option("timeout",{type:"string",describe:"Auto-stop after this long (e.g. 30m, 2h). Exit code 0 even if nothing arrived."}).option("exit-on-message",{type:"boolean",default:!1,describe:"Stop as soon as the first new message from someone else arrives (wait-for-reply)"}).option("rtm",{type:"boolean",default:!0,describe:"Use RTM WebSocket when available (xoxc + cookie); pass --no-rtm to force polling"}),async(s)=>{let r=e(s),i=t(s),a=new AbortController;process.on("SIGINT",()=>{a.abort(),process.exit(0)}),await du(r,s.target,{...s.since!==void 0?{since:s.since}:{},...s.thread!==void 0?{thread:s.thread}:{},...s["watch-thread"]!==void 0?{watchThread:s["watch-thread"]}:{},me:s.me,interval:s.interval,...s.timeout!==void 0?{timeout:s.timeout}:{},...s["exit-on-message"]===!0?{exitOnMessage:!0}:{},...i!==void 0?{cookie:i}:{},...s.rtm===!1?{noRtm:!0}:{}},a.signal)}).command("login",!1,(s)=>s.option("token",{type:"string"}).option("name",{type:"string"}).option("yes",{type:"boolean",default:!1}).option("from-desktop",{type:"boolean",default:!1}).option("from-chrome",{type:"boolean",default:!1}).option("from-firefox",{type:"boolean",default:!1}).option("from-all",{type:"boolean",default:!1}),async(s)=>{await ps({...s.token!==void 0?{token:s.token}:{},...s.name!==void 0?{name:s.name}:{},yes:s.yes,fromDesktop:s.fromDesktop,fromChrome:s.fromChrome,fromFirefox:s.fromFirefox,fromAll:s.fromAll})}).demandCommand(1,"Specify a command. Run with --help for usage.").strict().help().alias("help","h").parseAsync()}Hw().catch((e)=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});
|