slack-term 1.51.2 → 1.53.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 +10 -0
- package/dist/cli.js +241 -239
- package/package.json +1 -1
- package/ts/askPush.ts +83 -0
- package/ts/botIntent.ts +5 -4
- package/ts/cli.ts +172 -15
- package/ts/sentlog.ts +16 -2
- package/ts/urlGuard.ts +43 -6
package/dist/cli.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{createRequire as cm}from"node:module";var nm=Object.create;var{getPrototypeOf:sm,defineProperty:sl,getOwnPropertyNames:om}=Object;var ol=Object.prototype.hasOwnProperty;function rm(e){return this[e]}var im,am,rl=(e,t,n)=>{var s=e!=null&&typeof e==="object";if(s){var o=t?im??=new WeakMap:am??=new WeakMap,r=o.get(e);if(r)return r}n=e!=null?nm(sm(e)):{};let i=t||!e||!e.__esModule||!ol.call(e,"default")?sl(n,"default",{value:e,enumerable:!0}):n;if(e&&typeof e==="object"||typeof e==="function"){for(let l of om(e))if(!ol.call(i,l))sl(i,l,{get:rm.bind(e,l),enumerable:!0})}if(s)o.set(e,i);return i};var il=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ps=cm(import.meta.url);var _l=il(function(Px,Sl){Sl.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 Xl=il(function(SS,Gl){Gl.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(o,r){return r};var s=Error().stack;if(Error.prepareStackTrace=n,s!==null&&typeof s==="object")return s[t]?s[t].getFileName():void 0}});import{createHash as Og}from"crypto";import{existsSync as Rg,readFileSync as Vc,mkdirSync as z0,realpathSync as Y0,writeFileSync as Ig}from"fs";import{homedir as Hc}from"os";import{dirname as G0,join as Ot,resolve as X0}from"path";import{notStrictEqual as zm,strictEqual as Ym}from"assert";var lm={right:fm,center:pm};class cl{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((s)=>s.split("\t")),n=0;return t.forEach((s)=>{if(s.length>1&&Ze.stringWidth(s[0])>n)n=Math.min(Math.floor(this.width*0.5),Ze.stringWidth(s[0]))}),t.forEach((s)=>{this.div(...s.map((o
|
|
5
|
-
`)}rowToString(e,t){return this.rasterize(e).forEach((n,s)=>{let
|
|
6
|
-
`);else s=
|
|
7
|
-
`);if(o.border)s.unshift("."+"-".repeat(this.negatePadding(o)+2)+"."),s.push("'"+"-".repeat(this.negatePadding(o)+2)+"'");if(o.padding)s.unshift(...Array(o.padding[0]||0).fill("")),s.push(...Array(o.padding[2]||0).fill(""));s.forEach((i,l)=>{if(!t[l])t.push([]);let u=t[l];for(let c=0;c<r;c++)if(u[c]===void 0)u.push("");u.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||Ze.stringWidth(r.text));let t=e.length,n=this.width,s=e.map((r)=>{if(r.width)return t--,n-=r.width,r.width;return}),o=t?Math.floor(n/t):0;return s.map((r,i)=>{if(r===void 0)return Math.max(o,um(e[i]));return r})}}function al(e,t,n){if(e.border){if(/[.']-+[.']/.test(t))return"";if(t.trim().length!==0)return n;return" "}return""}function um(e){let t=e.padding||[],n=1+(t[3]||0)+(t[1]||0);if(e.border)return n+4;return n}function dm(){if(typeof process==="object"&&process.stdout&&process.stdout.columns)return process.stdout.columns;return 80}function fm(e,t){e=e.trim();let n=Ze.stringWidth(e);if(n<t)return" ".repeat(t-n)+e;return e}function pm(e,t){e=e.trim();let n=Ze.stringWidth(e);if(n>=t)return e;return" ".repeat(t-n>>1)+e}var Ze;function ll(e,t){return Ze=t,new cl({width:(e===null||e===void 0?void 0:e.width)||dm(),wrap:e===null||e===void 0?void 0:e.wrap})}function Gr({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 hm=Gr();function fn(e){if(typeof e!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof e}\``);if(!e.includes("\x1B")&&!e.includes(""))return e;return e.replace(hm,"")}var ul=161,dl=1114109,fl=[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],pl=12288,hl=65510,gl=[12288,12288,65281,65376,65504,65510];var ml=4352,yl=262141,Xr=[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 ro=(e,t)=>{let n=0,s=Math.floor(e.length/2)-1;while(n<=s){let o=Math.floor((n+s)/2),r=o*2;if(t<e[r])s=o-1;else if(t>e[r+1])n=o+1;else return!0}return!1};var bl=19968,[gm,mm]=ym(Xr);function ym(e){let t=e[0],n=e[1];for(let s=0;s<e.length;s+=2){let o=e[s],r=e[s+1];if(bl>=o&&bl<=r)return[o,r];if(r-o>n-t)t=o,n=r}return[t,n]}var wl=(e)=>{if(e<ul||e>dl)return!1;return ro(fl,e)},Dl=(e)=>{if(e<pl||e>hl)return!1;return ro(gl,e)};var kl=(e)=>{if(e>=gm&&e<=mm)return!0;if(e<ml||e>yl)return!1;return ro(Xr,e)};function bm(e){if(!Number.isSafeInteger(e))throw TypeError(`Expected a code point, got \`${typeof e}\`.`)}function xl(e,{ambiguousAsWide:t=!1}={}){if(bm(e),Dl(e)||kl(e)||t&&wl(e))return 2;return 1}var El=rl(_l(),1),wm=new Intl.Segmenter,Dm=/^\p{Default_Ignorable_Code_Point}$/u;function ht(e,t={}){if(typeof e!=="string"||e.length===0)return 0;let{ambiguousIsNarrow:n=!0,countAnsiEscapeCodes:s=!1}=t;if(!s)e=fn(e);if(e.length===0)return 0;let o=0,r={ambiguousAsWide:!n};for(let{segment:i}of wm.segment(e)){let l=i.codePointAt(0);if(l<=31||l>=127&&l<=159)continue;if(l>=8203&&l<=8207||l===65279)continue;if(l>=768&&l<=879||l>=6832&&l<=6911||l>=7616&&l<=7679||l>=8400&&l<=8447||l>=65056&&l<=65071)continue;if(l>=55296&&l<=57343)continue;if(l>=65024&&l<=65039)continue;if(Dm.test(i))continue;if(El.default().test(i)){o+=2;continue}o+=xl(l,r)}return o}var $l=(e=0)=>(t)=>`\x1B[${t+e}m`,Cl=(e=0)=>(t)=>`\x1B[${38+e};5;${t}m`,Al=(e=0)=>(t,n,s)=>`\x1B[${38+e};2;${t};${n};${s}m`,Se={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]}},Bx=Object.keys(Se.modifier),km=Object.keys(Se.color),xm=Object.keys(Se.bgColor),jx=[...km,...xm];function Sm(){let e=new Map;for(let[t,n]of Object.entries(Se)){for(let[s,o]of Object.entries(n))Se[s]={open:`\x1B[${o[0]}m`,close:`\x1B[${o[1]}m`},n[s]=Se[s],e.set(o[0],o[1]);Object.defineProperty(Se,t,{value:n,enumerable:!1})}return Object.defineProperty(Se,"codes",{value:e,enumerable:!1}),Se.color.close="\x1B[39m",Se.bgColor.close="\x1B[49m",Se.color.ansi=$l(),Se.color.ansi256=Cl(),Se.color.ansi16m=Al(),Se.bgColor.ansi=$l(10),Se.bgColor.ansi256=Cl(10),Se.bgColor.ansi16m=Al(10),Object.defineProperties(Se,{rgbToAnsi256:{value(t,n,s){if(t===n&&n===s){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(s/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[s]=n;if(s.length===3)s=[...s].map((r)=>r+r).join("");let o=Number.parseInt(s,16);return[o>>16&255,o>>8&255,o&255]},enumerable:!1},hexToAnsi256:{value:(t)=>Se.rgbToAnsi256(...Se.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let n,s,o;if(t>=232)n=((t-232)*10+8)/255,s=n,o=n;else{t-=16;let l=t%36;n=Math.floor(t/36)/5,s=Math.floor(l/6)/5,o=l%6/5}let r=Math.max(n,s,o)*2;if(r===0)return 30;let i=30+(Math.round(o)<<2|Math.round(s)<<1|Math.round(n));if(r===2)i+=60;return i},enumerable:!1},rgbToAnsi:{value:(t,n,s)=>Se.ansi256ToAnsi(Se.rgbToAnsi256(t,n,s)),enumerable:!1},hexToAnsi:{value:(t)=>Se.ansi256ToAnsi(Se.hexToAnsi256(t)),enumerable:!1}}),Se}var _m=Sm(),Fl=_m;var ao=new Set(["\x1B",""]),Em=39,Zr="\x07",Rl="[",$m="]",Il="m",io=`${$m}8;;`,Tl=(e)=>`${ao.values().next().value}${Rl}${e}${Il}`,Ol=(e)=>`${ao.values().next().value}${io}${e}${Zr}`,Cm=(e)=>e.split(" ").map((t)=>ht(t)),Vr=(e,t,n)=>{let s=[...t],o=!1,r=!1,i=ht(fn(e.at(-1)));for(let[l,u]of s.entries()){let c=ht(u);if(i+c<=n)e[e.length-1]+=u;else e.push(u),i=0;if(ao.has(u))o=!0,r=s.slice(l+1,l+1+io.length).join("")===io;if(o){if(r){if(u===Zr)o=!1,r=!1}else if(u===Il)o=!1;continue}if(i+=c,i===n&&l<s.length-1)e.push(""),i=0}if(!i&&e.at(-1).length>0&&e.length>1)e[e.length-2]+=e.pop()},Am=(e)=>{let t=e.split(" "),n=t.length;while(n>0){if(ht(t[n-1])>0)break;n--}if(n===t.length)return e;return t.slice(0,n).join(" ")+t.slice(n).join("")},Fm=(e,t,n={})=>{if(n.trim!==!1&&e.trim()==="")return"";let s="",o,r,i=Cm(e),l=[""];for(let[d,f]of e.split(" ").entries()){if(n.trim!==!1)l[l.length-1]=l.at(-1).trimStart();let p=ht(l.at(-1));if(d!==0){if(p>=t&&(n.wordWrap===!1||n.trim===!1))l.push(""),p=0;if(p>0||n.trim===!1)l[l.length-1]+=" ",p++}if(n.hard&&i[d]>t){let g=t-p,h=1+Math.floor((i[d]-g-1)/t);if(Math.floor((i[d]-1)/t)<h)l.push("");Vr(l,f,t);continue}if(p+i[d]>t&&p>0&&i[d]>0){if(n.wordWrap===!1&&p<t){Vr(l,f,t);continue}l.push("")}if(p+i[d]>t&&n.wordWrap===!1){Vr(l,f,t);continue}l[l.length-1]+=f}if(n.trim!==!1)l=l.map((d)=>Am(d));let u=l.join(`
|
|
8
|
-
`),
|
|
9
|
-
`){if(
|
|
10
|
-
`){if(
|
|
3
|
+
import{createRequire as Em}from"node:module";var wm=Object.create;var{getPrototypeOf:Dm,defineProperty:ul,getOwnPropertyNames:km}=Object;var dl=Object.prototype.hasOwnProperty;function xm(e){return this[e]}var Sm,_m,fl=(e,t,n)=>{var s=e!=null&&typeof e==="object";if(s){var r=t?Sm??=new WeakMap:_m??=new WeakMap,o=r.get(e);if(o)return o}n=e!=null?wm(Dm(e)):{};let i=t||!e||!e.__esModule||!dl.call(e,"default")?ul(n,"default",{value:e,enumerable:!0}):n;if(e&&typeof e==="object"||typeof e==="function"){for(let l of km(e))if(!dl.call(i,l))ul(i,l,{get:xm.bind(e,l),enumerable:!0})}if(s)r.set(e,i);return i};var pl=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var gs=Em(import.meta.url);var Ol=pl(function(oS,Tl){Tl.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 su=pl(function(zS,nu){nu.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(r,o){return o};var s=Error().stack;if(Error.prepareStackTrace=n,s!==null&&typeof s==="object")return s[t]?s[t].getFileName():void 0}});import{createHash as Gg}from"crypto";import{existsSync as Yg,readFileSync as rl,mkdirSync as gk,realpathSync as mk,writeFileSync as Xg}from"fs";import{spawnSync as yk}from"child_process";import{homedir as Io}from"os";import{dirname as bk,join as gt,resolve as wk}from"path";import{notStrictEqual as uy,strictEqual as dy}from"assert";var $m={right:Fm,center:Tm};class gl{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((s)=>s.split("\t")),n=0;return t.forEach((s)=>{if(s.length>1&&Ze.stringWidth(s[0])>n)n=Math.min(Math.floor(this.width*0.5),Ze.stringWidth(s[0]))}),t.forEach((s)=>{this.div(...s.map((r,o)=>({text:r.trim(),padding:this.measurePadding(r),width:o===0&&s.length>1?n:void 0})))}),this.rows[this.rows.length-1]}colFromString(e){return{text:e,padding:this.measurePadding(e)}}measurePadding(e){let t=Ze.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,s)=>{let r="";n.forEach((o,i)=>{let{width:l}=e[i],u=this.negatePadding(e[i]),a=o;if(u>Ze.stringWidth(o))a+=" ".repeat(u-Ze.stringWidth(o));if(e[i].align&&e[i].align!=="left"&&this.wrap){let d=$m[e[i].align];if(a=d(a,u),Ze.stringWidth(a)<u)a+=" ".repeat((l||0)-Ze.stringWidth(a)-1)}let c=e[i].padding||[0,0,0,0];if(c[3])r+=" ".repeat(c[3]);if(r+=hl(e[i],a,"| "),r+=a,r+=hl(e[i],a," |"),c[1])r+=" ".repeat(c[1]);if(s===0&&t.length>0)r=this.renderInline(r,t[t.length-1])}),t.push({text:r.replace(/ +$/,""),span:e.span})}),t}renderInline(e,t){let n=e.match(/^ */),s=n?n[0].length:0,r=t.text,o=Ze.stringWidth(r.trimRight());if(!t.span)return e;if(!this.wrap)return t.hidden=!0,r+e;if(s<o)return e;return t.hidden=!0,r.trimRight()+" ".repeat(s-o)+e.trimLeft()}rasterize(e){let t=[],n=this.columnWidths(e),s;return e.forEach((r,o)=>{if(r.width=n[o],this.wrap)s=Ze.wrap(r.text,this.negatePadding(r),{hard:!0}).split(`
|
|
6
|
+
`);else s=r.text.split(`
|
|
7
|
+
`);if(r.border)s.unshift("."+"-".repeat(this.negatePadding(r)+2)+"."),s.push("'"+"-".repeat(this.negatePadding(r)+2)+"'");if(r.padding)s.unshift(...Array(r.padding[0]||0).fill("")),s.push(...Array(r.padding[2]||0).fill(""));s.forEach((i,l)=>{if(!t[l])t.push([]);let u=t[l];for(let a=0;a<o;a++)if(u[a]===void 0)u.push("");u.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((o)=>o.width||Ze.stringWidth(o.text));let t=e.length,n=this.width,s=e.map((o)=>{if(o.width)return t--,n-=o.width,o.width;return}),r=t?Math.floor(n/t):0;return s.map((o,i)=>{if(o===void 0)return Math.max(r,Cm(e[i]));return o})}}function hl(e,t,n){if(e.border){if(/[.']-+[.']/.test(t))return"";if(t.trim().length!==0)return n;return" "}return""}function Cm(e){let t=e.padding||[],n=1+(t[3]||0)+(t[1]||0);if(e.border)return n+4;return n}function Am(){if(typeof process==="object"&&process.stdout&&process.stdout.columns)return process.stdout.columns;return 80}function Fm(e,t){e=e.trim();let n=Ze.stringWidth(e);if(n<t)return" ".repeat(t-n)+e;return e}function Tm(e,t){e=e.trim();let n=Ze.stringWidth(e);if(n>=t)return e;return" ".repeat(t-n>>1)+e}var Ze;function ml(e,t){return Ze=t,new gl({width:(e===null||e===void 0?void 0:e.width)||Am(),wrap:e===null||e===void 0?void 0:e.wrap})}function Vo({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 Om=Vo();function fn(e){if(typeof e!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof e}\``);if(!e.includes("\x1B")&&!e.includes(""))return e;return e.replace(Om,"")}var yl=161,bl=1114109,wl=[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],Dl=12288,kl=65510,xl=[12288,12288,65281,65376,65504,65510];var Sl=4352,_l=262141,Zo=[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 cr=(e,t)=>{let n=0,s=Math.floor(e.length/2)-1;while(n<=s){let r=Math.floor((n+s)/2),o=r*2;if(t<e[o])s=r-1;else if(t>e[o+1])n=r+1;else return!0}return!1};var El=19968,[Rm,Im]=vm(Zo);function vm(e){let t=e[0],n=e[1];for(let s=0;s<e.length;s+=2){let r=e[s],o=e[s+1];if(El>=r&&El<=o)return[r,o];if(o-r>n-t)t=r,n=o}return[t,n]}var $l=(e)=>{if(e<yl||e>bl)return!1;return cr(wl,e)},Cl=(e)=>{if(e<Dl||e>kl)return!1;return cr(xl,e)};var Al=(e)=>{if(e>=Rm&&e<=Im)return!0;if(e<Sl||e>_l)return!1;return cr(Zo,e)};function Pm(e){if(!Number.isSafeInteger(e))throw TypeError(`Expected a code point, got \`${typeof e}\`.`)}function Fl(e,{ambiguousAsWide:t=!1}={}){if(Pm(e),Cl(e)||Al(e)||t&&$l(e))return 2;return 1}var Rl=fl(Ol(),1),Lm=new Intl.Segmenter,Nm=/^\p{Default_Ignorable_Code_Point}$/u;function mt(e,t={}){if(typeof e!=="string"||e.length===0)return 0;let{ambiguousIsNarrow:n=!0,countAnsiEscapeCodes:s=!1}=t;if(!s)e=fn(e);if(e.length===0)return 0;let r=0,o={ambiguousAsWide:!n};for(let{segment:i}of Lm.segment(e)){let l=i.codePointAt(0);if(l<=31||l>=127&&l<=159)continue;if(l>=8203&&l<=8207||l===65279)continue;if(l>=768&&l<=879||l>=6832&&l<=6911||l>=7616&&l<=7679||l>=8400&&l<=8447||l>=65056&&l<=65071)continue;if(l>=55296&&l<=57343)continue;if(l>=65024&&l<=65039)continue;if(Nm.test(i))continue;if(Rl.default().test(i)){r+=2;continue}r+=Fl(l,o)}return r}var Il=(e=0)=>(t)=>`\x1B[${t+e}m`,vl=(e=0)=>(t)=>`\x1B[${38+e};5;${t}m`,Pl=(e=0)=>(t,n,s)=>`\x1B[${38+e};2;${t};${n};${s}m`,Se={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]}},lS=Object.keys(Se.modifier),Mm=Object.keys(Se.color),Bm=Object.keys(Se.bgColor),uS=[...Mm,...Bm];function jm(){let e=new Map;for(let[t,n]of Object.entries(Se)){for(let[s,r]of Object.entries(n))Se[s]={open:`\x1B[${r[0]}m`,close:`\x1B[${r[1]}m`},n[s]=Se[s],e.set(r[0],r[1]);Object.defineProperty(Se,t,{value:n,enumerable:!1})}return Object.defineProperty(Se,"codes",{value:e,enumerable:!1}),Se.color.close="\x1B[39m",Se.bgColor.close="\x1B[49m",Se.color.ansi=Il(),Se.color.ansi256=vl(),Se.color.ansi16m=Pl(),Se.bgColor.ansi=Il(10),Se.bgColor.ansi256=vl(10),Se.bgColor.ansi16m=Pl(10),Object.defineProperties(Se,{rgbToAnsi256:{value(t,n,s){if(t===n&&n===s){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(s/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[s]=n;if(s.length===3)s=[...s].map((o)=>o+o).join("");let r=Number.parseInt(s,16);return[r>>16&255,r>>8&255,r&255]},enumerable:!1},hexToAnsi256:{value:(t)=>Se.rgbToAnsi256(...Se.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let n,s,r;if(t>=232)n=((t-232)*10+8)/255,s=n,r=n;else{t-=16;let l=t%36;n=Math.floor(t/36)/5,s=Math.floor(l/6)/5,r=l%6/5}let o=Math.max(n,s,r)*2;if(o===0)return 30;let i=30+(Math.round(r)<<2|Math.round(s)<<1|Math.round(n));if(o===2)i+=60;return i},enumerable:!1},rgbToAnsi:{value:(t,n,s)=>Se.ansi256ToAnsi(Se.rgbToAnsi256(t,n,s)),enumerable:!1},hexToAnsi:{value:(t)=>Se.ansi256ToAnsi(Se.hexToAnsi256(t)),enumerable:!1}}),Se}var Wm=jm(),Ll=Wm;var ur=new Set(["\x1B",""]),Um=39,ei="\x07",Bl="[",Jm="]",jl="m",lr=`${Jm}8;;`,Nl=(e)=>`${ur.values().next().value}${Bl}${e}${jl}`,Ml=(e)=>`${ur.values().next().value}${lr}${e}${ei}`,Km=(e)=>e.split(" ").map((t)=>mt(t)),Qo=(e,t,n)=>{let s=[...t],r=!1,o=!1,i=mt(fn(e.at(-1)));for(let[l,u]of s.entries()){let a=mt(u);if(i+a<=n)e[e.length-1]+=u;else e.push(u),i=0;if(ur.has(u))r=!0,o=s.slice(l+1,l+1+lr.length).join("")===lr;if(r){if(o){if(u===ei)r=!1,o=!1}else if(u===jl)r=!1;continue}if(i+=a,i===n&&l<s.length-1)e.push(""),i=0}if(!i&&e.at(-1).length>0&&e.length>1)e[e.length-2]+=e.pop()},qm=(e)=>{let t=e.split(" "),n=t.length;while(n>0){if(mt(t[n-1])>0)break;n--}if(n===t.length)return e;return t.slice(0,n).join(" ")+t.slice(n).join("")},Hm=(e,t,n={})=>{if(n.trim!==!1&&e.trim()==="")return"";let s="",r,o,i=Km(e),l=[""];for(let[d,f]of e.split(" ").entries()){if(n.trim!==!1)l[l.length-1]=l.at(-1).trimStart();let p=mt(l.at(-1));if(d!==0){if(p>=t&&(n.wordWrap===!1||n.trim===!1))l.push(""),p=0;if(p>0||n.trim===!1)l[l.length-1]+=" ",p++}if(n.hard&&i[d]>t){let g=t-p,h=1+Math.floor((i[d]-g-1)/t);if(Math.floor((i[d]-1)/t)<h)l.push("");Qo(l,f,t);continue}if(p+i[d]>t&&p>0&&i[d]>0){if(n.wordWrap===!1&&p<t){Qo(l,f,t);continue}l.push("")}if(p+i[d]>t&&n.wordWrap===!1){Qo(l,f,t);continue}l[l.length-1]+=f}if(n.trim!==!1)l=l.map((d)=>qm(d));let u=l.join(`
|
|
8
|
+
`),a=[...u],c=0;for(let[d,f]of a.entries()){if(s+=f,ur.has(f)){let{groups:g}=new RegExp(`(?:\\${Bl}(?<code>\\d+)m|\\${lr}(?<uri>.*)${ei})`).exec(u.slice(c))||{groups:{}};if(g.code!==void 0){let h=Number.parseFloat(g.code);r=h===Um?void 0:h}else if(g.uri!==void 0)o=g.uri.length===0?void 0:g.uri}let p=Ll.codes.get(Number(r));if(a[d+1]===`
|
|
9
|
+
`){if(o)s+=Ml("");if(r&&p)s+=Nl(p)}else if(f===`
|
|
10
|
+
`){if(r&&p)s+=Nl(r);if(o)s+=Ml(o)}c+=f.length}return s};function ti(e,t,n){return String(e).normalize().replaceAll(`\r
|
|
11
11
|
`,`
|
|
12
12
|
`).split(`
|
|
13
|
-
`).map((s)=>
|
|
14
|
-
`)}function ei(e){return ll(e,{stringWidth:ht,stripAnsi:fn,wrap:Qr})}import{dirname as vl,resolve as Pl}from"path";import{readdirSync as Tm,statSync as Om}from"fs";function ti(e,t){let n=Pl(".",e),s;if(!Om(n).isDirectory())n=vl(n);while(!0){if(s=t(n,Tm(n)),s)return Pl(n,s);if(n=vl(s=n),s===n)break}}import{inspect as Gm}from"util";import{fileURLToPath as Zl}from"url";import{format as vm}from"util";import{normalize as Pm,resolve as Lm}from"path";function pn(e){if(!(e!==e.toLowerCase()&&e!==e.toUpperCase()))e=e.toLowerCase();if(e.indexOf("-")===-1&&e.indexOf("_")===-1)return e;else{let n="",s=!1,o=e.match(/^-+/);for(let r=o?o[0].length:0;r<e.length;r++){let i=e.charAt(r);if(s)s=!1,i=i.toUpperCase();if(r!==0&&(i==="-"||i==="_"))s=!0;else if(i!=="-"&&i!=="_")n+=i}return n}}function co(e,t){let n=e.toLowerCase();t=t||"-";let s="";for(let o=0;o<e.length;o++){let r=n.charAt(o),i=e.charAt(o);if(r!==i&&o>0)s+=`${t}${n.charAt(o)}`;else s+=i}return s}function lo(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 Ll(e){if(Array.isArray(e))return e.map((i)=>typeof i!=="string"?i+"":i);e=e.trim();let t=0,n=null,s=null,o=null,r=[];for(let i=0;i<e.length;i++){if(n=s,s=e.charAt(i),s===" "&&!o){if(n!==" ")t++;continue}if(s===o)o=null;else if((s==="'"||s==='"')&&!o)o=s;if(!r[t])r[t]="";r[t]+=s}return r}var rt;(function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARRAY="array"})(rt||(rt={}));var Rt;class si{constructor(e){Rt=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),s=Ll(e),o=typeof e==="string",r=Rm(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),l=Object.assign(Object.create(null),n.default),u=n.configObjects||[],c=n.envPrefix,a=i["populate--"],d=a?"--":"_",f=Object.create(null),p=Object.create(null),g=n.__||Rt.format,h={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:[]},m=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,y=new RegExp("^--"+i["negation-prefix"]+"(.+)");if([].concat(n.array||[]).filter(Boolean).forEach(function(_){let F=typeof _==="object"?_.key:_,J=Object.keys(_).map(function(I){return{boolean:"bools",string:"strings",number:"numbers"}[I]}).filter(Boolean).pop();if(J)h[J][F]=!0;h.arrays[F]=!0,h.keys.push(F)}),[].concat(n.boolean||[]).filter(Boolean).forEach(function(_){h.bools[_]=!0,h.keys.push(_)}),[].concat(n.string||[]).filter(Boolean).forEach(function(_){h.strings[_]=!0,h.keys.push(_)}),[].concat(n.number||[]).filter(Boolean).forEach(function(_){h.numbers[_]=!0,h.keys.push(_)}),[].concat(n.count||[]).filter(Boolean).forEach(function(_){h.counts[_]=!0,h.keys.push(_)}),[].concat(n.normalize||[]).filter(Boolean).forEach(function(_){h.normalize[_]=!0,h.keys.push(_)}),typeof n.narg==="object")Object.entries(n.narg).forEach(([_,F])=>{if(typeof F==="number")h.nargs[_]=F,h.keys.push(_)});if(typeof n.coerce==="object")Object.entries(n.coerce).forEach(([_,F])=>{if(typeof F==="function")h.coercions[_]=F,h.keys.push(_)});if(typeof n.config<"u"){if(Array.isArray(n.config)||typeof n.config==="string")[].concat(n.config).filter(Boolean).forEach(function(_){h.configs[_]=!0});else if(typeof n.config==="object")Object.entries(n.config).forEach(([_,F])=>{if(typeof F==="boolean"||typeof F==="function")h.configs[_]=F})}oe(n.key,r,n.default,h.arrays),Object.keys(l).forEach(function(_){(h.aliases[_]||[]).forEach(function(F){l[F]=l[_]})});let w=null;Yr();let x=[],D=Object.assign(Object.create(null),{_:[]}),E={};for(let _=0;_<s.length;_++){let F=s[_],J=F.replace(/^-{3,}/,"---"),I,A,ee,X,se,Ie;if(F!=="--"&&/^-/.test(F)&&ie(F))C(F);else if(J.match(/^---+(=|$)/)){C(F);continue}else if(F.match(/^--.+=/)||!i["short-option-groups"]&&F.match(/^-.+=/)){if(X=F.match(/^--?([^=]+)=([\s\S]*)$/),X!==null&&Array.isArray(X)&&X.length>=3)if(U(X[1],h.arrays))_=k(_,X[1],s,X[2]);else if(U(X[1],h.nargs)!==!1)_=S(_,X[1],s,X[2]);else O(X[1],X[2],!0)}else if(F.match(y)&&i["boolean-negation"]){if(X=F.match(y),X!==null&&Array.isArray(X)&&X.length>=2)A=X[1],O(A,U(A,h.arrays)?[!1]:!1)}else if(F.match(/^--.+/)||!i["short-option-groups"]&&F.match(/^-[^-]+/)){if(X=F.match(/^--?(.+)/),X!==null&&Array.isArray(X)&&X.length>=2)if(A=X[1],U(A,h.arrays))_=k(_,A,s);else if(U(A,h.nargs)!==!1)_=S(_,A,s);else if(se=s[_+1],se!==void 0&&(!se.match(/^-/)||se.match(m))&&!U(A,h.bools)&&!U(A,h.counts))O(A,se),_++;else if(/^(true|false)$/.test(se))O(A,se),_++;else O(A,W(A))}else if(F.match(/^-.\..+=/)){if(X=F.match(/^-([^=]+)=([\s\S]*)$/),X!==null&&Array.isArray(X)&&X.length>=3)O(X[1],X[2])}else if(F.match(/^-.\..+/)&&!F.match(m)){if(se=s[_+1],X=F.match(/^-(.\..+)/),X!==null&&Array.isArray(X)&&X.length>=2)if(A=X[1],se!==void 0&&!se.match(/^-/)&&!U(A,h.bools)&&!U(A,h.counts))O(A,se),_++;else O(A,W(A))}else if(F.match(/^-[^-]+/)&&!F.match(m)){ee=F.slice(1,-1).split(""),I=!1;for(let Je=0;Je<ee.length;Je++){if(se=F.slice(Je+2),ee[Je+1]&&ee[Je+1]==="="){if(Ie=F.slice(Je+3),A=ee[Je],U(A,h.arrays))_=k(_,A,s,Ie);else if(U(A,h.nargs)!==!1)_=S(_,A,s,Ie);else O(A,Ie);I=!0;break}if(se==="-"){O(ee[Je],se);continue}if(/[A-Za-z]/.test(ee[Je])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(se)&&U(se,h.bools)===!1){O(ee[Je],se),I=!0;break}if(ee[Je+1]&&ee[Je+1].match(/\W/)){O(ee[Je],se),I=!0;break}else O(ee[Je],W(ee[Je]))}if(A=F.slice(-1)[0],!I&&A!=="-")if(U(A,h.arrays))_=k(_,A,s);else if(U(A,h.nargs)!==!1)_=S(_,A,s);else if(se=s[_+1],se!==void 0&&(!/^(-|--)[^-]/.test(se)||se.match(m))&&!U(A,h.bools)&&!U(A,h.counts))O(A,se),_++;else if(/^(true|false)$/.test(se))O(A,se),_++;else O(A,W(A))}else if(F.match(/^-[0-9]$/)&&F.match(m)&&U(F.slice(1),h.bools))A=F.slice(1),O(A,W(A));else if(F==="--"){x=s.slice(_+1);break}else if(i["halt-at-non-option"]){x=s.slice(_);break}else C(F)}if(q(D,!0),q(D,!1),j(D),B(),te(D,h.aliases,l,!0),z(D),i["set-placeholder-key"])R(D);if(Object.keys(h.counts).forEach(function(_){if(!Q(D,_.split(".")))O(_,0)}),a&&x.length)D[d]=[];if(x.forEach(function(_){D[d].push(_)}),i["camel-case-expansion"]&&i["strip-dashed"])Object.keys(D).filter((_)=>_!=="--"&&_.includes("-")).forEach((_)=>{delete D[_]});if(i["strip-aliased"])[].concat(...Object.keys(r).map((_)=>r[_])).forEach((_)=>{if(i["camel-case-expansion"]&&_.includes("-"))delete D[_.split(".").map((F)=>pn(F)).join(".")];delete D[_]});function C(_){let F=v("_",_);if(typeof F==="string"||typeof F==="number")D._.push(F)}function S(_,F,J,I){let A,ee=U(F,h.nargs);if(ee=typeof ee!=="number"||isNaN(ee)?1:ee,ee===0){if(!Ae(I))w=Error(g("Argument unexpected for: %s",F));return O(F,W(F)),_}let X=Ae(I)?0:1;if(i["nargs-eats-options"]){if(J.length-(_+1)+X<ee)w=Error(g("Not enough arguments following: %s",F));X=ee}else{for(A=_+1;A<J.length;A++)if(!J[A].match(/^-[^0-9]/)||J[A].match(m)||ie(J[A]))X++;else break;if(X<ee)w=Error(g("Not enough arguments following: %s",F))}let se=Math.min(X,ee);if(!Ae(I)&&se>0)O(F,I),se--;for(A=_+1;A<se+_+1;A++)O(F,J[A]);return _+se}function k(_,F,J,I){let A=[],ee=I||J[_+1],X=U(F,h.nargs);if(U(F,h.bools)&&!/^(true|false)$/.test(ee))A.push(!0);else if(Ae(ee)||Ae(I)&&/^-/.test(ee)&&!m.test(ee)&&!ie(ee)){if(l[F]!==void 0){let se=l[F];A=Array.isArray(se)?se:[se]}}else{if(!Ae(I))A.push(L(F,I,!0));for(let se=_+1;se<J.length;se++){if(!i["greedy-arrays"]&&A.length>0||X&&typeof X==="number"&&A.length>=X)break;if(ee=J[se],/^-/.test(ee)&&!m.test(ee)&&!ie(ee))break;_=se,A.push(L(F,ee,o))}}if(typeof X==="number"&&(X&&A.length<X||isNaN(X)&&A.length===0))w=Error(g("Not enough arguments following: %s",F));return O(F,A),_}function O(_,F,J=o){if(/-/.test(_)&&i["camel-case-expansion"]){let ee=_.split(".").map(function(X){return pn(X)}).join(".");P(_,ee)}let I=L(_,F,J),A=_.split(".");if(M(D,A,I),h.aliases[_])h.aliases[_].forEach(function(ee){let X=ee.split(".");M(D,X,I)});if(A.length>1&&i["dot-notation"])(h.aliases[A[0]]||[]).forEach(function(ee){let X=ee.split("."),se=[].concat(A);if(se.shift(),X=X.concat(se),!(h.aliases[_]||[]).includes(X.join(".")))M(D,X,I)});if(U(_,h.normalize)&&!U(_,h.arrays))[_].concat(h.aliases[_]||[]).forEach(function(X){Object.defineProperty(E,X,{enumerable:!0,get(){return F},set(se){F=typeof se==="string"?Rt.normalize(se):se}})})}function P(_,F){if(!(h.aliases[_]&&h.aliases[_].length))h.aliases[_]=[F],f[F]=!0;if(!(h.aliases[F]&&h.aliases[F].length))P(F,_)}function L(_,F,J){if(J)F=Im(F);if(U(_,h.bools)||U(_,h.counts)){if(typeof F==="string")F=F==="true"}let I=Array.isArray(F)?F.map(function(A){return v(_,A)}):v(_,F);if(U(_,h.counts)&&(Ae(I)||typeof I==="boolean"))I=ni();if(U(_,h.normalize)&&U(_,h.arrays))if(Array.isArray(F))I=F.map((A)=>Rt.normalize(A));else I=Rt.normalize(F);return I}function v(_,F){if(!i["parse-positional-numbers"]&&_==="_")return F;if(!U(_,h.strings)&&!U(_,h.bools)&&!Array.isArray(F)){if(lo(F)&&i["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${F}`)))||!Ae(F)&&U(_,h.numbers))F=Number(F)}return F}function j(_){let F=Object.create(null);te(F,h.aliases,l),Object.keys(h.configs).forEach(function(J){let I=_[J]||F[J];if(I)try{let A=null,ee=Rt.resolve(Rt.cwd(),I),X=h.configs[J];if(typeof X==="function"){try{A=X(ee)}catch(se){A=se}if(A instanceof Error){w=A;return}}else A=Rt.require(ee);H(A)}catch(A){if(A.name==="PermissionDenied")w=A;else if(_[J])w=Error(g("Invalid JSON config file: %s",I))}})}function H(_,F){Object.keys(_).forEach(function(J){let I=_[J],A=F?F+"."+J:J;if(typeof I==="object"&&I!==null&&!Array.isArray(I)&&i["dot-notation"])H(I,A);else if(!Q(D,A.split("."))||U(A,h.arrays)&&i["combine-arrays"])O(A,I)})}function B(){if(typeof u<"u")u.forEach(function(_){H(_)})}function q(_,F){if(typeof c>"u")return;let J=typeof c==="string"?c:"",I=Rt.env();Object.keys(I).forEach(function(A){if(J===""||A.lastIndexOf(J,0)===0){let ee=A.split("__").map(function(X,se){if(se===0)X=X.substring(J.length);return pn(X)});if((F&&h.configs[ee.join(".")]||!F)&&!Q(_,ee))O(ee.join("."),I[A])}})}function z(_){let F,J=new Set;Object.keys(_).forEach(function(I){if(!J.has(I)){if(F=U(I,h.coercions),typeof F==="function")try{let A=v(I,F(_[I]));[].concat(h.aliases[I]||[],I).forEach((ee)=>{J.add(ee),_[ee]=A})}catch(A){w=A}}})}function R(_){return h.keys.forEach((F)=>{if(~F.indexOf("."))return;if(typeof _[F]>"u")_[F]=void 0}),_}function te(_,F,J,I=!1){Object.keys(J).forEach(function(A){if(!Q(_,A.split("."))){if(M(_,A.split("."),J[A]),I)p[A]=!0;(F[A]||[]).forEach(function(ee){if(Q(_,ee.split(".")))return;M(_,ee.split("."),J[A])})}})}function Q(_,F){let J=_;if(!i["dot-notation"])F=[F.join(".")];F.slice(0,-1).forEach(function(A){J=J[A]||{}});let I=F[F.length-1];if(typeof J!=="object")return!1;else return I in J}function M(_,F,J){let I=_;if(!i["dot-notation"])F=[F.join(".")];F.slice(0,-1).forEach(function(Ie){if(Ie=Nl(Ie),typeof I==="object"&&I[Ie]===void 0)I[Ie]={};if(typeof I[Ie]!=="object"||Array.isArray(I[Ie])){if(Array.isArray(I[Ie]))I[Ie].push({});else I[Ie]=[I[Ie],{}];I=I[Ie][I[Ie].length-1]}else I=I[Ie]});let A=Nl(F[F.length-1]),ee=U(F.join("."),h.arrays),X=Array.isArray(J),se=i["duplicate-arguments-array"];if(!se&&U(A,h.nargs)){if(se=!0,!Ae(I[A])&&h.nargs[A]===1||Array.isArray(I[A])&&I[A].length===h.nargs[A])I[A]=void 0}if(J===ni())I[A]=ni(I[A]);else if(Array.isArray(I[A]))if(se&&ee&&X)I[A]=i["flatten-duplicate-arrays"]?I[A].concat(J):(Array.isArray(I[A][0])?I[A]:[I[A]]).concat([J]);else if(!se&&Boolean(ee)===Boolean(X))I[A]=J;else I[A]=I[A].concat([J]);else if(I[A]===void 0&&ee)I[A]=X?J:[J];else if(se&&!(I[A]===void 0||U(A,h.counts)||U(A,h.bools)))I[A]=[I[A],J];else I[A]=J}function oe(..._){_.forEach(function(F){Object.keys(F||{}).forEach(function(J){if(h.aliases[J])return;h.aliases[J]=[].concat(r[J]||[]),h.aliases[J].concat(J).forEach(function(I){if(/-/.test(I)&&i["camel-case-expansion"]){let A=pn(I);if(A!==J&&h.aliases[J].indexOf(A)===-1)h.aliases[J].push(A),f[A]=!0}}),h.aliases[J].concat(J).forEach(function(I){if(I.length>1&&/[A-Z]/.test(I)&&i["camel-case-expansion"]){let A=co(I,"-");if(A!==J&&h.aliases[J].indexOf(A)===-1)h.aliases[J].push(A),f[A]=!0}}),h.aliases[J].forEach(function(I){h.aliases[I]=[J].concat(h.aliases[J].filter(function(A){return I!==A}))})})})}function U(_,F){let J=[].concat(h.aliases[_]||[],_),I=Object.keys(F),A=J.find((ee)=>I.includes(ee));return A?F[A]:!1}function de(_){let F=Object.keys(h);return[].concat(F.map((I)=>h[I])).some(function(I){return Array.isArray(I)?I.includes(_):I[_]})}function re(_,...F){return[].concat(...F).some(function(I){let A=_.match(I);return A&&de(A[1])})}function K(_){if(_.match(m)||!_.match(/^-[^-]+/))return!1;let F=!0,J,I=_.slice(1).split("");for(let A=0;A<I.length;A++){if(J=_.slice(A+2),!de(I[A])){F=!1;break}if(I[A+1]&&I[A+1]==="="||J==="-"||/[A-Za-z]/.test(I[A])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(J)||I[A+1]&&I[A+1].match(/\W/))break}return F}function ie(_){return i["unknown-options-as-args"]&&G(_)}function G(_){if(_=_.replace(/^-{3,}/,"--"),_.match(m))return!1;if(K(_))return!1;return!re(_,/^-+([^=]+?)=[\s\S]*$/,y,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}function W(_){if(!U(_,h.bools)&&!U(_,h.counts)&&`${_}`in l)return l[_];else return he(De(_))}function he(_){return{[rt.BOOLEAN]:!0,[rt.STRING]:"",[rt.NUMBER]:void 0,[rt.ARRAY]:[]}[_]}function De(_){let F=rt.BOOLEAN;if(U(_,h.strings))F=rt.STRING;else if(U(_,h.numbers))F=rt.NUMBER;else if(U(_,h.bools))F=rt.BOOLEAN;else if(U(_,h.arrays))F=rt.ARRAY;return F}function Ae(_){return _===void 0}function Yr(){Object.keys(h.counts).find((_)=>{if(U(_,h.arrays))return w=Error(g("Invalid configuration: %s, opts.count excludes opts.array.",_)),!0;else if(U(_,h.nargs))return w=Error(g("Invalid configuration: %s, opts.count excludes opts.narg.",_)),!0;return!1})}return{aliases:Object.assign({},h.aliases),argv:Object.assign(E,D),configuration:i,defaulted:Object.assign({},p),error:w,newAliases:Object.assign({},f)}}}function Rm(e){let t=[],n=Object.create(null),s=!0;Object.keys(e).forEach(function(o){t.push([].concat(e[o],o))});while(s){s=!1;for(let o=0;o<t.length;o++)for(let r=o+1;r<t.length;r++)if(t[o].filter(function(l){return t[r].indexOf(l)!==-1}).length){t[o]=t[o].concat(t[r]),t.splice(r,1),s=!0;break}}return t.forEach(function(o){o=o.filter(function(i,l,u){return u.indexOf(i)===l});let r=o.pop();if(r!==void 0&&typeof r==="string")n[r]=o}),n}function ni(e){return e!==void 0?e+1:1}function Nl(e){if(e==="__proto__")return"___proto___";return e}function Im(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 Nm}from"fs";import{createRequire as Ml}from"node:module";var oi,ri,ii,Bl=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):20,jl=(ri=(oi=process===null||process===void 0?void 0:process.versions)===null||oi===void 0?void 0:oi.node)!==null&&ri!==void 0?ri:(ii=process===null||process===void 0?void 0:process.version)===null||ii===void 0?void 0:ii.slice(1);if(jl){if(Number(jl.match(/^([^.]+)/)[1])<Bl)throw Error(`yargs parser supports a minimum Node.js version of ${Bl}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}var Mm=process?process.env:{},Wl=Ml?Ml(import.meta.url):void 0,Jl=new si({cwd:process.cwd,env:()=>Mm,format:vm,normalize:Pm,resolve:Lm,require:(e)=>{if(typeof Wl<"u")return Wl(e);else if(e.match(/\.json$/))return JSON.parse(Nm(e,"utf8"));else throw Error("only .json config files are supported in ESM")}}),hs=function(t,n){return Jl.parse(t.slice(),n).argv};hs.detailed=function(e,t){return Jl.parse(e.slice(),t)};hs.camelCase=pn;hs.decamelize=co;hs.looksLikeNumber=lo;var ai=hs;import{basename as Xm,dirname as Vm,extname as Zm,relative as Qm,resolve as Vl,join as ey}from"path";function Ul(){if(Bm())return 0;return 1}function Bm(){return jm()&&!process.defaultApp}function jm(){return!!process.versions.electron}function ci(e){return e.slice(Ul()+1)}function Kl(){return process.argv[Ul()]}import{readFileSync as Wm,statSync as Jm,writeFile as Um}from"fs";import{format as Km}from"util";import{resolve as qm}from"path";var ql={fs:{readFileSync:Wm,writeFile:Um},format:Km,resolve:qm,exists:(e)=>{try{return Jm(e).isFile()}catch(t){return!1}}};var gt;class Hl{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 gt.format.apply(gt.format,[this.cache[this.locale][t]||t].concat(e))}__n(){let e=Array.prototype.slice.call(arguments),t=e.shift(),n=e.shift(),s=e.shift(),o=function(){};if(typeof e[e.length-1]==="function")o=e.pop();if(!this.cache[this.locale])this._readLocaleFile();let r=s===1?t:n;if(this.cache[this.locale][t])r=this.cache[this.locale][t][s===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:o});else o();let i=[r];if(~r.indexOf("%d"))i.push(s);return gt.format.apply(gt.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(s,o){let r=t[o+1];if(n+=s,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:s,cb:o}=t,r=this._resolveLocaleFile(n,s),i=JSON.stringify(this.cache[s],null,2);gt.fs.writeFile(r,i,"utf-8",function(l){if(e.writeQueue.shift(),e.writeQueue.length>0)e._processWriteQueue();o(l)})}_readLocaleFile(){let e={},t=this._resolveLocaleFile(this.directory,this.locale);try{if(gt.fs.readFileSync)e=JSON.parse(gt.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=gt.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){let s=gt.resolve(e,"./",t.split("_")[0]+".json");if(this._fileExistsSync(s))n=s}return n}_fileExistsSync(e){return gt.exists(e)}}function zl(e,t){gt=t;let n=new Hl(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 Hm=(e)=>zl(e,ql),Yl=Hm;var Ql=rl(Xl(),1);import{createRequire as ty}from"node:module";import{readFileSync as ny,readdirSync as sy}from"node:fs";var li=Zl(import.meta.url),oy=li.substring(0,li.lastIndexOf("node_modules")),ry=ty(import.meta.url),ui={assert:{notStrictEqual:zm,strictEqual:Ym},cliui:ei,findUp:ti,getEnv:(e)=>process.env[e],inspect:Gm,getProcessArgvBin:Kl,mainFilename:oy||process.cwd(),Parser:ai,path:{basename:Xm,dirname:Vm,extname:Zm,relative:Qm,resolve:Vl,join:ey},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:ny,readdirSync:sy,require:ry,getCallerFile:()=>{let e=Ql.default(3);return e.match(/^file:\/\//)?Zl(e):e},stringWidth:ht,y18n:Yl({directory:Vl(li,"../../../locales"),updateFiles:!1})};function Ue(e,t,n,s){n.assert.notStrictEqual(e,t,s)}function di(e,t){t.assert.strictEqual(typeof e,"string")}function Jn(e){return Object.keys(e)}function ke(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 Ht(e){let n=e.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),s=/\.*[\][<>]/g,o=n.shift();if(!o)throw Error(`No command found in: ${e}`);let r={cmd:o.replace(s,""),demanded:[],optional:[]};return n.forEach((i,l)=>{let u=!1;if(i=i.replace(/\s/g,""),/\.+[\]>]/.test(i)&&l===n.length-1)u=!0;if(/^\[/.test(i))r.optional.push({cmd:i.replace(s,"").split("|"),variadic:u});else r.demanded.push({cmd:i.replace(s,"").split("|"),variadic:u})}),r}var iy=["first","second","third","fourth","fifth","sixth"];function V(e,t,n){function s(){return typeof e==="object"?[{demanded:[],optional:[]},e,t]:[Ht(`cmd ${e}`),t,n]}try{let o=0,[r,i,l]=s(),u=[].slice.call(i);while(u.length&&u[u.length-1]===void 0)u.pop();let c=l||u.length;if(c<r.demanded.length)throw new $e(`Not enough arguments provided. Expected ${r.demanded.length} but received ${u.length}.`);let a=r.demanded.length+r.optional.length;if(c>a)throw new $e(`Too many arguments provided. Expected max ${a} but received ${c}.`);r.demanded.forEach((d)=>{let f=u.shift(),p=eu(f);if(d.cmd.filter((h)=>h===p||h==="*").length===0)tu(p,d.cmd,o);o+=1}),r.optional.forEach((d)=>{if(u.length===0)return;let f=u.shift(),p=eu(f);if(d.cmd.filter((h)=>h===p||h==="*").length===0)tu(p,d.cmd,o);o+=1})}catch(o){console.warn(o.stack)}}function eu(e){if(Array.isArray(e))return"array";else if(e===null)return"null";return typeof e}function tu(e,t,n){throw new $e(`Invalid ${iy[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class fi{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,s=!1){if(V("<array|function> [boolean] [boolean] [boolean]",[e,t,n],arguments.length),Array.isArray(e)){for(let o=0;o<e.length;o++){if(typeof e[o]!=="function")throw Error("middleware must be a function");let r=e[o];r.applyBeforeValidation=t,r.global=n}Array.prototype.push.apply(this.globalMiddleware,e)}else if(typeof e==="function"){let o=e;o.applyBeforeValidation=t,o.global=n,o.mutates=s,this.globalMiddleware.push(e)}return this.yargs}addCoerceMiddleware(e,t){let n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((s)=>{let o=[...n[t]||[],t];if(!s.option)return!0;else return!o.includes(s.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 nu(e){if(!e)return[];return e.map((t)=>(t.applyBeforeValidation=!1,t))}function hn(e,t,n,s){return n.reduce((o,r)=>{if(r.applyBeforeValidation!==s)return o;if(r.mutates){if(r.applied)return o;r.applied=!0}if(ke(o))return o.then((i)=>Promise.all([i,r(i,t)])).then(([i,l])=>Object.assign(i,l));else{let i=r(o,t);return ke(i)?i.then((l)=>Object.assign(o,l)):Object.assign(o,i)}},e)}function gn(e,t,n=(s)=>{throw s}){try{let s=ay(e)?e():e;return ke(s)?s.then((o)=>t(o)):t(s)}catch(s){return n(s)}}function ay(e){return typeof e==="function"}var Un=/(^\*)|(^\$0)/;class ou{constructor(e,t,n,s){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=s,this.usage=e,this.globalMiddleware=n,this.validation=t}addDirectory(e,t,n,s){s=s||{},this.requireCache.add(n);let o=this.shim.path.resolve(this.shim.path.dirname(n),e),r=this.shim.readdirSync(o,{recursive:s.recurse?!0:!1});if(!Array.isArray(s.extensions))s.extensions=["js"];let i=typeof s.visit==="function"?s.visit:(l)=>l;for(let l of r){let u=l.toString();if(s.exclude){let a=!1;if(typeof s.exclude==="function")a=s.exclude(u);else a=s.exclude.test(u);if(a)continue}if(s.include){let a=!1;if(typeof s.include==="function")a=s.include(u);else a=s.include.test(u);if(!a)continue}let c=!1;for(let a of s.extensions)if(u.endsWith(a))c=!0;if(c){let a=this.shim.path.join(o,u),d=t(a),f=Object.create(null,Object.getOwnPropertyDescriptors({...d}));if(i(f,a,u)){if(this.requireCache.has(a))continue;else this.requireCache.add(a);if(!f.command)f.command=this.shim.path.basename(a,this.shim.path.extname(a));this.addHandler(f)}}}}addHandler(e,t,n,s,o,r){let i=[],l=nu(o);if(s=s||(()=>{}),Array.isArray(e))if(cy(e))[e,...i]=e;else for(let u of e)this.addHandler(u);else if(uy(e)){let u=Array.isArray(e.command)||typeof e.command==="string"?e.command:null;if(u===null)throw Error(`No command name given for module: ${this.shim.inspect(e)}`);if(e.aliases)u=[].concat(u).concat(e.aliases);this.addHandler(u,this.extractDesc(e),e.builder,e.handler,e.middlewares,e.deprecated);return}else if(su(n)){this.addHandler([e].concat(i),t,n.builder,n.handler,n.middlewares,n.deprecated);return}if(typeof e==="string"){let u=Ht(e);i=i.map((d)=>Ht(d).cmd);let c=!1,a=[u.cmd].concat(i).filter((d)=>{if(Un.test(d))return c=!0,!1;return!0});if(a.length===0&&c)a.push("$0");if(c)u.cmd=a[0],i=a.slice(1),e=e.replace(Un,u.cmd);if(i.forEach((d)=>{this.aliasMap[d]=u.cmd}),t!==!1)this.usage.command(e,t,c,i,r);if(this.handlers[u.cmd]={original:e,description:t,handler:s,builder:n||{},middlewares:l,deprecated:r,demanded:u.demanded,optional:u.optional},c)this.defaultCommand=this.handlers[u.cmd]}}getCommandHandlers(){return this.handlers}getCommands(){return Object.keys(this.handlers).concat(Object.keys(this.aliasMap))}hasDefaultCommand(){return!!this.defaultCommand}runCommand(e,t,n,s,o,r){let i=this.handlers[e]||this.handlers[this.aliasMap[e]]||this.defaultCommand,l=t.getInternalMethods().getContext(),u=l.commands.slice(),c=!e;if(e)l.commands.push(e),l.fullCommands.push(i.original);let a=this.applyBuilderUpdateUsageAndParse(c,i,t,n.aliases,u,s,o,r);return ke(a)?a.then((d)=>this.applyMiddlewareAndGetResult(c,i,d.innerArgv,l,o,d.aliases,t)):this.applyMiddlewareAndGetResult(c,i,a.innerArgv,l,o,a.aliases,t)}applyBuilderUpdateUsageAndParse(e,t,n,s,o,r,i,l){let u=t.builder,c=n;if(uo(u)){n.getInternalMethods().getUsageInstance().freeze();let a=u(n.getInternalMethods().reset(s),l);if(ke(a))return a.then((d)=>(c=iu(d)?d:n,this.parseAndUpdateUsage(e,t,c,o,r,i)))}else if(ly(u))n.getInternalMethods().getUsageInstance().freeze(),c=n.getInternalMethods().reset(s),Object.keys(t.builder).forEach((a)=>{c.option(a,u[a])});return this.parseAndUpdateUsage(e,t,c,o,r,i)}parseAndUpdateUsage(e,t,n,s,o,r){if(e)n.getInternalMethods().getUsageInstance().unfreeze(!0);if(this.shouldUpdateUsage(n))n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(s,t),t.description);let i=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,o,r);return ke(i)?i.then((l)=>({aliases:n.parsed.aliases,innerArgv:l})):{aliases:n.parsed.aliases,innerArgv:i}}shouldUpdateUsage(e){return!e.getInternalMethods().getUsageInstance().getUsageDisabled()&&e.getInternalMethods().getUsageInstance().getUsage().length===0}usageFromParentCommandsCommandHandler(e,t){let n=Un.test(t.original)?t.original.replace(Un,"").trim():t.original,s=e.filter((o)=>!Un.test(o));return s.push(n),`$0 ${s.join(" ")}`}handleValidationAndGetResult(e,t,n,s,o,r,i,l){if(!r.getInternalMethods().getHasOutput()){let u=r.getInternalMethods().runValidation(o,l,r.parsed.error,e);n=gn(n,(c)=>(u(c),c))}if(t.handler&&!r.getInternalMethods().getHasOutput()){r.getInternalMethods().setHasOutput();let u=!!r.getOptions().configuration["populate--"];if(r.getInternalMethods().postProcess(n,u,!1,!1),n=hn(n,r,i,!1),n=gn(n,(c)=>{let a=t.handler(c);return ke(a)?a.then(()=>c):c}),!e)r.getInternalMethods().getUsageInstance().cacheHelpMessage();if(ke(n)&&!r.getInternalMethods().hasParseCallback())n.catch((c)=>{try{r.getInternalMethods().getUsageInstance().fail(null,c)}catch(a){}})}if(!e)s.commands.pop(),s.fullCommands.pop();return n}applyMiddlewareAndGetResult(e,t,n,s,o,r,i){let l={};if(o)return n;if(!i.getInternalMethods().getHasOutput())l=this.populatePositionals(t,n,s,i);let u=this.globalMiddleware.getMiddleware().slice(0).concat(t.middlewares),c=hn(n,i,u,!0);return ke(c)?c.then((a)=>this.handleValidationAndGetResult(e,t,a,s,r,i,u,l)):this.handleValidationAndGetResult(e,t,c,s,r,i,u,l)}populatePositionals(e,t,n,s){t._=t._.slice(n.commands.length);let o=e.demanded.slice(0),r=e.optional.slice(0),i={};this.validation.positionalCount(o.length,t._.length);while(o.length){let l=o.shift();this.populatePositional(l,t,i)}while(r.length){let l=r.shift();this.populatePositional(l,t,i)}return t._=n.commands.concat(t._.map((l)=>""+l)),this.postProcessPositionals(t,i,this.cmdToParseOptions(e.original),s),i}populatePositional(e,t,n){let s=e.cmd[0];if(e.variadic)n[s]=t._.splice(0).map(String);else if(t._.length)n[s]=[String(t._.shift())]}cmdToParseOptions(e){let t={array:[],default:{},alias:{},demand:{}},n=Ht(e);return n.demanded.forEach((s)=>{let[o,...r]=s.cmd;if(s.variadic)t.array.push(o),t.default[o]=[];t.alias[o]=r,t.demand[o]=!0}),n.optional.forEach((s)=>{let[o,...r]=s.cmd;if(s.variadic)t.array.push(o),t.default[o]=[];t.alias[o]=r}),t}postProcessPositionals(e,t,n,s){let o=Object.assign({},s.getOptions());o.default=Object.assign(n.default,o.default);for(let u of Object.keys(n.alias))o.alias[u]=(o.alias[u]||[]).concat(n.alias[u]);o.array=o.array.concat(n.array),o.config={};let r=[];if(Object.keys(t).forEach((u)=>{t[u].map((c)=>{if(o.configuration["unknown-options-as-args"])o.key[u]=!0;r.push(`--${u}`),r.push(c)})}),!r.length)return;let i=Object.assign({},o.configuration,{"populate--":!1}),l=this.shim.Parser.detailed(r,Object.assign({},o,{configuration:i}));if(l.error)s.getInternalMethods().getUsageInstance().fail(l.error.message,l.error);else{let u=Object.keys(t);Object.keys(t).forEach((c)=>{u.push(...l.aliases[c])}),Object.keys(l.argv).forEach((c)=>{if(u.includes(c)){if(!t[c])t[c]=l.argv[c];if(!this.isInConfigs(s,c)&&!this.isDefaulted(s,c)&&Object.prototype.hasOwnProperty.call(e,c)&&Object.prototype.hasOwnProperty.call(l.argv,c)&&(Array.isArray(e[c])||Array.isArray(l.argv[c])))e[c]=[].concat(e[c],l.argv[c]);else e[c]=l.argv[c]}})}}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((s)=>Object.prototype.hasOwnProperty.call(s,t))||n.some((s)=>Object.prototype.hasOwnProperty.call(s,this.shim.Parser.camelCase(t)))}runDefaultBuilderOn(e){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(e)){let n=Un.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(uo(t))return t(e,!0);else if(!su(t))Object.keys(t).forEach((n)=>{e.option(n,t[n])});return}extractDesc({describe:e,description:t,desc:n}){for(let s of[e,t,n]){if(typeof s==="string"||s===!1)return s;Ue(s,!0,this.shim)}return!1}freeze(){this.frozens.push({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand})}unfreeze(){let e=this.frozens.pop();Ue(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 ru(e,t,n,s){return new ou(e,t,n,s)}function su(e){return typeof e==="object"&&!!e.builder&&typeof e.handler==="function"}function cy(e){return e.every((t)=>typeof t==="string")}function uo(e){return typeof e==="function"}function ly(e){return typeof e==="object"}function uy(e){return typeof e==="object"&&!Array.isArray(e)}function zt(e={},t=()=>!0){let n={};return Jn(e).forEach((s)=>{if(t(s,e[s]))n[s]=e[s]}),n}function Yt(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 dy(e){return typeof e==="boolean"}function cu(e,t){let n=t.y18n.__,s={},o=[];s.failFn=function(v){o.push(v)};let r=null,i=null,l=!0;s.showHelpOnFail=function(v=!0,j){let[H,B]=typeof v==="string"?[!0,v]:[v,j];if(e.getInternalMethods().isGlobalContext())i=B;return r=B,l=H,s};let u=!1;s.fail=function(v,j){let H=e.getInternalMethods().getLoggerInstance();if(o.length)for(let B=o.length-1;B>=0;--B){let q=o[B];if(dy(q)){if(j)throw j;else if(v)throw Error(v)}else q(v,j,s)}else{if(e.getExitProcess())Yt(!0);if(!u){if(u=!0,l)e.showHelp("error"),H.error();if(v||j)H.error(v||j);let B=r||i;if(B){if(v||j)H.error("");H.error(B)}}if(j=j||new $e(v),e.getExitProcess())return e.exit(1);else if(e.getInternalMethods().hasParseCallback())return e.exit(1,j);else throw j}};let c=[],a=!1;s.usage=(L,v)=>{if(L===null)return a=!0,c=[],s;return a=!1,c.push([L,v||""]),s},s.getUsage=()=>c,s.getUsageDisabled=()=>a,s.getPositionalGroupName=()=>n("Positionals:");let d=[];s.example=(L,v)=>{d.push([L,v||""])};let f=[];s.command=function(v,j,H,B,q=!1){if(H)f=f.map((z)=>(z[2]=!1,z));f.push([v,j||"",H,B,q])},s.getCommands=()=>f;let p={};s.describe=function(v,j){if(Array.isArray(v))v.forEach((H)=>{s.describe(H,j)});else if(typeof v==="object")Object.keys(v).forEach((H)=>{s.describe(H,v[H])});else p[v]=j},s.getDescriptions=()=>p;let g=[];s.epilog=(L)=>{g.push(L)};let h=!1,m;s.wrap=(L)=>{h=!0,m=L},s.getWrap=()=>{if(t.getEnv("YARGS_DISABLE_WRAP"))return null;if(!h)m=k(),h=!0;return m};let y="__yargsString__:";s.deferY18nLookup=(L)=>y+L,s.help=function(){if(D)return D;x();let v=e.customScriptName?e.$0:t.path.basename(e.$0),j=e.getDemandedOptions(),H=e.getDemandedCommands(),B=e.getDeprecatedOptions(),q=e.getGroups(),z=e.getOptions(),R=[];R=R.concat(Object.keys(p)),R=R.concat(Object.keys(j)),R=R.concat(Object.keys(H)),R=R.concat(Object.keys(z.default)),R=R.filter(C),R=Object.keys(R.reduce((K,ie)=>{if(ie!=="_")K[ie]=!0;return K},{}));let te=s.getWrap(),Q=t.cliui({width:te,wrap:!!te});if(!a){if(c.length)c.forEach((K)=>{if(Q.div({text:`${K[0].replace(/\$0/g,v)}`}),K[1])Q.div({text:`${K[1]}`,padding:[1,0,0,0]})}),Q.div();else if(f.length){let K=null;if(H._)K=`${v} <${n("command")}>
|
|
13
|
+
`).map((s)=>Hm(s,t,n)).join(`
|
|
14
|
+
`)}function ni(e){return ml(e,{stringWidth:mt,stripAnsi:fn,wrap:ti})}import{dirname as Wl,resolve as Ul}from"path";import{readdirSync as zm,statSync as Gm}from"fs";function si(e,t){let n=Ul(".",e),s;if(!Gm(n).isDirectory())n=Wl(n);while(!0){if(s=t(n,zm(n)),s)return Ul(n,s);if(n=Wl(s=n),s===n)break}}import{inspect as fy}from"util";import{fileURLToPath as ou}from"url";import{format as Vm}from"util";import{normalize as Zm,resolve as Qm}from"path";function pn(e){if(!(e!==e.toLowerCase()&&e!==e.toUpperCase()))e=e.toLowerCase();if(e.indexOf("-")===-1&&e.indexOf("_")===-1)return e;else{let n="",s=!1,r=e.match(/^-+/);for(let o=r?r[0].length:0;o<e.length;o++){let i=e.charAt(o);if(s)s=!1,i=i.toUpperCase();if(o!==0&&(i==="-"||i==="_"))s=!0;else if(i!=="-"&&i!=="_")n+=i}return n}}function dr(e,t){let n=e.toLowerCase();t=t||"-";let s="";for(let r=0;r<e.length;r++){let o=n.charAt(r),i=e.charAt(r);if(o!==i&&r>0)s+=`${t}${n.charAt(r)}`;else s+=i}return s}function fr(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 Jl(e){if(Array.isArray(e))return e.map((i)=>typeof i!=="string"?i+"":i);e=e.trim();let t=0,n=null,s=null,r=null,o=[];for(let i=0;i<e.length;i++){if(n=s,s=e.charAt(i),s===" "&&!r){if(n!==" ")t++;continue}if(s===r)r=null;else if((s==="'"||s==='"')&&!r)r=s;if(!o[t])o[t]="";o[t]+=s}return o}var ot;(function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARRAY="array"})(ot||(ot={}));var It;class oi{constructor(e){It=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),s=Jl(e),r=typeof e==="string",o=Ym(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),l=Object.assign(Object.create(null),n.default),u=n.configObjects||[],a=n.envPrefix,c=i["populate--"],d=c?"--":"_",f=Object.create(null),p=Object.create(null),g=n.__||It.format,h={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:[]},m=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,y=new RegExp("^--"+i["negation-prefix"]+"(.+)");if([].concat(n.array||[]).filter(Boolean).forEach(function(_){let F=typeof _==="object"?_.key:_,U=Object.keys(_).map(function(I){return{boolean:"bools",string:"strings",number:"numbers"}[I]}).filter(Boolean).pop();if(U)h[U][F]=!0;h.arrays[F]=!0,h.keys.push(F)}),[].concat(n.boolean||[]).filter(Boolean).forEach(function(_){h.bools[_]=!0,h.keys.push(_)}),[].concat(n.string||[]).filter(Boolean).forEach(function(_){h.strings[_]=!0,h.keys.push(_)}),[].concat(n.number||[]).filter(Boolean).forEach(function(_){h.numbers[_]=!0,h.keys.push(_)}),[].concat(n.count||[]).filter(Boolean).forEach(function(_){h.counts[_]=!0,h.keys.push(_)}),[].concat(n.normalize||[]).filter(Boolean).forEach(function(_){h.normalize[_]=!0,h.keys.push(_)}),typeof n.narg==="object")Object.entries(n.narg).forEach(([_,F])=>{if(typeof F==="number")h.nargs[_]=F,h.keys.push(_)});if(typeof n.coerce==="object")Object.entries(n.coerce).forEach(([_,F])=>{if(typeof F==="function")h.coercions[_]=F,h.keys.push(_)});if(typeof n.config<"u"){if(Array.isArray(n.config)||typeof n.config==="string")[].concat(n.config).filter(Boolean).forEach(function(_){h.configs[_]=!0});else if(typeof n.config==="object")Object.entries(n.config).forEach(([_,F])=>{if(typeof F==="boolean"||typeof F==="function")h.configs[_]=F})}re(n.key,o,n.default,h.arrays),Object.keys(l).forEach(function(_){(h.aliases[_]||[]).forEach(function(F){l[F]=l[_]})});let w=null;Xo();let x=[],D=Object.assign(Object.create(null),{_:[]}),E={};for(let _=0;_<s.length;_++){let F=s[_],U=F.replace(/^-{3,}/,"---"),I,A,ee,X,se,Ie;if(F!=="--"&&/^-/.test(F)&&ie(F))C(F);else if(U.match(/^---+(=|$)/)){C(F);continue}else if(F.match(/^--.+=/)||!i["short-option-groups"]&&F.match(/^-.+=/)){if(X=F.match(/^--?([^=]+)=([\s\S]*)$/),X!==null&&Array.isArray(X)&&X.length>=3)if(J(X[1],h.arrays))_=k(_,X[1],s,X[2]);else if(J(X[1],h.nargs)!==!1)_=S(_,X[1],s,X[2]);else O(X[1],X[2],!0)}else if(F.match(y)&&i["boolean-negation"]){if(X=F.match(y),X!==null&&Array.isArray(X)&&X.length>=2)A=X[1],O(A,J(A,h.arrays)?[!1]:!1)}else if(F.match(/^--.+/)||!i["short-option-groups"]&&F.match(/^-[^-]+/)){if(X=F.match(/^--?(.+)/),X!==null&&Array.isArray(X)&&X.length>=2)if(A=X[1],J(A,h.arrays))_=k(_,A,s);else if(J(A,h.nargs)!==!1)_=S(_,A,s);else if(se=s[_+1],se!==void 0&&(!se.match(/^-/)||se.match(m))&&!J(A,h.bools)&&!J(A,h.counts))O(A,se),_++;else if(/^(true|false)$/.test(se))O(A,se),_++;else O(A,W(A))}else if(F.match(/^-.\..+=/)){if(X=F.match(/^-([^=]+)=([\s\S]*)$/),X!==null&&Array.isArray(X)&&X.length>=3)O(X[1],X[2])}else if(F.match(/^-.\..+/)&&!F.match(m)){if(se=s[_+1],X=F.match(/^-(.\..+)/),X!==null&&Array.isArray(X)&&X.length>=2)if(A=X[1],se!==void 0&&!se.match(/^-/)&&!J(A,h.bools)&&!J(A,h.counts))O(A,se),_++;else O(A,W(A))}else if(F.match(/^-[^-]+/)&&!F.match(m)){ee=F.slice(1,-1).split(""),I=!1;for(let Ue=0;Ue<ee.length;Ue++){if(se=F.slice(Ue+2),ee[Ue+1]&&ee[Ue+1]==="="){if(Ie=F.slice(Ue+3),A=ee[Ue],J(A,h.arrays))_=k(_,A,s,Ie);else if(J(A,h.nargs)!==!1)_=S(_,A,s,Ie);else O(A,Ie);I=!0;break}if(se==="-"){O(ee[Ue],se);continue}if(/[A-Za-z]/.test(ee[Ue])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(se)&&J(se,h.bools)===!1){O(ee[Ue],se),I=!0;break}if(ee[Ue+1]&&ee[Ue+1].match(/\W/)){O(ee[Ue],se),I=!0;break}else O(ee[Ue],W(ee[Ue]))}if(A=F.slice(-1)[0],!I&&A!=="-")if(J(A,h.arrays))_=k(_,A,s);else if(J(A,h.nargs)!==!1)_=S(_,A,s);else if(se=s[_+1],se!==void 0&&(!/^(-|--)[^-]/.test(se)||se.match(m))&&!J(A,h.bools)&&!J(A,h.counts))O(A,se),_++;else if(/^(true|false)$/.test(se))O(A,se),_++;else O(A,W(A))}else if(F.match(/^-[0-9]$/)&&F.match(m)&&J(F.slice(1),h.bools))A=F.slice(1),O(A,W(A));else if(F==="--"){x=s.slice(_+1);break}else if(i["halt-at-non-option"]){x=s.slice(_);break}else C(F)}if(q(D,!0),q(D,!1),j(D),B(),te(D,h.aliases,l,!0),z(D),i["set-placeholder-key"])R(D);if(Object.keys(h.counts).forEach(function(_){if(!Q(D,_.split(".")))O(_,0)}),c&&x.length)D[d]=[];if(x.forEach(function(_){D[d].push(_)}),i["camel-case-expansion"]&&i["strip-dashed"])Object.keys(D).filter((_)=>_!=="--"&&_.includes("-")).forEach((_)=>{delete D[_]});if(i["strip-aliased"])[].concat(...Object.keys(o).map((_)=>o[_])).forEach((_)=>{if(i["camel-case-expansion"]&&_.includes("-"))delete D[_.split(".").map((F)=>pn(F)).join(".")];delete D[_]});function C(_){let F=v("_",_);if(typeof F==="string"||typeof F==="number")D._.push(F)}function S(_,F,U,I){let A,ee=J(F,h.nargs);if(ee=typeof ee!=="number"||isNaN(ee)?1:ee,ee===0){if(!Ae(I))w=Error(g("Argument unexpected for: %s",F));return O(F,W(F)),_}let X=Ae(I)?0:1;if(i["nargs-eats-options"]){if(U.length-(_+1)+X<ee)w=Error(g("Not enough arguments following: %s",F));X=ee}else{for(A=_+1;A<U.length;A++)if(!U[A].match(/^-[^0-9]/)||U[A].match(m)||ie(U[A]))X++;else break;if(X<ee)w=Error(g("Not enough arguments following: %s",F))}let se=Math.min(X,ee);if(!Ae(I)&&se>0)O(F,I),se--;for(A=_+1;A<se+_+1;A++)O(F,U[A]);return _+se}function k(_,F,U,I){let A=[],ee=I||U[_+1],X=J(F,h.nargs);if(J(F,h.bools)&&!/^(true|false)$/.test(ee))A.push(!0);else if(Ae(ee)||Ae(I)&&/^-/.test(ee)&&!m.test(ee)&&!ie(ee)){if(l[F]!==void 0){let se=l[F];A=Array.isArray(se)?se:[se]}}else{if(!Ae(I))A.push(P(F,I,!0));for(let se=_+1;se<U.length;se++){if(!i["greedy-arrays"]&&A.length>0||X&&typeof X==="number"&&A.length>=X)break;if(ee=U[se],/^-/.test(ee)&&!m.test(ee)&&!ie(ee))break;_=se,A.push(P(F,ee,r))}}if(typeof X==="number"&&(X&&A.length<X||isNaN(X)&&A.length===0))w=Error(g("Not enough arguments following: %s",F));return O(F,A),_}function O(_,F,U=r){if(/-/.test(_)&&i["camel-case-expansion"]){let ee=_.split(".").map(function(X){return pn(X)}).join(".");L(_,ee)}let I=P(_,F,U),A=_.split(".");if(M(D,A,I),h.aliases[_])h.aliases[_].forEach(function(ee){let X=ee.split(".");M(D,X,I)});if(A.length>1&&i["dot-notation"])(h.aliases[A[0]]||[]).forEach(function(ee){let X=ee.split("."),se=[].concat(A);if(se.shift(),X=X.concat(se),!(h.aliases[_]||[]).includes(X.join(".")))M(D,X,I)});if(J(_,h.normalize)&&!J(_,h.arrays))[_].concat(h.aliases[_]||[]).forEach(function(X){Object.defineProperty(E,X,{enumerable:!0,get(){return F},set(se){F=typeof se==="string"?It.normalize(se):se}})})}function L(_,F){if(!(h.aliases[_]&&h.aliases[_].length))h.aliases[_]=[F],f[F]=!0;if(!(h.aliases[F]&&h.aliases[F].length))L(F,_)}function P(_,F,U){if(U)F=Xm(F);if(J(_,h.bools)||J(_,h.counts)){if(typeof F==="string")F=F==="true"}let I=Array.isArray(F)?F.map(function(A){return v(_,A)}):v(_,F);if(J(_,h.counts)&&(Ae(I)||typeof I==="boolean"))I=ri();if(J(_,h.normalize)&&J(_,h.arrays))if(Array.isArray(F))I=F.map((A)=>It.normalize(A));else I=It.normalize(F);return I}function v(_,F){if(!i["parse-positional-numbers"]&&_==="_")return F;if(!J(_,h.strings)&&!J(_,h.bools)&&!Array.isArray(F)){if(fr(F)&&i["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${F}`)))||!Ae(F)&&J(_,h.numbers))F=Number(F)}return F}function j(_){let F=Object.create(null);te(F,h.aliases,l),Object.keys(h.configs).forEach(function(U){let I=_[U]||F[U];if(I)try{let A=null,ee=It.resolve(It.cwd(),I),X=h.configs[U];if(typeof X==="function"){try{A=X(ee)}catch(se){A=se}if(A instanceof Error){w=A;return}}else A=It.require(ee);H(A)}catch(A){if(A.name==="PermissionDenied")w=A;else if(_[U])w=Error(g("Invalid JSON config file: %s",I))}})}function H(_,F){Object.keys(_).forEach(function(U){let I=_[U],A=F?F+"."+U:U;if(typeof I==="object"&&I!==null&&!Array.isArray(I)&&i["dot-notation"])H(I,A);else if(!Q(D,A.split("."))||J(A,h.arrays)&&i["combine-arrays"])O(A,I)})}function B(){if(typeof u<"u")u.forEach(function(_){H(_)})}function q(_,F){if(typeof a>"u")return;let U=typeof a==="string"?a:"",I=It.env();Object.keys(I).forEach(function(A){if(U===""||A.lastIndexOf(U,0)===0){let ee=A.split("__").map(function(X,se){if(se===0)X=X.substring(U.length);return pn(X)});if((F&&h.configs[ee.join(".")]||!F)&&!Q(_,ee))O(ee.join("."),I[A])}})}function z(_){let F,U=new Set;Object.keys(_).forEach(function(I){if(!U.has(I)){if(F=J(I,h.coercions),typeof F==="function")try{let A=v(I,F(_[I]));[].concat(h.aliases[I]||[],I).forEach((ee)=>{U.add(ee),_[ee]=A})}catch(A){w=A}}})}function R(_){return h.keys.forEach((F)=>{if(~F.indexOf("."))return;if(typeof _[F]>"u")_[F]=void 0}),_}function te(_,F,U,I=!1){Object.keys(U).forEach(function(A){if(!Q(_,A.split("."))){if(M(_,A.split("."),U[A]),I)p[A]=!0;(F[A]||[]).forEach(function(ee){if(Q(_,ee.split(".")))return;M(_,ee.split("."),U[A])})}})}function Q(_,F){let U=_;if(!i["dot-notation"])F=[F.join(".")];F.slice(0,-1).forEach(function(A){U=U[A]||{}});let I=F[F.length-1];if(typeof U!=="object")return!1;else return I in U}function M(_,F,U){let I=_;if(!i["dot-notation"])F=[F.join(".")];F.slice(0,-1).forEach(function(Ie){if(Ie=Kl(Ie),typeof I==="object"&&I[Ie]===void 0)I[Ie]={};if(typeof I[Ie]!=="object"||Array.isArray(I[Ie])){if(Array.isArray(I[Ie]))I[Ie].push({});else I[Ie]=[I[Ie],{}];I=I[Ie][I[Ie].length-1]}else I=I[Ie]});let A=Kl(F[F.length-1]),ee=J(F.join("."),h.arrays),X=Array.isArray(U),se=i["duplicate-arguments-array"];if(!se&&J(A,h.nargs)){if(se=!0,!Ae(I[A])&&h.nargs[A]===1||Array.isArray(I[A])&&I[A].length===h.nargs[A])I[A]=void 0}if(U===ri())I[A]=ri(I[A]);else if(Array.isArray(I[A]))if(se&&ee&&X)I[A]=i["flatten-duplicate-arrays"]?I[A].concat(U):(Array.isArray(I[A][0])?I[A]:[I[A]]).concat([U]);else if(!se&&Boolean(ee)===Boolean(X))I[A]=U;else I[A]=I[A].concat([U]);else if(I[A]===void 0&&ee)I[A]=X?U:[U];else if(se&&!(I[A]===void 0||J(A,h.counts)||J(A,h.bools)))I[A]=[I[A],U];else I[A]=U}function re(..._){_.forEach(function(F){Object.keys(F||{}).forEach(function(U){if(h.aliases[U])return;h.aliases[U]=[].concat(o[U]||[]),h.aliases[U].concat(U).forEach(function(I){if(/-/.test(I)&&i["camel-case-expansion"]){let A=pn(I);if(A!==U&&h.aliases[U].indexOf(A)===-1)h.aliases[U].push(A),f[A]=!0}}),h.aliases[U].concat(U).forEach(function(I){if(I.length>1&&/[A-Z]/.test(I)&&i["camel-case-expansion"]){let A=dr(I,"-");if(A!==U&&h.aliases[U].indexOf(A)===-1)h.aliases[U].push(A),f[A]=!0}}),h.aliases[U].forEach(function(I){h.aliases[I]=[U].concat(h.aliases[U].filter(function(A){return I!==A}))})})})}function J(_,F){let U=[].concat(h.aliases[_]||[],_),I=Object.keys(F),A=U.find((ee)=>I.includes(ee));return A?F[A]:!1}function de(_){let F=Object.keys(h);return[].concat(F.map((I)=>h[I])).some(function(I){return Array.isArray(I)?I.includes(_):I[_]})}function oe(_,...F){return[].concat(...F).some(function(I){let A=_.match(I);return A&&de(A[1])})}function K(_){if(_.match(m)||!_.match(/^-[^-]+/))return!1;let F=!0,U,I=_.slice(1).split("");for(let A=0;A<I.length;A++){if(U=_.slice(A+2),!de(I[A])){F=!1;break}if(I[A+1]&&I[A+1]==="="||U==="-"||/[A-Za-z]/.test(I[A])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(U)||I[A+1]&&I[A+1].match(/\W/))break}return F}function ie(_){return i["unknown-options-as-args"]&&Y(_)}function Y(_){if(_=_.replace(/^-{3,}/,"--"),_.match(m))return!1;if(K(_))return!1;return!oe(_,/^-+([^=]+?)=[\s\S]*$/,y,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}function W(_){if(!J(_,h.bools)&&!J(_,h.counts)&&`${_}`in l)return l[_];else return he(De(_))}function he(_){return{[ot.BOOLEAN]:!0,[ot.STRING]:"",[ot.NUMBER]:void 0,[ot.ARRAY]:[]}[_]}function De(_){let F=ot.BOOLEAN;if(J(_,h.strings))F=ot.STRING;else if(J(_,h.numbers))F=ot.NUMBER;else if(J(_,h.bools))F=ot.BOOLEAN;else if(J(_,h.arrays))F=ot.ARRAY;return F}function Ae(_){return _===void 0}function Xo(){Object.keys(h.counts).find((_)=>{if(J(_,h.arrays))return w=Error(g("Invalid configuration: %s, opts.count excludes opts.array.",_)),!0;else if(J(_,h.nargs))return w=Error(g("Invalid configuration: %s, opts.count excludes opts.narg.",_)),!0;return!1})}return{aliases:Object.assign({},h.aliases),argv:Object.assign(E,D),configuration:i,defaulted:Object.assign({},p),error:w,newAliases:Object.assign({},f)}}}function Ym(e){let t=[],n=Object.create(null),s=!0;Object.keys(e).forEach(function(r){t.push([].concat(e[r],r))});while(s){s=!1;for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++)if(t[r].filter(function(l){return t[o].indexOf(l)!==-1}).length){t[r]=t[r].concat(t[o]),t.splice(o,1),s=!0;break}}return t.forEach(function(r){r=r.filter(function(i,l,u){return u.indexOf(i)===l});let o=r.pop();if(o!==void 0&&typeof o==="string")n[o]=r}),n}function ri(e){return e!==void 0?e+1:1}function Kl(e){if(e==="__proto__")return"___proto___";return e}function Xm(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 ey}from"fs";import{createRequire as ql}from"node:module";var ii,ai,ci,Hl=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):20,zl=(ai=(ii=process===null||process===void 0?void 0:process.versions)===null||ii===void 0?void 0:ii.node)!==null&&ai!==void 0?ai:(ci=process===null||process===void 0?void 0:process.version)===null||ci===void 0?void 0:ci.slice(1);if(zl){if(Number(zl.match(/^([^.]+)/)[1])<Hl)throw Error(`yargs parser supports a minimum Node.js version of ${Hl}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}var ty=process?process.env:{},Gl=ql?ql(import.meta.url):void 0,Yl=new oi({cwd:process.cwd,env:()=>ty,format:Vm,normalize:Zm,resolve:Qm,require:(e)=>{if(typeof Gl<"u")return Gl(e);else if(e.match(/\.json$/))return JSON.parse(ey(e,"utf8"));else throw Error("only .json config files are supported in ESM")}}),ms=function(t,n){return Yl.parse(t.slice(),n).argv};ms.detailed=function(e,t){return Yl.parse(e.slice(),t)};ms.camelCase=pn;ms.decamelize=dr;ms.looksLikeNumber=fr;var li=ms;import{basename as py,dirname as hy,extname as gy,relative as my,resolve as ru,join as yy}from"path";function Xl(){if(ny())return 0;return 1}function ny(){return sy()&&!process.defaultApp}function sy(){return!!process.versions.electron}function ui(e){return e.slice(Xl()+1)}function Vl(){return process.argv[Xl()]}import{readFileSync as ry,statSync as oy,writeFile as iy}from"fs";import{format as ay}from"util";import{resolve as cy}from"path";var Zl={fs:{readFileSync:ry,writeFile:iy},format:ay,resolve:cy,exists:(e)=>{try{return oy(e).isFile()}catch(t){return!1}}};var yt;class Ql{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 yt.format.apply(yt.format,[this.cache[this.locale][t]||t].concat(e))}__n(){let e=Array.prototype.slice.call(arguments),t=e.shift(),n=e.shift(),s=e.shift(),r=function(){};if(typeof e[e.length-1]==="function")r=e.pop();if(!this.cache[this.locale])this._readLocaleFile();let o=s===1?t:n;if(this.cache[this.locale][t])o=this.cache[this.locale][t][s===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:r});else r();let i=[o];if(~o.indexOf("%d"))i.push(s);return yt.format.apply(yt.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(s,r){let o=t[r+1];if(n+=s,typeof o<"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:s,cb:r}=t,o=this._resolveLocaleFile(n,s),i=JSON.stringify(this.cache[s],null,2);yt.fs.writeFile(o,i,"utf-8",function(l){if(e.writeQueue.shift(),e.writeQueue.length>0)e._processWriteQueue();r(l)})}_readLocaleFile(){let e={},t=this._resolveLocaleFile(this.directory,this.locale);try{if(yt.fs.readFileSync)e=JSON.parse(yt.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=yt.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){let s=yt.resolve(e,"./",t.split("_")[0]+".json");if(this._fileExistsSync(s))n=s}return n}_fileExistsSync(e){return yt.exists(e)}}function eu(e,t){yt=t;let n=new Ql(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 ly=(e)=>eu(e,Zl),tu=ly;var iu=fl(su(),1);import{createRequire as by}from"node:module";import{readFileSync as wy,readdirSync as Dy}from"node:fs";var di=ou(import.meta.url),ky=di.substring(0,di.lastIndexOf("node_modules")),xy=by(import.meta.url),fi={assert:{notStrictEqual:uy,strictEqual:dy},cliui:ni,findUp:si,getEnv:(e)=>process.env[e],inspect:fy,getProcessArgvBin:Vl,mainFilename:ky||process.cwd(),Parser:li,path:{basename:py,dirname:hy,extname:gy,relative:my,resolve:ru,join:yy},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:wy,readdirSync:Dy,require:xy,getCallerFile:()=>{let e=iu.default(3);return e.match(/^file:\/\//)?ou(e):e},stringWidth:mt,y18n:tu({directory:ru(di,"../../../locales"),updateFiles:!1})};function Je(e,t,n,s){n.assert.notStrictEqual(e,t,s)}function pi(e,t){t.assert.strictEqual(typeof e,"string")}function Un(e){return Object.keys(e)}function ke(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 Ht(e){let n=e.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),s=/\.*[\][<>]/g,r=n.shift();if(!r)throw Error(`No command found in: ${e}`);let o={cmd:r.replace(s,""),demanded:[],optional:[]};return n.forEach((i,l)=>{let u=!1;if(i=i.replace(/\s/g,""),/\.+[\]>]/.test(i)&&l===n.length-1)u=!0;if(/^\[/.test(i))o.optional.push({cmd:i.replace(s,"").split("|"),variadic:u});else o.demanded.push({cmd:i.replace(s,"").split("|"),variadic:u})}),o}var Sy=["first","second","third","fourth","fifth","sixth"];function V(e,t,n){function s(){return typeof e==="object"?[{demanded:[],optional:[]},e,t]:[Ht(`cmd ${e}`),t,n]}try{let r=0,[o,i,l]=s(),u=[].slice.call(i);while(u.length&&u[u.length-1]===void 0)u.pop();let a=l||u.length;if(a<o.demanded.length)throw new $e(`Not enough arguments provided. Expected ${o.demanded.length} but received ${u.length}.`);let c=o.demanded.length+o.optional.length;if(a>c)throw new $e(`Too many arguments provided. Expected max ${c} but received ${a}.`);o.demanded.forEach((d)=>{let f=u.shift(),p=au(f);if(d.cmd.filter((h)=>h===p||h==="*").length===0)cu(p,d.cmd,r);r+=1}),o.optional.forEach((d)=>{if(u.length===0)return;let f=u.shift(),p=au(f);if(d.cmd.filter((h)=>h===p||h==="*").length===0)cu(p,d.cmd,r);r+=1})}catch(r){console.warn(r.stack)}}function au(e){if(Array.isArray(e))return"array";else if(e===null)return"null";return typeof e}function cu(e,t,n){throw new $e(`Invalid ${Sy[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class hi{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,s=!1){if(V("<array|function> [boolean] [boolean] [boolean]",[e,t,n],arguments.length),Array.isArray(e)){for(let r=0;r<e.length;r++){if(typeof e[r]!=="function")throw Error("middleware must be a function");let o=e[r];o.applyBeforeValidation=t,o.global=n}Array.prototype.push.apply(this.globalMiddleware,e)}else if(typeof e==="function"){let r=e;r.applyBeforeValidation=t,r.global=n,r.mutates=s,this.globalMiddleware.push(e)}return this.yargs}addCoerceMiddleware(e,t){let n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((s)=>{let r=[...n[t]||[],t];if(!s.option)return!0;else return!r.includes(s.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 lu(e){if(!e)return[];return e.map((t)=>(t.applyBeforeValidation=!1,t))}function hn(e,t,n,s){return n.reduce((r,o)=>{if(o.applyBeforeValidation!==s)return r;if(o.mutates){if(o.applied)return r;o.applied=!0}if(ke(r))return r.then((i)=>Promise.all([i,o(i,t)])).then(([i,l])=>Object.assign(i,l));else{let i=o(r,t);return ke(i)?i.then((l)=>Object.assign(r,l)):Object.assign(r,i)}},e)}function gn(e,t,n=(s)=>{throw s}){try{let s=_y(e)?e():e;return ke(s)?s.then((r)=>t(r)):t(s)}catch(s){return n(s)}}function _y(e){return typeof e==="function"}var Jn=/(^\*)|(^\$0)/;class du{constructor(e,t,n,s){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=s,this.usage=e,this.globalMiddleware=n,this.validation=t}addDirectory(e,t,n,s){s=s||{},this.requireCache.add(n);let r=this.shim.path.resolve(this.shim.path.dirname(n),e),o=this.shim.readdirSync(r,{recursive:s.recurse?!0:!1});if(!Array.isArray(s.extensions))s.extensions=["js"];let i=typeof s.visit==="function"?s.visit:(l)=>l;for(let l of o){let u=l.toString();if(s.exclude){let c=!1;if(typeof s.exclude==="function")c=s.exclude(u);else c=s.exclude.test(u);if(c)continue}if(s.include){let c=!1;if(typeof s.include==="function")c=s.include(u);else c=s.include.test(u);if(!c)continue}let a=!1;for(let c of s.extensions)if(u.endsWith(c))a=!0;if(a){let c=this.shim.path.join(r,u),d=t(c),f=Object.create(null,Object.getOwnPropertyDescriptors({...d}));if(i(f,c,u)){if(this.requireCache.has(c))continue;else this.requireCache.add(c);if(!f.command)f.command=this.shim.path.basename(c,this.shim.path.extname(c));this.addHandler(f)}}}}addHandler(e,t,n,s,r,o){let i=[],l=lu(r);if(s=s||(()=>{}),Array.isArray(e))if(Ey(e))[e,...i]=e;else for(let u of e)this.addHandler(u);else if(Cy(e)){let u=Array.isArray(e.command)||typeof e.command==="string"?e.command:null;if(u===null)throw Error(`No command name given for module: ${this.shim.inspect(e)}`);if(e.aliases)u=[].concat(u).concat(e.aliases);this.addHandler(u,this.extractDesc(e),e.builder,e.handler,e.middlewares,e.deprecated);return}else if(uu(n)){this.addHandler([e].concat(i),t,n.builder,n.handler,n.middlewares,n.deprecated);return}if(typeof e==="string"){let u=Ht(e);i=i.map((d)=>Ht(d).cmd);let a=!1,c=[u.cmd].concat(i).filter((d)=>{if(Jn.test(d))return a=!0,!1;return!0});if(c.length===0&&a)c.push("$0");if(a)u.cmd=c[0],i=c.slice(1),e=e.replace(Jn,u.cmd);if(i.forEach((d)=>{this.aliasMap[d]=u.cmd}),t!==!1)this.usage.command(e,t,a,i,o);if(this.handlers[u.cmd]={original:e,description:t,handler:s,builder:n||{},middlewares:l,deprecated:o,demanded:u.demanded,optional:u.optional},a)this.defaultCommand=this.handlers[u.cmd]}}getCommandHandlers(){return this.handlers}getCommands(){return Object.keys(this.handlers).concat(Object.keys(this.aliasMap))}hasDefaultCommand(){return!!this.defaultCommand}runCommand(e,t,n,s,r,o){let i=this.handlers[e]||this.handlers[this.aliasMap[e]]||this.defaultCommand,l=t.getInternalMethods().getContext(),u=l.commands.slice(),a=!e;if(e)l.commands.push(e),l.fullCommands.push(i.original);let c=this.applyBuilderUpdateUsageAndParse(a,i,t,n.aliases,u,s,r,o);return ke(c)?c.then((d)=>this.applyMiddlewareAndGetResult(a,i,d.innerArgv,l,r,d.aliases,t)):this.applyMiddlewareAndGetResult(a,i,c.innerArgv,l,r,c.aliases,t)}applyBuilderUpdateUsageAndParse(e,t,n,s,r,o,i,l){let u=t.builder,a=n;if(pr(u)){n.getInternalMethods().getUsageInstance().freeze();let c=u(n.getInternalMethods().reset(s),l);if(ke(c))return c.then((d)=>(a=pu(d)?d:n,this.parseAndUpdateUsage(e,t,a,r,o,i)))}else if($y(u))n.getInternalMethods().getUsageInstance().freeze(),a=n.getInternalMethods().reset(s),Object.keys(t.builder).forEach((c)=>{a.option(c,u[c])});return this.parseAndUpdateUsage(e,t,a,r,o,i)}parseAndUpdateUsage(e,t,n,s,r,o){if(e)n.getInternalMethods().getUsageInstance().unfreeze(!0);if(this.shouldUpdateUsage(n))n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(s,t),t.description);let i=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,r,o);return ke(i)?i.then((l)=>({aliases:n.parsed.aliases,innerArgv:l})):{aliases:n.parsed.aliases,innerArgv:i}}shouldUpdateUsage(e){return!e.getInternalMethods().getUsageInstance().getUsageDisabled()&&e.getInternalMethods().getUsageInstance().getUsage().length===0}usageFromParentCommandsCommandHandler(e,t){let n=Jn.test(t.original)?t.original.replace(Jn,"").trim():t.original,s=e.filter((r)=>!Jn.test(r));return s.push(n),`$0 ${s.join(" ")}`}handleValidationAndGetResult(e,t,n,s,r,o,i,l){if(!o.getInternalMethods().getHasOutput()){let u=o.getInternalMethods().runValidation(r,l,o.parsed.error,e);n=gn(n,(a)=>(u(a),a))}if(t.handler&&!o.getInternalMethods().getHasOutput()){o.getInternalMethods().setHasOutput();let u=!!o.getOptions().configuration["populate--"];if(o.getInternalMethods().postProcess(n,u,!1,!1),n=hn(n,o,i,!1),n=gn(n,(a)=>{let c=t.handler(a);return ke(c)?c.then(()=>a):a}),!e)o.getInternalMethods().getUsageInstance().cacheHelpMessage();if(ke(n)&&!o.getInternalMethods().hasParseCallback())n.catch((a)=>{try{o.getInternalMethods().getUsageInstance().fail(null,a)}catch(c){}})}if(!e)s.commands.pop(),s.fullCommands.pop();return n}applyMiddlewareAndGetResult(e,t,n,s,r,o,i){let l={};if(r)return n;if(!i.getInternalMethods().getHasOutput())l=this.populatePositionals(t,n,s,i);let u=this.globalMiddleware.getMiddleware().slice(0).concat(t.middlewares),a=hn(n,i,u,!0);return ke(a)?a.then((c)=>this.handleValidationAndGetResult(e,t,c,s,o,i,u,l)):this.handleValidationAndGetResult(e,t,a,s,o,i,u,l)}populatePositionals(e,t,n,s){t._=t._.slice(n.commands.length);let r=e.demanded.slice(0),o=e.optional.slice(0),i={};this.validation.positionalCount(r.length,t._.length);while(r.length){let l=r.shift();this.populatePositional(l,t,i)}while(o.length){let l=o.shift();this.populatePositional(l,t,i)}return t._=n.commands.concat(t._.map((l)=>""+l)),this.postProcessPositionals(t,i,this.cmdToParseOptions(e.original),s),i}populatePositional(e,t,n){let s=e.cmd[0];if(e.variadic)n[s]=t._.splice(0).map(String);else if(t._.length)n[s]=[String(t._.shift())]}cmdToParseOptions(e){let t={array:[],default:{},alias:{},demand:{}},n=Ht(e);return n.demanded.forEach((s)=>{let[r,...o]=s.cmd;if(s.variadic)t.array.push(r),t.default[r]=[];t.alias[r]=o,t.demand[r]=!0}),n.optional.forEach((s)=>{let[r,...o]=s.cmd;if(s.variadic)t.array.push(r),t.default[r]=[];t.alias[r]=o}),t}postProcessPositionals(e,t,n,s){let r=Object.assign({},s.getOptions());r.default=Object.assign(n.default,r.default);for(let u of Object.keys(n.alias))r.alias[u]=(r.alias[u]||[]).concat(n.alias[u]);r.array=r.array.concat(n.array),r.config={};let o=[];if(Object.keys(t).forEach((u)=>{t[u].map((a)=>{if(r.configuration["unknown-options-as-args"])r.key[u]=!0;o.push(`--${u}`),o.push(a)})}),!o.length)return;let i=Object.assign({},r.configuration,{"populate--":!1}),l=this.shim.Parser.detailed(o,Object.assign({},r,{configuration:i}));if(l.error)s.getInternalMethods().getUsageInstance().fail(l.error.message,l.error);else{let u=Object.keys(t);Object.keys(t).forEach((a)=>{u.push(...l.aliases[a])}),Object.keys(l.argv).forEach((a)=>{if(u.includes(a)){if(!t[a])t[a]=l.argv[a];if(!this.isInConfigs(s,a)&&!this.isDefaulted(s,a)&&Object.prototype.hasOwnProperty.call(e,a)&&Object.prototype.hasOwnProperty.call(l.argv,a)&&(Array.isArray(e[a])||Array.isArray(l.argv[a])))e[a]=[].concat(e[a],l.argv[a]);else e[a]=l.argv[a]}})}}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((s)=>Object.prototype.hasOwnProperty.call(s,t))||n.some((s)=>Object.prototype.hasOwnProperty.call(s,this.shim.Parser.camelCase(t)))}runDefaultBuilderOn(e){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(e)){let n=Jn.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(pr(t))return t(e,!0);else if(!uu(t))Object.keys(t).forEach((n)=>{e.option(n,t[n])});return}extractDesc({describe:e,description:t,desc:n}){for(let s of[e,t,n]){if(typeof s==="string"||s===!1)return s;Je(s,!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 fu(e,t,n,s){return new du(e,t,n,s)}function uu(e){return typeof e==="object"&&!!e.builder&&typeof e.handler==="function"}function Ey(e){return e.every((t)=>typeof t==="string")}function pr(e){return typeof e==="function"}function $y(e){return typeof e==="object"}function Cy(e){return typeof e==="object"&&!Array.isArray(e)}function zt(e={},t=()=>!0){let n={};return Un(e).forEach((s)=>{if(t(s,e[s]))n[s]=e[s]}),n}function Gt(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 Ay(e){return typeof e==="boolean"}function gu(e,t){let n=t.y18n.__,s={},r=[];s.failFn=function(v){r.push(v)};let o=null,i=null,l=!0;s.showHelpOnFail=function(v=!0,j){let[H,B]=typeof v==="string"?[!0,v]:[v,j];if(e.getInternalMethods().isGlobalContext())i=B;return o=B,l=H,s};let u=!1;s.fail=function(v,j){let H=e.getInternalMethods().getLoggerInstance();if(r.length)for(let B=r.length-1;B>=0;--B){let q=r[B];if(Ay(q)){if(j)throw j;else if(v)throw Error(v)}else q(v,j,s)}else{if(e.getExitProcess())Gt(!0);if(!u){if(u=!0,l)e.showHelp("error"),H.error();if(v||j)H.error(v||j);let B=o||i;if(B){if(v||j)H.error("");H.error(B)}}if(j=j||new $e(v),e.getExitProcess())return e.exit(1);else if(e.getInternalMethods().hasParseCallback())return e.exit(1,j);else throw j}};let a=[],c=!1;s.usage=(P,v)=>{if(P===null)return c=!0,a=[],s;return c=!1,a.push([P,v||""]),s},s.getUsage=()=>a,s.getUsageDisabled=()=>c,s.getPositionalGroupName=()=>n("Positionals:");let d=[];s.example=(P,v)=>{d.push([P,v||""])};let f=[];s.command=function(v,j,H,B,q=!1){if(H)f=f.map((z)=>(z[2]=!1,z));f.push([v,j||"",H,B,q])},s.getCommands=()=>f;let p={};s.describe=function(v,j){if(Array.isArray(v))v.forEach((H)=>{s.describe(H,j)});else if(typeof v==="object")Object.keys(v).forEach((H)=>{s.describe(H,v[H])});else p[v]=j},s.getDescriptions=()=>p;let g=[];s.epilog=(P)=>{g.push(P)};let h=!1,m;s.wrap=(P)=>{h=!0,m=P},s.getWrap=()=>{if(t.getEnv("YARGS_DISABLE_WRAP"))return null;if(!h)m=k(),h=!0;return m};let y="__yargsString__:";s.deferY18nLookup=(P)=>y+P,s.help=function(){if(D)return D;x();let v=e.customScriptName?e.$0:t.path.basename(e.$0),j=e.getDemandedOptions(),H=e.getDemandedCommands(),B=e.getDeprecatedOptions(),q=e.getGroups(),z=e.getOptions(),R=[];R=R.concat(Object.keys(p)),R=R.concat(Object.keys(j)),R=R.concat(Object.keys(H)),R=R.concat(Object.keys(z.default)),R=R.filter(C),R=Object.keys(R.reduce((K,ie)=>{if(ie!=="_")K[ie]=!0;return K},{}));let te=s.getWrap(),Q=t.cliui({width:te,wrap:!!te});if(!c){if(a.length)a.forEach((K)=>{if(Q.div({text:`${K[0].replace(/\$0/g,v)}`}),K[1])Q.div({text:`${K[1]}`,padding:[1,0,0,0]})}),Q.div();else if(f.length){let K=null;if(H._)K=`${v} <${n("command")}>
|
|
15
15
|
`;else K=`${v} [${n("command")}]
|
|
16
|
-
`;Q.div(`${K}`)}}if(f.length>1||f.length===1&&!f[0][2]){Q.div(n("Commands:"));let K=e.getInternalMethods().getContext(),ie=K.commands.length?`${K.commands.join(" ")} `:"";if(e.getInternalMethods().getParserConfiguration()["sort-commands"]===!0)f=f.sort((W,he)=>W[0].localeCompare(he[0]));let
|
|
16
|
+
`;Q.div(`${K}`)}}if(f.length>1||f.length===1&&!f[0][2]){Q.div(n("Commands:"));let K=e.getInternalMethods().getContext(),ie=K.commands.length?`${K.commands.join(" ")} `:"";if(e.getInternalMethods().getParserConfiguration()["sort-commands"]===!0)f=f.sort((W,he)=>W[0].localeCompare(he[0]));let Y=v?`${v} `:"";f.forEach((W)=>{let he=`${Y}${ie}${W[0].replace(/^\$0 ?/,"")}`;Q.span({text:he,padding:[0,2,0,2],width:w(f,te,`${v}${ie}`)+4},{text:W[1]});let De=[];if(W[2])De.push(`[${n("default")}]`);if(W[3]&&W[3].length)De.push(`[${n("aliases:")} ${W[3].join(", ")}]`);if(W[4])if(typeof W[4]==="string")De.push(`[${n("deprecated: %s",W[4])}]`);else De.push(`[${n("deprecated")}]`);if(De.length)Q.div({text:De.join(" "),padding:[0,0,0,2],align:"right"});else Q.div()}),Q.div()}let M=(Object.keys(z.alias)||[]).concat(Object.keys(e.parsed.newAliases)||[]);R=R.filter((K)=>!e.parsed.newAliases[K]&&M.every((ie)=>(z.alias[ie]||[]).indexOf(K)===-1));let re=n("Options:");if(!q[re])q[re]=[];E(R,z.alias,q,re);let J=(K)=>/^--/.test(hr(K)),de=Object.keys(q).filter((K)=>q[K].length>0).map((K)=>{let ie=q[K].filter(C).map((Y)=>{if(M.includes(Y))return Y;for(let W=0,he;(he=M[W])!==void 0;W++)if((z.alias[he]||[]).includes(Y))return he;return Y});return{groupName:K,normalizedKeys:ie}}).filter(({normalizedKeys:K})=>K.length>0).map(({groupName:K,normalizedKeys:ie})=>{let Y=ie.reduce((W,he)=>(W[he]=[he].concat(z.alias[he]||[]).map((De)=>{if(K===s.getPositionalGroupName())return De;else return(/^[0-9]$/.test(De)?z.boolean.includes(he)?"-":"--":De.length>1?"--":"-")+De}).sort((De,Ae)=>J(De)===J(Ae)?0:J(De)?1:-1).join(", "),W),{});return{groupName:K,normalizedKeys:ie,switches:Y}});if(de.filter(({groupName:K})=>K!==s.getPositionalGroupName()).some(({normalizedKeys:K,switches:ie})=>!K.every((Y)=>J(ie[Y]))))de.filter(({groupName:K})=>K!==s.getPositionalGroupName()).forEach(({normalizedKeys:K,switches:ie})=>{K.forEach((Y)=>{if(J(ie[Y]))ie[Y]=Fy(ie[Y],4)})});if(de.forEach(({groupName:K,normalizedKeys:ie,switches:Y})=>{Q.div(K),ie.forEach((W)=>{let he=Y[W],De=p[W]||"",Ae=null;if(De.includes(y))De=n(De.substring(y.length));if(z.boolean.includes(W))Ae=`[${n("boolean")}]`;if(z.count.includes(W))Ae=`[${n("count")}]`;if(z.string.includes(W))Ae=`[${n("string")}]`;if(z.normalize.includes(W))Ae=`[${n("string")}]`;if(z.array.includes(W))Ae=`[${n("array")}]`;if(z.number.includes(W))Ae=`[${n("number")}]`;let Xo=(U)=>typeof U==="string"?`[${n("deprecated: %s",U)}]`:`[${n("deprecated")}]`,_=[W in B?Xo(B[W]):null,Ae,W in j?`[${n("required")}]`:null,z.choices&&z.choices[W]?`[${n("choices:")} ${s.stringifiedValues(z.choices[W])}]`:null,S(z.default[W],z.defaultDescription[W])].filter(Boolean).join(" ");Q.span({text:hr(he),padding:[0,2,0,2+hu(he)],width:w(Y,te)+4},De);let F=e.getInternalMethods().getUsageConfiguration()["hide-types"]===!0;if(_&&!F)Q.div({text:_,padding:[0,0,0,2],align:"right"});else Q.div()}),Q.div()}),d.length)Q.div(n("Examples:")),d.forEach((K)=>{K[0]=K[0].replace(/\$0/g,v)}),d.forEach((K)=>{if(K[1]==="")Q.div({text:K[0],padding:[0,2,0,2]});else Q.div({text:K[0],padding:[0,2,0,2],width:w(d,te)+4},{text:K[1]})}),Q.div();if(g.length>0){let K=g.map((ie)=>ie.replace(/\$0/g,v)).join(`
|
|
17
17
|
`);Q.div(`${K}
|
|
18
|
-
`)}return Q.toString().replace(/\s*$/,"")};function w(
|
|
18
|
+
`)}return Q.toString().replace(/\s*$/,"")};function w(P,v,j){let H=0;if(!Array.isArray(P))P=Object.values(P).map((B)=>[B]);if(P.forEach((B)=>{H=Math.max(t.stringWidth(j?`${j} ${hr(B[0])}`:hr(B[0]))+hu(B[0]),H)}),v)H=Math.min(H,parseInt((v*0.5).toString(),10));return H}function x(){let P=e.getDemandedOptions(),v=e.getOptions();(Object.keys(v.alias)||[]).forEach((j)=>{v.alias[j].forEach((H)=>{if(p[H])s.describe(j,p[H]);if(H in P)e.demandOption(j,P[H]);if(v.boolean.includes(H))e.boolean(j);if(v.count.includes(H))e.count(j);if(v.string.includes(H))e.string(j);if(v.normalize.includes(H))e.normalize(j);if(v.array.includes(H))e.array(j);if(v.number.includes(H))e.number(j)})})}let D;s.cacheHelpMessage=function(){D=this.help()},s.clearCachedHelpMessage=function(){D=void 0},s.hasCachedHelpMessage=function(){return!!D};function E(P,v,j,H){let B=[],q=null;return Object.keys(j).forEach((z)=>{B=B.concat(j[z])}),P.forEach((z)=>{if(q=[z].concat(v[z]),!q.some((R)=>B.indexOf(R)!==-1))j[H].push(z)}),B}function C(P){return e.getOptions().hiddenOptions.indexOf(P)<0||e.parsed.argv[e.getOptions().showHiddenOpt]}s.showHelp=(P)=>{let v=e.getInternalMethods().getLoggerInstance();if(!P)P="error";(typeof P==="function"?P:v[P])(s.help())},s.functionDescription=(P)=>["(",P.name?t.Parser.decamelize(P.name,"-"):n("generated-value"),")"].join(""),s.stringifiedValues=function(v,j){let H="",B=j||", ",q=[].concat(v);if(!v||!q.length)return H;return q.forEach((z)=>{if(H.length)H+=B;H+=JSON.stringify(z)}),H};function S(P,v){let j=`[${n("default:")} `;if(P===void 0&&!v)return null;if(v)j+=v;else switch(typeof P){case"string":j+=`"${P}"`;break;case"object":j+=JSON.stringify(P);break;default:j+=P}return`${j}]`}function k(){if(t.process.stdColumns)return Math.min(80,t.process.stdColumns);else return 80}let O=null;s.version=(P)=>{O=P},s.showVersion=(P)=>{let v=e.getInternalMethods().getLoggerInstance();if(!P)P="error";(typeof P==="function"?P:v[P])(O)},s.reset=function(v){return o=null,u=!1,a=[],c=!1,g=[],d=[],f=[],p=zt(p,(j)=>!v[j]),s};let L=[];return s.freeze=function(){L.push({failMessage:o,failureOutput:u,usages:a,usageDisabled:c,epilogs:g,examples:d,commands:f,descriptions:p})},s.unfreeze=function(v=!1){let j=L.pop();if(!j)return;if(v)p={...j.descriptions,...p},f=[...j.commands,...f],a=[...j.usages,...a],d=[...j.examples,...d],g=[...j.epilogs,...g];else({failMessage:o,failureOutput:u,usages:a,usageDisabled:c,epilogs:g,examples:d,commands:f,descriptions:p}=j)},s}function gi(e){return typeof e==="object"}function Fy(e,t){return gi(e)?{text:e.text,indentation:e.indentation+t}:{text:e,indentation:t}}function hu(e){return gi(e)?e.indentation:0}function hr(e){return gi(e)?e.text:e}var mu=`###-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
|
+
`,yu=`#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
|
|
74
|
+
`;class bu{constructor(e,t,n,s){var r,o,i;this.yargs=e,this.usage=t,this.command=n,this.shim=s,this.completionKey="get-yargs-completions",this.aliases=null,this.customCompletionFunction=null,this.indexAfterLastReset=0,this.zshShell=(i=((r=this.shim.getEnv("SHELL"))===null||r===void 0?void 0:r.includes("zsh"))||((o=this.shim.getEnv("ZSH_NAME"))===null||o===void 0?void 0:o.includes("zsh")))!==null&&i!==void 0?i:!1}defaultCompletion(e,t,n,s){let r=this.command.getCommandHandlers();for(let i=0,l=e.length;i<l;++i)if(r[e[i]]&&r[e[i]].builder){let u=r[e[i]].builder;if(pr(u)){this.indexAfterLastReset=i+1;let a=this.yargs.getInternalMethods().reset();return u(a,!0),a.argv}}let o=[];this.commandCompletions(o,e,n),this.optionCompletions(o,e,t,n),this.choicesFromOptionsCompletions(o,e,t,n),this.choicesFromPositionalsCompletions(o,e,t,n),s(null,o)}commandCompletions(e,t,n){let s=this.yargs.getInternalMethods().getContext().commands;if(!n.match(/^-/)&&s[s.length-1]!==n&&!this.previousArgHasChoices(t))this.usage.getCommands().forEach((r)=>{let o=Ht(r[0]).cmd;if(t.indexOf(o)===-1)if(!this.zshShell)e.push(o);else{let i=r[1]||"";e.push(o.replace(/:/g,"\\:")+":"+i)}})}optionCompletions(e,t,n,s){if((s.match(/^-/)||s===""&&e.length===0)&&!this.previousArgHasChoices(t)){let r=this.yargs.getOptions(),o=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[];Object.keys(r.key).forEach((i)=>{let l=!!r.configuration["boolean-negation"]&&r.boolean.includes(i);if(!o.includes(i)&&!r.hiddenOptions.includes(i)&&!this.argsContainKey(t,i,l))this.completeOptionKey(i,e,s,l&&!!r.default[i])})}}choicesFromOptionsCompletions(e,t,n,s){if(this.previousArgHasChoices(t)){let r=this.getPreviousArgChoices(t);if(r&&r.length>0)e.push(...r.map((o)=>o.replace(/:/g,"\\:")))}}choicesFromPositionalsCompletions(e,t,n,s){if(s===""&&e.length>0&&this.previousArgHasChoices(t))return;let r=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[],o=Math.max(this.indexAfterLastReset,this.yargs.getInternalMethods().getContext().commands.length+1),i=r[n._.length-o-1];if(!i)return;let l=this.yargs.getOptions().choices[i]||[];for(let u of l)if(u.startsWith(s))e.push(u.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 s=t.replace(/^-+/,""),r=this.yargs.getOptions(),o=[s,...this.yargs.getAliases()[s]||[]],i;for(let l of o)if(Object.prototype.hasOwnProperty.call(r.key,l)&&Array.isArray(r.choices[l])){i=r.choices[l];break}if(i)return i.filter((l)=>!n||l.startsWith(n))}previousArgHasChoices(e){let t=this.getPreviousArgChoices(e);return t!==void 0&&t.length>0}argsContainKey(e,t,n){let s=(r)=>e.indexOf((/^[^0-9]$/.test(r)?"-":"--")+r)!==-1;if(s(t))return!0;if(n&&s(`no-${t}`))return!0;if(this.aliases){for(let r of this.aliases[t])if(s(r))return!0}return!1}completeOptionKey(e,t,n,s){var r,o,i,l;let u=e;if(this.zshShell){let f=this.usage.getDescriptions(),p=(o=(r=this===null||this===void 0?void 0:this.aliases)===null||r===void 0?void 0:r[e])===null||o===void 0?void 0:o.find((m)=>{let y=f[m];return typeof y==="string"&&y.length>0}),g=p?f[p]:void 0,h=(l=(i=f[e])!==null&&i!==void 0?i:g)!==null&&l!==void 0?l:"";u=`${e.replace(/:/g,"\\:")}:${h.replace("__yargsString__:","").replace(/(\r\n|\n|\r)/gm," ")}`}let a=(f)=>/^--/.test(f),c=(f)=>/^[^0-9]$/.test(f),d=!a(n)&&c(e)?"-":"--";if(t.push(d+u),s)t.push(d+"no-"+u)}customCompletion(e,t,n,s){if(Je(this.customCompletionFunction,null,this.shim),Oy(this.customCompletionFunction)){let r=this.customCompletionFunction(n,t);if(ke(r))return r.then((o)=>{this.shim.process.nextTick(()=>{s(null,o)})}).catch((o)=>{this.shim.process.nextTick(()=>{s(o,void 0)})});return s(null,r)}else if(Ry(this.customCompletionFunction))return this.customCompletionFunction(n,t,(r=s)=>this.defaultCompletion(e,t,n,r),(r)=>{s(null,r)});else return this.customCompletionFunction(n,t,(r)=>{s(null,r)})}getCompletion(e,t){let n=e.length?e[e.length-1]:"",s=this.yargs.parse(e,!0),r=this.customCompletionFunction?(o)=>this.customCompletion(e,o,n,t):(o)=>this.defaultCompletion(e,o,n,t);return ke(s)?s.then(r):r(s)}generateCompletionScript(e,t){let n=this.zshShell?yu:mu,s=this.shim.path.basename(e);if(e.match(/\.js$/))e=`./${e}`;return n=n.replace(/{{app_name}}/g,s),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 wu(e,t,n,s){return new bu(e,t,n,s)}function Oy(e){return e.length<3}function Ry(e){return e.length>3}function Du(e,t){if(e.length===0)return t.length;if(t.length===0)return e.length;let n=[],s;for(s=0;s<=t.length;s++)n[s]=[s];let r;for(r=0;r<=e.length;r++)n[0][r]=r;for(s=1;s<=t.length;s++)for(r=1;r<=e.length;r++)if(t.charAt(s-1)===e.charAt(r-1))n[s][r]=n[s-1][r-1];else if(s>1&&r>1&&t.charAt(s-2)===e.charAt(r-1)&&t.charAt(s-1)===e.charAt(r-2))n[s][r]=n[s-2][r-2]+1;else n[s][r]=Math.min(n[s-1][r-1]+1,Math.min(n[s][r-1]+1,n[s-1][r]+1));return n[t.length][e.length]}var ku=["$0","--","_"];function xu(e,t,n){let s=n.y18n.__,r=n.y18n.__n,o={};o.nonOptionCount=function(d){let f=e.getDemandedCommands(),g=d._.length+(d["--"]?d["--"].length:0)-e.getInternalMethods().getContext().commands.length;if(f._&&(g<f._.min||g>f._.max)){if(g<f._.min)if(f._.minMsg!==void 0)t.fail(f._.minMsg?f._.minMsg.replace(/\$0/g,g.toString()).replace(/\$1/,f._.min.toString()):null);else t.fail(r("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",g,g.toString(),f._.min.toString()));else if(g>f._.max)if(f._.maxMsg!==void 0)t.fail(f._.maxMsg?f._.maxMsg.replace(/\$0/g,g.toString()).replace(/\$1/,f._.max.toString()):null);else t.fail(r("Too many non-option arguments: got %s, maximum of %s","Too many non-option arguments: got %s, maximum of %s",g,g.toString(),f._.max.toString()))}},o.positionalCount=function(d,f){if(f<d)t.fail(r("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+""))},o.requiredArguments=function(d,f){let p=null;for(let g of Object.keys(f))if(!Object.prototype.hasOwnProperty.call(d,g)||typeof d[g]>"u")p=p||{},p[g]=f[g];if(p){let g=[];for(let m of Object.keys(p)){let y=p[m];if(y&&g.indexOf(y)<0)g.push(y)}let h=g.length?`
|
|
75
75
|
${g.join(`
|
|
76
|
-
`)}`:"";t.fail(
|
|
77
|
-
${s("Argument: %s, Given: %s, Choices: %s",m,t.stringifiedValues(p[m]),t.stringifiedValues(f.choices[m]))}`}),t.fail(h)};let i={};
|
|
78
|
-
`;f.forEach((g)=>{p+=g}),t.fail(p)}};let u={};r.conflicts=function(d,f){if(V("<string|object> [array|string]",[d,f],arguments.length),typeof d==="object")Object.keys(d).forEach((p)=>{r.conflicts(p,d[p])});else{if(e.global(d),!u[d])u[d]=[];if(Array.isArray(f))f.forEach((p)=>r.conflicts(d,p));else u[d].push(f)}},r.getConflicting=()=>u,r.conflicting=function(d){if(Object.keys(d).forEach((f)=>{if(u[f])u[f].forEach((p)=>{if(p&&d[f]!==void 0&&d[p]!==void 0)t.fail(s("Arguments %s and %s are mutually exclusive",f,p))})}),e.getInternalMethods().getParserConfiguration()["strip-dashed"])Object.keys(u).forEach((f)=>{u[f].forEach((p)=>{if(p&&d[n.Parser.camelCase(f)]!==void 0&&d[n.Parser.camelCase(p)]!==void 0)t.fail(s("Arguments %s and %s are mutually exclusive",f,p))})})},r.recommendCommands=function(d,f){f=f.sort((m,y)=>y.length-m.length);let g=null,h=1/0;for(let m=0,y;(y=f[m])!==void 0;m++){let w=pu(d,y);if(w<=3&&w<h)h=w,g=y}if(g)t.fail(s("Did you mean %s?",g))},r.reset=function(d){return i=zt(i,(f)=>!d[f]),u=zt(u,(f)=>!d[f]),r};let c=[];return r.freeze=function(){c.push({implied:i,conflicting:u})},r.unfreeze=function(){let d=c.pop();Ue(d,void 0,n),{implied:i,conflicting:u}=d},r}var hi=[],gs;function ms(e,t,n,s){gs=s;let o={};if(Object.prototype.hasOwnProperty.call(e,"extends")){if(typeof e.extends!=="string")return o;let r=/\.json|\..*rc$/.test(e.extends),i=null;if(!r)try{i=import.meta.resolve(e.extends)}catch(l){return e}else i=yy(t,e.extends);my(i),hi.push(i),o=r?JSON.parse(gs.readFileSync(i,"utf8")):s.require(e.extends),delete e.extends,o=ms(o,gs.path.dirname(i),n,gs)}return hi=[],n?mu(o,e):Object.assign({},o,e)}function my(e){if(hi.indexOf(e)>-1)throw new $e(`Circular extended configurations: '${e}'.`)}function yy(e,t){return gs.path.resolve(e,t)}function mu(e,t){let n={};function s(o){return o&&typeof o==="object"&&!Array.isArray(o)}Object.assign(n,e);for(let o of Object.keys(t))if(s(t[o])&&s(n[o]))n[o]=mu(e[o],t[o]);else n[o]=t[o];return n}var Z=function(e,t,n,s,o){if(s==="m")throw TypeError("Private method is not writable");if(s==="a"&&!o)throw TypeError("Private accessor was defined without a setter");if(typeof t==="function"?e!==t||!o:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?o.call(e,n):o?o.value=n:t.set(e,n),n},b=function(e,t,n,s){if(n==="a"&&!s)throw TypeError("Private accessor was defined without a getter");if(typeof t==="function"?e!==t||!s:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?s:n==="a"?s.call(e):s?s.value:t.get(e)},Ce,mn,ys,ze,Qe,po,Gt,yn,ho,it,go,at,St,et,ct,mo,bn,ve,ne,yo,bo,tt,wn,Kn,Dn,Xt,wo,ae,kn,xn,Sn,ue,Do,_t,Ee;function Lu(e){return(t=[],n=e.process.cwd(),s)=>{let o=new Nu(t,n,s,e);return Object.defineProperty(o,"argv",{get:()=>o.parse(),enumerable:!0}),o.help(),o.version(),o}}var yu=Symbol("copyDoubleDash"),bu=Symbol("copyDoubleDash"),gi=Symbol("deleteFromParserHintObject"),wu=Symbol("emitWarning"),Du=Symbol("freeze"),ku=Symbol("getDollarZero"),_n=Symbol("getParserConfiguration"),xu=Symbol("getUsageConfiguration"),mi=Symbol("guessLocale"),Su=Symbol("guessVersion"),_u=Symbol("parsePositionalNumbers"),yi=Symbol("pkgUp"),Vt=Symbol("populateParserHintArray"),qn=Symbol("populateParserHintSingleValueDictionary"),bi=Symbol("populateParserHintArrayDictionary"),wi=Symbol("populateParserHintDictionary"),Di=Symbol("sanitizeKey"),ki=Symbol("setKey"),xi=Symbol("unfreeze"),Eu=Symbol("validateAsync"),$u=Symbol("getCommandInstance"),Cu=Symbol("getContext"),Au=Symbol("getHasOutput"),Fu=Symbol("getLoggerInstance"),Tu=Symbol("getParseContext"),Ou=Symbol("getUsageInstance"),Ru=Symbol("getValidationInstance"),ko=Symbol("hasParseCallback"),Iu=Symbol("isGlobalContext"),En=Symbol("postProcess"),vu=Symbol("rebase"),Si=Symbol("reset"),bs=Symbol("runYargsParserAndExecuteCommands"),_i=Symbol("runValidation"),Pu=Symbol("setHasOutput"),$n=Symbol("kTrackManuallySetKeys"),by="en_US";class Nu{constructor(e=[],t,n,s){this.customScriptName=!1,this.parsed=!1,Ce.set(this,void 0),mn.set(this,void 0),ys.set(this,{commands:[],fullCommands:[]}),ze.set(this,null),Qe.set(this,null),po.set(this,"show-hidden"),Gt.set(this,null),yn.set(this,!0),ho.set(this,{}),it.set(this,!0),go.set(this,[]),at.set(this,void 0),St.set(this,{}),et.set(this,!1),ct.set(this,null),mo.set(this,!0),bn.set(this,void 0),ve.set(this,""),ne.set(this,void 0),yo.set(this,void 0),bo.set(this,{}),tt.set(this,null),wn.set(this,null),Kn.set(this,{}),Dn.set(this,{}),Xt.set(this,void 0),wo.set(this,!1),ae.set(this,void 0),kn.set(this,!1),xn.set(this,!1),Sn.set(this,!1),ue.set(this,void 0),Do.set(this,{}),_t.set(this,null),Ee.set(this,void 0),Z(this,ae,s,"f"),Z(this,Xt,e,"f"),Z(this,mn,t,"f"),Z(this,yo,n,"f"),Z(this,at,new fi(this),"f"),this.$0=this[ku](),this[Si](),Z(this,Ce,b(this,Ce,"f"),"f"),Z(this,ue,b(this,ue,"f"),"f"),Z(this,Ee,b(this,Ee,"f"),"f"),Z(this,ne,b(this,ne,"f"),"f"),b(this,ne,"f").showHiddenOpt=b(this,po,"f"),Z(this,bn,this[bu](),"f"),b(this,ae,"f").y18n.setLocale(by)}addHelpOpt(e,t){if(V("[string|boolean] [string]",[e,t],arguments.length),b(this,ct,"f"))this[gi](b(this,ct,"f")),Z(this,ct,null,"f");if(e===!1&&t===void 0)return this;return Z(this,ct,typeof e==="string"?e:"help","f"),this.boolean(b(this,ct,"f")),this.describe(b(this,ct,"f"),t||b(this,ue,"f").deferY18nLookup("Show help")),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(V("[string|boolean] [string]",[e,t],arguments.length),e===!1&&t===void 0)return this;let n=typeof e==="string"?e:b(this,po,"f");return this.boolean(n),this.describe(n,t||b(this,ue,"f").deferY18nLookup("Show hidden options")),b(this,ne,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return V("<object|string|array> [string|array]",[e,t],arguments.length),this[bi](this.alias.bind(this),"alias",e,t),this}array(e){return V("<array|string>",[e],arguments.length),this[Vt]("array",e),this[$n](e),this}boolean(e){return V("<array|string>",[e],arguments.length),this[Vt]("boolean",e),this[$n](e),this}check(e,t){return V("<function> [boolean]",[e,t],arguments.length),this.middleware((n,s)=>gn(()=>e(n,s.getOptions()),(o)=>{if(!o)b(this,ue,"f").fail(b(this,ae,"f").y18n.__("Argument check failed: %s",e.toString()));else if(typeof o==="string"||o instanceof Error)b(this,ue,"f").fail(o.toString(),o);return n},(o)=>(b(this,ue,"f").fail(o.message?o.message:o.toString(),o),n)),!1,t),this}choices(e,t){return V("<object|string|array> [string|array]",[e,t],arguments.length),this[bi](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(V("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new $e("coerce callback must be provided");for(let s of e)this.coerce(s,t);return this}else if(typeof e==="object"){for(let s of Object.keys(e))this.coerce(s,e[s]);return this}if(!t)throw new $e("coerce callback must be provided");let n=e;return b(this,ne,"f").key[n]=!0,b(this,at,"f").addCoerceMiddleware((s,o)=>{var r;let i=(r=o.getAliases()[n])!==null&&r!==void 0?r:[],l=[n,...i].filter((u)=>Object.prototype.hasOwnProperty.call(s,u));if(l.length===0)return s;return gn(()=>t(s[l[0]]),(u)=>(l.forEach((c)=>{s[c]=u}),s),(u)=>{throw new $e(u.message)})},n),this}conflicts(e,t){return V("<string|object> [string|array]",[e,t],arguments.length),b(this,Ee,"f").conflicts(e,t),this}config(e="config",t,n){if(V("[object|string] [string|function] [function]",[e,t,n],arguments.length),typeof e==="object"&&!Array.isArray(e))return e=ms(e,b(this,mn,"f"),this[_n]()["deep-merge-config"]||!1,b(this,ae,"f")),b(this,ne,"f").configObjects=(b(this,ne,"f").configObjects||[]).concat(e),this;if(typeof t==="function")n=t,t=void 0;return this.describe(e,t||b(this,ue,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((s)=>{b(this,ne,"f").config[s]=n||!0}),this}completion(e,t,n){if(V("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),typeof t==="function")n=t,t=void 0;if(Z(this,Qe,e||b(this,Qe,"f")||"completion","f"),!t&&t!==!1)t="generate completion script";if(this.command(b(this,Qe,"f"),t),n)b(this,ze,"f").registerFunction(n);return this}command(e,t,n,s,o,r){return V("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,s,o,r],arguments.length),b(this,Ce,"f").addHandler(e,t,n,s,o,r),this}commands(e,t,n,s,o,r){return this.command(e,t,n,s,o,r)}commandDir(e,t){V("<string> [object]",[e,t],arguments.length);let n=b(this,yo,"f")||b(this,ae,"f").require;return b(this,Ce,"f").addDirectory(e,n,b(this,ae,"f").getCallerFile(),t),this}count(e){return V("<array|string>",[e],arguments.length),this[Vt]("count",e),this[$n](e),this}default(e,t,n){if(V("<object|string|array> [*] [string]",[e,t,n],arguments.length),n)di(e,b(this,ae,"f")),b(this,ne,"f").defaultDescription[e]=n;if(typeof t==="function"){if(di(e,b(this,ae,"f")),!b(this,ne,"f").defaultDescription[e])b(this,ne,"f").defaultDescription[e]=b(this,ue,"f").functionDescription(t);t=t.call()}return this[qn](this.default.bind(this),"default",e,t),this}defaults(e,t,n){return this.default(e,t,n)}demandCommand(e=1,t,n,s){if(V("[number] [number|string] [string|null|undefined] [string|null|undefined]",[e,t,n,s],arguments.length),typeof t!=="number")n=t,t=1/0;return this.global("_",!1),b(this,ne,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:s},this}demand(e,t,n){if(Array.isArray(t))t.forEach((s)=>{Ue(n,!0,b(this,ae,"f")),this.demandOption(s,n)}),t=1/0;else if(typeof t!=="number")n=t,t=1/0;if(typeof e==="number")Ue(n,!0,b(this,ae,"f")),this.demandCommand(e,t,n,n);else if(Array.isArray(e))e.forEach((s)=>{Ue(n,!0,b(this,ae,"f")),this.demandOption(s,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 V("<object|string|array> [string]",[e,t],arguments.length),this[qn](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return V("<string> [string|boolean]",[e,t],arguments.length),b(this,ne,"f").deprecatedOptions[e]=t,this}describe(e,t){return V("<object|string|array> [string]",[e,t],arguments.length),this[ki](e,!0),b(this,ue,"f").describe(e,t),this}detectLocale(e){return V("<boolean>",[e],arguments.length),Z(this,yn,e,"f"),this}env(e){if(V("[string|boolean]",[e],arguments.length),e===!1)delete b(this,ne,"f").envPrefix;else b(this,ne,"f").envPrefix=e||"";return this}epilogue(e){return V("<string>",[e],arguments.length),b(this,ue,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){if(V("<string|array> [string]",[e,t],arguments.length),Array.isArray(e))e.forEach((n)=>this.example(...n));else b(this,ue,"f").example(e,t);return this}exit(e,t){if(Z(this,et,!0,"f"),Z(this,Gt,t,"f"),b(this,it,"f"))b(this,ae,"f").process.exit(e)}exitProcess(e=!0){return V("[boolean]",[e],arguments.length),Z(this,it,e,"f"),this}fail(e){if(V("<function|boolean>",[e],arguments.length),typeof e==="boolean"&&e!==!1)throw new $e("Invalid first argument. Expected function or boolean 'false'");return b(this,ue,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){if(V("<array> [function]",[e,t],arguments.length),!t)return new Promise((n,s)=>{b(this,ze,"f").getCompletion(e,(o,r)=>{if(o)s(o);else n(r)})});else return b(this,ze,"f").getCompletion(e,t)}getDemandedOptions(){return V([],0),b(this,ne,"f").demandedOptions}getDemandedCommands(){return V([],0),b(this,ne,"f").demandedCommands}getDeprecatedOptions(){return V([],0),b(this,ne,"f").deprecatedOptions}getDetectLocale(){return b(this,yn,"f")}getExitProcess(){return b(this,it,"f")}getGroups(){return Object.assign({},b(this,St,"f"),b(this,Dn,"f"))}getHelp(){if(Z(this,et,!0,"f"),!b(this,ue,"f").hasCachedHelpMessage()){if(!this.parsed){let t=this[bs](b(this,Xt,"f"),void 0,void 0,0,!0);if(ke(t))return t.then(()=>b(this,ue,"f").help())}let e=b(this,Ce,"f").runDefaultBuilderOn(this);if(ke(e))return e.then(()=>b(this,ue,"f").help())}return Promise.resolve(b(this,ue,"f").help())}getOptions(){return b(this,ne,"f")}getStrict(){return b(this,kn,"f")}getStrictCommands(){return b(this,xn,"f")}getStrictOptions(){return b(this,Sn,"f")}global(e,t){if(V("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),t!==!1)b(this,ne,"f").local=b(this,ne,"f").local.filter((n)=>e.indexOf(n)===-1);else e.forEach((n)=>{if(!b(this,ne,"f").local.includes(n))b(this,ne,"f").local.push(n)});return this}group(e,t){V("<string|array> <string>",[e,t],arguments.length);let n=b(this,Dn,"f")[t]||b(this,St,"f")[t];if(b(this,Dn,"f")[t])delete b(this,Dn,"f")[t];let s={};return b(this,St,"f")[t]=(n||[]).concat(e).filter((o)=>{if(s[o])return!1;return s[o]=!0}),this}hide(e){return V("<string>",[e],arguments.length),b(this,ne,"f").hiddenOptions.push(e),this}implies(e,t){return V("<string|object> [number|string|array]",[e,t],arguments.length),b(this,Ee,"f").implies(e,t),this}locale(e){if(V("[string]",[e],arguments.length),e===void 0)return this[mi](),b(this,ae,"f").y18n.getLocale();return Z(this,yn,!1,"f"),b(this,ae,"f").y18n.setLocale(e),this}middleware(e,t,n){return b(this,at,"f").addMiddleware(e,!!t,n)}nargs(e,t){return V("<string|object|array> [number]",[e,t],arguments.length),this[qn](this.nargs.bind(this),"narg",e,t),this}normalize(e){return V("<array|string>",[e],arguments.length),this[Vt]("normalize",e),this}number(e){return V("<array|string>",[e],arguments.length),this[Vt]("number",e),this[$n](e),this}option(e,t){if(V("<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[$n](e),b(this,_t,"f")&&(e==="version"||(t===null||t===void 0?void 0:t.alias)==="version"))this[wu](['"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(b(this,ne,"f").key[e]=!0,t.alias)this.alias(e,t.alias);let n=t.deprecate||t.deprecated;if(n)this.deprecateOption(e,n);let s=t.demand||t.required||t.require;if(s)this.demand(e,s);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)b(this,ne,"f").defaultDescription[e]=t.defaultDescription;if(t.skipValidation)this.skipValidation(e);let
|
|
80
|
-
`,"f");Z(this,ve,b(this,ve,"f")+e.join(" "),"f")},error:(...e)=>{if(!this[
|
|
81
|
-
`,"f");Z(this,ve,b(this,ve,"f")+e.join(" "),"f")}}}[gi](e){Jn(b(this,ne,"f")).forEach((t)=>{if(((s)=>s==="configObjects")(t))return;let n=b(this,ne,"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 b(this,ue,"f").getDescriptions()[e]}[wu](e,t,n){if(!b(this,ho,"f")[n])b(this,ae,"f").process.emitWarning(e,t),b(this,ho,"f")[n]=!0}[Du](){b(this,go,"f").push({options:b(this,ne,"f"),configObjects:b(this,ne,"f").configObjects.slice(0),exitProcess:b(this,it,"f"),groups:b(this,St,"f"),strict:b(this,kn,"f"),strictCommands:b(this,xn,"f"),strictOptions:b(this,Sn,"f"),completionCommand:b(this,Qe,"f"),output:b(this,ve,"f"),exitError:b(this,Gt,"f"),hasOutput:b(this,et,"f"),parsed:this.parsed,parseFn:b(this,tt,"f"),parseContext:b(this,wn,"f")}),b(this,ue,"f").freeze(),b(this,Ee,"f").freeze(),b(this,Ce,"f").freeze(),b(this,at,"f").freeze()}[ku](){let e="",t;if(/\b(node|iojs|electron)(\.exe)?$/.test(b(this,ae,"f").process.argv()[0]))t=b(this,ae,"f").process.argv().slice(1,2);else t=b(this,ae,"f").process.argv().slice(0,1);if(e=t.map((n)=>{let s=this[vu](b(this,mn,"f"),n);return n.match(/^(\/|([a-zA-Z]:)?\\)/)&&s.length<n.length?s:n}).join(" ").trim(),b(this,ae,"f").getEnv("_")&&b(this,ae,"f").getProcessArgvBin()===b(this,ae,"f").getEnv("_"))e=b(this,ae,"f").getEnv("_").replace(`${b(this,ae,"f").path.dirname(b(this,ae,"f").process.execPath())}/`,"");return e}[_n](){return b(this,bo,"f")}[xu](){return b(this,Do,"f")}[mi](){if(!b(this,yn,"f"))return;let e=b(this,ae,"f").getEnv("LC_ALL")||b(this,ae,"f").getEnv("LC_MESSAGES")||b(this,ae,"f").getEnv("LANG")||b(this,ae,"f").getEnv("LANGUAGE")||"en_US";this.locale(e.replace(/[.:].*/,""))}[Su](){return this[yi]().version||"unknown"}[_u](e){let t=e["--"]?e["--"]:e._;for(let n=0,s;(s=t[n])!==void 0;n++)if(b(this,ae,"f").Parser.looksLikeNumber(s)&&Number.isSafeInteger(Math.floor(parseFloat(`${s}`))))t[n]=Number(s);return e}[yi](e){let t=e||"*";if(b(this,Kn,"f")[t])return b(this,Kn,"f")[t];let n={};try{let s=e||b(this,ae,"f").mainFilename;if(b(this,ae,"f").path.extname(s))s=b(this,ae,"f").path.dirname(s);let o=b(this,ae,"f").findUp(s,(r,i)=>{if(i.includes("package.json"))return"package.json";else return});Ue(o,void 0,b(this,ae,"f")),n=JSON.parse(b(this,ae,"f").readFileSync(o,"utf8"))}catch(s){}return b(this,Kn,"f")[t]=n||{},b(this,Kn,"f")[t]}[Vt](e,t){t=[].concat(t),t.forEach((n)=>{n=this[Di](n),b(this,ne,"f")[e].push(n)})}[qn](e,t,n,s){this[wi](e,t,n,s,(o,r,i)=>{b(this,ne,"f")[o][r]=i})}[bi](e,t,n,s){this[wi](e,t,n,s,(o,r,i)=>{b(this,ne,"f")[o][r]=(b(this,ne,"f")[o][r]||[]).concat(i)})}[wi](e,t,n,s,o){if(Array.isArray(n))n.forEach((r)=>{e(r,s)});else if(((r)=>typeof r==="object")(n))for(let r of Jn(n))e(r,n[r]);else o(t,this[Di](n),s)}[Di](e){if(e==="__proto__")return"___proto___";return e}[ki](e,t){return this[qn](this[ki].bind(this),"key",e,t),this}[xi](){var e,t,n,s,o,r,i,l,u,c,a,d;let f=b(this,go,"f").pop();Ue(f,void 0,b(this,ae,"f"));let p;e=this,t=this,n=this,s=this,o=this,r=this,i=this,l=this,u=this,c=this,a=this,d=this,{options:{set value(g){Z(e,ne,g,"f")}}.value,configObjects:p,exitProcess:{set value(g){Z(t,it,g,"f")}}.value,groups:{set value(g){Z(n,St,g,"f")}}.value,output:{set value(g){Z(s,ve,g,"f")}}.value,exitError:{set value(g){Z(o,Gt,g,"f")}}.value,hasOutput:{set value(g){Z(r,et,g,"f")}}.value,parsed:this.parsed,strict:{set value(g){Z(i,kn,g,"f")}}.value,strictCommands:{set value(g){Z(l,xn,g,"f")}}.value,strictOptions:{set value(g){Z(u,Sn,g,"f")}}.value,completionCommand:{set value(g){Z(c,Qe,g,"f")}}.value,parseFn:{set value(g){Z(a,tt,g,"f")}}.value,parseContext:{set value(g){Z(d,wn,g,"f")}}.value}=f,b(this,ne,"f").configObjects=p,b(this,ue,"f").unfreeze(),b(this,Ee,"f").unfreeze(),b(this,Ce,"f").unfreeze(),b(this,at,"f").unfreeze()}[Eu](e,t){return gn(t,(n)=>(e(n),n))}getInternalMethods(){return{getCommandInstance:this[$u].bind(this),getContext:this[Cu].bind(this),getHasOutput:this[Au].bind(this),getLoggerInstance:this[Fu].bind(this),getParseContext:this[Tu].bind(this),getParserConfiguration:this[_n].bind(this),getUsageConfiguration:this[xu].bind(this),getUsageInstance:this[Ou].bind(this),getValidationInstance:this[Ru].bind(this),hasParseCallback:this[ko].bind(this),isGlobalContext:this[Iu].bind(this),postProcess:this[En].bind(this),reset:this[Si].bind(this),runValidation:this[_i].bind(this),runYargsParserAndExecuteCommands:this[bs].bind(this),setHasOutput:this[Pu].bind(this)}}[$u](){return b(this,Ce,"f")}[Cu](){return b(this,ys,"f")}[Au](){return b(this,et,"f")}[Fu](){return b(this,bn,"f")}[Tu](){return b(this,wn,"f")||{}}[Ou](){return b(this,ue,"f")}[Ru](){return b(this,Ee,"f")}[ko](){return!!b(this,tt,"f")}[Iu](){return b(this,mo,"f")}[En](e,t,n,s){if(n)return e;if(ke(e))return e;if(!t)e=this[yu](e);if(this[_n]()["parse-positional-numbers"]||this[_n]()["parse-positional-numbers"]===void 0)e=this[_u](e);if(s)e=hn(e,this,b(this,at,"f").getMiddleware(),!1);return e}[Si](e={}){Z(this,ne,b(this,ne,"f")||{},"f");let t={};t.local=b(this,ne,"f").local||[],t.configObjects=b(this,ne,"f").configObjects||[];let n={};t.local.forEach((r)=>{n[r]=!0,(e[r]||[]).forEach((i)=>{n[i]=!0})}),Object.assign(b(this,Dn,"f"),Object.keys(b(this,St,"f")).reduce((r,i)=>{let l=b(this,St,"f")[i].filter((u)=>!(u in n));if(l.length>0)r[i]=l;return r},{})),Z(this,St,{},"f");let s=["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"],o=["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"];if(s.forEach((r)=>{t[r]=(b(this,ne,"f")[r]||[]).filter((i)=>!n[i])}),o.forEach((r)=>{t[r]=zt(b(this,ne,"f")[r],(i)=>!n[i])}),t.envPrefix=b(this,ne,"f").envPrefix,Z(this,ne,t,"f"),Z(this,ue,b(this,ue,"f")?b(this,ue,"f").reset(n):cu(this,b(this,ae,"f")),"f"),Z(this,Ee,b(this,Ee,"f")?b(this,Ee,"f").reset(n):gu(this,b(this,ue,"f"),b(this,ae,"f")),"f"),Z(this,Ce,b(this,Ce,"f")?b(this,Ce,"f").reset():ru(b(this,ue,"f"),b(this,Ee,"f"),b(this,at,"f"),b(this,ae,"f")),"f"),!b(this,ze,"f"))Z(this,ze,fu(this,b(this,ue,"f"),b(this,Ce,"f"),b(this,ae,"f")),"f");return b(this,at,"f").reset(),Z(this,Qe,null,"f"),Z(this,ve,"","f"),Z(this,Gt,null,"f"),Z(this,et,!1,"f"),this.parsed=!1,this}[vu](e,t){return b(this,ae,"f").path.relative(e,t)}[bs](e,t,n,s=0,o=!1){var r,i,l,u;let c=!!n||o;e=e||b(this,Xt,"f"),b(this,ne,"f").__=b(this,ae,"f").y18n.__,b(this,ne,"f").configuration=this[_n]();let a=!!b(this,ne,"f").configuration["populate--"],d=Object.assign({},b(this,ne,"f").configuration,{"populate--":!0}),f=b(this,ae,"f").Parser.detailed(e,Object.assign({},b(this,ne,"f"),{configuration:{"parse-positional-numbers":!1,...d}})),p=Object.assign(f.argv,b(this,wn,"f")),g=void 0,h=f.aliases,m=!1,y=!1;if(Object.keys(p).forEach((w)=>{if(w===b(this,ct,"f")&&p[w])m=!0;else if(w===b(this,_t,"f")&&p[w])y=!0}),p.$0=this.$0,this.parsed=f,s===0)b(this,ue,"f").clearCachedHelpMessage();try{if(this[mi](),t)return this[En](p,a,!!n,!1);if(b(this,ct,"f")){if([b(this,ct,"f")].concat(h[b(this,ct,"f")]||[]).filter((C)=>C.length>1).includes(""+p._[p._.length-1]))p._.pop(),m=!0}Z(this,mo,!1,"f");let w=b(this,Ce,"f").getCommands(),x=((r=b(this,ze,"f"))===null||r===void 0?void 0:r.completionKey)?[(i=b(this,ze,"f"))===null||i===void 0?void 0:i.completionKey,...(u=this.getAliases()[(l=b(this,ze,"f"))===null||l===void 0?void 0:l.completionKey])!==null&&u!==void 0?u:[]].some((E)=>Object.prototype.hasOwnProperty.call(p,E)):!1,D=m||x||o;if(p._.length){if(w.length){let E;for(let C=s||0,S;p._[C]!==void 0;C++)if(S=String(p._[C]),w.includes(S)&&S!==b(this,Qe,"f")){let k=b(this,Ce,"f").runCommand(S,this,f,C+1,o,m||y||o);return this[En](k,a,!!n,!1)}else if(!E&&S!==b(this,Qe,"f")){E=S;break}if(!b(this,Ce,"f").hasDefaultCommand()&&b(this,wo,"f")&&E&&!D)b(this,Ee,"f").recommendCommands(E,w)}if(b(this,Qe,"f")&&p._.includes(b(this,Qe,"f"))&&!x){if(b(this,it,"f"))Yt(!0);this.showCompletionScript(),this.exit(0)}}if(b(this,Ce,"f").hasDefaultCommand()&&!D){let E=b(this,Ce,"f").runCommand(null,this,f,0,o,m||y||o);return this[En](E,a,!!n,!1)}if(x){if(b(this,it,"f"))Yt(!0);e=[].concat(e);let E=e.slice(e.indexOf(`--${b(this,ze,"f").completionKey}`)+1);return b(this,ze,"f").getCompletion(E,(C,S)=>{if(C)throw new $e(C.message);(S||[]).forEach((k)=>{b(this,bn,"f").log(k)}),this.exit(0)}),this[En](p,!a,!!n,!1)}if(!b(this,et,"f")){if(m){if(b(this,it,"f"))Yt(!0);c=!0,this.showHelp((E)=>{b(this,bn,"f").log(E),this.exit(0)})}else if(y){if(b(this,it,"f"))Yt(!0);c=!0,b(this,ue,"f").showVersion("log"),this.exit(0)}}if(!c&&b(this,ne,"f").skipValidation.length>0)c=Object.keys(p).some((E)=>b(this,ne,"f").skipValidation.indexOf(E)>=0&&p[E]===!0);if(!c){if(f.error)throw new $e(f.error.message);if(!x){let E=this[_i](h,{},f.error);if(!n)g=hn(p,this,b(this,at,"f").getMiddleware(),!0);if(g=this[Eu](E,g!==null&&g!==void 0?g:p),ke(g)&&!n)g=g.then(()=>hn(p,this,b(this,at,"f").getMiddleware(),!1))}}}catch(w){if(w instanceof $e)b(this,ue,"f").fail(w.message,w);else throw w}return this[En](g!==null&&g!==void 0?g:p,a,!!n,!0)}[_i](e,t,n,s){let o={...this.getDemandedOptions()};return(r)=>{if(n)throw new $e(n.message);b(this,Ee,"f").nonOptionCount(r),b(this,Ee,"f").requiredArguments(r,o);let i=!1;if(b(this,xn,"f"))i=b(this,Ee,"f").unknownCommands(r);if(b(this,kn,"f")&&!i)b(this,Ee,"f").unknownArguments(r,e,t,!!s);else if(b(this,Sn,"f"))b(this,Ee,"f").unknownArguments(r,e,{},!1,!1);b(this,Ee,"f").limitedChoices(r),b(this,Ee,"f").implications(r),b(this,Ee,"f").conflicting(r)}}[Pu](){Z(this,et,!0,"f")}[$n](e){if(typeof e==="string")b(this,ne,"f").key[e]=!0;else for(let t of e)b(this,ne,"f").key[t]=!0}}function iu(e){return!!e&&typeof e.getInternalMethods==="function"}var wy=Lu(ui),Mu=wy;var Dy=/<https?:\/\/[^\s<>|]+(?:\|[^<>\r\n]*)?>|https?:\/\/[^\t\n\v\f\r <\x00]+/gi,ky=/[\t\n\v\f\r (*_~]/;function xy(e){let t=e.split(""),n=(o,r)=>{for(let i=o;i<r;i++)if(t[i]!==`
|
|
82
|
-
`)t[i]="\x00"},s=0;while(s<e.length){let
|
|
83
|
-
`?/^ {0,3}(?:(`{3,})[^`\n]*|(~{3,})[^\n]*)(?=\n|$)/.exec(e.slice(s)):null;if(
|
|
76
|
+
`)}`:"";t.fail(r("Missing required argument: %s","Missing required arguments: %s",Object.keys(p).length,Object.keys(p).join(", ")+h))}},o.unknownArguments=function(d,f,p,g,h=!0){var m;let y=e.getInternalMethods().getCommandInstance().getCommands(),w=[],x=e.getInternalMethods().getContext();if(Object.keys(d).forEach((D)=>{if(!ku.includes(D)&&!Object.prototype.hasOwnProperty.call(p,D)&&!Object.prototype.hasOwnProperty.call(e.getInternalMethods().getParseContext(),D)&&!o.isValidAndSomeAliasIsNotNew(D,f))w.push(D)}),h&&(x.commands.length>0||y.length>0||g))d._.slice(x.commands.length).forEach((D)=>{if(!y.includes(""+D))w.push(""+D)});if(h){let E=((m=e.getDemandedCommands()._)===null||m===void 0?void 0:m.max)||0,C=x.commands.length+E;if(C<d._.length)d._.slice(C).forEach((S)=>{if(S=String(S),!x.commands.includes(S)&&!w.includes(S))w.push(S)})}if(w.length)t.fail(r("Unknown argument: %s","Unknown arguments: %s",w.length,w.map((D)=>D.trim()?D:`"${D}"`).join(", ")))},o.unknownCommands=function(d){let f=e.getInternalMethods().getCommandInstance().getCommands(),p=[],g=e.getInternalMethods().getContext();if(g.commands.length>0||f.length>0)d._.slice(g.commands.length).forEach((h)=>{if(!f.includes(""+h))p.push(""+h)});if(p.length>0)return t.fail(r("Unknown command: %s","Unknown commands: %s",p.length,p.join(", "))),!0;else return!1},o.isValidAndSomeAliasIsNotNew=function(d,f){if(!Object.prototype.hasOwnProperty.call(f,d))return!1;let p=e.parsed.newAliases;return[d,...f[d]].some((g)=>!Object.prototype.hasOwnProperty.call(p,g)||!p[d])},o.limitedChoices=function(d){let f=e.getOptions(),p={};if(!Object.keys(f.choices).length)return;Object.keys(d).forEach((m)=>{if(ku.indexOf(m)===-1&&Object.prototype.hasOwnProperty.call(f.choices,m))[].concat(d[m]).forEach((y)=>{if(f.choices[m].indexOf(y)===-1&&y!==void 0)p[m]=(p[m]||[]).concat(y)})});let g=Object.keys(p);if(!g.length)return;let h=s("Invalid values:");g.forEach((m)=>{h+=`
|
|
77
|
+
${s("Argument: %s, Given: %s, Choices: %s",m,t.stringifiedValues(p[m]),t.stringifiedValues(f.choices[m]))}`}),t.fail(h)};let i={};o.implies=function(d,f){if(V("<string|object> [array|number|string]",[d,f],arguments.length),typeof d==="object")Object.keys(d).forEach((p)=>{o.implies(p,d[p])});else{if(e.global(d),!i[d])i[d]=[];if(Array.isArray(f))f.forEach((p)=>o.implies(d,p));else Je(f,void 0,n),i[d].push(f)}},o.getImplied=function(){return i};function l(c,d){let f=Number(d);if(d=isNaN(f)?d:f,typeof d==="number")d=c._.length>=d;else if(d.match(/^--no-.+/))d=d.match(/^--no-(.+)/)[1],d=!Object.prototype.hasOwnProperty.call(c,d);else d=Object.prototype.hasOwnProperty.call(c,d);return d}o.implications=function(d){let f=[];if(Object.keys(i).forEach((p)=>{let g=p;(i[p]||[]).forEach((h)=>{let m=g,y=h;if(m=l(d,m),h=l(d,h),m&&!h)f.push(` ${g} -> ${y}`)})}),f.length){let p=`${s("Implications failed:")}
|
|
78
|
+
`;f.forEach((g)=>{p+=g}),t.fail(p)}};let u={};o.conflicts=function(d,f){if(V("<string|object> [array|string]",[d,f],arguments.length),typeof d==="object")Object.keys(d).forEach((p)=>{o.conflicts(p,d[p])});else{if(e.global(d),!u[d])u[d]=[];if(Array.isArray(f))f.forEach((p)=>o.conflicts(d,p));else u[d].push(f)}},o.getConflicting=()=>u,o.conflicting=function(d){if(Object.keys(d).forEach((f)=>{if(u[f])u[f].forEach((p)=>{if(p&&d[f]!==void 0&&d[p]!==void 0)t.fail(s("Arguments %s and %s are mutually exclusive",f,p))})}),e.getInternalMethods().getParserConfiguration()["strip-dashed"])Object.keys(u).forEach((f)=>{u[f].forEach((p)=>{if(p&&d[n.Parser.camelCase(f)]!==void 0&&d[n.Parser.camelCase(p)]!==void 0)t.fail(s("Arguments %s and %s are mutually exclusive",f,p))})})},o.recommendCommands=function(d,f){f=f.sort((m,y)=>y.length-m.length);let g=null,h=1/0;for(let m=0,y;(y=f[m])!==void 0;m++){let w=Du(d,y);if(w<=3&&w<h)h=w,g=y}if(g)t.fail(s("Did you mean %s?",g))},o.reset=function(d){return i=zt(i,(f)=>!d[f]),u=zt(u,(f)=>!d[f]),o};let a=[];return o.freeze=function(){a.push({implied:i,conflicting:u})},o.unfreeze=function(){let d=a.pop();Je(d,void 0,n),{implied:i,conflicting:u}=d},o}var mi=[],ys;function bs(e,t,n,s){ys=s;let r={};if(Object.prototype.hasOwnProperty.call(e,"extends")){if(typeof e.extends!=="string")return r;let o=/\.json|\..*rc$/.test(e.extends),i=null;if(!o)try{i=import.meta.resolve(e.extends)}catch(l){return e}else i=vy(t,e.extends);Iy(i),mi.push(i),r=o?JSON.parse(ys.readFileSync(i,"utf8")):s.require(e.extends),delete e.extends,r=bs(r,ys.path.dirname(i),n,ys)}return mi=[],n?Su(r,e):Object.assign({},r,e)}function Iy(e){if(mi.indexOf(e)>-1)throw new $e(`Circular extended configurations: '${e}'.`)}function vy(e,t){return ys.path.resolve(e,t)}function Su(e,t){let n={};function s(r){return r&&typeof r==="object"&&!Array.isArray(r)}Object.assign(n,e);for(let r of Object.keys(t))if(s(t[r])&&s(n[r]))n[r]=Su(e[r],t[r]);else n[r]=t[r];return n}var Z=function(e,t,n,s,r){if(s==="m")throw TypeError("Private method is not writable");if(s==="a"&&!r)throw TypeError("Private accessor was defined without a setter");if(typeof t==="function"?e!==t||!r:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?r.call(e,n):r?r.value=n:t.set(e,n),n},b=function(e,t,n,s){if(n==="a"&&!s)throw TypeError("Private accessor was defined without a getter");if(typeof t==="function"?e!==t||!s:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?s:n==="a"?s.call(e):s?s.value:t.get(e)},Ce,mn,ws,ze,Qe,gr,Yt,yn,mr,it,yr,at,_t,et,ct,br,bn,ve,ne,wr,Dr,tt,wn,Kn,Dn,Xt,kr,ae,kn,xn,Sn,ue,xr,Et,Ee;function Ju(e){return(t=[],n=e.process.cwd(),s)=>{let r=new Ku(t,n,s,e);return Object.defineProperty(r,"argv",{get:()=>r.parse(),enumerable:!0}),r.help(),r.version(),r}}var _u=Symbol("copyDoubleDash"),Eu=Symbol("copyDoubleDash"),yi=Symbol("deleteFromParserHintObject"),$u=Symbol("emitWarning"),Cu=Symbol("freeze"),Au=Symbol("getDollarZero"),_n=Symbol("getParserConfiguration"),Fu=Symbol("getUsageConfiguration"),bi=Symbol("guessLocale"),Tu=Symbol("guessVersion"),Ou=Symbol("parsePositionalNumbers"),wi=Symbol("pkgUp"),Vt=Symbol("populateParserHintArray"),qn=Symbol("populateParserHintSingleValueDictionary"),Di=Symbol("populateParserHintArrayDictionary"),ki=Symbol("populateParserHintDictionary"),xi=Symbol("sanitizeKey"),Si=Symbol("setKey"),_i=Symbol("unfreeze"),Ru=Symbol("validateAsync"),Iu=Symbol("getCommandInstance"),vu=Symbol("getContext"),Pu=Symbol("getHasOutput"),Lu=Symbol("getLoggerInstance"),Nu=Symbol("getParseContext"),Mu=Symbol("getUsageInstance"),Bu=Symbol("getValidationInstance"),Sr=Symbol("hasParseCallback"),ju=Symbol("isGlobalContext"),En=Symbol("postProcess"),Wu=Symbol("rebase"),Ei=Symbol("reset"),Ds=Symbol("runYargsParserAndExecuteCommands"),$i=Symbol("runValidation"),Uu=Symbol("setHasOutput"),$n=Symbol("kTrackManuallySetKeys"),Py="en_US";class Ku{constructor(e=[],t,n,s){this.customScriptName=!1,this.parsed=!1,Ce.set(this,void 0),mn.set(this,void 0),ws.set(this,{commands:[],fullCommands:[]}),ze.set(this,null),Qe.set(this,null),gr.set(this,"show-hidden"),Yt.set(this,null),yn.set(this,!0),mr.set(this,{}),it.set(this,!0),yr.set(this,[]),at.set(this,void 0),_t.set(this,{}),et.set(this,!1),ct.set(this,null),br.set(this,!0),bn.set(this,void 0),ve.set(this,""),ne.set(this,void 0),wr.set(this,void 0),Dr.set(this,{}),tt.set(this,null),wn.set(this,null),Kn.set(this,{}),Dn.set(this,{}),Xt.set(this,void 0),kr.set(this,!1),ae.set(this,void 0),kn.set(this,!1),xn.set(this,!1),Sn.set(this,!1),ue.set(this,void 0),xr.set(this,{}),Et.set(this,null),Ee.set(this,void 0),Z(this,ae,s,"f"),Z(this,Xt,e,"f"),Z(this,mn,t,"f"),Z(this,wr,n,"f"),Z(this,at,new hi(this),"f"),this.$0=this[Au](),this[Ei](),Z(this,Ce,b(this,Ce,"f"),"f"),Z(this,ue,b(this,ue,"f"),"f"),Z(this,Ee,b(this,Ee,"f"),"f"),Z(this,ne,b(this,ne,"f"),"f"),b(this,ne,"f").showHiddenOpt=b(this,gr,"f"),Z(this,bn,this[Eu](),"f"),b(this,ae,"f").y18n.setLocale(Py)}addHelpOpt(e,t){if(V("[string|boolean] [string]",[e,t],arguments.length),b(this,ct,"f"))this[yi](b(this,ct,"f")),Z(this,ct,null,"f");if(e===!1&&t===void 0)return this;return Z(this,ct,typeof e==="string"?e:"help","f"),this.boolean(b(this,ct,"f")),this.describe(b(this,ct,"f"),t||b(this,ue,"f").deferY18nLookup("Show help")),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(V("[string|boolean] [string]",[e,t],arguments.length),e===!1&&t===void 0)return this;let n=typeof e==="string"?e:b(this,gr,"f");return this.boolean(n),this.describe(n,t||b(this,ue,"f").deferY18nLookup("Show hidden options")),b(this,ne,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return V("<object|string|array> [string|array]",[e,t],arguments.length),this[Di](this.alias.bind(this),"alias",e,t),this}array(e){return V("<array|string>",[e],arguments.length),this[Vt]("array",e),this[$n](e),this}boolean(e){return V("<array|string>",[e],arguments.length),this[Vt]("boolean",e),this[$n](e),this}check(e,t){return V("<function> [boolean]",[e,t],arguments.length),this.middleware((n,s)=>gn(()=>e(n,s.getOptions()),(r)=>{if(!r)b(this,ue,"f").fail(b(this,ae,"f").y18n.__("Argument check failed: %s",e.toString()));else if(typeof r==="string"||r instanceof Error)b(this,ue,"f").fail(r.toString(),r);return n},(r)=>(b(this,ue,"f").fail(r.message?r.message:r.toString(),r),n)),!1,t),this}choices(e,t){return V("<object|string|array> [string|array]",[e,t],arguments.length),this[Di](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(V("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new $e("coerce callback must be provided");for(let s of e)this.coerce(s,t);return this}else if(typeof e==="object"){for(let s of Object.keys(e))this.coerce(s,e[s]);return this}if(!t)throw new $e("coerce callback must be provided");let n=e;return b(this,ne,"f").key[n]=!0,b(this,at,"f").addCoerceMiddleware((s,r)=>{var o;let i=(o=r.getAliases()[n])!==null&&o!==void 0?o:[],l=[n,...i].filter((u)=>Object.prototype.hasOwnProperty.call(s,u));if(l.length===0)return s;return gn(()=>t(s[l[0]]),(u)=>(l.forEach((a)=>{s[a]=u}),s),(u)=>{throw new $e(u.message)})},n),this}conflicts(e,t){return V("<string|object> [string|array]",[e,t],arguments.length),b(this,Ee,"f").conflicts(e,t),this}config(e="config",t,n){if(V("[object|string] [string|function] [function]",[e,t,n],arguments.length),typeof e==="object"&&!Array.isArray(e))return e=bs(e,b(this,mn,"f"),this[_n]()["deep-merge-config"]||!1,b(this,ae,"f")),b(this,ne,"f").configObjects=(b(this,ne,"f").configObjects||[]).concat(e),this;if(typeof t==="function")n=t,t=void 0;return this.describe(e,t||b(this,ue,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((s)=>{b(this,ne,"f").config[s]=n||!0}),this}completion(e,t,n){if(V("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),typeof t==="function")n=t,t=void 0;if(Z(this,Qe,e||b(this,Qe,"f")||"completion","f"),!t&&t!==!1)t="generate completion script";if(this.command(b(this,Qe,"f"),t),n)b(this,ze,"f").registerFunction(n);return this}command(e,t,n,s,r,o){return V("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,s,r,o],arguments.length),b(this,Ce,"f").addHandler(e,t,n,s,r,o),this}commands(e,t,n,s,r,o){return this.command(e,t,n,s,r,o)}commandDir(e,t){V("<string> [object]",[e,t],arguments.length);let n=b(this,wr,"f")||b(this,ae,"f").require;return b(this,Ce,"f").addDirectory(e,n,b(this,ae,"f").getCallerFile(),t),this}count(e){return V("<array|string>",[e],arguments.length),this[Vt]("count",e),this[$n](e),this}default(e,t,n){if(V("<object|string|array> [*] [string]",[e,t,n],arguments.length),n)pi(e,b(this,ae,"f")),b(this,ne,"f").defaultDescription[e]=n;if(typeof t==="function"){if(pi(e,b(this,ae,"f")),!b(this,ne,"f").defaultDescription[e])b(this,ne,"f").defaultDescription[e]=b(this,ue,"f").functionDescription(t);t=t.call()}return this[qn](this.default.bind(this),"default",e,t),this}defaults(e,t,n){return this.default(e,t,n)}demandCommand(e=1,t,n,s){if(V("[number] [number|string] [string|null|undefined] [string|null|undefined]",[e,t,n,s],arguments.length),typeof t!=="number")n=t,t=1/0;return this.global("_",!1),b(this,ne,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:s},this}demand(e,t,n){if(Array.isArray(t))t.forEach((s)=>{Je(n,!0,b(this,ae,"f")),this.demandOption(s,n)}),t=1/0;else if(typeof t!=="number")n=t,t=1/0;if(typeof e==="number")Je(n,!0,b(this,ae,"f")),this.demandCommand(e,t,n,n);else if(Array.isArray(e))e.forEach((s)=>{Je(n,!0,b(this,ae,"f")),this.demandOption(s,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 V("<object|string|array> [string]",[e,t],arguments.length),this[qn](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return V("<string> [string|boolean]",[e,t],arguments.length),b(this,ne,"f").deprecatedOptions[e]=t,this}describe(e,t){return V("<object|string|array> [string]",[e,t],arguments.length),this[Si](e,!0),b(this,ue,"f").describe(e,t),this}detectLocale(e){return V("<boolean>",[e],arguments.length),Z(this,yn,e,"f"),this}env(e){if(V("[string|boolean]",[e],arguments.length),e===!1)delete b(this,ne,"f").envPrefix;else b(this,ne,"f").envPrefix=e||"";return this}epilogue(e){return V("<string>",[e],arguments.length),b(this,ue,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){if(V("<string|array> [string]",[e,t],arguments.length),Array.isArray(e))e.forEach((n)=>this.example(...n));else b(this,ue,"f").example(e,t);return this}exit(e,t){if(Z(this,et,!0,"f"),Z(this,Yt,t,"f"),b(this,it,"f"))b(this,ae,"f").process.exit(e)}exitProcess(e=!0){return V("[boolean]",[e],arguments.length),Z(this,it,e,"f"),this}fail(e){if(V("<function|boolean>",[e],arguments.length),typeof e==="boolean"&&e!==!1)throw new $e("Invalid first argument. Expected function or boolean 'false'");return b(this,ue,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){if(V("<array> [function]",[e,t],arguments.length),!t)return new Promise((n,s)=>{b(this,ze,"f").getCompletion(e,(r,o)=>{if(r)s(r);else n(o)})});else return b(this,ze,"f").getCompletion(e,t)}getDemandedOptions(){return V([],0),b(this,ne,"f").demandedOptions}getDemandedCommands(){return V([],0),b(this,ne,"f").demandedCommands}getDeprecatedOptions(){return V([],0),b(this,ne,"f").deprecatedOptions}getDetectLocale(){return b(this,yn,"f")}getExitProcess(){return b(this,it,"f")}getGroups(){return Object.assign({},b(this,_t,"f"),b(this,Dn,"f"))}getHelp(){if(Z(this,et,!0,"f"),!b(this,ue,"f").hasCachedHelpMessage()){if(!this.parsed){let t=this[Ds](b(this,Xt,"f"),void 0,void 0,0,!0);if(ke(t))return t.then(()=>b(this,ue,"f").help())}let e=b(this,Ce,"f").runDefaultBuilderOn(this);if(ke(e))return e.then(()=>b(this,ue,"f").help())}return Promise.resolve(b(this,ue,"f").help())}getOptions(){return b(this,ne,"f")}getStrict(){return b(this,kn,"f")}getStrictCommands(){return b(this,xn,"f")}getStrictOptions(){return b(this,Sn,"f")}global(e,t){if(V("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),t!==!1)b(this,ne,"f").local=b(this,ne,"f").local.filter((n)=>e.indexOf(n)===-1);else e.forEach((n)=>{if(!b(this,ne,"f").local.includes(n))b(this,ne,"f").local.push(n)});return this}group(e,t){V("<string|array> <string>",[e,t],arguments.length);let n=b(this,Dn,"f")[t]||b(this,_t,"f")[t];if(b(this,Dn,"f")[t])delete b(this,Dn,"f")[t];let s={};return b(this,_t,"f")[t]=(n||[]).concat(e).filter((r)=>{if(s[r])return!1;return s[r]=!0}),this}hide(e){return V("<string>",[e],arguments.length),b(this,ne,"f").hiddenOptions.push(e),this}implies(e,t){return V("<string|object> [number|string|array]",[e,t],arguments.length),b(this,Ee,"f").implies(e,t),this}locale(e){if(V("[string]",[e],arguments.length),e===void 0)return this[bi](),b(this,ae,"f").y18n.getLocale();return Z(this,yn,!1,"f"),b(this,ae,"f").y18n.setLocale(e),this}middleware(e,t,n){return b(this,at,"f").addMiddleware(e,!!t,n)}nargs(e,t){return V("<string|object|array> [number]",[e,t],arguments.length),this[qn](this.nargs.bind(this),"narg",e,t),this}normalize(e){return V("<array|string>",[e],arguments.length),this[Vt]("normalize",e),this}number(e){return V("<array|string>",[e],arguments.length),this[Vt]("number",e),this[$n](e),this}option(e,t){if(V("<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[$n](e),b(this,Et,"f")&&(e==="version"||(t===null||t===void 0?void 0:t.alias)==="version"))this[$u](['"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(b(this,ne,"f").key[e]=!0,t.alias)this.alias(e,t.alias);let n=t.deprecate||t.deprecated;if(n)this.deprecateOption(e,n);let s=t.demand||t.required||t.require;if(s)this.demand(e,s);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)b(this,ne,"f").defaultDescription[e]=t.defaultDescription;if(t.skipValidation)this.skipValidation(e);let r=t.describe||t.description||t.desc,o=b(this,ue,"f").getDescriptions();if(!Object.prototype.hasOwnProperty.call(o,e)||typeof r==="string")this.describe(e,r);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(V("[string|array] [function|boolean|object] [function]",[e,t,n],arguments.length),this[Cu](),typeof e>"u")e=b(this,Xt,"f");if(typeof t==="object")Z(this,wn,t,"f"),t=n;if(typeof t==="function")Z(this,tt,t,"f"),t=!1;if(!t)Z(this,Xt,e,"f");if(b(this,tt,"f"))Z(this,it,!1,"f");let s=this[Ds](e,!!t),r=this.parsed;if(b(this,ze,"f").setParsed(this.parsed),ke(s))return s.then((o)=>{if(b(this,tt,"f"))b(this,tt,"f").call(this,b(this,Yt,"f"),o,b(this,ve,"f"));return o}).catch((o)=>{if(b(this,tt,"f"))b(this,tt,"f")(o,this.parsed.argv,b(this,ve,"f"));throw o}).finally(()=>{this[_i](),this.parsed=r});else{if(b(this,tt,"f"))b(this,tt,"f").call(this,b(this,Yt,"f"),s,b(this,ve,"f"));this[_i](),this.parsed=r}return s}parseAsync(e,t,n){let s=this.parse(e,t,n);return!ke(s)?Promise.resolve(s):s}parseSync(e,t,n){let s=this.parse(e,t,n);if(ke(s))throw new $e(".parseSync() must not be used with asynchronous builders, handlers, or middleware");return s}parserConfiguration(e){return V("<object>",[e],arguments.length),Z(this,Dr,e,"f"),this}pkgConf(e,t){V("<string> [string]",[e,t],arguments.length);let n=null,s=this[wi](t||b(this,mn,"f"));if(s[e]&&typeof s[e]==="object")n=bs(s[e],t||b(this,mn,"f"),this[_n]()["deep-merge-config"]||!1,b(this,ae,"f")),b(this,ne,"f").configObjects=(b(this,ne,"f").configObjects||[]).concat(n);return this}positional(e,t){V("<string> <object>",[e,t],arguments.length);let n=["default","defaultDescription","implies","normalize","choices","conflicts","coerce","type","describe","desc","description","alias"];t=zt(t,(o,i)=>{if(o==="type"&&!["string","number","boolean"].includes(i))return!1;return n.includes(o)});let s=b(this,ws,"f").fullCommands[b(this,ws,"f").fullCommands.length-1],r=s?b(this,Ce,"f").cmdToParseOptions(s):{array:[],alias:{},default:{},demand:{}};return Un(r).forEach((o)=>{let i=r[o];if(Array.isArray(i)){if(i.indexOf(e)!==-1)t[o]=!0}else if(i[e]&&!(o in t))t[o]=i[e]}),this.group(e,b(this,ue,"f").getPositionalGroupName()),this.option(e,t)}recommendCommands(e=!0){return V("[boolean]",[e],arguments.length),Z(this,kr,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(V("<array|string|object> [number]",[e],arguments.length),typeof e==="string"&&b(this,ne,"f").narg[e])return this;else this[qn](this.requiresArg.bind(this),"narg",e,NaN);return this}showCompletionScript(e,t){return V("[string] [string]",[e,t],arguments.length),e=e||this.$0,b(this,bn,"f").log(b(this,ze,"f").generateCompletionScript(e,t||b(this,Qe,"f")||"completion")),this}showHelp(e){if(V("[string|function]",[e],arguments.length),Z(this,et,!0,"f"),!b(this,ue,"f").hasCachedHelpMessage()){if(!this.parsed){let n=this[Ds](b(this,Xt,"f"),void 0,void 0,0,!0);if(ke(n))return n.then(()=>{b(this,ue,"f").showHelp(e)}),this}let t=b(this,Ce,"f").runDefaultBuilderOn(this);if(ke(t))return t.then(()=>{b(this,ue,"f").showHelp(e)}),this}return b(this,ue,"f").showHelp(e),this}scriptName(e){return this.customScriptName=!0,this.$0=e,this}showHelpOnFail(e,t){return V("[boolean|string] [string]",[e,t],arguments.length),b(this,ue,"f").showHelpOnFail(e,t),this}showVersion(e){return V("[string|function]",[e],arguments.length),b(this,ue,"f").showVersion(e),this}skipValidation(e){return V("<array|string>",[e],arguments.length),this[Vt]("skipValidation",e),this}strict(e){return V("[boolean]",[e],arguments.length),Z(this,kn,e!==!1,"f"),this}strictCommands(e){return V("[boolean]",[e],arguments.length),Z(this,xn,e!==!1,"f"),this}strictOptions(e){return V("[boolean]",[e],arguments.length),Z(this,Sn,e!==!1,"f"),this}string(e){return V("<array|string>",[e],arguments.length),this[Vt]("string",e),this[$n](e),this}terminalWidth(){return V([],0),b(this,ae,"f").process.stdColumns}updateLocale(e){return this.updateStrings(e)}updateStrings(e){return V("<object>",[e],arguments.length),Z(this,yn,!1,"f"),b(this,ae,"f").y18n.updateLocale(e),this}usage(e,t,n,s){if(V("<string|null|undefined> [string|boolean] [function|object] [function]",[e,t,n,s],arguments.length),t!==void 0)if(Je(e,null,b(this,ae,"f")),(e||"").match(/^\$0( |$)/))return this.command(e,t,n,s);else throw new $e(".usage() description must start with $0 if being used as alias for .command()");else return b(this,ue,"f").usage(e),this}usageConfiguration(e){return V("<object>",[e],arguments.length),Z(this,xr,e,"f"),this}version(e,t,n){if(V("[boolean|string] [string] [string]",[e,t,n],arguments.length),b(this,Et,"f"))this[yi](b(this,Et,"f")),b(this,ue,"f").version(void 0),Z(this,Et,null,"f");if(arguments.length===0)n=this[Tu](),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,Et,typeof e==="string"?e:"version","f"),t=t||b(this,ue,"f").deferY18nLookup("Show version number"),b(this,ue,"f").version(n||void 0),this.boolean(b(this,Et,"f")),this.describe(b(this,Et,"f"),t),this}wrap(e){return V("<number|null|undefined>",[e],arguments.length),b(this,ue,"f").wrap(e),this}[(Ce=new WeakMap,mn=new WeakMap,ws=new WeakMap,ze=new WeakMap,Qe=new WeakMap,gr=new WeakMap,Yt=new WeakMap,yn=new WeakMap,mr=new WeakMap,it=new WeakMap,yr=new WeakMap,at=new WeakMap,_t=new WeakMap,et=new WeakMap,ct=new WeakMap,br=new WeakMap,bn=new WeakMap,ve=new WeakMap,ne=new WeakMap,wr=new WeakMap,Dr=new WeakMap,tt=new WeakMap,wn=new WeakMap,Kn=new WeakMap,Dn=new WeakMap,Xt=new WeakMap,kr=new WeakMap,ae=new WeakMap,kn=new WeakMap,xn=new WeakMap,Sn=new WeakMap,ue=new WeakMap,xr=new WeakMap,Et=new WeakMap,Ee=new WeakMap,_u)](e){if(!e._||!e["--"])return e;e._.push.apply(e._,e["--"]);try{delete e["--"]}catch(t){}return e}[Eu](){return{log:(...e)=>{if(!this[Sr]())console.log(...e);if(Z(this,et,!0,"f"),b(this,ve,"f").length)Z(this,ve,b(this,ve,"f")+`
|
|
80
|
+
`,"f");Z(this,ve,b(this,ve,"f")+e.join(" "),"f")},error:(...e)=>{if(!this[Sr]())console.error(...e);if(Z(this,et,!0,"f"),b(this,ve,"f").length)Z(this,ve,b(this,ve,"f")+`
|
|
81
|
+
`,"f");Z(this,ve,b(this,ve,"f")+e.join(" "),"f")}}}[yi](e){Un(b(this,ne,"f")).forEach((t)=>{if(((s)=>s==="configObjects")(t))return;let n=b(this,ne,"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 b(this,ue,"f").getDescriptions()[e]}[$u](e,t,n){if(!b(this,mr,"f")[n])b(this,ae,"f").process.emitWarning(e,t),b(this,mr,"f")[n]=!0}[Cu](){b(this,yr,"f").push({options:b(this,ne,"f"),configObjects:b(this,ne,"f").configObjects.slice(0),exitProcess:b(this,it,"f"),groups:b(this,_t,"f"),strict:b(this,kn,"f"),strictCommands:b(this,xn,"f"),strictOptions:b(this,Sn,"f"),completionCommand:b(this,Qe,"f"),output:b(this,ve,"f"),exitError:b(this,Yt,"f"),hasOutput:b(this,et,"f"),parsed:this.parsed,parseFn:b(this,tt,"f"),parseContext:b(this,wn,"f")}),b(this,ue,"f").freeze(),b(this,Ee,"f").freeze(),b(this,Ce,"f").freeze(),b(this,at,"f").freeze()}[Au](){let e="",t;if(/\b(node|iojs|electron)(\.exe)?$/.test(b(this,ae,"f").process.argv()[0]))t=b(this,ae,"f").process.argv().slice(1,2);else t=b(this,ae,"f").process.argv().slice(0,1);if(e=t.map((n)=>{let s=this[Wu](b(this,mn,"f"),n);return n.match(/^(\/|([a-zA-Z]:)?\\)/)&&s.length<n.length?s:n}).join(" ").trim(),b(this,ae,"f").getEnv("_")&&b(this,ae,"f").getProcessArgvBin()===b(this,ae,"f").getEnv("_"))e=b(this,ae,"f").getEnv("_").replace(`${b(this,ae,"f").path.dirname(b(this,ae,"f").process.execPath())}/`,"");return e}[_n](){return b(this,Dr,"f")}[Fu](){return b(this,xr,"f")}[bi](){if(!b(this,yn,"f"))return;let e=b(this,ae,"f").getEnv("LC_ALL")||b(this,ae,"f").getEnv("LC_MESSAGES")||b(this,ae,"f").getEnv("LANG")||b(this,ae,"f").getEnv("LANGUAGE")||"en_US";this.locale(e.replace(/[.:].*/,""))}[Tu](){return this[wi]().version||"unknown"}[Ou](e){let t=e["--"]?e["--"]:e._;for(let n=0,s;(s=t[n])!==void 0;n++)if(b(this,ae,"f").Parser.looksLikeNumber(s)&&Number.isSafeInteger(Math.floor(parseFloat(`${s}`))))t[n]=Number(s);return e}[wi](e){let t=e||"*";if(b(this,Kn,"f")[t])return b(this,Kn,"f")[t];let n={};try{let s=e||b(this,ae,"f").mainFilename;if(b(this,ae,"f").path.extname(s))s=b(this,ae,"f").path.dirname(s);let r=b(this,ae,"f").findUp(s,(o,i)=>{if(i.includes("package.json"))return"package.json";else return});Je(r,void 0,b(this,ae,"f")),n=JSON.parse(b(this,ae,"f").readFileSync(r,"utf8"))}catch(s){}return b(this,Kn,"f")[t]=n||{},b(this,Kn,"f")[t]}[Vt](e,t){t=[].concat(t),t.forEach((n)=>{n=this[xi](n),b(this,ne,"f")[e].push(n)})}[qn](e,t,n,s){this[ki](e,t,n,s,(r,o,i)=>{b(this,ne,"f")[r][o]=i})}[Di](e,t,n,s){this[ki](e,t,n,s,(r,o,i)=>{b(this,ne,"f")[r][o]=(b(this,ne,"f")[r][o]||[]).concat(i)})}[ki](e,t,n,s,r){if(Array.isArray(n))n.forEach((o)=>{e(o,s)});else if(((o)=>typeof o==="object")(n))for(let o of Un(n))e(o,n[o]);else r(t,this[xi](n),s)}[xi](e){if(e==="__proto__")return"___proto___";return e}[Si](e,t){return this[qn](this[Si].bind(this),"key",e,t),this}[_i](){var e,t,n,s,r,o,i,l,u,a,c,d;let f=b(this,yr,"f").pop();Je(f,void 0,b(this,ae,"f"));let p;e=this,t=this,n=this,s=this,r=this,o=this,i=this,l=this,u=this,a=this,c=this,d=this,{options:{set value(g){Z(e,ne,g,"f")}}.value,configObjects:p,exitProcess:{set value(g){Z(t,it,g,"f")}}.value,groups:{set value(g){Z(n,_t,g,"f")}}.value,output:{set value(g){Z(s,ve,g,"f")}}.value,exitError:{set value(g){Z(r,Yt,g,"f")}}.value,hasOutput:{set value(g){Z(o,et,g,"f")}}.value,parsed:this.parsed,strict:{set value(g){Z(i,kn,g,"f")}}.value,strictCommands:{set value(g){Z(l,xn,g,"f")}}.value,strictOptions:{set value(g){Z(u,Sn,g,"f")}}.value,completionCommand:{set value(g){Z(a,Qe,g,"f")}}.value,parseFn:{set value(g){Z(c,tt,g,"f")}}.value,parseContext:{set value(g){Z(d,wn,g,"f")}}.value}=f,b(this,ne,"f").configObjects=p,b(this,ue,"f").unfreeze(),b(this,Ee,"f").unfreeze(),b(this,Ce,"f").unfreeze(),b(this,at,"f").unfreeze()}[Ru](e,t){return gn(t,(n)=>(e(n),n))}getInternalMethods(){return{getCommandInstance:this[Iu].bind(this),getContext:this[vu].bind(this),getHasOutput:this[Pu].bind(this),getLoggerInstance:this[Lu].bind(this),getParseContext:this[Nu].bind(this),getParserConfiguration:this[_n].bind(this),getUsageConfiguration:this[Fu].bind(this),getUsageInstance:this[Mu].bind(this),getValidationInstance:this[Bu].bind(this),hasParseCallback:this[Sr].bind(this),isGlobalContext:this[ju].bind(this),postProcess:this[En].bind(this),reset:this[Ei].bind(this),runValidation:this[$i].bind(this),runYargsParserAndExecuteCommands:this[Ds].bind(this),setHasOutput:this[Uu].bind(this)}}[Iu](){return b(this,Ce,"f")}[vu](){return b(this,ws,"f")}[Pu](){return b(this,et,"f")}[Lu](){return b(this,bn,"f")}[Nu](){return b(this,wn,"f")||{}}[Mu](){return b(this,ue,"f")}[Bu](){return b(this,Ee,"f")}[Sr](){return!!b(this,tt,"f")}[ju](){return b(this,br,"f")}[En](e,t,n,s){if(n)return e;if(ke(e))return e;if(!t)e=this[_u](e);if(this[_n]()["parse-positional-numbers"]||this[_n]()["parse-positional-numbers"]===void 0)e=this[Ou](e);if(s)e=hn(e,this,b(this,at,"f").getMiddleware(),!1);return e}[Ei](e={}){Z(this,ne,b(this,ne,"f")||{},"f");let t={};t.local=b(this,ne,"f").local||[],t.configObjects=b(this,ne,"f").configObjects||[];let n={};t.local.forEach((o)=>{n[o]=!0,(e[o]||[]).forEach((i)=>{n[i]=!0})}),Object.assign(b(this,Dn,"f"),Object.keys(b(this,_t,"f")).reduce((o,i)=>{let l=b(this,_t,"f")[i].filter((u)=>!(u in n));if(l.length>0)o[i]=l;return o},{})),Z(this,_t,{},"f");let s=["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"],r=["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"];if(s.forEach((o)=>{t[o]=(b(this,ne,"f")[o]||[]).filter((i)=>!n[i])}),r.forEach((o)=>{t[o]=zt(b(this,ne,"f")[o],(i)=>!n[i])}),t.envPrefix=b(this,ne,"f").envPrefix,Z(this,ne,t,"f"),Z(this,ue,b(this,ue,"f")?b(this,ue,"f").reset(n):gu(this,b(this,ae,"f")),"f"),Z(this,Ee,b(this,Ee,"f")?b(this,Ee,"f").reset(n):xu(this,b(this,ue,"f"),b(this,ae,"f")),"f"),Z(this,Ce,b(this,Ce,"f")?b(this,Ce,"f").reset():fu(b(this,ue,"f"),b(this,Ee,"f"),b(this,at,"f"),b(this,ae,"f")),"f"),!b(this,ze,"f"))Z(this,ze,wu(this,b(this,ue,"f"),b(this,Ce,"f"),b(this,ae,"f")),"f");return b(this,at,"f").reset(),Z(this,Qe,null,"f"),Z(this,ve,"","f"),Z(this,Yt,null,"f"),Z(this,et,!1,"f"),this.parsed=!1,this}[Wu](e,t){return b(this,ae,"f").path.relative(e,t)}[Ds](e,t,n,s=0,r=!1){var o,i,l,u;let a=!!n||r;e=e||b(this,Xt,"f"),b(this,ne,"f").__=b(this,ae,"f").y18n.__,b(this,ne,"f").configuration=this[_n]();let c=!!b(this,ne,"f").configuration["populate--"],d=Object.assign({},b(this,ne,"f").configuration,{"populate--":!0}),f=b(this,ae,"f").Parser.detailed(e,Object.assign({},b(this,ne,"f"),{configuration:{"parse-positional-numbers":!1,...d}})),p=Object.assign(f.argv,b(this,wn,"f")),g=void 0,h=f.aliases,m=!1,y=!1;if(Object.keys(p).forEach((w)=>{if(w===b(this,ct,"f")&&p[w])m=!0;else if(w===b(this,Et,"f")&&p[w])y=!0}),p.$0=this.$0,this.parsed=f,s===0)b(this,ue,"f").clearCachedHelpMessage();try{if(this[bi](),t)return this[En](p,c,!!n,!1);if(b(this,ct,"f")){if([b(this,ct,"f")].concat(h[b(this,ct,"f")]||[]).filter((C)=>C.length>1).includes(""+p._[p._.length-1]))p._.pop(),m=!0}Z(this,br,!1,"f");let w=b(this,Ce,"f").getCommands(),x=((o=b(this,ze,"f"))===null||o===void 0?void 0:o.completionKey)?[(i=b(this,ze,"f"))===null||i===void 0?void 0:i.completionKey,...(u=this.getAliases()[(l=b(this,ze,"f"))===null||l===void 0?void 0:l.completionKey])!==null&&u!==void 0?u:[]].some((E)=>Object.prototype.hasOwnProperty.call(p,E)):!1,D=m||x||r;if(p._.length){if(w.length){let E;for(let C=s||0,S;p._[C]!==void 0;C++)if(S=String(p._[C]),w.includes(S)&&S!==b(this,Qe,"f")){let k=b(this,Ce,"f").runCommand(S,this,f,C+1,r,m||y||r);return this[En](k,c,!!n,!1)}else if(!E&&S!==b(this,Qe,"f")){E=S;break}if(!b(this,Ce,"f").hasDefaultCommand()&&b(this,kr,"f")&&E&&!D)b(this,Ee,"f").recommendCommands(E,w)}if(b(this,Qe,"f")&&p._.includes(b(this,Qe,"f"))&&!x){if(b(this,it,"f"))Gt(!0);this.showCompletionScript(),this.exit(0)}}if(b(this,Ce,"f").hasDefaultCommand()&&!D){let E=b(this,Ce,"f").runCommand(null,this,f,0,r,m||y||r);return this[En](E,c,!!n,!1)}if(x){if(b(this,it,"f"))Gt(!0);e=[].concat(e);let E=e.slice(e.indexOf(`--${b(this,ze,"f").completionKey}`)+1);return b(this,ze,"f").getCompletion(E,(C,S)=>{if(C)throw new $e(C.message);(S||[]).forEach((k)=>{b(this,bn,"f").log(k)}),this.exit(0)}),this[En](p,!c,!!n,!1)}if(!b(this,et,"f")){if(m){if(b(this,it,"f"))Gt(!0);a=!0,this.showHelp((E)=>{b(this,bn,"f").log(E),this.exit(0)})}else if(y){if(b(this,it,"f"))Gt(!0);a=!0,b(this,ue,"f").showVersion("log"),this.exit(0)}}if(!a&&b(this,ne,"f").skipValidation.length>0)a=Object.keys(p).some((E)=>b(this,ne,"f").skipValidation.indexOf(E)>=0&&p[E]===!0);if(!a){if(f.error)throw new $e(f.error.message);if(!x){let E=this[$i](h,{},f.error);if(!n)g=hn(p,this,b(this,at,"f").getMiddleware(),!0);if(g=this[Ru](E,g!==null&&g!==void 0?g:p),ke(g)&&!n)g=g.then(()=>hn(p,this,b(this,at,"f").getMiddleware(),!1))}}}catch(w){if(w instanceof $e)b(this,ue,"f").fail(w.message,w);else throw w}return this[En](g!==null&&g!==void 0?g:p,c,!!n,!0)}[$i](e,t,n,s){let r={...this.getDemandedOptions()};return(o)=>{if(n)throw new $e(n.message);b(this,Ee,"f").nonOptionCount(o),b(this,Ee,"f").requiredArguments(o,r);let i=!1;if(b(this,xn,"f"))i=b(this,Ee,"f").unknownCommands(o);if(b(this,kn,"f")&&!i)b(this,Ee,"f").unknownArguments(o,e,t,!!s);else if(b(this,Sn,"f"))b(this,Ee,"f").unknownArguments(o,e,{},!1,!1);b(this,Ee,"f").limitedChoices(o),b(this,Ee,"f").implications(o),b(this,Ee,"f").conflicting(o)}}[Uu](){Z(this,et,!0,"f")}[$n](e){if(typeof e==="string")b(this,ne,"f").key[e]=!0;else for(let t of e)b(this,ne,"f").key[t]=!0}}function pu(e){return!!e&&typeof e.getInternalMethods==="function"}var Ly=Ju(fi),qu=Ly;var zu=/<https?:\/\/[^\s<>|]+(?:\|[^<>\r\n]*)?>|https?:\/\/[^\t\n\v\f\r <\x00]+/gi,Gu=/[\t\n\v\f\r (*_~]/,Ny=/[.,:;!?]$/;function Yu(e){if(Ny.test(e))return e.slice(-1);if(e.endsWith(")")&&Hu(e,"(")<Hu(e,")"))return")";return}function Xu(e){let t=e.split(""),n=(r,o)=>{for(let i=r;i<o;i++)if(t[i]!==`
|
|
82
|
+
`)t[i]="\x00"},s=0;while(s<e.length){let o=s===0||e[s-1]===`
|
|
83
|
+
`?/^ {0,3}(?:(`{3,})[^`\n]*|(~{3,})[^\n]*)(?=\n|$)/.exec(e.slice(s)):null;if(o){let l=o[1]??o[2],u=new RegExp(`
|
|
84
84
|
{0,3}${l[0]==="`"?"`":"~"}{${l.length},}[ ]*\r?(?=
|
|
85
|
-
|$)`,"g");u.lastIndex=s+
|
|
86
|
-
`&&/^\n[ \t\r]*(?:\n|$)/.test(e.slice(u)))break;if(e[u]!=="`"){u++;continue}let
|
|
87
|
-
`,{mode:384}),process.platform!=="win32")
|
|
88
|
-
`);
|
|
89
|
-
`)}function
|
|
90
|
-
`)){let s=n.trim();if(!s||s.startsWith("#"))continue;let
|
|
91
|
-
`+" Migrate to SLACK_TOKEN=... or remove from your shell config.")}}let i
|
|
85
|
+
|$)`,"g");u.lastIndex=s+o[0].length;let a=u.exec(e),c=a?a.index+a[0].length:e.length;n(s,c),s=c;continue}let i=e[s];if(i==="\\"){s+=2;continue}if(i==="`"){let l=0;while(e[s+l]==="`")l++;let u=s+l,a=-1;while(u<e.length){if(e[u]===`
|
|
86
|
+
`&&/^\n[ \t\r]*(?:\n|$)/.test(e.slice(u)))break;if(e[u]!=="`"){u++;continue}let c=0;while(e[u+c]==="`")c++;if(c===l){a=u+c;break}u+=c}if(a<0){s+=l;continue}n(s,a),s=a;continue}if(i==="["){let l=/^\[(?:\\.|[^\]\\\n])*\]\([^()\s]*\)/.exec(e.slice(s));if(l){n(s,s+l[0].length),s+=l[0].length;continue}}s++}return t.join("")}function My(e,{markdown:t=!0}={}){let n=t?Xu(e):e,s=[];for(let r of n.matchAll(zu)){let o=r[0];if(o.startsWith("<"))continue;let i=r.index??0,l=i>0?n[i-1]:"";if(l&&!Gu.test(l))s.push({url:o,side:"before",char:e[i-1]});let u=o.match(/[^\x00-\x7f]|>/);if(u)s.push({url:o,side:"after",char:u[0]});else{let a=Yu(o);if(a&&!(a===")"&&l==="("))s.push({url:o,side:"trailing",char:a})}}return s}function Ke(e,t=!1,n=console.error,{sides:s=["before","after","trailing"],markdown:r=!0}={}){let o=My(e,{markdown:r}),i=o.filter((d)=>d.side==="trailing"&&s.includes("trailing"));if(i.length)n(`⚠ URL ends in punctuation Slack may take into the link: ${i.map((d)=>`${JSON.stringify(d.url)} → ${JSON.stringify(ks(`x ${d.url}`).slice(2))}`).join(", ")}. If the ${JSON.stringify(i[0].char)} is not part of the URL, send the suggested form (or --fix-urls).`);let l=o.filter((d)=>d.side!=="trailing"&&s.includes(d.side));if(!l.length)return;let u=l.map((d)=>d.side==="before"?`${JSON.stringify(d.url)} (glued to ${JSON.stringify(d.char)} before it — Slack will NOT make it a link)`:`${JSON.stringify(d.url)} (runs into ${JSON.stringify(d.char)} after it; non-ASCII in a URL is OK only if intended, otherwise send ${JSON.stringify(ks(`x ${d.url}`).slice(2))} or put an ASCII space after the URL)`),a=l.some((d)=>d.side==="before")?"Put an ASCII space (or a newline) before the URL, ":"",c=`Ambiguous URL boundary: ${u.join(", ")}. ${a}Put the URL on its own line, or wrap it as <url> / <url|label>. Use --fix-urls to wrap them, or --allow-url-adjacent to warn only.`;if(!t)throw Error(c);n(`⚠ Warning: ${c}`)}function ks(e){let t=Xu(e),n="",s=0;for(let r of t.matchAll(zu)){let o=r.index??0;if(r[0].startsWith("<"))continue;let i=e.slice(o,o+r[0].length),l=i.search(/[^\x00-\x7f]|>/);if(l>=0)i=i.slice(0,l);while(Yu(i))i=i.slice(0,-1);let u=o>0?t[o-1]:"";if(!(i.length<r[0].length||u&&!Gu.test(u))||!/^https?:\/\/./i.test(i))continue;n+=e.slice(s,o)+`<${i}>`,s=o+i.length}return n+e.slice(s)}function Hu(e,t){return e.split(t).length-1}import{existsSync as Ss,readFileSync as Fi,writeFileSync as Ci,mkdirSync as ed,chmodSync as Vu}from"node:fs";import{homedir as By}from"node:os";import{join as Cn,dirname as Ti}from"node:path";function Oi(){return process.env.HOME||By()}function td(){return Cn(Oi(),".config","slack-cli","profiles.json")}function _r(){return Cn(process.cwd(),".slack-cli","workspace")}function Er(){return Cn(Oi(),".slack-cli","workspace")}function _s(){let e=td();if(!Ss(e))return{profiles:{}};return JSON.parse(Fi(e,"utf8"))}function jy(e){let t=td();if(ed(Ti(t),{recursive:!0}),process.platform!=="win32"&&Ss(t))Vu(t,384);if(Ci(t,JSON.stringify(e,null,2)+`
|
|
87
|
+
`,{mode:384}),process.platform!=="win32")Vu(t,384)}function Hn(e){if(!Ss(e))return;return Fi(e,"utf8").trim()||void 0}function Zu(e,t){let n=Ti(e);ed(n,{recursive:!0});let s=Cn(n,".gitignore");if(!Ss(s))Ci(s,`*
|
|
88
|
+
`);Ci(e,t+`
|
|
89
|
+
`)}function Wy(e){let t={};for(let n of e.split(`
|
|
90
|
+
`)){let s=n.trim();if(!s||s.startsWith("#"))continue;let r=s.indexOf("=");if(r===-1)continue;let o=s.slice(0,r).trim(),i=s.slice(r+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);t[o]=i}return t}function Qu(e){if(!Ss(e))return{};try{return Wy(Fi(e,"utf8"))}catch{return{}}}function Ai(e,t){let n=Oi(),s=e;while(!0){for(let i of[Cn(s,".slack-term",".env.local"),Cn(s,".env.local")]){let l=Qu(i);for(let u of t)if(l[u])return l[u]}if(s===n)break;let o=Ti(s);if(o===s)break;s=o}let r=Qu(Cn(n,".slack-term",".env.local"));for(let o of t)if(r[o])return r[o];return}function Ri(){let e=_s(),t=Hn(_r()),n=Hn(Er()),s=t??n;return Object.entries(e.profiles).map(([r,o])=>{let i=xs(e,r);return{name:r,profile:{...o,...i?{cookie:i}:{}},current:r===s}})}function xs(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 nd(e){let t=_s();if(!(e in t.profiles))throw Error(`Profile not found: ${e}`);delete t.profiles[e],jy(t)}function sd(e,t=!1){let n=_s();if(!(e in n.profiles))throw Error(`Profile not found: ${e}`);if(t)Zu(Er(),e);else Zu(_r(),e)}function Es(e){let n=_s().profiles,s=Object.keys(n);if(e){let c=n[e];if(!c)throw Error(`Workspace "${e}" not found. Available: ${s.join(", ")||"(none)"}`);return c.token}if(process.env.SLACK_TOKEN)return process.env.SLACK_TOKEN;let r=process.env.SLACK_BOT_TOKEN??process.env.SLACK_MCP_XOXP_TOKEN;if(r&&s.length===0)return r;let o=[process.env.SLACK_BOT_TOKEN,process.env.SLACK_MCP_XOXP_TOKEN].find((c)=>c&&!c.startsWith("xoxb-"));if(o&&s.length>0){let c=Ai(process.cwd(),["SLACK_BOT_TOKEN","SLACK_MCP_XOXP_TOKEN"]);if(o!==c){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=Ai(process.cwd(),["SLACK_TOKEN"]);if(i)return i;let l=process.env.SLACK_WORKSPACE;if(l){let c=n[l];if(!c)throw Error(`Workspace "${l}" not found. Available: ${s.join(", ")||"(none)"}`);return c.token}let u=Hn(_r());if(u){let c=n[u];if(!c)throw Error(`Workspace "${u}" (from .slack-cli/workspace) not found in profiles.`);return c.token}let a=Hn(Er());if(a){let c=n[a];if(!c)throw Error(`Workspace "${a}" (from ~/.slack-cli/workspace) not found in profiles.`);return c.token}if(s.length>0)throw Error(`Workspace not selected (${s.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 @@ ${g.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 Le(){let e=process.env.SLACK_BOT_TOKEN;return e&&e.startsWith("xoxb-")?e:void 0}function
|
|
101
|
-
`,{mode:384}),process.platform!=="win32")
|
|
102
|
-
`)){let s=n.trim();if(!s||s.startsWith("#"))continue;let
|
|
103
|
-
`):[];for(let[o
|
|
100
|
+
`+" Or set SLACK_TOKEN=xoxp-... in .slack-term/.env.local")}function Le(){let e=process.env.SLACK_BOT_TOKEN;return e&&e.startsWith("xoxb-")?e:void 0}function Ii(e){let t=_s(),n=t.profiles;if(e)return xs(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 r=Ai(process.cwd(),["SLACK_COOKIE"]);if(r)return r;let o=process.env.SLACK_WORKSPACE;if(o)return xs(t,o);let i=Hn(_r());if(i)return xs(t,i);let l=Hn(Er());if(l)return xs(t,l);return}import{existsSync as Gn,readFileSync as Cr,writeFileSync as od,mkdirSync as id,chmodSync as $r}from"node:fs";import{homedir as Uy}from"node:os";import{join as zn,dirname as Pi}from"node:path";function Li(){return process.env.HOME||Uy()}function ad(){return zn(Li(),".config","slack-cli","profiles.json")}function Ni(){return zn(process.cwd(),".slack-cli","workspace")}function Mi(){return zn(Li(),".slack-cli","workspace")}function Xn(){let e=ad();if(!Gn(e))return{profiles:{}};return JSON.parse(Cr(e,"utf8"))}function Bi(e){let t=ad();if(id(Pi(t),{recursive:!0}),process.platform!=="win32"&&Gn(t))$r(t,384);if(od(t,JSON.stringify(e,null,2)+`
|
|
101
|
+
`,{mode:384}),process.platform!=="win32")$r(t,384)}function Yn(e){if(!Gn(e))return;return Cr(e,"utf8").trim()||void 0}function Jy(e){let t={};for(let n of e.split(`
|
|
102
|
+
`)){let s=n.trim();if(!s||s.startsWith("#"))continue;let r=s.indexOf("=");if(r===-1)continue;let o=s.slice(0,r).trim(),i=s.slice(r+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);t[o]=i}return t}function rd(e){if(!Gn(e))return{};try{return Jy(Cr(e,"utf8"))}catch{return{}}}function vi(e,t){let n=Li(),s=e;while(!0){for(let i of[zn(s,".slack-term",".env.local"),zn(s,".env.local")]){let l=rd(i);for(let u of t)if(l[u])return l[u]}if(s===n)break;let o=Pi(s);if(o===s)break;s=o}let r=rd(zn(n,".slack-term",".env.local"));for(let o of t)if(r[o])return r[o];return}function ji(e,t){id(Pi(e),{recursive:!0});let n=Gn(e)?Cr(e,"utf8"):"",s=n?n.split(`
|
|
103
|
+
`):[];for(let[r,o]of Object.entries(t)){let i=s.findIndex((u)=>{let a=u.trim();return a.startsWith(r+"=")||a.startsWith(r+" =")}),l=`${r}=${o}`;if(i!==-1)s[i]=l;else s.push(l)}if(process.platform!=="win32"&&Gn(e))$r(e,384);if(od(e,s.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")$r(e,384)}function Cs(){let e=Xn(),t=Yn(Ni()),n=Yn(Mi()),s=t??n;return Object.entries(e.profiles).map(([r,o])=>{let i=$s(e,r);return{name:r,profile:{...o,...i?{cookie:i}:{}},current:r===s}})}function Ar(e,t){let n=Xn();if(t.identity&&t.cookie){n.users??={};let s=n.users[t.identity]??{};n.users[t.identity]={...s,cookie:t.cookie};let{cookie:r,...o}=t;n.profiles[e]=o}else n.profiles[e]=t;Bi(n)}function Wi(e,t){let n=Xn(),s=n.profiles[e];if(!s)throw Error(`Profile not found: ${e}`);if(s.identity)n.users??={},n.users[s.identity]={...n.users[s.identity]??{},cookie:t};else s.cookie=t;Bi(n)}function cd(e,t,n){let s=Xn();s.users??={},s.users[e]={...s.users[e]??{},cookie:t,...n?{source:n}:{}},Bi(s)}function $s(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 ld(e){let n=Xn().profiles,s=Object.keys(n);if(e){let c=n[e];if(!c)throw Error(`Workspace "${e}" not found. Available: ${s.join(", ")||"(none)"}`);return c.token}if(process.env.SLACK_TOKEN)return process.env.SLACK_TOKEN;let r=process.env.SLACK_BOT_TOKEN??process.env.SLACK_MCP_XOXP_TOKEN;if(r&&s.length===0)return r;let o=[process.env.SLACK_BOT_TOKEN,process.env.SLACK_MCP_XOXP_TOKEN].find((c)=>c&&!c.startsWith("xoxb-"));if(o&&s.length>0){let c=vi(process.cwd(),["SLACK_BOT_TOKEN","SLACK_MCP_XOXP_TOKEN"]);if(o!==c){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=vi(process.cwd(),["SLACK_TOKEN"]);if(i)return i;let l=process.env.SLACK_WORKSPACE;if(l){let c=n[l];if(!c)throw Error(`Workspace "${l}" not found. Available: ${s.join(", ")||"(none)"}`);return c.token}let u=Yn(Ni());if(u){let c=n[u];if(!c)throw Error(`Workspace "${u}" (from .slack-cli/workspace) not found in profiles.`);return c.token}let a=Yn(Mi());if(a){let c=n[a];if(!c)throw Error(`Workspace "${a}" (from ~/.slack-cli/workspace) not found in profiles.`);return c.token}if(s.length>0)throw Error(`Workspace not selected (${s.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,34 +112,34 @@ ${g.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
|
|
116
|
-
`)t.push(null);else if(!/\s/u.test(i))t.push(...
|
|
117
|
-
`)||!Array.isArray(t)||!t.some((g)=>g?.type==="rich_text"))return e;let n=
|
|
118
|
-
`;w=!0}y="",m=x}else y+=s[m],m++}return s.join("")}function
|
|
115
|
+
`+" Or set SLACK_TOKEN=xoxp-... in .slack-term/.env.local")}function Fr(){let e=process.env.SLACK_BOT_TOKEN;return e&&e.startsWith("xoxb-")?e:void 0}function Zt(e){let t=Xn(),n=t.profiles;if(e)return $s(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 r=vi(process.cwd(),["SLACK_COOKIE"]);if(r)return r;let o=process.env.SLACK_WORKSPACE;if(o)return $s(t,o);let i=Yn(Ni());if(i)return $s(t,i);let l=Yn(Mi());if(l)return $s(t,l);return}function Tr(e){let t=[],n=(o)=>{if(!o)return;let i=t[t.length-1];if(i?.type==="text")i.text+=o;else t.push({type:"text",text:o})},s=/<(https?:\/\/[^\s<>|]+)(?:\|([^<>\r\n]*))?>|https?:\/\/[\x21-\x3b\x3d\x3f-\x7e]+/gi,r=0;for(let o of e.matchAll(s)){let i=o.index??0;if(n(e.slice(r,i)),o[1]){t.push(o[2]?{type:"link",url:o[1],text:o[2]}:{type:"link",url:o[1]}),r=i+o[0].length;continue}let l=o[0];while(/[.,:;!?'"*_~]$/.test(l)||l.endsWith(")")&&ud(l,"(")<ud(l,")"))l=l.slice(0,-1);t.push({type:"link",url:l}),r=i+l.length}return n(e.slice(r)),t}function ud(e,t){return e.split(t).length-1}var Ky={"&":"&","<":"<",">":">"};function qy(e){if(typeof e!=="string"||!/^[0-9a-f]+(-[0-9a-f]+)*$/i.test(e))return[];let t=e.split("-").map((r)=>parseInt(r,16)),n=String.fromCodePoint(...t),s=String.fromCodePoint(...t.filter((r)=>r!==65039));return n===s?[n]:[n,s]}function Hy(e){let t=[],n=(o)=>{for(let i of o)if(i===`
|
|
116
|
+
`)t.push(null);else if(!/\s/u.test(i))t.push(...Ky[i]??i)},s=(o)=>{switch(o.type){case"text":n(String(o.text??""));break;case"link":case"message_mention":n(String(o.url??""));break;case"user":n(String(o.user_id??""));break;case"channel":n(String(o.channel_id??""));break;case"usergroup":n(String(o.usergroup_id??""));break;case"broadcast":n(String(o.range??""));break;case"emoji":t.push([`:${String(o.name??"")}:`,...qy(o.unicode)].filter((i)=>i!=="::"));break;default:break}},r=(o)=>{let i=Array.isArray(o.elements)?o.elements:[];if(o.type==="rich_text_list"||o.type==="rich_text")i.forEach((l,u)=>{if(u>0)t.push(null);r(l)});else i.forEach(s)};return e.forEach((o,i)=>{if(i>0)t.push(null);let l=o;if(l.type==="rich_text")r(l)}),t}function zy(e,t,n){if(typeof t==="string"){let r=n;while(r<e.length&&e[r]!==t)r++;return r<e.length?[r,1]:[-1,0]}let s=[-1,0];for(let r of t){let o=[...r];for(let i=n;i+o.length<=e.length&&(s[0]<0||i<s[0]);i++)if(o.every((l,u)=>e[i+u]===l)){s=[i,o.length];break}}return s}function Gy(e,t){if(e.includes(`
|
|
117
|
+
`)||!Array.isArray(t)||!t.some((g)=>g?.type==="rich_text"))return e;let n=Hy(t);if(!n.includes(null))return e;let s=[...e],r=t[0].elements,i=t[t.length-1].elements,l=Array.isArray(r)&&r[0]?.type==="rich_text_preformatted",u=Array.isArray(i)&&i[i.length-1]?.type==="rich_text_preformatted",a=0,c=-1,d=l,f=[];for(let g of n){if(g===null){d=!0;continue}let[h,m]=zy(s,g,a);if(h<0)return e;if(d)f.push([c+1,h]),d=!1;c=h+m-1,a=h+m}if((d||u)&&c>=0)f.push([c+1,s.length]);let p=/^(?:[-*+•]|\d{1,9}[.)]|>|>)$/;for(let[g,h]of f){let m=g;if(s.lastIndexOf("<",g-1)>s.lastIndexOf(">",g-1)){let x=s.indexOf(">",g);if(x!==-1&&x<h)m=x+1}let y="",w=g===0;while(m<h)if(s[m]===" "){let x=m;while(x<h&&s[x]===" ")x++;if(w&&p.test(y))w=!1;else{let D=x-m<=2?x-m:1;for(let E=m;E<m+D;E++)s[E]=`
|
|
118
|
+
`;w=!0}y="",m=x}else y+=s[m],m++}return s.join("")}function Or(e){if(!e||typeof e!=="object"||Array.isArray(e))return;let t=e;if(typeof t.text==="string")t.text=Gy(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 Ji(){return(process.env.SLACK_API_BASE??"https://slack.com/api").replace(/\/$/,"")}var Yy=(()=>{let e=Number(process.env.SLACK_RATELIMIT_WAIT_SEC);return Number.isFinite(e)&&e>=0?e:120})();async function hd(e,t=(n)=>new Promise((s)=>setTimeout(s,n))){let n=0;for(;;)try{return await e()}catch(s){if(!(s instanceof qe)||n+s.retryAfter>Yy)throw s;n+=s.retryAfter,console.error(`slack: ${s.message} — waiting`),await t(s.retryAfter*1000)}}function Ki(e,t,n,s){return hd(()=>Xy(e,t,n,s))}async function Xy(e,t,n,s){s=e.startsWith("xoxc-")?s??Zt():void 0;let r={};if(s)r.Cookie=`d=${s}`;let o=await fetch(`${Ji()}/${t}`,{...n,headers:{...n.headers??{},Authorization:`Bearer ${e}`,...r}});if(o.status===429){let l=parseInt(o.headers.get("retry-after")??"60",10);throw new qe(isNaN(l)?60:l,t)}let i=await o.json();if(i.ok!==!0){let l=i.error??"unknown";if(l==="ratelimited")throw new qe(60,t);if(l==="invalid_auth"&&e.startsWith("xoxc-")&&!s)throw Error(`Desktop app token (xoxc-) needs its session cookie to be accepted by the public Slack API.
|
|
119
119
|
Attach it: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)
|
|
120
120
|
Or replace the token with an xoxp- user token:
|
|
121
121
|
slack auth login`);if((l==="missing_scope"||l==="cannot_dm_bot")&&e.startsWith("xoxb-")){if(t.startsWith("agents.sessions."))throw Error(`Slack error on ${t}: ${l}. Agent sessions need a granular bot token with chat:write and app membership in the channel.`);throw Error(`Slack error on ${t}: ${l} — ${l==="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"}.
|
|
122
122
|
Tailing/DMing people and listing users need a user session, not a bot token.
|
|
123
123
|
Switch workspace: slack auth ls then slack auth use <name>
|
|
124
|
-
Or import your Slack desktop session: slack auth login`)}throw Error(`Slack error on ${t}: ${l}`)}return i}function
|
|
124
|
+
Or import your Slack desktop session: slack auth login`)}throw Error(`Slack error on ${t}: ${l}`)}return i}function Vy(e,t,n,s){return hd(()=>Zy(e,t,n,s))}async function Zy(e,t,n,s){let r={};if(s)r.Cookie=`d=${s}`;let o=await fetch(`${Ji()}/${t}`,{...n,headers:{...n.headers??{},Authorization:`Bearer ${e}`,...r}});if(o.status===429){let l=parseInt(o.headers.get("retry-after")??"60",10);throw new qe(isNaN(l)?60:l,t)}let i=await o.json();if(i.ok!==!0){let l=i.error??"unknown";if(l==="ratelimited")throw new qe(60,t);if((l==="invalid_auth"||l==="not_authed")&&!e.startsWith("xoxc-"))throw Error(`${t} requires a desktop app session token (xoxc-).
|
|
125
125
|
Import from Slack desktop: slack auth login`);if((l==="invalid_auth"||l==="not_authed")&&!s)throw Error(`${t} also requires the xoxd session cookie.
|
|
126
|
-
Attach it with: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)`);throw Error(`Slack error on ${t}: ${l}`)}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}: ${l}`)}return i}function Qy(e,t,n={},s){let r=new URLSearchParams({token:e,...n});return Vy(e,t,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()},s)}function Fe(e,t,n,s){let r=new URLSearchParams(n).toString();return Ki(e,`${t}?${r}`,{method:"GET"},s)}function qi(e,t,n,s){return Ki(e,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},s)}async function gd(e,t,n){if(!e.startsWith("xoxb-"))throw Error("Agent sessions require a bot token (xoxb); user tokens are refused.");return Ki(e,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),signal:AbortSignal.timeout(1e4)})}function Fs(e,t,n){return gd(e,"agents.sessions.setStatus",{...t,status:n})}function Hi(e,t,n){return gd(e,"agents.sessions.rename",{...t,title:n})}async function Vn(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 md(e,t){t=e.startsWith("xoxc-")?t??Zt():void 0;let n={Authorization:`Bearer ${e}`};if(t)n.Cookie=`d=${t}`;let s=await fetch(`${Ji()}/auth.test`,{method:"GET",headers:n});if(s.status===429){let i=parseInt(s.headers.get("retry-after")??"60",10);throw new qe(isNaN(i)?60:i,"auth.test")}let r=s.headers.get("x-oauth-scopes")??"",o=await s.json();if(o.ok!==!0)throw Error(`Slack error on auth.test: ${o.error??"unknown"}`);return{userId:o.user_id??"",user:o.user??"",botId:o.bot_id??"",team:o.team??"",url:o.url??"",scopes:r.split(",").map((i)=>i.trim()).filter(Boolean)}}async function yd(e,t,n){let s=await Fe(e,"bots.info",{bot:t},n);return{appId:s.bot?.app_id??"",userId:s.bot?.user_id??""}}async function An(e,t,n=20,s,r,o,i){let l={channel:t,limit:String(n)};if(s!==void 0)l.oldest=s;if(r!==void 0)l.cursor=r;if(i)l.inclusive="true";return zi(await Fe(e,"conversations.history",l,o))}function zi(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 s of n)Or(s);return e}async function bd(e,t,n,s=50,r){return zi(await Fe(e,"conversations.replies",{channel:t,ts:n,limit:String(s)},r))}async function wd(e,t,n,s={},r){let o={channel:t,ts:n,limit:String(s.limit??200)};if(s.oldest!==void 0)o.oldest=s.oldest;if(s.cursor!==void 0)o.cursor=s.cursor;return zi(await Fe(e,"conversations.replies",o,r))}async function Gi(e,t,n){let s=[],r="";do{let o={limit:"200",types:t,exclude_archived:"true"};if(r)o.cursor=r;let i=await Fe(e,"users.conversations",o,n);s.push(...i.channels??[]),r=i.response_metadata?.next_cursor??""}while(r);return s}async function Rr(e,t,n,s,r){await qi(e,"reactions.add",{channel:t,timestamp:n,name:s},r)}async function Dd(e,t,n,s){return((await Fe(e,"reactions.get",{channel:t,timestamp:n,full:"true"},s)).message?.reactions??[]).map((o)=>({name:String(o.name??""),users:Array.isArray(o.users)?o.users.map(String):[]}))}async function Ir(e,t,n,s,r){await qi(e,"reactions.remove",{channel:t,timestamp:n,name:s},r)}async function eb(e,t,n){let r=(await qi(e,"conversations.open",{users:t},n)).channel?.id;if(!r)throw Error(`Failed to open DM with user ${t}`);return r}async function kd(e,t,n){let s="";while(!0){let r={types:"im",limit:"200"};if(s)r.cursor=s;let o=await Fe(e,"conversations.list",r,n);for(let i of o.channels??[])if(i.user===t)return String(i.id??"");if(s=o.response_metadata?.next_cursor??"",!s)break}return""}async function Ui(e,t,n,s){let r=await kd(e,t,n);if(r)return r;let o=s?`${s} (${t})`:t;throw Error(`No existing DM with ${o}. Open it once in Slack first.`)}function As(e){return e.toLowerCase().replace(/[-_\s]/g,"")}function dd(e,t){let n=As(e.name??""),s=As(e.real_name??e.profile?.real_name??""),r=As(e.profile?.display_name??"");return n===t||s===t||!!r&&r===t}var xd=200;async function tb(e,t,n){let s=0,r=new Set,o="";while(!0){let c={limit:"200"};if(o)c.cursor=o;let d=await Fe(e,"users.list",c,n);for(let f of d.members??[]){if(s++,f.id)r.add(f.id);if(dd(f,t))return{id:f.id??"",workspaceCount:s,connectCount:0,skipped:0,capped:!1}}if(o=d.response_metadata?.next_cursor??"",!o)break}let i=0,l=0,u=!1,a="";while(!0){let c={types:"im",limit:"200"};if(a)c.cursor=a;let d=await Fe(e,"conversations.list",c,n);for(let f of d.channels??[]){let p=f.user;if(!p||r.has(p))continue;if(i>=xd){u=!0;break}r.add(p),i++;let g;try{g=(await Fe(e,"users.info",{user:p},n)).user}catch(h){if(h instanceof qe)throw h;l++;continue}if(g&&dd(g,t))return{id:p,dm:String(f.id??""),workspaceCount:s,connectCount:i,skipped:l,capped:u}}if(u)break;if(a=d.response_metadata?.next_cursor??"",!a)break}return{id:"",workspaceCount:s,connectCount:i,skipped:l,capped:u}}function nb(e,t){if(t.workspaceCount===0)return Error(`Cannot resolve ${e}: users.list returned no members at all, so nothing could have matched.
|
|
127
127
|
`+`That is a token or scope fault, not a wrong handle — this says nothing about whether ${e} exists.
|
|
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)`,s=[];if(t.capped)s.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)`,s=[];if(t.capped)s.push(`stopped after ${xd} Slack Connect DM partners, so there may be more`);if(t.skipped)s.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.
|
|
129
129
|
`+(s.length?`This search was incomplete: ${s.join("; ")}.
|
|
130
130
|
`:"")+`Slack Connect people from another workspace are not in users.list, so if they never
|
|
131
131
|
DMed you they cannot be found by name at all. Look them up and use their ID:
|
|
132
|
-
slack user ls --external`)}function
|
|
133
|
-
${
|
|
132
|
+
slack user ls --external`)}function Yi(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],s=t[2]&&t[3]?`${t[2]}.${t[3]}`:void 0,r=e.indexOf("?"),o=r>=0?new URLSearchParams(e.slice(r)):void 0,i=o?.get("thread_ts")??void 0,a={channel:o?.get("cid")??void 0??n};if(s)a.ts=s;if(i)a.threadTs=i;return a}function sb(e){return Yi(e)?.channel}function fd(e){return/^[CDG][A-Z0-9]{8,}$/.test(e)}function pd(e){return/^[UW][A-Z0-9]{6,}$/.test(e)}async function vr(e,t,n){let s=sb(t);if(s)return s;if(!t.startsWith("@")&&!t.startsWith("#")){if(fd(t))return t;if(pd(t))return Ui(e,t,n);throw Error(`Target must start with # or @ (or be a Slack URL/ID), got: ${t}`)}if(t.startsWith("#")&&fd(t.slice(1)))return t.slice(1);let r=t.startsWith("@"),o=t.slice(1),i=As(o);if(r){if(pd(o))return Ui(e,o,n);let a=await Fe(e,"auth.test",{},n);if(i==="you"||i==="me"||As(a.user??"")===i){let f=a.user_id;if(!f)throw Error("auth.test did not return user_id");return await kd(e,f,n)||eb(e,f,n)}let d=await tb(e,i,n);if(!d.id)throw nb(t,d);if(d.dm)return d.dm;return Ui(e,d.id,n,t)}let l=o.toLowerCase(),u="";while(!0){let a={limit:"200",types:"public_channel,private_channel",exclude_archived:"true"};if(u)a.cursor=u;let c=await Fe(e,"conversations.list",a,n);for(let d of c.channels??[])if(String(d.name??"").toLowerCase()===l)return String(d.id??"");if(u=c.response_metadata?.next_cursor??"",!u)break}throw Error(`channel not found: ${t}`)}async function Pr(e,t,n){try{let s=await Fe(e,"users.info",{user:t},n),r=s.user?.profile?.display_name,o=r&&r.length>0?r:s.user?.real_name??s.user?.name??t,i=s.user?.name??t;return[o,i]}catch{return[t,t]}}async function Zn(e,t,n){try{let s=await Fe(e,"users.info",{user:t},n),r=s.user?.profile?.display_name;if(r&&r.length>0)return r;return s.user?.real_name??s.user?.name??t}catch{return t}}async function Lr(e,t){let n=[],s="";while(!0){let r={limit:"200"};if(s)r.cursor=s;let o=await Fe(e,"users.list",r,t);if(n.push(...o.members??[]),s=o.response_metadata?.next_cursor??"",!s)break}return{members:n}}async function Xi(e,t,n){let s=[],r="";while(!0){let o={channel:t,limit:"200"};if(r)o.cursor=r;let i=await Fe(e,"conversations.members",o,n);if(s.push(...i.members??[]),r=i.response_metadata?.next_cursor??"",!r)break}return s}async function Vi(e,t,n){return Fe(e,"users.info",{user:t},n)}async function Nr(e,t,n){return Fe(e,"conversations.info",{channel:t},n)}async function Sd(e,t){let n=await Qy(e,"client.boot",{},t),s=typeof n.url==="string"?n.url:void 0;if(!s){let o=Object.keys(n).join(", ");throw Error(`client.boot did not return a WebSocket URL. Keys: ${o}`)}let r=n.self&&typeof n.self==="object"&&!Array.isArray(n.self)?n.self:{};return{wsUrl:s,selfId:typeof r.id==="string"?r.id:""}}var rb=["chat:write","im:write"],ob=["im:history","im:read"];async function Mr(e){let{userId:t,botId:n,team:s,scopes:r}=await md(e),o="";if(n)try{o=(await yd(e,n)).appId}catch{o=""}let i=(a)=>r.includes(a),l=rb.filter((a)=>!i(a)),u=ob.filter((a)=>!i(a));return{canSend:l.length===0,canReceiveReplies:u.length===0,ok:l.length===0&&u.length===0,botUserId:t,appId:o,team:s,grantedScopes:r,missingSendScopes:l,missingReplyScopes:u}}function _d(e){return["",` Bot user: ${e.botUserId||"(unknown)"}`,` App ID: ${e.appId||"(unknown — bots.info unavailable)"}`,` Granted scopes: ${e.grantedScopes.join(", ")||"(none reported)"}`]}function Br(e,t=!1){let n=e.appId?`https://api.slack.com/apps/${e.appId}`:"https://api.slack.com/apps";if(e.ok){let r=["✓ 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?r:[...r,..._d(e)]}let s=[];if(!e.canSend)s.push(`⚠ This bot CANNOT send DMs — missing scope(s): ${e.missingSendScopes.join(", ")}.`);else s.push("⚠ This bot can send DMs, but the user's replies will NOT be readable.");return s.push(" Make escalation DMs two-way:"),s.push(` 1. ${n} → App Home → enable "Messages Tab" and check`),s.push(' "Allow users to send Slash commands and messages".'),s.push(` 2. OAuth & Permissions → add Bot Token Scopes: ${[...e.missingSendScopes,...e.missingReplyScopes].join(", ")}`),s.push(" 3. Reinstall the app to apply the new scopes."),t?s:[...s,..._d(e)]}import{createInterface as Ge}from"node:readline/promises";import{join as aa,resolve as Ob}from"node:path";import{homedir as Rb}from"node:os";import{readdirSync as Rs,readFileSync as Os,existsSync as nt,copyFileSync as ea,mkdtempSync as Ad,rmSync as Fd}from"node:fs";import{homedir as Wr,tmpdir as Td}from"node:os";import{join as me,dirname as cb}from"node:path";import{pbkdf2Sync as jr,createDecipheriv as Od,createHash as lb,timingSafeEqual as ub}from"node:crypto";import{execSync as Rd,execFileSync as db}from"node:child_process";function Ts(e,t){let n=0,s=0,r=t;while(r<e.length){let o=e[r++];if(n+=(o&127)*2**s,(o&128)===0)break;s+=7}return{value:n,pos:r}}function ib(e){let t=0,n=0,s=0;while(t<e.length){let i=e[t++];if(n+=(i&127)*2**s,(i&128)===0)break;s+=7}let r=Buffer.allocUnsafe(n),o=0;while(t<e.length&&o<n){let i=e[t++],l=i&3;if(l===0){let u=i>>2;if(u>=60){let a=u-59;u=0;for(let c=0;c<a;c++)u+=e[t++]*2**(8*c)}u+=1,e.copy(r,o,t,t+u),t+=u,o+=u}else{let u,a;if(l===1)u=4+(i>>2&7),a=(i>>5&7)*256+e[t++];else if(l===2)u=1+(i>>2),a=e[t]+e[t+1]*256,t+=2;else u=1+(i>>2),a=e[t]+e[t+1]*256+e[t+2]*65536+e[t+3]*16777216,t+=4;let c=o-a;for(let d=0;d<u&&o<n;d++)r[o++]=r[c++]}}return o===n?r:r.subarray(0,o)}function Zi(e,t){let n=Ts(e,t),s=Ts(e,n.pos);return{handle:{offset:n.value,size:s.value},pos:s.pos}}function Ed(e,t){let{offset:n,size:s}=t,r=e.subarray(n,n+s);return e[n+s]===1?ib(r):Buffer.from(r)}function ab(e){if(e.length<4)return[];let t=e.readUInt32LE(e.length-4),n=e.length-(t+1)*4,s=[],r=0,o=Buffer.alloc(0);while(r<n){let i=Ts(e,r),l=Ts(e,i.pos),u=Ts(e,l.pos);r=u.pos;let a=i.value,c=l.value,d=u.value,f=e.subarray(r,r+c);r+=c;let p=e.subarray(r,r+d);r+=d,o=Buffer.concat([o.subarray(0,a),f]),s.push(p)}return s}function $d(e){if(e.length<48)return Buffer.alloc(0);try{let t=e.length-48,n=Zi(e,t),s=Zi(e,n.pos),r=Ed(e,s.handle),o=[];for(let i of ab(r))try{let{handle:l}=Zi(i,0);o.push(Ed(e,l))}catch{}return Buffer.concat(o)}catch{return Buffer.alloc(0)}}function Cd(){let e=process.env.HOME??Wr();if(process.platform==="darwin")return[me(e,"Library","Application Support","Slack","Local Storage","leveldb")];if(process.platform==="linux")return[me(e,".config","Slack","Local Storage","leveldb"),me(e,"snap","slack","current",".config","Slack","Local Storage","leveldb"),me(e,".var","app","com.slack.Slack","config","Slack","Local Storage","leveldb")];if(process.platform==="win32"){let t=process.env.APPDATA??me(e,"AppData","Roaming");return[me(t,"Slack","Local Storage","leveldb")]}throw Error(`Unsupported platform: ${process.platform}`)}function fb(){let e=process.env.HOME??Wr();if(process.platform==="darwin")return me(e,"Library","Application Support","Slack","Cookies");return""}function pb(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),s=e.slice(35),r=Od("aes-128-cbc",t,n);return r.setAutoPadding(!0),Buffer.concat([r.update(s),r.final()]).toString("utf8")}function hb(){if(process.platform!=="darwin")return;let e=fb();if(!nt(e))return;let t;try{t=Rd('security find-generic-password -w -s "Slack Safe Storage" -a "Slack Key"',{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trimEnd()}catch{return}let n=jr(t,"saltysalt",1003,16,"sha1");try{let{default:s}=gs("bun:sqlite"),r=new s(e,{readonly:!0}),o=r.prepare("SELECT encrypted_value FROM cookies WHERE name='d' AND host_key LIKE '%slack%'").get();if(r.close(),!o)return;return pb(Buffer.from(o.encrypted_value),n)}catch{return}}function Id(e){if(!nt(e))return[];let t=Rs(e).filter((i)=>i.endsWith(".ldb")||i.endsWith(".log"));if(t.length===0)return[];let n=new Map,s=(i)=>{let l=n.get(i);if(l!==void 0)return l;let u="";try{let a=Os(me(e,i));u=i.endsWith(".ldb")?$d(a).toString("latin1")||a.toString("latin1"):a.toString("latin1")}catch{u=""}return n.set(i,u),u},r=new Map;for(let i of t){let l=s(i);for(let u of l.matchAll(/"token":"(xoxc-[^"]+)"/g)){let a=u[1],c=a.split("-")[1]??"";if(!c||a.length<40)continue;let d=Math.max(0,u.index-2000),f=Math.min(l.length,u.index+2000),p=l.slice(d,f),g=p.match(/"url":"(https:\/\/[a-z0-9-]+\.slack\.com\/)"/),h=p.match(/"(?:team_name|name)":"([^"]{2,60})"/),m=r.get(c);if(!m||a.length>m.token.length){let y={token:a,teamId:c},w=g?.[1]??m?.url,x=h?.[1]??m?.teamName;if(w)y.url=w;if(x)y.teamName=x;r.set(c,y)}}}let o=t.map((i)=>s(i).replace(/[^\x20-\x7e]/g," ")).join(" ");for(let i of r.values()){if(i.teamName)continue;let l=o.indexOf(i.teamId);if(l!==-1){let u=Math.max(0,l-500),a=Math.min(o.length,l+500),d=o.slice(u,a).match(/"(?:team_name|name)":"([^"]{2,60})"/);if(d?.[1]){i.teamName=d[1];continue}}if(!i.teamName&&i.url){let u=i.url.match(/https:\/\/([a-z0-9-]+)\.slack\.com\//)?.[1];if(u){let a=o.indexOf(u);if(a!==-1){let c=Math.max(0,a-500),d=Math.min(o.length,a+500),p=o.slice(c,d).match(/"(?:team_name|name)":"([^"]{2,60})"/);if(p?.[1]){i.teamName=p[1];continue}}i.teamName=u.split("-").map((c)=>c.charAt(0).toUpperCase()+c.slice(1)).join(" ")}}}return[...r.values()]}async function ta(e){let t=e??Cd().find(nt);if(!t)throw Error(`Slack desktop app LevelDB not found at:
|
|
133
|
+
${Cd().join(`
|
|
134
134
|
`)}
|
|
135
|
-
Is Slack installed and opened at least once?`);let n=
|
|
136
|
-
`)){let u=l.trim();if(u.startsWith("[")){
|
|
135
|
+
Is Slack installed and opened at least once?`);let n=Id(t),s=e?void 0:hb();if(s)for(let r of n)r.cookie=s;return n}function gb(e,t){try{return JSON.parse(Os(me(e,"Local State"),"utf8")).profile?.info_cache?.[t]?.user_name||void 0}catch{return}}function na(){let e=sa();if(!e||!nt(e))return[];let t=["Default",...Rs(e).filter((s)=>s.startsWith("Profile "))],n=[];for(let s of t){let r=me(e,s,"Local Storage","leveldb"),o=Id(r);if(o.length===0)continue;let i=gb(e,s);n.push({profileDir:s,...i?{email:i}:{},label:vd(e,s),sessions:o})}return n}function Qi(e,t,n,s=!1){let r=(o,i)=>{try{let l=Od("aes-128-cbc",t,o);l.setAutoPadding(!0);let u=Buffer.concat([l.update(i),l.final()]);if(u.subarray(0,5).toString()==="xoxd-")return u.toString("utf8");if(u.length>=37){let a=lb("sha256").update(n).digest();if(ub(u.subarray(0,32),a)){let c=u.subarray(32).toString("utf8");if(c.startsWith("xoxd-"))return c}}return}catch{return}};return r(Buffer.alloc(16,32),e.slice(3))??(s&&e.length>=35?r(e.slice(19,35),e.slice(35)):void 0)}function vd(e,t){let n=(s,r)=>{if(s&&r)return`${s} (${r})`;return s||r||t};try{let r=JSON.parse(Os(me(e,"Local State"),"utf8")).profile?.info_cache?.[t];if(r&&(r.name||r.user_name))return n(r.name??"",r.user_name??"")}catch{}try{let r=JSON.parse(Os(me(e,t,"Preferences"),"utf8")).profile;return n(r?.name??"",r?.user_name??"")}catch{return t}}function sa(){let e=process.env.HOME??Wr();if(process.platform==="darwin")return me(e,"Library","Application Support","Google","Chrome");if(process.platform==="linux")return me(process.env.XDG_CONFIG_HOME??me(e,".config"),"google-chrome");return""}function mb(){try{return db("secret-tool",["lookup","application","chrome"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trimEnd()||void 0}catch{return}}function Is(){if(process.platform!=="darwin"&&process.platform!=="linux")return{candidates:[],totalProfiles:0};let e=sa();if(!nt(e))return{candidates:[],totalProfiles:0};let t;if(process.platform==="darwin"){let i;try{i=Rd('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=jr(i,"saltysalt",1003,16,"sha1")}let n=["Default",...Rs(e).filter((i)=>i.startsWith("Profile "))],s=[],r,o=!1;for(let i of n){let l=[me(e,i,"Network","Cookies"),me(e,i,"Cookies")].find(nt);if(!l)continue;let u=Ad(me(Td(),"slack-chrome-cookies-")),a=me(u,"Cookies");try{if(ea(l,a),nt(`${l}-wal`))ea(`${l}-wal`,`${a}-wal`);let{default:c}=gs("bun:sqlite"),d=new c(a,{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 p=Buffer.from(f.encrypted_value),g=p.subarray(0,3).toString(),h;if(g==="v20")throw Error("Chrome cookie uses unsupported v20 app-bound encryption.");if(process.platform==="linux"){if(!p.length&&f.value?.startsWith("xoxd-"))h=f.value;else if(g==="v10")h=Qi(p,jr("peanuts","saltysalt",1,16,"sha1"),f.host_key);else if(g==="v11"){if(!r){let m=mb();if(m)r=jr(m,"saltysalt",1,16,"sha1")}if(r)h=Qi(p,r,f.host_key);else o=!0}}else if(g==="v10"&&t)h=Qi(p,t,f.host_key,!0);else if(g!=="v10")throw Error("Unknown cookie encryption prefix.");if(h)s.push({profileDir:i,profileName:vd(e,i),cookie:h})}catch(c){if(c instanceof Error&&(c.message.includes("unsupported v20")||c.message.includes("Unknown cookie")))throw c}finally{Fd(u,{recursive:!0,force:!0})}}if(o&&s.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:s,totalProfiles:n.length}}async function ra(){if(process.platform!=="linux")throw Error("Chrome session import is currently supported on Linux only.");let e=sa();if(!nt(e))throw Error("Chrome profile directory was not found.");let t=new Map(Is().candidates.map((r)=>[r.profileDir,r.cookie])),n=new Map,s=["Default",...Rs(e).filter((r)=>r.startsWith("Profile "))];for(let r of s){let o=me(e,r,"Local Storage","leveldb");if(!nt(o))continue;let i;try{i=await ta(o)}catch{continue}for(let l of i){if(n.has(l.teamId))throw Error("More than one Chrome profile has a token for the same workspace. Select one browser profile first.");let u=t.get(r);if(u)l.cookie=u;n.set(l.teamId,l)}}return[...n.values()]}function yb(){let e=process.env.HOME??Wr();if(process.platform==="darwin")return[me(e,"Library","Application Support","Firefox","Profiles")];if(process.platform==="linux")return[me(e,".mozilla","firefox"),me(e,"snap","firefox","common",".mozilla","firefox"),me(e,".var","app","org.mozilla.firefox",".mozilla","firefox")];if(process.platform==="win32")return[me(process.env.APPDATA??me(e,"AppData","Roaming"),"Mozilla","Firefox","Profiles")];return[]}function bb(e){let t=me(e,"profiles.ini"),n=nt(t)?t:me(cb(e),"profiles.ini"),s={};if(!nt(n))return s;try{let r=Os(n,"utf8"),o="",i="";for(let l of r.split(`
|
|
136
|
+
`)){let u=l.trim();if(u.startsWith("[")){o="",i="";continue}let a=u.indexOf("=");if(a===-1)continue;let c=u.slice(0,a).trim().toLowerCase(),d=u.slice(a+1).trim();if(c==="name")o=d;if(c==="path")i=d.split(/[\\/]/).pop()??d;if(o&&i)s[i]=o,o="",i=""}}catch{}return s}function Ur(){let e=[];for(let t of yb().filter(nt)){let n=bb(t),s;try{s=Rs(t)}catch{continue}for(let r of s){let o=me(t,r,"cookies.sqlite");if(!nt(o))continue;let i=Ad(me(Td(),"slack-firefox-cookies-")),l=me(i,"cookies.sqlite");try{ea(o,l);let{default:u}=gs("bun:sqlite"),a=new u(l,{readonly:!0}),c=a.prepare("SELECT value FROM moz_cookies WHERE name='d' AND (host='slack.com' OR host LIKE '%.slack.com') LIMIT 1").get();if(a.close(),!c?.value||!c.value.startsWith("xoxd-"))continue;let d=n[r]??r;e.push({profileDir:r,profileName:d,cookie:c.value})}catch{}finally{Fd(i,{recursive:!0,force:!0})}}}return e}import{readFileSync as oa,writeFileSync as ia,mkdirSync as wb,existsSync as vs,rmSync as Db}from"node:fs";import{join as lt}from"node:path";import{createDecipheriv as Jr}from"node:crypto";import{spawnSync as kb}from"node:child_process";var xb=Buffer.from("b31c6e241ac846728da9c1fac4936651cffb944d143ab816276bcc6da0284787","hex"),Sb=Buffer.from("e98f37d7f4e1fa433d19304dc2258042090e2d1d7eea7670d41f738d08729660","hex"),_b=Buffer.from("ccf8a1cec56605b8517552ba1a2d061c03a29e90274fb2fcf59ba4b75c392390","hex"),bt="C:\\ProgramData\\slack-term-abe";function Eb(){let e=process.env.LOCALAPPDATA??lt(process.env.USERPROFILE??"","AppData","Local");return lt(e,"Google","Chrome","User Data")}var $b=String.raw`try {
|
|
137
137
|
Add-Type -AssemblyName System.Security
|
|
138
138
|
$d = [IO.File]::ReadAllBytes('C:\ProgramData\slack-term-abe\in.bin')
|
|
139
139
|
$o = [Security.Cryptography.ProtectedData]::Unprotect($d, $null, 'CurrentUser')
|
|
140
140
|
[IO.File]::WriteAllBytes('C:\ProgramData\slack-term-abe\sys.bin', $o)
|
|
141
141
|
} catch { Set-Content 'C:\ProgramData\slack-term-abe\dpapi.err' ($_.Exception.Message) }
|
|
142
|
-
`,
|
|
142
|
+
`,Cb=String.raw`try {
|
|
143
143
|
Add-Type -TypeDefinition @'
|
|
144
144
|
using System; using System.Runtime.InteropServices;
|
|
145
145
|
public static class NC {
|
|
@@ -155,7 +155,7 @@ public static class NC {
|
|
|
155
155
|
'@
|
|
156
156
|
[IO.File]::WriteAllBytes('C:\ProgramData\slack-term-abe\cng.bin', [NC]::Dec([IO.File]::ReadAllBytes('C:\ProgramData\slack-term-abe\eak.bin')))
|
|
157
157
|
} catch { Set-Content 'C:\ProgramData\slack-term-abe\cng.err' ($_.Exception.Message) }
|
|
158
|
-
`;function
|
|
158
|
+
`;function Ab(e,t){let n=(s)=>`'${s.replace(/'/g,"''")}'`;return String.raw`
|
|
159
159
|
$ErrorActionPreference = 'Stop'
|
|
160
160
|
Add-Type -AssemblyName System.Security
|
|
161
161
|
$work = 'C:\ProgramData\slack-term-abe'
|
|
@@ -221,44 +221,44 @@ icacls "$work\Cookies" /grant "$($u):(R)" | Out-Null
|
|
|
221
221
|
if (Test-Path "$work\cng.bin") { icacls "$work\cng.bin" /grant "$($u):(R)" | Out-Null }
|
|
222
222
|
Write-Host 'OK'
|
|
223
223
|
try { Stop-Transcript | Out-Null } catch {}
|
|
224
|
-
`}function
|
|
225
|
-
`).filter((u)=>u.startsWith("ERROR")).join(" "):"";throw Error(`Elevated extraction did not complete${l?` (${l.trim()})`:" (UAC declined or Chrome build unsupported)"}`)}try{let l=
|
|
226
|
-
Could not extract the cookie automatically: ${
|
|
224
|
+
`}function Fb(e,t){let s=4+e.readUInt32LE(0)+4,r=e[s];if(r===1||r===2){let o=e.subarray(s+1,s+13),i=e.subarray(s+13,s+45),l=e.subarray(s+45,s+61),u=r===1?Jr("aes-256-gcm",xb,o):Jr("chacha20-poly1305",Sb,o,{authTagLength:16});return u.setAuthTag(l),Buffer.concat([u.update(i),u.final()])}if(r===3){if(!t)throw Error("flag 3 requires the CNG-decrypted key (cng.bin missing)");let o=e.subarray(s+33,s+45),i=e.subarray(s+45,s+77),l=e.subarray(s+77,s+93),u=Buffer.from(t.map((c,d)=>c^_b[d])),a=Jr("aes-256-gcm",u,o);return a.setAuthTag(l),Buffer.concat([a.update(i),a.final()])}throw Error(`Unsupported app-bound key flag: ${r}`)}function Tb(e,t){let n=t.subarray(3,15),s=t.subarray(15,t.length-16),r=t.subarray(t.length-16),o=Jr("aes-256-gcm",e,n);return o.setAuthTag(r),Buffer.concat([o.update(s),o.final()]).subarray(32).toString("utf8")}async function Pd(e){if(process.platform!=="win32")throw Error("Windows-only");let t=Eb();if(!vs(lt(t,"Local State")))throw Error(`Chrome Local State not found at ${t}`);wb(bt,{recursive:!0});let n=lt(bt,"extract.ps1");ia(n,Ab(t,e)),ia(lt(bt,"inner_dpapi.ps1"),$b),ia(lt(bt,"inner_cng.ps1"),Cb);let s=`Start-Process powershell -Verb RunAs -Wait -ArgumentList @('-NoProfile','-ExecutionPolicy','Bypass','-WindowStyle','Hidden','-File','${n.replace(/'/g,"''")}')`,r=kb("powershell",["-NoProfile","-Command",s],{encoding:"utf8",windowsHide:!0});if(r.status!==0&&r.error)throw Error(`Failed to launch elevated helper: ${r.error.message}`);let o=lt(bt,"out.bin"),i=lt(bt,"Cookies");if(!vs(o)||!vs(i)){let l=vs(lt(bt,"log.txt"))?oa(lt(bt,"log.txt"),"utf8").split(`
|
|
225
|
+
`).filter((u)=>u.startsWith("ERROR")).join(" "):"";throw Error(`Elevated extraction did not complete${l?` (${l.trim()})`:" (UAC declined or Chrome build unsupported)"}`)}try{let l=oa(o),u=vs(lt(bt,"cng.bin"))?oa(lt(bt,"cng.bin")):void 0,a=Fb(l,u),{Database:c}=gs("bun:sqlite"),d=new c(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 p=Buffer.from(f.v);if(p.subarray(0,3).toString()!=="v20")throw Error(`unexpected cookie version ${p.subarray(0,3).toString("latin1")}`);let g=Tb(a,p);if(!g.startsWith("xoxd-"))throw Error("decrypted value is not an xoxd- cookie");return g}finally{if(!process.env.SLACK_KEEP_ABE)Db(bt,{recursive:!0,force:!0})}}var Ib=["search:read","channels:history","groups:history","im:history","mpim:history","channels:read","groups:read","im:read","mpim:read","users:read","chat:write","files:write"],vb=["channels:history","groups:history","im:history","mpim:history","channels:read","groups:read","im:read","mpim:read","users:read","chat:write","files:write"];function Qn(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function Pb(){return JSON.stringify({display_information:{name:"slack-term"},oauth_config:{scopes:{user:Ib}},settings:{org_deploy_enabled:!1,socket_mode_enabled:!1,token_rotation_enabled:!1}},null,2)}function Lb(){return JSON.stringify({display_information:{name:"slack-term"},features:{bot_user:{display_name:"slack-term",always_online:!1}},oauth_config:{scopes:{bot:vb}},settings:{org_deploy_enabled:!1,socket_mode_enabled:!1,token_rotation_enabled:!1}},null,2)}async function Qt(e,t){return(await e.question(t)).trim()}async function Ps(e,t){if(t)return!0;if(!e)return!1;let n=await Qt(e,"Read local browser profiles and Slack session cookies? [y/N]: ");return n.toLowerCase()==="y"||n.toLowerCase()==="yes"}async function Fn(e,t,n,s){console.error("Verifying token...");let r=await Vn(t,s),o=Qn(r.team),i;if(n)i=n;else if(e)i=await Qt(e,`Workspace name [${o}]: `)||o;else i=o;let l=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 u=await Qt(e,"Choice [1/2/3/4, Enter=1]: ");if(u==="2")l=aa(process.cwd(),".slack-term",".env.local");else if(u==="3")l=aa(Rb(),".slack-term",".env.local");else if(u==="4")l=null;else l=aa(process.cwd(),".env.local")}if(l===null)if(Ar(i,{token:t,...r,...s?{cookie:s}:{}}),console.log(`Saved workspace "${i}" to profiles.json: ${r.team} (${r.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 u={SLACK_TOKEN:t};if(s)u.SLACK_COOKIE=s;ji(l,u),console.log(`Saved token to ${l}`),console.log(" SLACK_TOKEN will be picked up automatically in this directory tree.")}return i}async function ca(e,t=!1,n="auto",s=!1){console.error("Scanning Slack desktop app...");let r=await ta();if(r.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"&&r.some((o)=>!o.cookie)&&await Ps(e,t)){let o=[];if(n!=="chrome")for(let i of Ur())o.push({source:"Firefox",profileName:i.profileName,cookie:i.cookie});if(n==="chrome"||n==="all"||n==="auto"&&o.length===0)try{for(let i of Is().candidates)o.push({source:"Chrome",profileName:i.profileName,cookie:i.cookie})}catch(i){console.error(i instanceof Error?i.message:String(i))}if(o.length===1){for(let i of r)i.cookie??=o[0].cookie;console.log(`Found Slack session cookie in ${o[0].source} profile: ${o[0].profileName}`)}else if(o.length>1)console.log("Multiple browser sessions found. Choose one later with slack auth chrome or slack auth firefox.");if(r.some((i)=>!i.cookie))console.log("Desktop session needs an xoxd cookie on Linux. Run: slack auth chrome or slack auth firefox")}await la(r,e,s)}async function la(e,t,n=!1){if(e.length===1&&t&&e[0]?.cookie&&!n){let s=e[0],r=s.teamName??s.teamId;console.log(`Found workspace: ${r}${s.cookie?" (+ xoxd cookie)":""}`),await Fn(t,s.token,Qn(r),s.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 s of e){let r=s.teamName??s.teamId,o=Qn(r);Ar(o,{token:s.token,team:r,teamId:s.teamId,url:s.url??"",user:"",...s.cookie?{cookie:s.cookie}:{}}),console.log(`Added workspace "${o}": ${r}${s.cookie?" + xoxd cookie":""}`)}if(console.log(""),e.length===1){let s=Qn(e[0].teamName??e[0].teamId);console.log(`Run: slack auth use -g ${s}`)}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 Ld(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 Qt(e,"Choice [1/2]: ")==="2"?"bot":"user",s=n==="user"?"xoxp-":"xoxb-",r=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 "${r}" (starts with ${s})`),console.log("");let o=await Qt(e,"Paste your token: ");if(!o)console.error("No token provided."),process.exit(1);if(!o.startsWith(s))console.error(`Expected a ${s} token, got: ${o.slice(0,10)}...`),process.exit(1);await Fn(e,o)}async function Kr(e,t){let n=t==="user"?Pb():Lb(),s=t==="user"?"User OAuth Token (xoxp-...)":"Bot User OAuth Token (xoxb-...)",r=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 -> ${s}`),console.log("");let o=await Qt(e,"Paste your token: ");if(!o)console.error("No token provided."),process.exit(1);if(!o.startsWith(r))console.error(`Expected a ${r} token, got: ${o.slice(0,10)}...`),process.exit(1);await Fn(e,o)}async function Nb(e,t){let n=na();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 s=e.profile.token.split("-")[1],r=n.find((o)=>o.sessions.some((i)=>i.teamId===s));if(!r&&t){if(r=n.find((o)=>o.email===t||o.profileDir===t||o.profileDir===`Profile ${t}`),!r)console.error(`Chrome profile "${t}" has no Slack session. Available: ${n.map((o)=>o.email??o.profileDir).join(", ")}`),process.exit(1)}if(!r)if(n.length===1)r=n[0];else if(process.stdin.isTTY){console.log("Multiple Chrome profiles have a Slack session:"),n.forEach((u,a)=>console.log(` ${a+1}) ${u.email??u.label} [${u.profileDir}]`));let o=Ge({input:process.stdin,output:process.stdout}),i=(await o.question(`Choice [1-${n.length}]: `)).trim();o.close();let l=parseInt(i,10)-1;if(isNaN(l)||l<0||l>=n.length)console.error("Invalid choice."),process.exit(1);r=n[l]}else console.error("Multiple Chrome profiles have a Slack session — choose one with --profile:"),n.forEach((o)=>console.error(` slack auth cookie -w ${e.name} --profile "${o.email??o.profileDir}"`)),process.exit(1);console.log(`Using Chrome profile: ${r.email??r.label} [${r.profileDir}]`),console.log("Chrome's cookie is app-bound encrypted; a Windows elevation (UAC) prompt will appear — approve it.");try{return await Pd(r.profileDir)}catch(o){console.error(`
|
|
226
|
+
Could not extract the cookie automatically: ${o instanceof Error?o.message:String(o)}`),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 Nd(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=Cs();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 o=t.find((i)=>i.current);if(o)n=o.name,console.log(`Using active workspace: ${n}`);else{console.log("Multiple workspaces found. Choose one:"),t.forEach((a,c)=>console.log(` ${c+1}) ${a.name} (${a.profile.team})`));let i=Ge({input:process.stdin,output:process.stdout}),l=(await i.question("Choice: ")).trim();i.close();let u=parseInt(l,10)-1;if(isNaN(u)||u<0||u>=t.length)console.error("Invalid choice."),process.exit(1);n=t[u].name}}let s=t.find((o)=>o.name===n);if(s.profile.token.startsWith("xoxb-")){console.error(`
|
|
227
227
|
Workspace "${n}" uses a bot token (xoxb-). A Chrome session cookie only
|
|
228
228
|
`+`augments a user session token (xoxc-) — it has no effect on a bot token, so user-level
|
|
229
|
-
`+"actions (tail @user, DMs, listing users) would still fail.");let
|
|
230
|
-
`))}function
|
|
231
|
-
`),
|
|
229
|
+
`+"actions (tail @user, DMs, listing users) would still fail.");let o=t.filter((i)=>i.profile.token.startsWith("xoxc-")||i.profile.token.startsWith("xoxp-"));if(o.length>0)console.error(` Target a user-token workspace instead: ${o.map((i)=>i.name).join(", ")}`),console.error(` slack auth chrome -w ${o[0].name}`);else console.error(" Import your Slack desktop user session instead: slack auth login");process.exit(1)}let r;if(process.platform==="win32")r=await Nb(s,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 o=e.yes?void 0:Ge({input:process.stdin,output:process.stdout});try{if(!await Ps(o,e.yes??!1)){console.log("Browser profile scan cancelled.");return}}finally{o?.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,l;try{({candidates:i,totalProfiles:l}=Is())}catch(u){console.error(`Failed: ${u instanceof Error?u.message:String(u)}`),process.exit(1)}if(i.length===0)console.error(`No Slack session found in Chrome (scanned ${l} profile${l!==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&&l<=1)r=i[0].cookie,console.log(`Found session in Chrome profile: ${i[0].profileName}`);else{let u=i.length===1?`Found 1 Slack session across ${l} Chrome profiles:`:`Found ${i.length} Slack sessions across ${l} Chrome profiles:`;console.log(u),i.forEach((p,g)=>console.log(` ${g+1}) ${p.profileName} [${p.profileDir}]`)),console.log("");let a=Ge({input:process.stdin,output:process.stdout}),c=i.length===1?" [Enter=1]":"",d=(await a.question(`Choice [1-${i.length}]${c}: `)).trim();a.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);r=i[f].cookie}}Wi(n,r),console.log(`Saved xoxd cookie to workspace "${n}".`),console.log("RTM WebSocket mode is now available: slack tail @you")}async function ua(e={}){console.error("Scanning Chrome profiles for Slack sessions...");let t=na();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 o=e.profile,i=t.find((l)=>l.email===o||l.profileDir===o||l.profileDir===`Profile ${o}`);if(!i)console.error(`Chrome profile "${o}" has no Slack session. Available:`),t.forEach((l)=>console.error(` - ${l.email??l.label} [${l.profileDir}] (${l.sessions.length} workspace${l.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((u,a)=>console.log(` ${a+1}) ${u.email??u.label} [${u.profileDir}] (${u.sessions.length} workspace${u.sessions.length!==1?"s":""})`));let o=Ge({input:process.stdin,output:process.stdout}),i=(await o.question(`Choice [1-${t.length}]: `)).trim();o.close();let l=parseInt(i,10)-1;if(isNaN(l)||l<0||l>=t.length)console.error("Invalid choice."),process.exit(1);n=t[l]}else console.error("Multiple Chrome profiles have a Slack session — choose one with --profile:"),t.forEach((o)=>console.error(` slack auth login chrome --profile "${o.email??o.profileDir}"`)),process.exit(1);let s=n.email??n.label??n.profileDir,r;if(process.platform==="darwin")try{let{candidates:o}=Is();r=o.find((i)=>i.profileDir===n.profileDir)?.cookie??o[0]?.cookie}catch{}if(r)cd(s,r,`chrome:${n.profileDir}`);for(let o of n.sessions){let i=o.teamName??o.teamId,l=Qn(i);Ar(l,{token:o.token,team:i,teamId:o.teamId,url:o.url??"",user:"",identity:s}),console.log(`Added workspace "${l}": ${i} (identity: ${s})`)}if(console.log(""),r)console.log(`Captured xoxd cookie for ${s} — 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 ${Qn(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 da(e={}){let t=Cs();if(t.length===0)console.error("No workspaces configured. Run: slack auth login"),process.exit(1);let n;if(e.workspace){if(!t.find((l)=>l.name===e.workspace))console.error(`Workspace "${e.workspace}" not found. Available: ${t.map((l)=>l.name).join(", ")}`),process.exit(1);n=e.workspace}else if(t.length===1)n=t[0].name;else{let i=t.find((l)=>l.current);if(i)n=i.name,console.log(`Using active workspace: ${n}`);else{console.log("Multiple workspaces found. Choose one:"),t.forEach((c,d)=>console.log(` ${d+1}) ${c.name} (${c.profile.team})`));let l=Ge({input:process.stdin,output:process.stdout}),u=(await l.question("Choice: ")).trim();l.close();let a=parseInt(u,10)-1;if(isNaN(a)||a<0||a>=t.length)console.error("Invalid choice."),process.exit(1);n=t[a].name}}if(!e.yes&&!process.stdin.isTTY)console.error("Reading browser profiles requires confirmation. Re-run interactively or pass --yes."),process.exit(1);let s=e.yes?void 0:Ge({input:process.stdin,output:process.stdout});try{if(!await Ps(s,e.yes??!1)){console.log("Browser profile scan cancelled.");return}}finally{s?.close()}console.log("Scanning Firefox profiles for Slack session...");let r=Ur();if(r.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 o;if(r.length===1)o=r[0].cookie,console.log(`Found session in Firefox profile: ${r[0].profileName}`);else{console.log("Multiple Firefox profiles have a Slack session. Choose one:"),r.forEach((a,c)=>console.log(` ${c+1}) ${a.profileName} [${a.profileDir}]`));let i=Ge({input:process.stdin,output:process.stdout}),l=(await i.question("Choice: ")).trim();i.close();let u=parseInt(l,10)-1;if(isNaN(u)||u<0||u>=r.length)console.error("Invalid choice."),process.exit(1);o=r[u].cookie}Wi(n,o),console.log(`Saved xoxd cookie to workspace "${n}".`),console.log("RTM WebSocket mode is now available: slack tail @you")}async function Md(e={}){if(e.token){await Fn(null,e.token,e.name);return}if(!process.stdin.isTTY){let n=[];for await(let r of process.stdin)n.push(r);let s=Buffer.concat(n).toString("utf8").trim();if(!s)console.error("No token provided on stdin."),process.exit(1);await Fn(null,s,e.name);return}let t=Ge({input:process.stdin,output:process.stdout});try{await Ld(t)}finally{t.close()}}async function Bd(e={}){let t=Ge({input:process.stdin,output:process.stdout});try{if(e.bot!==void 0){await Kr(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 Qt(t,"Choice [1/2, Enter=1]: ");await Kr(t,n==="2"?"bot":"user")}finally{t.close()}}function jd(e={}){let t=(r,o)=>{if(/[\r\n]/.test(o))throw Error(`Invalid newline in ${r}.`);return`${r}=${/^[A-Za-z0-9._=-]+$/.test(o)?o:JSON.stringify(o)}`},n=[t("SLACK_TOKEN",ld(e.workspace))],s=Zt(e.workspace);if(s)n.push(t("SLACK_COOKIE",s));if(!e.workspace){let r=Fr();if(r)n.push(t("SLACK_BOT_TOKEN",r))}console.log(n.join(`
|
|
230
|
+
`))}function Wd(e){let t=Cs(),n=e.workspace?t.find((r)=>r.name===e.workspace):t.find((r)=>r.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 s=Ob(e.envfile);ji(s,{SLACK_TOKEN:n.profile.token,SLACK_COOKIE:n.profile.cookie}),console.log(`Saved token and cookie for workspace "${n.name}" to ${s}`)}async function Ls(e={}){let t=Cs();if(t.length>0){console.log("Currently logged in:");for(let{name:s,profile:r,current:o}of t)console.log(` ${o?"*":" "} ${s} ${r.team} (${r.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 s=process.stdin.isTTY?Ge({input:process.stdin,output:process.stdout}):void 0;try{if(!await Ps(s,e.yes??!1)){console.log("Browser profile scan cancelled.");return}let r=await ra();if(r.length===0)throw Error("No Slack session token found in Chrome profiles.");await la(r,s,!0)}finally{s?.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 s=process.stdin.isTTY?Ge({input:process.stdin,output:process.stdout}):void 0;try{try{await ca(s,e.yes??!1,"all",!0)}catch(r){if(!(r instanceof Error)||!r.message.startsWith("Slack desktop app LevelDB not found"))throw r;if(!await Ps(s,e.yes??!1)){console.log("Browser profile scan cancelled.");return}let o=await ra();if(o.length===0)throw Error("No Slack session token found in Chrome profiles.");if(o.every((i)=>!i.cookie)){let i=Ur();if(i.length===1)for(let l of o)l.cookie=i[0].cookie}await la(o,s,!0)}}finally{s?.close()}return}if(e.fromDesktop||e.fromChrome||e.fromFirefox||e.fromAll){let s=e.fromChrome?"chrome":e.fromFirefox?"firefox":e.fromAll?"all":"none";if(s!=="none"&&!e.yes&&!process.stdin.isTTY)throw Error("Reading browser profiles requires confirmation. Re-run interactively or pass --yes.");let r=process.stdin.isTTY?Ge({input:process.stdin,output:process.stdout}):void 0;try{await ca(r,e.yes??!1,s,!0)}finally{r?.close()}return}if(e.token){await Fn(null,e.token,e.name);return}if(!process.stdin.isTTY){let s=[];for await(let o of process.stdin)s.push(o);let r=Buffer.concat(s).toString("utf8").trim();if(!r)console.error("No token provided on stdin."),process.exit(1);await Fn(null,r,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=Ge({input:process.stdin,output:process.stdout});try{let s=await Qt(n,"Choice [1/2/3/4/5]: ");if(console.log(""),s==="1")await ca(n,e.yes??!1);else if(s==="2"){n.close(),await ua();return}else if(s==="3")await Ld(n);else if(s==="4")await Kr(n,"user");else if(s==="5")await Kr(n,"bot");else console.error(`Invalid choice: "${s}". Enter 1, 2, 3, 4, or 5.`),process.exit(1)}finally{n.close()}}async function qr(e,t,n,s){let r=t,o=[],i=r,l=0;while(!0){let u=i.indexOf("<@U",l);if(u===-1)break;let a=i.slice(u+2),c=a.search(/[>|]/),d=c===-1?a:a.slice(0,c);if(d.length>=9)o.push(d);l=u+1}for(let u of o){if(!n.has(u))n.set(u,await Zn(e,u,s));let a=n.get(u)??u;r=r.replaceAll(`<@${u}>`,`@${a}`),r=r.replace(new RegExp(`<@${u}\\|[^>]*>`,"g"),`@${a}`)}return r}function Hr(e){return e.replace(/<!date\^(\d+)\^[^|>]*(?:\|([^>]*))?>/g,(t,n,s)=>{let r=Number(n);if(!Number.isFinite(r))return s??"date";let o=new Date(r*1000);if(Number.isNaN(o.getTime()))return s??"date";let i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],l=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],u=i[o.getUTCDay()]??"",a=l[o.getUTCMonth()]??"";return`${u}, ${a} ${String(o.getUTCDate()).padStart(2,"0")}, ${o.getUTCFullYear()}`})}function Jd(e){let t=typeof e.ts==="string"?e.ts:"",n=typeof e.thread_ts==="string"?e.thread_ts:"";return n!==""&&n!==t}function Mb(e){let[t,n="000000"]=e.split("."),s=new Date(Number(t)*1000),r=s.getUTCFullYear(),o=String(s.getUTCMonth()+1).padStart(2,"0"),i=String(s.getUTCDate()).padStart(2,"0"),l=String(s.getUTCHours()).padStart(2,"0"),u=String(s.getUTCMinutes()).padStart(2,"0"),a=String(s.getUTCSeconds()).padStart(2,"0"),c=n.padEnd(6,"0").slice(0,6);return`${r}-${o}-${i}T${l}:${u}:${a}.${c}`}async function Bb(e,t,n){let s=typeof t.ts==="string"?t.ts:"0.000000",r=Mb(s),o="?";if(typeof t.user==="string"){let d=t.user,f="@"+d;if(!n.has(f)){let[,p]=await Pr(e,d);n.set(f,p)}o=n.get(f)??d}else if(typeof t.username==="string")o=t.username;let i=typeof t.text==="string"?t.text:"",u=Hr(await qr(e,i,n)).split(`
|
|
231
|
+
`),a=u[0]+(u.length>1?`
|
|
232
232
|
`+u.slice(1).map((d)=>` ${d}`).join(`
|
|
233
|
-
`):""),
|
|
234
|
-
`)}),
|
|
233
|
+
`):""),c=Jd(t)?"↳ ":"";return`${r} ${c}@${o}: ${a}`}async function jb(e,t,n,s,r,o,i,l){if(l?.aborted)return;return new Promise((u)=>{let a=new e(n);l?.addEventListener("abort",()=>{a.close(),u()},{once:!0}),a.addEventListener("open",()=>{process.stderr.write(`Connected via RTM (experimental).
|
|
234
|
+
`)}),a.addEventListener("close",()=>u()),a.addEventListener("error",()=>u()),a.addEventListener("message",(c)=>{(async()=>{try{let d;try{d=JSON.parse(String(c.data))}catch{return}let f=typeof d.type==="string"?d.type:"";if(f==="ping"){a.send(JSON.stringify({type:"pong",reply_to:d.id??0}));return}if(f!=="message")return;if((typeof d.channel==="string"?d.channel:"")!==s)return;let g=typeof d.ts==="string"?d.ts:"";if(!g||o.has(g))return;let h=typeof d.subtype==="string"?d.subtype:"";if(h==="message_changed"||h==="message_deleted")return;if(r.thread){if((typeof d.thread_ts==="string"?d.thread_ts:g)!==r.thread&&g!==r.thread)return}if(r.watchThread&&Jd(d)){if((typeof d.thread_ts==="string"?d.thread_ts:"")!==r.watchThread)return}if(r.me&&r.myUserId){if(!(typeof d.text==="string"?d.text:"").includes(`<@${r.myUserId}>`))return}if(o.add(g),o.size>1000){let y=o.values().next().value;if(y!==void 0)o.delete(y)}let m=await Bb(t,d,i);process.stdout.write(m+`
|
|
235
235
|
`)}catch(d){process.stderr.write(`RTM message error: ${d instanceof Error?d.message:String(d)}
|
|
236
|
-
`)}})()})})}var
|
|
237
|
-
`),d=
|
|
238
|
-
`+
|
|
239
|
-
`):""),f=
|
|
236
|
+
`)}})()})})}var Ud=3,Wb=2000,fa={sleep:(e)=>new Promise((t)=>setTimeout(t,e)),clientBoot:Sd,getWebSocket:()=>{let e=globalThis.WebSocket;return typeof e==="function"?e:void 0}};async function Kd(e,t,n,s,r,o,i){let l=fa.getWebSocket();if(!l)return;for(let u=0;u<Ud;u++){if(i?.aborted)return;try{let{wsUrl:a}=await fa.clientBoot(e,t);await jb(l,e,a,n,s,r,o,i)}catch{}if(i?.aborted)return;if(u<Ud-1)await fa.sleep(Wb)}}function en(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 wt={sleep:(e)=>new Promise((t)=>setTimeout(t,e)),now:()=>Date.now(),tailRTM:Kd};function vt(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function pa(e){return Array.isArray(e)?e:[]}function qd(e){return Number(e)||0}function Hd(e){let t=typeof e.ts==="string"?e.ts:"",n=typeof e.thread_ts==="string"?e.thread_ts:"";return n!==""&&n!==t}function Ub(e){let[t,n="000000"]=e.split("."),s=new Date(Number(t)*1000),r=s.getUTCFullYear(),o=String(s.getUTCMonth()+1).padStart(2,"0"),i=String(s.getUTCDate()).padStart(2,"0"),l=String(s.getUTCHours()).padStart(2,"0"),u=String(s.getUTCMinutes()).padStart(2,"0"),a=String(s.getUTCSeconds()).padStart(2,"0"),c=n.padEnd(6,"0").slice(0,6);return`${r}-${o}-${i}T${l}:${u}:${a}.${c}`}async function Jb(e,t,n,s,r){let o=typeof t.ts==="string"?t.ts:"0.000000",i=Ub(o),l="?";if(typeof t.user==="string"){let g=t.user,h="@"+g;if(!n.has(h)){let[,m]=await Pr(e,g,r);n.set(h,m)}l=n.get(h)??g}else if(typeof t.username==="string")l=t.username;let u=typeof t.text==="string"?t.text:"",c=Hr(await qr(e,u,n,r)).split(`
|
|
237
|
+
`),d=c[0]+(c.length>1?`
|
|
238
|
+
`+c.slice(1).map((g)=>` ${g}`).join(`
|
|
239
|
+
`):""),f=Hd(t)?"↳ ":"",p=s?`${s} @${l}`:`@${l}`;return`${i} ${f}${p}: ${d}`}async function Kb(e,t,n,s,r,o,i){let l=vt(await An(e,t,20,i?void 0:n||void 0,i,s.cookie)),u=pa(l.messages).map(vt).reverse(),a=vt(l.response_metadata),c=l.has_more===!0&&typeof a.next_cursor==="string"?a.next_cursor:void 0,d=[];if(s.watchThread&&!i){let m=vt(await bd(e,t,s.watchThread,50,s.cookie));d=pa(m.messages).map(vt).filter((y)=>(typeof y.ts==="string"?y.ts:"")!==s.watchThread)}let f=[...u.map((m)=>({m,fromHistory:!0})),...d.map((m)=>({m,fromHistory:!1}))].sort((m,y)=>qd(typeof m.m.ts==="string"?m.m.ts:"")-qd(typeof y.m.ts==="string"?y.m.ts:"")),p=[],g=n,h=!1;for(let{m,fromHistory:y}of f){let w=typeof m.ts==="string"?m.ts:"";if(!w||r.has(w))continue;let x=typeof m.subtype==="string"?m.subtype:"";if(x==="message_changed"||x==="message_deleted")continue;if(s.thread){if((typeof m.thread_ts==="string"?m.thread_ts:w)!==s.thread&&w!==s.thread)continue}if(s.watchThread&&Hd(m)){if((typeof m.thread_ts==="string"?m.thread_ts:"")!==s.watchThread)continue}if(s.me&&s.myUserId){if(!(typeof m.text==="string"?m.text:"").includes(`<@${s.myUserId}>`))continue}if(r.add(w),r.size>1000){let E=r.values().next().value;if(E!==void 0)r.delete(E)}if(p.push(await Jb(e,m,o,void 0,s.cookie)),y)g=w;let D=typeof m.user==="string"?m.user:"";if(!s.myUserId||D!==s.myUserId)h=!0}return{newCursor:g,lines:p,hasMore:l.has_more===!0,nextPageCursor:c,emittedOther:h}}function qb(e){if(e.includes("slack.com")){let t=Yi(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 zd(e,t,n={},s){if(n.me&&!t)console.error(`slack tail --me requires a <target> channel.
|
|
240
240
|
Cross-channel mention streaming is not yet supported.
|
|
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
|
|
242
|
-
`);E=!1;for(let
|
|
243
|
-
`);if(O)h=!0;D=x?k:void 0}while(D);p=!1}catch(y){if(y instanceof qe){console.error(`Warning: Slack rate limit hit — backing off for ${y.retryAfter}s`),await
|
|
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 r=await vr(e,t,n.cookie),o=n.interval??60000,i=n.timeout?wt.now()+en(n.timeout)*1000:1/0,l=new Map,u=new Set;try{let h=vt(await Nr(e,r,n.cookie));if(vt(h.channel).is_archived===!0)console.error("Warning: this channel is archived — no new messages will arrive.")}catch(h){let m=h instanceof Error?h.message:String(h);if(m.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(m.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(m.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: ${m}`)}let a="";if(n.since){let h=en(n.since);a=(wt.now()/1000-h).toFixed(6)}else{let h=vt(await An(e,r,1,void 0,void 0,n.cookie)),m=pa(h.messages).map(vt);if(m.length>0&&typeof m[0]?.ts==="string")a=m[0].ts,u.add(a);else a=(wt.now()/1000).toFixed(6)}let c;if(n.me||n.exitOnMessage)c=(await Vn(e,n.cookie)).userId||void 0;let d;if(n.watchThread!==void 0)try{d=qb(n.watchThread)}catch(h){console.error(h instanceof Error?h.message:String(h)),process.exit(1)}let f={...n.thread!==void 0?{thread:n.thread}:{},...d!==void 0?{watchThread:d}:{},...n.me!==void 0?{me:n.me}:{},...c!==void 0?{myUserId:c}:{},...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 wt.tailRTM(e,n.cookie,r,f,u,l,s),s?.aborted)return;console.error("RTM unavailable — switching to polling.")}let p=!0,g=wt.now();while(!s?.aborted){if(wt.now()>=i)return;let h=!1;try{let w=wt.now()-g,x=o>0&&w>o*5,D,E=!0;do{let{newCursor:C,lines:S,nextPageCursor:k,emittedOther:O}=await Kb(e,r,a,f,u,l,D);if(a=C,p&&E&&n.since&&S.length===0)process.stdout.write(`(no messages in the last ${n.since} — watching for new)
|
|
242
|
+
`);E=!1;for(let L of S)process.stdout.write(L+`
|
|
243
|
+
`);if(O)h=!0;D=x?k:void 0}while(D);p=!1}catch(y){if(y instanceof qe){console.error(`Warning: Slack rate limit hit — backing off for ${y.retryAfter}s`),await wt.sleep(y.retryAfter*1000);continue}throw y}if(n.exitOnMessage&&h)return;g=wt.now();let m=i-wt.now();if(m<=0)return;await wt.sleep(Math.min(o,m))}}import{existsSync as Hb,mkdirSync as Vd,readFileSync as ma,renameSync as zb,unlinkSync as Gd,writeFileSync as ya}from"node:fs";import{dirname as Zd}from"node:path";class ha extends Error{}function Yd(e){let t=e,n=(Array.isArray(t.messages)?t.messages:[]).filter((r)=>!!r&&typeof r==="object"&&!Array.isArray(r)),s=t.has_more===!0?t.response_metadata?.next_cursor:void 0;return typeof s==="string"&&s?{messages:n,nextCursor:s}:{messages:n}}function Qd(e,t){return{async listChannels(n){let s;if(n){s=[];for(let r of n){let o=await Nr(e,r,t),i=o.channel;if(i&&i.is_member!==!1)s.push(o.channel)}}else try{s=await Gi(e,"public_channel,private_channel,im,mpim",t)}catch(r){if(!/missing_scope/.test(r instanceof Error?r.message:String(r)))throw r;s=[];let o=[];for(let i of["public_channel","private_channel","im","mpim"])try{s.push(...await Gi(e,i,t))}catch(l){if(!/missing_scope/.test(l instanceof Error?l.message:String(l)))throw l;o.push(i)}fe.err(`slack stream: no scope to list ${o.join(", ")} — watching the rest`)}return s.flatMap((r)=>{if(!r||typeof r!=="object"||Array.isArray(r)||typeof r.id!=="string")return[];let o=r.is_im===!0;return[{id:r.id,name:ce(r.name)||r.id,isIm:o,...r.is_mpim===!0?{isMpim:!0}:{},...o&&typeof r.user==="string"?{user:r.user}:{}}]})},history:async(n,s,r)=>Yd(await An(e,n,200,s,r,t)),replies:async(n,s,r,o)=>Yd(await wd(e,n,s,{oldest:r,...o?{cursor:o}:{}},t)),userName:(n)=>Zn(e,n,t)}}var Gb="https://github.com/snomiao/slack-term/blob/main/worker/README.md",Yb=1.618,Xb=25,zr=2000,Vb=8,fe={now:()=>Date.now(),sleep:(e,t)=>new Promise((n)=>{if(t?.aborted)return n();let s=()=>{clearTimeout(r),n()},r=setTimeout(()=>{t?.removeEventListener("abort",s),n()},e);t?.addEventListener("abort",s,{once:!0})}),out:(e)=>{process.stdout.write(e+`
|
|
244
244
|
`)},err:(e)=>{process.stderr.write(e+`
|
|
245
|
-
`)},pidAlive:(e)=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}};function
|
|
246
|
-
`)}function
|
|
245
|
+
`)},pidAlive:(e)=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}};function es(e,t,n){return Math.min(n,Math.round(t*Math.pow(Yb,Math.max(0,e-1))))}var Zb=["invalid_auth","not_authed","token_revoked","token_expired","account_inactive","no_permission"],Qb=["channel_not_found","not_in_channel","missing_scope","is_archived"];class tn extends Error{}function Ye(e){return e instanceof Error?e.message:String(e)}function ga(e){let t=Ye(e);if(Zb.some((n)=>t.includes(n)))return"fatal";if(Qb.some((n)=>t.includes(n)))return"channel";return"transient"}var ce=(e)=>typeof e==="string"?e:"",ge=(e)=>Number(e)||0,Dt=(e)=>e.toFixed(6),ew=new Set(["message_changed","message_deleted","channel_join","channel_leave","group_join","group_leave"]);function tw(e){let t=[ce(e.text)];if(Array.isArray(e.attachments)){for(let n of e.attachments)if(n&&typeof n==="object"&&!Array.isArray(n))t.push(ce(n.pretext),ce(n.text),ce(n.fallback))}return t.filter(Boolean).join(`
|
|
246
|
+
`)}function nw(e,t,n,s){let o=`${e.endsWith("/")?e:e+"/"}archives/${t}/p${n.replace(".","")}`;return s&&s!==n?`${o}?thread_ts=${s}&cid=${t}`:o}function sw(e,t){if(!Hb(e))return{version:1,identity:t,channels:{}};let n;try{n=JSON.parse(ma(e,"utf8"))}catch(r){throw new tn(`state file ${e} is unreadable (${Ye(r)}); 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((r)=>r&&typeof r.since==="string"&&typeof r.cursor==="string"&&r.threads&&typeof r.threads==="object")))throw new tn(`state file ${e} is not a slack stream state; move it aside to start fresh`);if(n.identity!==t)throw new tn(`state file ${e} belongs to identity ${n.identity}, not ${t}; pass a different --state`);return n}function Pt(e,t){Vd(Zd(e),{recursive:!0});let n=`${e}.tmp-${process.pid}`;ya(n,JSON.stringify(t)),zb(n,e)}function rw(e){let t=`${e}.lock`;Vd(Zd(t),{recursive:!0});let n=()=>{try{if(ma(t,"utf8").trim()===String(process.pid))Gd(t)}catch{}};try{ya(t,String(process.pid),{flag:"wx"})}catch{let s=Number(ma(t,"utf8").trim());if(s&&fe.pidAlive(s))throw new tn(`another slack stream (pid ${s}) already uses ${e}`);Gd(t),ya(t,String(process.pid),{flag:"wx"})}return n}async function Xd(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 ba(e,t,n,s,r){if(ew.has(ce(n.subtype)))return!1;let o=ce(n.user),i=ce(n.bot_id),l=e.opts.repliesTo,u=ce(n.thread_ts);if(s&&l&&u&&(l.has(o)||l.has(i))){let y=e.state.joined??={};y[`${t.id}:${u}`]=Math.max(y[`${t.id}:${u}`]??0,ge(ce(n.ts)))}if(o&&e.opts.selfUsers.has(o)||i&&e.opts.selfBots.has(i))return!1;e.opts.grep.lastIndex=0;let a=e.opts.grep.test(tw(n))?"grep":s&&l&&await ow(e,t,l,n,r)?"replies-to":void 0;if(!a)return!1;let c=ce(n.ts),d=`${t.id}:${c}`;if(e.state.seen?.[d]!==void 0)return!1;if(e.opts.relay&&!e.opts.once)(e.state.seen??={})[d]=ge(c);let f=ce(n.thread_ts)||null,p=o||i,g=o?await Xd(e,o):ce(n.username)||ce(n.bot_profile?.name)||i,h=t.isIm?`@${t.user?await Xd(e,t.user):t.id}`:t.isMpim?t.name:`#${t.name}`,m={type:s?"reply":"message",channel:{id:t.id,name:h},ts:c,thread_ts:f,user:{id:p,name:g},text:ce(n.text).replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"),permalink:nw(e.opts.teamUrl,t.id,c,f??void 0),match:a};return e.opts.json?fe.out(JSON.stringify(m)):fe.out(iw(m)),e.opts.onMatch?.(m,Array.isArray(n.files)?n.files.length:0),e.matches++,!0}async function ow(e,t,n,s,r){if(n.has(ce(s.parent_user_id)))return!0;let o=ce(s.thread_ts),i=ef(e,t,n,o,r);if(i!==void 0)return i;let l=`${t.id}:${o}`,u=e.notJoined?.get(l);if(u!==void 0&&u>=ge(ce(s.ts)))return!1;let a=u!==void 0?Dt(u):"0";return wa(e,t,n,o,await Gr((c)=>e.client.replies(t.id,o,a,c))),e.state.joined?.[l]!==void 0}function ef(e,t,n,s,r){if(e.state.joined?.[`${t.id}:${s}`]!==void 0)return!0;if(!r)return;if(n.has(ce(r.user))||n.has(ce(r.bot_id)))return!0;let o=Array.isArray(r.reply_users)?r.reply_users.map((l)=>ce(l)):void 0;if(o?.some((l)=>n.has(l)))return!0;let i=typeof r.reply_users_count==="number"?r.reply_users_count:void 0;if(o&&(i!==void 0?i<=o.length:o.length<5))return!1;return}function wa(e,t,n,s,r){let o=`${t.id}:${s}`,i=r.filter((u)=>n.has(ce(u.user))||n.has(ce(u.bot_id))).map((u)=>ge(ce(u.ts)));if(i.length){let u=e.state.joined??={};u[o]=Math.max(u[o]??0,...i),e.notJoined?.delete(o);return}let l=Math.max(e.notJoined?.get(o)??0,...r.map((u)=>ge(ce(u.ts))));(e.notJoined??=new Map).set(o,l)}function iw(e){let t=new Date(ge(e.ts)*1000).toISOString().replace(/\.\d+Z$/,"Z"),n=e.type==="reply"?"↳ ":"",s=e.text.split(`
|
|
247
247
|
`).join(`
|
|
248
248
|
`);return`${t} ${e.channel.name} ${n}@${e.user.name}: ${s}
|
|
249
|
-
${e.permalink}`}async function zo(e){let t=[],n;do{let s=await e(n);t.push(...s.messages),n=s.nextCursor}while(n);return t}async function Hb(e,t,n,s=!0){let o=e.state.channels[t.id],r=n-(e.opts.settleSec??5),i=n-e.opts.threadWindowSec,l=ge(o.cursor),u=s?Math.min(l,i):l,c=(await zo((f)=>e.client.history(t.id,bt(u),f))).sort((f,p)=>ge(ce(f.ts))-ge(ce(p.ts))),a=e.opts.repliesTo?new Map(c.map((f)=>[ce(f.ts),f])):void 0,d=c.at(-1);if(d&&ge(ce(d.ts))>ge(o.latest??"0"))o.latest=ce(d.ts);if(s)o.scanned=bt(n);for(let f of c){let p=ge(ce(f.ts));if(p<=l||p>r)continue;let g=ce(f.thread_ts),h=await ma(e,t,f,g!==""&&g!==ce(f.ts),g?a?.get(g):void 0);if(o.cursor=ce(f.ts),h)vt(e.opts.statePath,e.state)}if(ge(o.cursor)<r)o.cursor=bt(r);for(let f of c){let p=ce(f.ts),g=ge(ce(f.latest_reply));if(!g||ce(f.thread_ts)!==p)continue;let h=ge(o.threads[p]??o.since);if(g<=h)continue;let m=e.opts.repliesTo,y=m!==void 0&&Jd(e,t,m,p,f)===void 0,w=y?Math.min(h,e.notJoined?.get(`${t.id}:${p}`)??0):h,x=(await zo((D)=>e.client.replies(t.id,p,bt(w),D))).sort((D,E)=>ge(ce(D.ts))-ge(ce(E.ts)));if(y)ya(e,t,m,p,x);for(let D of x){let E=ge(ce(D.ts));if(ce(D.ts)===p||E<=h||E>r)continue;let C=ce(D.subtype)!=="thread_broadcast"&&await ma(e,t,D,!0,f);if(o.threads[p]=ce(D.ts),C)vt(e.opts.statePath,e.state)}o.threads[p]=bt(Math.max(ge(o.threads[p]??"0"),Math.min(g,r)))}for(let f of Object.keys(o.threads))if(ge(f)<i)delete o.threads[f];vt(e.opts.statePath,e.state)}async function zb(e,t,n){let s,o,r,i=e.opts.repliesTo,l=`${t.id}:${n.thread_ts??""}`;if(i&&n.thread_ts&&e.state.joined?.[l]===void 0){let g=Math.min(e.notJoined?.get(l)??0,ge(n.ts)-1),h=await zo((m)=>e.client.replies(t.id,n.thread_ts,bt(g),m));if(s=h.find((m)=>ce(m.ts)===n.ts),o=h.find((m)=>ce(m.ts)===n.thread_ts),s)ya(e,t,i,n.thread_ts,h)}for(let g=0;g<5&&!s;g++){let h=await e.client.replies(t.id,n.thread_ts??n.ts,bt(ge(n.ts)-1),r);if(s=h.messages.find((m)=>ce(m.ts)===n.ts),o??=n.thread_ts?h.messages.find((m)=>ce(m.ts)===n.thread_ts):void 0,r=h.nextCursor,!r)break}if(!s)return!1;let u=ce(s.thread_ts),c=e.state.channels[t.id],d=u!==""&&u!==n.ts&&ce(s.subtype)!=="thread_broadcast"?c?.threads[u]:c?.cursor;if(d!==void 0&&ge(n.ts)<=ge(d))return!0;let f=Object.keys(e.state.joined??{}).length;if(await ma(e,t,s,u!==""&&u!==n.ts,o)||Object.keys(e.state.joined??{}).length!==f)vt(e.opts.statePath,e.state);return!0}var Yb=2592000;function Gb(e,t){if(!e.joined)return;for(let[n,s]of Object.entries(e.joined))if(s<t)delete e.joined[n];if(!Object.keys(e.joined).length)delete e.joined}function Xb(e,t){if(!e.seen)return;for(let[n,s]of Object.entries(e.seen))if(s<t)delete e.seen[n];if(!Object.keys(e.seen).length)delete e.seen}var Vb=10;function Zb(e,t,n){if(!(t>0))return e;let s=60000/t,o=-1/0,r=async()=>{let i=fe.now();o=Math.max(o,i);let l=o-i-(Vb-1)*s;if(o+=s,l>0)await fe.sleep(l,n)};return{listChannels:(i)=>e.listChannels(i),userName:(i)=>e.userName(i),history:async(i,l,u)=>(await r(),e.history(i,l,u)),replies:async(i,l,u,c)=>(await r(),e.replies(i,l,u,c))}}function Qb(e,t,n,s){let o=n-s.windowSec,r=(f)=>t.channels[f.id],i=(f)=>r(f)?.scanned!==void 0&&ge(r(f).latest??"0")<o,l=(f)=>s.once||r(f)?.scanned===void 0||n-ge(r(f).scanned)>=s.periodSec,u=new Map,c=e.filter((f)=>!i(f)),a=s.once||s.periodSec<=s.intervalSec?1/0:Math.max(1,Math.ceil(c.length*s.intervalSec/s.periodSec)),d=c.filter(l).sort((f,p)=>ge(r(f)?.scanned??"0")-ge(r(p)?.scanned??"0")).slice(0,a);for(let f of d)u.set(f.id,"full");for(let f of e){if(u.has(f.id))continue;u.set(f.id,i(f)&&(f.isIm||f.isMpim)&&!l(f)?"skip":"cursor")}return u}async function Ud(e,t){let n=t.maxFailures??(t.once?3:12),s=t.backoffBaseMs??2000,o=t.backoffCapMs??300000,r=t.refreshEvery??10,i=t.once?void 0:t.relay;if(!i&&!t.once)fe.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, set up the relay (slack relay init) and set SLACK_RELAY_URL + SLACK_RELAY_TOKEN: ${Ib}`);e=Zb(e,t.callsPerMin??40,t.signal);let l,u=new AbortController,c=()=>u.abort();t.signal?.addEventListener("abort",c,{once:!0});try{l=Ub(t.statePath);let a=Jb(t.statePath,t.identity),d=t.repliesTo?[...t.repliesTo].sort().join(","):void 0;if(a.joinedBy!==d)delete a.joined;if(d)a.joinedBy=d;else delete a.joinedBy;let f={opts:t,client:e,state:a,names:new Map,matches:0},p=new Set,g=[],h=fe.now()/1000,m=h,y="",w=0,x=0,D=-1/0,E=0,C=(M)=>{fe.err(`slack stream: rate limited — waiting ${M.retryAfter}s`),E=Math.max(E,fe.now()+M.retryAfter*1000)},S=async(M)=>{if(g=(await e.listChannels(t.channels)).filter((de)=>!t.channels||t.channels.includes(de.id)),t.channels){for(let de of t.channels)if(!g.some((re)=>re.id===de))throw new tn(`--channel ${de}: the identity is not a member of it`)}let U=Object.keys(a.channels).length===0;for(let de of g){if(a.channels[de.id])continue;let K=Math.min(U||x===0?M:m,t.sinceSec!==void 0?h-t.sinceSec:1/0);a.channels[de.id]={since:bt(K),cursor:bt(K),threads:{}}}m=M,vt(t.statePath,a)};if(t.sinceSec!==void 0)a.channels={},delete a.seen,delete a.relay;let k={queue:[],retry:[],inflight:void 0,onDrain:void 0,handled:0,live:void 0,full:!1},O=new AbortController,P=()=>O.abort(),L=(M,oe="")=>{if(k.live===M)return;k.live=M,fe.err(M?`slack stream: relay connected${oe?` (${oe})`:""} — polling every ${Math.round(Math.max(t.intervalMs,i.reconcileMs)/1000)}s as a safety net`:`slack stream: relay unavailable${oe?` (${oe})`:""} — polling every ${Math.round(t.intervalMs/1000)}s`),P()},v=async(M)=>{let oe=t.sinceSec===void 0&&a.relay?.url===M.url?{seq:a.relay.seq,...a.relay.epoch?{epoch:a.relay.epoch}:{}}:{seq:0},U=0,de=()=>k.queue.length+k.retry.length+(k.inflight?1:0);while(!u.signal.aborted){while(de()>=qo/2&&!u.signal.aborted)await new Promise((W)=>{let he=()=>W();k.onDrain=()=>{u.signal.removeEventListener("abort",he),W()},u.signal.addEventListener("abort",he,{once:!0})});if(u.signal.aborted)return;let re=new AbortController,K=()=>re.abort();u.signal.addEventListener("abort",K,{once:!0});let ie=!1,G="stream closed";try{await M.subscribe(oe,re.signal,{hello:(W)=>{if(U=0,W.gap)k.full=!0;if(W.gap||a.relay?.url!==M.url||a.relay.epoch!==W.epoch){a.relay={url:M.url,seq:W.seq,...W.epoch?{epoch:W.epoch}:{}},k.handled=Math.min(k.handled,W.seq);for(let he of[...k.queue,...k.retry,...k.inflight?[k.inflight]:[]])he.seq=Math.min(he.seq,W.seq)}oe={seq:W.seq,...W.epoch?{epoch:W.epoch}:{}},L(!0,W.via)},bell:(W,he)=>{if(ie)return;if(de()>=qo){fe.err(`slack stream: relay backlog over ${qo} — pausing the relay until it drains`),ie=!0,re.abort(),L(!1,"paused while its backlog drains");return}oe={...oe,seq:W},k.queue.push({seq:W,bell:he,tries:0,dueMs:0}),P()}})}catch(W){if(W instanceof fa){if(k.live)L(!1,Ge(W));k.live=!1,fe.err(`slack stream: relay disabled for this run: ${Ge(W)} — check SLACK_RELAY_TOKEN`);return}G=Ge(W)}finally{u.signal.removeEventListener("abort",K)}if(u.signal.aborted)return;if(ie)continue;L(!1,G),U++,await fe.sleep(Ho(U,2000,60000),u.signal)}};if(i)v(i);let j=async(M)=>{if(t.channels&&!t.channels.includes(M.channel))return!0;if(M.kind==="reaction"){if(!t.reactions||M.self&&t.selfUsers.has(M.self))return!0;if(M.user&&t.selfUsers.has(M.user))return!0;let de={type:"reaction",channel:{id:M.channel},ts:M.ts,user:{id:M.user??""}};return fe.out(t.json?JSON.stringify(de):`reaction ${M.channel} ${M.ts} by ${M.user??"?"}`),!0}let oe=g.find((de)=>de.id===M.channel);if(!oe){if(fe.now()/1000-m<60)return!1;await S(fe.now()/1000),oe=g.find((de)=>de.id===M.channel)}let U=oe&&a.channels[oe.id];if(!oe||!U||p.has(oe.id))return!0;if(ge(M.ts)<ge(U.since))return!0;if(M.self&&t.selfUsers.has(M.self)){if(t.repliesTo?.has(M.self)&&M.thread_ts){let de=a.joined??={},re=`${oe.id}:${M.thread_ts}`;de[re]=Math.max(de[re]??0,ge(M.ts)),f.notJoined?.delete(re),vt(t.statePath,a)}return!0}return zb(f,oe,M)},H=()=>{if(!a.relay||a.relay.url!==i?.url)return;let M=[...k.queue,...k.retry,...k.inflight?[k.inflight]:[]].map((oe)=>oe.seq);a.relay.seq=Math.max(0,M.length?Math.min(...M)-1:Math.max(a.relay.seq,k.handled))},B=async()=>{let M=fe.now(),oe=k.retry.filter((re)=>re.dueMs<=M);if(oe.length)k.retry=k.retry.filter((re)=>re.dueMs>M),k.queue=[...oe,...k.queue].sort((re,K)=>re.seq-K.seq);let U=0;while(k.queue.length&&U<Pb&&!t.signal?.aborted&&fe.now()>=E){let re=k.queue.shift();k.inflight=re,U++;let K,ie;try{K=await j(re.bell)}catch(G){if(G instanceof qe){C(G),re.dueMs=E,k.retry.push(re),k.inflight=void 0;break}K=!1,ie=G}if(k.inflight=void 0,ie!==void 0&&/thread_not_found|message_not_found/.test(Ge(ie)))ie=void 0;if(ie!==void 0&&pa(ie)==="channel")fe.err(`slack stream: relay bell for ${re.bell.channel} dropped: ${Ge(ie)}`),K=!0;if(ie===void 0&&Q)fe.err("slack stream: relay bell reads recovered"),Q=!1;if(K)k.handled=Math.max(k.handled,re.seq);else if(ie!==void 0){if(re.fails=(re.fails??0)+1,!Q)fe.err(`slack stream: relay bell for ${re.bell.channel} failed (${Ge(ie)}) — retrying`);Q=!0,re.dueMs=fe.now()+Ho(re.fails,1500,60000),k.retry.push(re)}else if(++re.tries>=Lb)fe.err(`slack stream: relay bell for ${re.bell.channel} abandoned after ${re.tries} tries (not visible) — only the poll can find it now`),k.handled=Math.max(k.handled,re.seq);else re.dueMs=fe.now()+Ho(re.tries,1500,60000),k.retry.push(re)}if(k.onDrain&&k.queue.length+k.retry.length<qo/2)k.onDrain(),k.onDrain=void 0;let de=a.relay?.seq;if(H(),U||a.relay?.seq!==de)vt(t.statePath,a)},q=()=>k.live===!0&&i?Math.max(t.intervalMs,i.reconcileMs):t.intervalMs,z=()=>{let M=fe.now();return(M>=D+q()||k.full)&&M>=E},R=()=>k.queue.length>0||k.retry.some((M)=>M.dueMs<=fe.now()),te=!1,Q=!1;while(!t.signal?.aborted){if(z()&&!(te&&R())){k.full=!1;let U=fe.now()/1000;try{if(x%r===0)await S(U);let de=Math.max(0,t.threadScanSec??180),re=Qb(g.filter((K)=>!p.has(K.id)),a,U,{windowSec:t.threadWindowSec,periodSec:de,intervalSec:q()/1000,once:t.once});for(let K of g){if(t.signal?.aborted)break;if(p.has(K.id))continue;let ie=re.get(K.id)??"full";if(ie==="skip")continue;for(;;)try{let G=a.channels[K.id],W=ie==="cursor"&&G.scanned!==void 0&&ge(G.latest??"0")<U-t.threadWindowSec&&U-ge(G.scanned)>=de;if(await Hb(f,K,U,ie==="full"),W)G.scanned=bt(U),vt(t.statePath,a);break}catch(G){if(G instanceof qe){if(C(G),await fe.sleep(E-fe.now(),t.signal),t.signal?.aborted)break;continue}if(pa(G)==="channel"){p.add(K.id),y=Ge(G),fe.err(`slack stream: skipping ${K.isIm?K.id:"#"+K.name} (${K.id}): ${Ge(G)}`);break}throw G}}if(g.length>0&&g.every((K)=>p.has(K.id)))throw new tn(`every channel failed — nothing left to watch (last: ${y})`);if(w>0)fe.err(`slack stream: recovered after ${w} failed attempt(s)`);w=0}catch(de){if(de instanceof tn||pa(de)==="fatal")return fe.err(`slack stream: fatal: ${Ge(de)}`),3;if(w++,w>=n)return fe.err(`slack stream: giving up after ${w} consecutive failures: ${Ge(de)}`),3;let re=Ho(w,s,o);fe.err(`slack stream: ${Ge(de)} — reconnecting in ${(re/1000).toFixed(1)}s (attempt ${w}/${n})`),await fe.sleep(re,t.signal),k.full=!0;continue}if(x++,Xb(a,U-t.threadWindowSec-86400),Gb(a,U-Yb),t.once){if(vt(t.statePath,a),f.matches===0)fe.err(`slack stream: no matches in ${g.length-p.size} channel(s)`);return f.matches>0?0:2}D=U*1000,te=!0}if(t.signal?.aborted)break;let M=fe.now(),oe=Math.max(E,k.queue.length||k.full?M:Math.min(D+q(),...k.retry.map((U)=>U.dueMs)));if(oe>M){O=new AbortController;let U=O,de=()=>U.abort();t.signal?.addEventListener("abort",de,{once:!0}),await fe.sleep(oe-M,U.signal),t.signal?.removeEventListener("abort",de)}if(z()&&!(te&&R()))continue;await B(),te=!1}return 0}catch(a){return fe.err(`slack stream: fatal: ${Ge(a)}`),3}finally{u.abort(),t.signal?.removeEventListener("abort",c),l?.()}}class Kd extends Error{}function ew(e,t){let n;while((n=e.indexOf(`
|
|
249
|
+
${e.permalink}`}async function Gr(e){let t=[],n;do{let s=await e(n);t.push(...s.messages),n=s.nextCursor}while(n);return t}async function aw(e,t,n,s=!0){let r=e.state.channels[t.id],o=n-(e.opts.settleSec??5),i=n-e.opts.threadWindowSec,l=ge(r.cursor),u=s?Math.min(l,i):l,a=(await Gr((f)=>e.client.history(t.id,Dt(u),f))).sort((f,p)=>ge(ce(f.ts))-ge(ce(p.ts))),c=e.opts.repliesTo?new Map(a.map((f)=>[ce(f.ts),f])):void 0,d=a.at(-1);if(d&&ge(ce(d.ts))>ge(r.latest??"0"))r.latest=ce(d.ts);if(s)r.scanned=Dt(n);for(let f of a){let p=ge(ce(f.ts));if(p<=l||p>o)continue;let g=ce(f.thread_ts),h=await ba(e,t,f,g!==""&&g!==ce(f.ts),g?c?.get(g):void 0);if(r.cursor=ce(f.ts),h)Pt(e.opts.statePath,e.state)}if(ge(r.cursor)<o)r.cursor=Dt(o);for(let f of a){let p=ce(f.ts),g=ge(ce(f.latest_reply));if(!g||ce(f.thread_ts)!==p)continue;let h=ge(r.threads[p]??r.since);if(g<=h)continue;let m=e.opts.repliesTo,y=m!==void 0&&ef(e,t,m,p,f)===void 0,w=y?Math.min(h,e.notJoined?.get(`${t.id}:${p}`)??0):h,x=(await Gr((D)=>e.client.replies(t.id,p,Dt(w),D))).sort((D,E)=>ge(ce(D.ts))-ge(ce(E.ts)));if(y)wa(e,t,m,p,x);for(let D of x){let E=ge(ce(D.ts));if(ce(D.ts)===p||E<=h||E>o)continue;let C=ce(D.subtype)!=="thread_broadcast"&&await ba(e,t,D,!0,f);if(r.threads[p]=ce(D.ts),C)Pt(e.opts.statePath,e.state)}r.threads[p]=Dt(Math.max(ge(r.threads[p]??"0"),Math.min(g,o)))}for(let f of Object.keys(r.threads))if(ge(f)<i)delete r.threads[f];Pt(e.opts.statePath,e.state)}async function cw(e,t,n){let s,r,o,i=e.opts.repliesTo,l=`${t.id}:${n.thread_ts??""}`;if(i&&n.thread_ts&&e.state.joined?.[l]===void 0){let g=Math.min(e.notJoined?.get(l)??0,ge(n.ts)-1),h=await Gr((m)=>e.client.replies(t.id,n.thread_ts,Dt(g),m));if(s=h.find((m)=>ce(m.ts)===n.ts),r=h.find((m)=>ce(m.ts)===n.thread_ts),s)wa(e,t,i,n.thread_ts,h)}for(let g=0;g<5&&!s;g++){let h=await e.client.replies(t.id,n.thread_ts??n.ts,Dt(ge(n.ts)-1),o);if(s=h.messages.find((m)=>ce(m.ts)===n.ts),r??=n.thread_ts?h.messages.find((m)=>ce(m.ts)===n.thread_ts):void 0,o=h.nextCursor,!o)break}if(!s)return!1;let u=ce(s.thread_ts),a=e.state.channels[t.id],d=u!==""&&u!==n.ts&&ce(s.subtype)!=="thread_broadcast"?a?.threads[u]:a?.cursor;if(d!==void 0&&ge(n.ts)<=ge(d))return!0;let f=Object.keys(e.state.joined??{}).length;if(await ba(e,t,s,u!==""&&u!==n.ts,r)||Object.keys(e.state.joined??{}).length!==f)Pt(e.opts.statePath,e.state);return!0}var lw=2592000;function uw(e,t){if(!e.joined)return;for(let[n,s]of Object.entries(e.joined))if(s<t)delete e.joined[n];if(!Object.keys(e.joined).length)delete e.joined}function dw(e,t){if(!e.seen)return;for(let[n,s]of Object.entries(e.seen))if(s<t)delete e.seen[n];if(!Object.keys(e.seen).length)delete e.seen}var fw=10;function pw(e,t,n){if(!(t>0))return e;let s=60000/t,r=-1/0,o=async()=>{let i=fe.now();r=Math.max(r,i);let l=r-i-(fw-1)*s;if(r+=s,l>0)await fe.sleep(l,n)};return{listChannels:(i)=>e.listChannels(i),userName:(i)=>e.userName(i),history:async(i,l,u)=>(await o(),e.history(i,l,u)),replies:async(i,l,u,a)=>(await o(),e.replies(i,l,u,a))}}function hw(e,t,n,s){let r=n-s.windowSec,o=(f)=>t.channels[f.id],i=(f)=>o(f)?.scanned!==void 0&&ge(o(f).latest??"0")<r,l=(f)=>s.once||o(f)?.scanned===void 0||n-ge(o(f).scanned)>=s.periodSec,u=new Map,a=e.filter((f)=>!i(f)),c=s.once||s.periodSec<=s.intervalSec?1/0:Math.max(1,Math.ceil(a.length*s.intervalSec/s.periodSec)),d=a.filter(l).sort((f,p)=>ge(o(f)?.scanned??"0")-ge(o(p)?.scanned??"0")).slice(0,c);for(let f of d)u.set(f.id,"full");for(let f of e){if(u.has(f.id))continue;u.set(f.id,i(f)&&(f.isIm||f.isMpim)&&!l(f)?"skip":"cursor")}return u}async function tf(e,t){let n=t.maxFailures??(t.once?3:12),s=t.backoffBaseMs??2000,r=t.backoffCapMs??300000,o=t.refreshEvery??10,i=t.once?void 0:t.relay;if(!i&&!t.once)fe.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, set up the relay (slack relay init) and set SLACK_RELAY_URL + SLACK_RELAY_TOKEN: ${Gb}`);e=pw(e,t.callsPerMin??40,t.signal);let l,u=new AbortController,a=()=>u.abort();t.signal?.addEventListener("abort",a,{once:!0});try{l=rw(t.statePath);let c=sw(t.statePath,t.identity),d=t.repliesTo?[...t.repliesTo].sort().join(","):void 0;if(c.joinedBy!==d)delete c.joined;if(d)c.joinedBy=d;else delete c.joinedBy;let f={opts:t,client:e,state:c,names:new Map,matches:0},p=new Set,g=[],h=fe.now()/1000,m=h,y="",w=0,x=0,D=-1/0,E=0,C=(M)=>{fe.err(`slack stream: rate limited — waiting ${M.retryAfter}s`),E=Math.max(E,fe.now()+M.retryAfter*1000)},S=async(M)=>{if(g=(await e.listChannels(t.channels)).filter((de)=>!t.channels||t.channels.includes(de.id)),t.channels){for(let de of t.channels)if(!g.some((oe)=>oe.id===de))throw new tn(`--channel ${de}: the identity is not a member of it`)}let J=Object.keys(c.channels).length===0;for(let de of g){if(c.channels[de.id])continue;let K=Math.min(J||x===0?M:m,t.sinceSec!==void 0?h-t.sinceSec:1/0);c.channels[de.id]={since:Dt(K),cursor:Dt(K),threads:{}}}m=M,Pt(t.statePath,c)};if(t.sinceSec!==void 0)c.channels={},delete c.seen,delete c.relay;let k={queue:[],retry:[],inflight:void 0,onDrain:void 0,handled:0,live:void 0,full:!1},O=new AbortController,L=()=>O.abort(),P=(M,re="")=>{if(k.live===M)return;k.live=M,fe.err(M?`slack stream: relay connected${re?` (${re})`:""} — polling every ${Math.round(Math.max(t.intervalMs,i.reconcileMs)/1000)}s as a safety net`:`slack stream: relay unavailable${re?` (${re})`:""} — polling every ${Math.round(t.intervalMs/1000)}s`),L()},v=async(M)=>{let re=t.sinceSec===void 0&&c.relay?.url===M.url?{seq:c.relay.seq,...c.relay.epoch?{epoch:c.relay.epoch}:{}}:{seq:0},J=0,de=()=>k.queue.length+k.retry.length+(k.inflight?1:0);while(!u.signal.aborted){while(de()>=zr/2&&!u.signal.aborted)await new Promise((W)=>{let he=()=>W();k.onDrain=()=>{u.signal.removeEventListener("abort",he),W()},u.signal.addEventListener("abort",he,{once:!0})});if(u.signal.aborted)return;let oe=new AbortController,K=()=>oe.abort();u.signal.addEventListener("abort",K,{once:!0});let ie=!1,Y="stream closed";try{await M.subscribe(re,oe.signal,{hello:(W)=>{if(J=0,W.gap)k.full=!0;if(W.gap||c.relay?.url!==M.url||c.relay.epoch!==W.epoch){c.relay={url:M.url,seq:W.seq,...W.epoch?{epoch:W.epoch}:{}},k.handled=Math.min(k.handled,W.seq);for(let he of[...k.queue,...k.retry,...k.inflight?[k.inflight]:[]])he.seq=Math.min(he.seq,W.seq)}re={seq:W.seq,...W.epoch?{epoch:W.epoch}:{}},P(!0,W.via)},bell:(W,he)=>{if(ie)return;if(de()>=zr){fe.err(`slack stream: relay backlog over ${zr} — pausing the relay until it drains`),ie=!0,oe.abort(),P(!1,"paused while its backlog drains");return}re={...re,seq:W},k.queue.push({seq:W,bell:he,tries:0,dueMs:0}),L()}})}catch(W){if(W instanceof ha){if(k.live)P(!1,Ye(W));k.live=!1,fe.err(`slack stream: relay disabled for this run: ${Ye(W)} — check SLACK_RELAY_TOKEN`);return}Y=Ye(W)}finally{u.signal.removeEventListener("abort",K)}if(u.signal.aborted)return;if(ie)continue;P(!1,Y),J++,await fe.sleep(es(J,2000,60000),u.signal)}};if(i)v(i);let j=async(M)=>{if(t.channels&&!t.channels.includes(M.channel))return!0;if(M.kind==="reaction"){if(!t.reactions||M.self&&t.selfUsers.has(M.self))return!0;if(M.user&&t.selfUsers.has(M.user))return!0;let de={type:"reaction",channel:{id:M.channel},ts:M.ts,user:{id:M.user??""}};return fe.out(t.json?JSON.stringify(de):`reaction ${M.channel} ${M.ts} by ${M.user??"?"}`),!0}let re=g.find((de)=>de.id===M.channel);if(!re){if(fe.now()/1000-m<60)return!1;await S(fe.now()/1000),re=g.find((de)=>de.id===M.channel)}let J=re&&c.channels[re.id];if(!re||!J||p.has(re.id))return!0;if(ge(M.ts)<ge(J.since))return!0;if(M.self&&t.selfUsers.has(M.self)){if(t.repliesTo?.has(M.self)&&M.thread_ts){let de=c.joined??={},oe=`${re.id}:${M.thread_ts}`;de[oe]=Math.max(de[oe]??0,ge(M.ts)),f.notJoined?.delete(oe),Pt(t.statePath,c)}return!0}return cw(f,re,M)},H=()=>{if(!c.relay||c.relay.url!==i?.url)return;let M=[...k.queue,...k.retry,...k.inflight?[k.inflight]:[]].map((re)=>re.seq);c.relay.seq=Math.max(0,M.length?Math.min(...M)-1:Math.max(c.relay.seq,k.handled))},B=async()=>{let M=fe.now(),re=k.retry.filter((oe)=>oe.dueMs<=M);if(re.length)k.retry=k.retry.filter((oe)=>oe.dueMs>M),k.queue=[...re,...k.queue].sort((oe,K)=>oe.seq-K.seq);let J=0;while(k.queue.length&&J<Xb&&!t.signal?.aborted&&fe.now()>=E){let oe=k.queue.shift();k.inflight=oe,J++;let K,ie;try{K=await j(oe.bell)}catch(Y){if(Y instanceof qe){C(Y),oe.dueMs=E,k.retry.push(oe),k.inflight=void 0;break}K=!1,ie=Y}if(k.inflight=void 0,ie!==void 0&&/thread_not_found|message_not_found/.test(Ye(ie)))ie=void 0;if(ie!==void 0&&ga(ie)==="channel")fe.err(`slack stream: relay bell for ${oe.bell.channel} dropped: ${Ye(ie)}`),K=!0;if(ie===void 0&&Q)fe.err("slack stream: relay bell reads recovered"),Q=!1;if(K)k.handled=Math.max(k.handled,oe.seq);else if(ie!==void 0){if(oe.fails=(oe.fails??0)+1,!Q)fe.err(`slack stream: relay bell for ${oe.bell.channel} failed (${Ye(ie)}) — retrying`);Q=!0,oe.dueMs=fe.now()+es(oe.fails,1500,60000),k.retry.push(oe)}else if(++oe.tries>=Vb)fe.err(`slack stream: relay bell for ${oe.bell.channel} abandoned after ${oe.tries} tries (not visible) — only the poll can find it now`),k.handled=Math.max(k.handled,oe.seq);else oe.dueMs=fe.now()+es(oe.tries,1500,60000),k.retry.push(oe)}if(k.onDrain&&k.queue.length+k.retry.length<zr/2)k.onDrain(),k.onDrain=void 0;let de=c.relay?.seq;if(H(),J||c.relay?.seq!==de)Pt(t.statePath,c)},q=()=>k.live===!0&&i?Math.max(t.intervalMs,i.reconcileMs):t.intervalMs,z=()=>{let M=fe.now();return(M>=D+q()||k.full)&&M>=E},R=()=>k.queue.length>0||k.retry.some((M)=>M.dueMs<=fe.now()),te=!1,Q=!1;while(!t.signal?.aborted){if(z()&&!(te&&R())){k.full=!1;let J=fe.now()/1000;try{if(x%o===0)await S(J);let de=Math.max(0,t.threadScanSec??180),oe=hw(g.filter((K)=>!p.has(K.id)),c,J,{windowSec:t.threadWindowSec,periodSec:de,intervalSec:q()/1000,once:t.once});for(let K of g){if(t.signal?.aborted)break;if(p.has(K.id))continue;let ie=oe.get(K.id)??"full";if(ie==="skip")continue;for(;;)try{let Y=c.channels[K.id],W=ie==="cursor"&&Y.scanned!==void 0&&ge(Y.latest??"0")<J-t.threadWindowSec&&J-ge(Y.scanned)>=de;if(await aw(f,K,J,ie==="full"),W)Y.scanned=Dt(J),Pt(t.statePath,c);break}catch(Y){if(Y instanceof qe){if(C(Y),await fe.sleep(E-fe.now(),t.signal),t.signal?.aborted)break;continue}if(ga(Y)==="channel"){p.add(K.id),y=Ye(Y),fe.err(`slack stream: skipping ${K.isIm?K.id:"#"+K.name} (${K.id}): ${Ye(Y)}`);break}throw Y}}if(g.length>0&&g.every((K)=>p.has(K.id)))throw new tn(`every channel failed — nothing left to watch (last: ${y})`);if(w>0)fe.err(`slack stream: recovered after ${w} failed attempt(s)`);w=0}catch(de){if(de instanceof tn||ga(de)==="fatal")return fe.err(`slack stream: fatal: ${Ye(de)}`),3;if(w++,w>=n)return fe.err(`slack stream: giving up after ${w} consecutive failures: ${Ye(de)}`),3;let oe=es(w,s,r);fe.err(`slack stream: ${Ye(de)} — reconnecting in ${(oe/1000).toFixed(1)}s (attempt ${w}/${n})`),await fe.sleep(oe,t.signal),k.full=!0;continue}if(x++,dw(c,J-t.threadWindowSec-86400),uw(c,J-lw),t.once){if(Pt(t.statePath,c),f.matches===0)fe.err(`slack stream: no matches in ${g.length-p.size} channel(s)`);return f.matches>0?0:2}D=J*1000,te=!0}if(t.signal?.aborted)break;let M=fe.now(),re=Math.max(E,k.queue.length||k.full?M:Math.min(D+q(),...k.retry.map((J)=>J.dueMs)));if(re>M){O=new AbortController;let J=O,de=()=>J.abort();t.signal?.addEventListener("abort",de,{once:!0}),await fe.sleep(re-M,J.signal),t.signal?.removeEventListener("abort",de)}if(z()&&!(te&&R()))continue;await B(),te=!1}return 0}catch(c){return fe.err(`slack stream: fatal: ${Ye(c)}`),3}finally{u.abort(),t.signal?.removeEventListener("abort",a),l?.()}}class nf extends Error{}function gw(e,t){let n;while((n=e.indexOf(`
|
|
250
250
|
|
|
251
|
-
`))>=0){let s=e.slice(0,n);e=e.slice(n+2);let
|
|
252
|
-
`)){if(!l||l.startsWith(":"))continue;let u=l.indexOf(":"),
|
|
253
|
-
`),
|
|
254
|
-
`),(y,w,x)=>{let D=JSON.parse(w);if(y==="hello")
|
|
251
|
+
`))>=0){let s=e.slice(0,n);e=e.slice(n+2);let r="message",o,i=[];for(let l of s.split(`
|
|
252
|
+
`)){if(!l||l.startsWith(":"))continue;let u=l.indexOf(":"),a=u<0?l:l.slice(0,u),c=u<0?"":l.slice(u+1).replace(/^ /,"");if(a==="event")r=c;else if(a==="data")i.push(c);else if(a==="id")o=c}if(i.length)t(r,i.join(`
|
|
253
|
+
`),o)}return e}var mw="slack-term-relay.v1";function yw(e){return`bearer.${Buffer.from(e,"utf8").toString("base64url")}`}function Da(e){return e==="websocket"||e==="sse"?e:"auto"}var bw=32;function sf(e){return e===void 0?"":`?after=${e.seq}${e.epoch?`&epoch=${encodeURIComponent(e.epoch)}`:""}`}function ka(e,t,n=70000,s={}){let r=e.replace(/\/+$/,""),o=s.transport??"auto",i=Dw(r,t,n);return async(l,u,a)=>{let c=s.WebSocket===void 0?globalThis.WebSocket:s.WebSocket;if(o!=="sse")if(!c){if(o==="websocket")throw Error("relay: this runtime has no WebSocket")}else{if(await ww(c,r,t,n,s.pingMs??25000,s.ackDelayMs??100,l,u,a)||u.aborted)return;if(o==="websocket")throw Error("relay: WebSocket connection failed")}return i(l,u,a)}}function ww(e,t,n,s,r,o,i,l,u){return new Promise((a,c)=>{if(l.aborted)return a(!0);let d;try{d=new e(`${t.replace(/^http/i,"ws")}/ws${sf(i)}`,[mw,yw(n)])}catch{return a(!1)}let f=!1,p=!1,g,h,m,y=0,w=0,x=(S)=>{if(p)return;p=!0,clearTimeout(g),clearTimeout(h),clearInterval(m),l.removeEventListener("abort",D),d.onopen=d.onmessage=d.onerror=d.onclose=null;try{d.close(1000)}catch{}if(S)c(S);else a(f||l.aborted)},D=()=>x();l.addEventListener("abort",D,{once:!0});let E=()=>{clearTimeout(g),g=setTimeout(()=>x(f?Error(`relay: no data for ${Math.round(s/1000)}s`):void 0),s)},C=()=>{if(clearTimeout(h),h=void 0,y<=w)return;w=y;try{d.send(JSON.stringify({type:"ack",seq:y}))}catch{}};E(),d.onopen=()=>{f=!0,E(),m=setInterval(()=>{try{d.send("ping")}catch{}},r)},d.onmessage=(S)=>{if(E(),typeof S.data!=="string"||S.data==="pong")return;let k;try{k=JSON.parse(S.data)}catch(O){return x(O)}if(k.type==="hello"){let{type:O,...L}=k;y=w=L.seq,u.hello({...L,via:"websocket"})}else if(k.type==="bell"&&typeof k.seq==="number"){if(u.bell(k.seq,k.bell),p)return;if(y=Math.max(y,k.seq),y-w>=bw)C();else h??=setTimeout(C,o)}},d.onerror=()=>{},d.onclose=(S)=>{if(!f||S.code===1000)return x();x(Error(`relay: WebSocket closed (${S.code}${S.reason?` ${S.reason}`:""})`))}})}function Dw(e,t,n){return async(s,r,o)=>{let i=new AbortController,l=()=>i.abort();r.addEventListener("abort",l,{once:!0});let u,a=!1,c=()=>{clearTimeout(u),u=setTimeout(()=>{a=!0,i.abort()},n)};try{c();let d=await fetch(`${e}/stream${sf(s)}`,{headers:{authorization:`Bearer ${t}`,accept:"text/event-stream"},signal:i.signal});if(d.status===401)throw new nf("relay rejected the token (401)");if(!d.ok||!d.body)throw Error(`relay: HTTP ${d.status}`);let f=d.body.getReader(),p=new TextDecoder,g="";for(;;){let{done:h,value:m}=await f.read();if(h)return;c(),g=gw((g+p.decode(m,{stream:!0})).replace(/\r\n/g,`
|
|
254
|
+
`),(y,w,x)=>{let D=JSON.parse(w);if(y==="hello")o.hello({...D,via:"sse"});else if(y==="bell"&&x!==void 0)o.bell(Number(x),D)})}}catch(d){if(r.aborted)return;if(a)throw Error(`relay: no data for ${Math.round(n/1000)}s`);throw d}finally{clearTimeout(u),r.removeEventListener("abort",l)}}}import{spawnSync as lf}from"node:child_process";import{closeSync as kw,mkdirSync as xw,openSync as Sw,readFileSync as uf,unlinkSync as of,writeFileSync as _w}from"node:fs";import{dirname as Ew}from"node:path";function rf(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}var af=1000;function cf(e,t){let n=e.split(/\s+/).filter(Boolean).join(" ");if(t<=1)return"";return n.length<=t?n:`${n.slice(0,t-1)}…`}function df(e){let t=`[ask-answer] ${e.link} →`,n=cf(e.answer,300),s=e.how?` (${e.how})`:"";if(e.freeText)s+=" — a free-text reply, not a choice: the question stays open";else if(e.collected)s+=" — collected ✅";let r=cf(e.question,af-t.length-n.length-s.length-8);return`${t} ${n}${s}. Q: ${r}`.slice(0,af)}var $w=(e,t)=>lf(e,t,{encoding:"utf8",timeout:60000});function Cw(e){try{let t=uf(`/proc/${e}/stat`,"utf8");return Number(t.slice(t.lastIndexOf(")")+2).split(" ")[1])||0}catch{let t=lf("ps",["-o","ppid=","-p",String(e)],{encoding:"utf8",timeout:2000});return Number((t.stdout??"").trim())||0}}function ff(e,t,n=$w,s=Cw){for(let r=0;r<4&&e>1;r++,e=s(e)){let o=n(process.env.SLACK_TERM_AY||"ay",["send",String(e),"--force",t]);if(o.error)return;let i=`${o.stdout??""}${o.stderr??""}`;if(/no agent matched/i.test(i))continue;if(o.status===0||/QUEUED|sent to pid|NOT SUBMITTED/.test(i))return e}return}function pf(e){xw(Ew(e),{recursive:!0});for(let t=0;t<2;t++)try{let n=Sw(e,"wx");return _w(n,String(process.pid)),kw(n),()=>{try{of(e)}catch{}}}catch{let n=0;try{n=Number(uf(e,"utf8").trim())}catch{}if(n&&n!==process.pid&&rf(n))return;try{of(e)}catch{}}return}import{existsSync as Fw,mkdirSync as Tw,writeFileSync as Ow}from"node:fs";import{basename as Rw,join as xa,resolve as gf}from"node:path";import{randomBytes as Iw}from"node:crypto";var hf={name:"slack-term",version:"1.53.0",repository:{type:"git",url:"https://github.com/snomiao/slack-term.git"},bugs:{url:"https://github.com/snomiao/slack-term/issues"},devDependencies:{"@semantic-release/commit-analyzer":"^13","@semantic-release/github":"^12","@semantic-release/npm":"^13","@semantic-release/release-notes-generator":"^14","@types/bun":"latest","@types/node":"^22","@types/yargs":"^17.0.35","@typescript/native-preview":"^7.0.0-dev.20260707.2","@vitest/coverage-istanbul":"4.1.10","semantic-release":"^24",typescript:"^5.6",vitest:"4.1.10"},bin:{slack:"./ts/cli.ts"},exports:{"./worker":"./worker/src/index.ts","./package.json":"./package.json"},description:"Slack CLI — read activity/news/mentions, search, send messages with a confirm-hash safety gate.",engines:{node:">=18"},files:["ts/","locales/","dist/","worker/src/","README.md","SKILL.md","LICENSE"],homepage:"https://github.com/snomiao/slack-term",keywords:["slack","cli","messaging","agent","terminal"],license:"MIT",overrides:{"@semantic-release/npm":"^13","@semantic-release/github":"^12"},publishConfig:{access:"public",bin:{slack:"./dist/cli.js"}},scripts:{dev:"bun run ts/cli.ts",build:"bun build ts/cli.ts --target=node --outfile dist/cli.js --minify",typecheck:"tsgo --noEmit","typecheck:tsc":"tsc --noEmit","typecheck:worker":"bun install --cwd worker --frozen-lockfile && tsgo --noEmit -p worker",test:"bun test tests/ --timeout 90000 --parallel=2","test:watch":"bun test tests/ --timeout 90000 --isolate --watch","test:parity":"bash tests/parity.sh",record:"bun run tests/record.ts",anonymize:"bun run tests/anonymize.ts","scan-pii":"bash .githooks/pre-commit","scan-pii:all":"bash .githooks/pre-commit --all",prepare:"git config core.hooksPath .githooks 2>/dev/null || true",prepublishOnly:"bun run scan-pii:all && bun run typecheck && bun run build","test:coverage":"vitest run --coverage --exclude tests/parity.test.ts --no-file-parallelism"},type:"module",dependencies:{yargs:"^18.0.0"},peerDependencies:{"@cloudflare/workers-types":"^4"},peerDependenciesMeta:{"@cloudflare/workers-types":{optional:!0}}};var vw="4.105.0",Pw="2026-07-01",Sa="slack-term-relay",Lw="https://github.com/snomiao/slack-term/blob/main/worker/README.md";function Nw(e){return/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(e)}function Mw(e){return Rw(gf(e)).toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,63).replace(/-+$/,"")||Sa}function Bw(e,t={}){let n={name:e,private:!0,type:"module",scripts:{deploy:"wrangler deploy",dev:"wrangler dev --local"},dependencies:{"slack-term":t.slackTerm??`^${hf.version}`},devDependencies:{wrangler:vw},engines:{node:">=22"}};return{"package.json":`${JSON.stringify(n,null,2)}
|
|
255
255
|
`,"wrangler.jsonc":`// slack-term relay: Slack Events API -> doorbells for \`slack stream\`.
|
|
256
256
|
// Secrets (not in this file): wrangler secret put SLACK_SIGNING_SECRET / RELAY_TOKEN / SLACK_TEAM_ID (optional)
|
|
257
257
|
{
|
|
258
258
|
"$schema": "node_modules/wrangler/config-schema.json",
|
|
259
259
|
"name": ${JSON.stringify(e)},
|
|
260
260
|
"main": "src/index.ts",
|
|
261
|
-
"compatibility_date": "${
|
|
261
|
+
"compatibility_date": "${Pw}",
|
|
262
262
|
"durable_objects": {
|
|
263
263
|
"bindings": [{ "name": "RELAY", "class_name": "Relay" }]
|
|
264
264
|
},
|
|
@@ -274,7 +274,7 @@ export { default, Relay } from "slack-term/worker";
|
|
|
274
274
|
.wrangler/
|
|
275
275
|
.dev.vars*
|
|
276
276
|
.env*
|
|
277
|
-
`,"README.md":
|
|
277
|
+
`,"README.md":jw(e)}}function mf(e,t){let n=t??"<RELAY_TOKEN>";return`1. Node >= 22 (wrangler 4 needs it), then install:
|
|
278
278
|
npm install
|
|
279
279
|
2. Log in to Cloudflare:
|
|
280
280
|
npx wrangler login
|
|
@@ -295,7 +295,7 @@ export { default, Relay } from "slack-term/worker";
|
|
|
295
295
|
6. Check it:
|
|
296
296
|
slack relay health # or: curl -H "Authorization: Bearer $SLACK_RELAY_TOKEN" $SLACK_RELAY_URL/health
|
|
297
297
|
slack stream -e . # stderr says: relay connected (websocket)
|
|
298
|
-
`}function
|
|
298
|
+
`}function jw(e){return`# ${e}
|
|
299
299
|
|
|
300
300
|
A [slack-term](https://github.com/snomiao/slack-term) relay: a Cloudflare Worker
|
|
301
301
|
that turns Slack's Events API into a resumable doorbell stream for
|
|
@@ -304,7 +304,7 @@ configures and deploys it. Created by \`slack relay init\`.
|
|
|
304
304
|
|
|
305
305
|
## Set up
|
|
306
306
|
|
|
307
|
-
${
|
|
307
|
+
${mf(e)}
|
|
308
308
|
\`RELAY_TOKEN\` is any long random string (\`openssl rand -hex 32\`); \`slack relay init\`
|
|
309
309
|
printed one. Keep it out of this folder: anyone holding it can watch when and
|
|
310
310
|
where messages are posted.
|
|
@@ -314,41 +314,41 @@ where messages are posted.
|
|
|
314
314
|
Bump \`slack-term\` in package.json, \`npm install\`, \`npx wrangler deploy\`.
|
|
315
315
|
Storage survives redeploys; clients reconnect and resume.
|
|
316
316
|
|
|
317
|
-
Details (endpoints, privacy, protocol): ${
|
|
318
|
-
`}function
|
|
319
|
-
`)}async function
|
|
317
|
+
Details (endpoints, privacy, protocol): ${Lw}
|
|
318
|
+
`}function yf(e,t={},n=Iw){let s=t.name??Mw(e);if(!Nw(s))return{ok:!1,error:`invalid worker name "${s}": use lowercase letters, digits and dashes (1-63 chars, no leading/trailing dash)`};let r=Bw(s,t.slackTerm!==void 0?{slackTerm:t.slackTerm}:{}),o=gf(e),i=Object.keys(r).filter((l)=>Fw(xa(o,l)));if(i.length&&!t.force)return{ok:!1,error:`refusing to overwrite existing files in ${o} (pass --force to replace them)`,existing:i};for(let[l,u]of Object.entries(r)){let a=xa(o,l);Tw(xa(a,".."),{recursive:!0}),Ow(a,u)}return{ok:!0,dir:o,name:s,written:Object.keys(r),token:n(32).toString("hex")}}function bf(e,t=process.cwd()){let n=e.dir.startsWith(`${t}/`)?e.dir.slice(t.length+1):e.dir;return[`Created ${e.dir} (worker "${e.name}"):`,...e.written.map((s)=>` ${s}`),"","RELAY_TOKEN (generated now, not saved anywhere — copy it):",` ${e.token}`,"","Next steps:",`0. cd ${n}`,mf(e.name,e.token)].join(`
|
|
319
|
+
`)}async function wf(e,t,n=fetch,s=1e4){if(!e||!t)return{code:2,out:"slack relay health: set SLACK_RELAY_URL and SLACK_RELAY_TOKEN (or pass --url / --token)"};let r=`${e.replace(/\/+$/,"")}/health`;try{let o=await n(r,{headers:{authorization:`Bearer ${t}`},signal:AbortSignal.timeout(s)}),i=await o.text();if(o.status===401)return{code:1,out:"slack relay health: 401 unauthorized — SLACK_RELAY_TOKEN does not match the relay's RELAY_TOKEN secret"};if(!o.ok)return{code:1,out:`slack relay health: HTTP ${o.status} from ${r}${i?`: ${i.slice(0,200)}`:""}`};let l;try{l=JSON.parse(i)}catch{return{code:1,out:`slack relay health: not a slack-term relay (non-JSON reply from ${r})`}}return{code:l.ok===!0?0:1,out:JSON.stringify(l,null,2)}}catch(o){return{code:1,out:`slack relay health: cannot reach ${r}: ${o instanceof Error?o.message:String(o)}`}}}import{spawn as Ww}from"node:child_process";import{constants as Df}from"node:os";var Uw=["processing","active","suspended","closed"];function kf(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?Fr():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 xf(e){if(e!==void 0&&(!e.trim()||[...e].length>200))throw Error("--title must contain 1–200 characters.")}async function Sf(e,t,n){let{ref:s,threadTs:r}=n(t);if(!r||!/^\d{10}\.\d{6}$/.test(r))throw Error("Target must include a thread root: C00000001:1700000000.000100, #channel:ts, or a message permalink.");return{channel_id:await vr(e,s),thread_ts:r}}function _a(e,t){console.error(`agent: ${e}: ${t instanceof Error?t.message:"request failed"}`)}async function Jw(e,t,n,s){let r,o,i,l,u,a=!1,c=!1,d=1,f=(h)=>{if(o)return;if(o=h,a=!0,r&&r.exitCode===null&&r.signalCode===null)r.kill(h),i=setTimeout(()=>r?.kill("SIGKILL"),5000)},p=()=>f("SIGINT"),g=()=>f("SIGTERM");process.on("SIGINT",p),process.on("SIGTERM",g);try{if(c=!0,await Fs(e,t,"processing"),!a&&s.title!==void 0)await Hi(e,t,s.title);if(!a){r=Ww(n[0],n.slice(1),{stdio:"inherit"});let h=new Promise((m)=>{r.once("error",()=>{console.error("agent: could not start command"),m(127)}),r.once("exit",(y,w)=>{m(y??(w?128+Df.signals[w]:1))})});l=setInterval(()=>{if(a||u)return;u=Fs(e,t,"processing").then(()=>{}).catch((m)=>_a("heartbeat failed; retrying on next tick",m)).finally(()=>{u=void 0})},s.every*1000),d=await h}}catch(h){_a("could not start agent session",h)}finally{if(a=!0,clearInterval(l),clearTimeout(i),await u,c)try{await Fs(e,t,s.close?"closed":"active")}catch(h){if(_a("final status clear failed",h),d===0)d=1}process.removeListener("SIGINT",p),process.removeListener("SIGTERM",g)}return o?128+Df.signals[o]:d}function _f(e,t){let n=(s)=>s.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",(s)=>n(s).positional("status",{type:"string",choices:Uw,demandOption:!0}),async(s)=>{xf(s.title);let r=kf(s["bot-token-env"]),o=await Sf(r,s.target,t);if(await Fs(r,o,s.status),s.title!==void 0)await Hi(r,o,s.title)}).command("run <target>","Keep a thread working while a command runs: run <target> -- <command...>",(s)=>n(s).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(s)=>{if(xf(s.title),!Number.isFinite(s.every)||s.every<=0||s.every>=3600)throw Error("--every must be greater than 0 and less than 3600 seconds.");let r=process.argv.indexOf("--"),o=r<0?[]:process.argv.slice(r+1);if(!o[0])throw Error("agent run requires -- <command...>");let i=kf(s["bot-token-env"]),l=await Sf(i,s.target,t);process.exitCode=await Jw(i,l,o,{every:s.every,close:s.close,...s.title!==void 0?{title:s.title}:{}})}).demandCommand(1,"Choose agent status or agent run.")}import{readdirSync as o0,readFileSync as i0,statSync as a0}from"node:fs";import{join as Ra}from"node:path";import{fileURLToPath as c0}from"node:url";import{closeSync as Kw,existsSync as Ef,mkdirSync as Cf,openSync as qw,readFileSync as Yr,realpathSync as Hw,renameSync as zw,statSync as Ca,unlinkSync as $f,writeFileSync as Gw}from"node:fs";import{homedir as Af}from"node:os";import{dirname as Aa,join as ut,resolve as Ea}from"node:path";var Yw=".slack-term";function Ns(){return process.env.SLACK_TERM_HOME??ut(Af(),".config","slack-term")}function Xr(e=process.cwd()){let t=Ea(e);for(;;){let n=ut(t,Yw);try{if(Ca(n).isDirectory())return{dir:n,global:!1}}catch{}let s=Aa(t);if(s===t)break;t=s}return{dir:Ns(),global:!0}}function Tn(e,t){Cf(Aa(e),{recursive:!0});let n=`${e}.tmp-${process.pid}-${Date.now()}`;Gw(n,t,{mode:384}),zw(n,e)}function Xw(e,t,n=1e4,s=5000){let r=`${e}.lock`;Cf(Aa(r),{recursive:!0});let o=Date.now()+s;for(;;)try{Kw(qw(r,"wx"));break}catch(i){if(i.code!=="EEXIST")throw i;try{if(Date.now()-Ca(r).mtimeMs>n){$f(r);continue}}catch{continue}if(Date.now()>o)throw Error(`${r} is held by another writer`);Bun.sleepSync(25)}try{return t()}finally{try{$f(r)}catch{}}}function Vw(e){if(!e||typeof e!=="object")return;let t=e;if(typeof t.channel!=="string"||!t.channel)return;let n={channel:t.channel};if(typeof t.thread_ts==="string"&&/^\d{10}\.\d{6}$/.test(t.thread_ts))n.thread_ts=t.thread_ts;if(typeof t.added==="string")n.added=t.added;if(typeof t.note==="string")n.note=t.note;return n}function nn(e){let t;try{t=Bun.YAML.parse(Yr(e,"utf8"))}catch(r){if(r.code==="ENOENT")return{};throw Error(`${e}: ${r instanceof Error?r.message:String(r)}`)}if(!t||typeof t!=="object")return{};let n=t,s={};if(typeof n.prefix==="string"&&n.prefix.trim())s.prefix=n.prefix.trim();else if(Array.isArray(n.prefix)&&n.prefix.length===1&&typeof n.prefix[0]==="string")s.prefix=`[${n.prefix[0]}]`;if(typeof n.channel==="string"&&n.channel)s.channel=n.channel;if(typeof n.as_bot==="boolean")s.as_bot=n.as_bot;if(n.restrict_to_subscriptions===!0)s.restrict_to_subscriptions=!0;if(Array.isArray(n.auto_subscribe))s.auto_subscribe=n.auto_subscribe.filter((r)=>typeof r==="string");if(typeof n.nudge_after_min==="number"&&n.nudge_after_min>0)s.nudge_after_min=n.nudge_after_min;if(typeof n.owner==="string"&&n.owner)s.owner=n.owner;if(n.subscriptions&&typeof n.subscriptions==="object"){let r={};for(let[o,i]of Object.entries(n.subscriptions)){let l=Vw(i);if(l&&Ff(o))r[o]=l}s.subscriptions=r}return s}function Fa(e){let t=nn(ut(e.dir,"settings.yml")),n=nn(ut(e.dir,"settings.local.yml"));if(delete n.restrict_to_subscriptions,delete n.auto_subscribe,delete n.owner,t.restrict_to_subscriptions)delete n.subscriptions,delete n.prefix,delete n.as_bot,delete n.channel;let s={...t.subscriptions,...n.subscriptions},r={...t,...n};if(Object.keys(s).length)r.subscriptions=s;else delete r.subscriptions;return r}var Zw=/^[a-z0-9][a-z0-9._-]{0,63}$/;function Ff(e){return Zw.test(e)&&!/^\d{10}\.\d{6}$/.test(e)}function Tf(e){let t=nn(ut(e.dir,"settings.yml")),n=t.subscriptions??{},s=t.restrict_to_subscriptions?{}:nn(ut(e.dir,"settings.local.yml")).subscriptions??{},r=[];for(let[o,i]of Object.entries(n))if(!s[o])r.push({...i,name:o,scope:e,file:"settings.yml"});for(let[o,i]of Object.entries(s))r.push({...i,name:o,scope:e,file:"settings.local.yml"});return r.sort((o,i)=>o.name.localeCompare(i.name))}var Qw="# Written by `slack alias set/unset`; wins over settings.yml. Safe to edit by hand.\n";function e0(e){try{let t=Yr(e,"utf8").split(`
|
|
320
320
|
`),n=[];for(let s of t)if(s.startsWith("#")||!s.trim()&&n.length)n.push(s);else break;return n.length?n.join(`
|
|
321
321
|
`).replace(/\n*$/,`
|
|
322
|
-
`):""}catch{return""}}function
|
|
323
|
-
`)})}function
|
|
324
|
-
`).map((e)=>e.trim()).filter((e)=>e&&!e.startsWith("#"))}catch{return[]}}function
|
|
325
|
-
`));if(s)return{lang:s,source:"content"};let
|
|
326
|
-
`),n=t[t.length-2];if(!
|
|
327
|
-
`);if(s.length<2)return e;if(
|
|
328
|
-
`);return
|
|
329
|
-
`)}function
|
|
322
|
+
`):""}catch{return""}}function t0(e,t,n){let s=ut(e.dir,t?"settings.yml":"settings.local.yml");Xw(s,()=>{let r=t?e0(s):Qw,o={};try{let i=Bun.YAML.parse(Yr(s,"utf8"));if(i&&typeof i==="object"&&!Array.isArray(i))o=i}catch(i){if(i.code!=="ENOENT")throw Error(`${s}: ${i instanceof Error?i.message:String(i)}`)}n(o),Tn(s,r+Bun.YAML.stringify(o,null,2)+`
|
|
323
|
+
`)})}function Of(e){return nn(ut(e.dir,"settings.yml")).restrict_to_subscriptions===!0}function n0(e,t=process.cwd()){if(!Of(e))return;let n=nn(ut(e.dir,"settings.yml")).owner;if(!n)return`${e.dir} is restricted and names no \`owner\` in settings.yml: nobody may write it with --shared (edit the file)`;let s=(i)=>{try{return Hw(Ea(i))}catch{return Ea(i)}},r=s(n.replace(/^~(?=\/|$)/,Af())),o=s(t);if(o===r||o.startsWith(r.endsWith("/")?r:r+"/"))return;return`${e.dir} is owned by ${n}: --shared writes run only from under that directory`}function Rf(e,t,n,s={}){let r=typeof s==="boolean"?{shared:s}:s,o=r.shared===!0;if(!Ff(t))throw Error(`invalid alias name "${t}" (a-z 0-9 . _ -, at most 64, not a bare ts)`);if(!o&&Of(e))throw new $a(e);if(o&&!r.asOwner){let l=n0(e,r.cwd);if(l)throw new $a(e,l)}let i=Tf(e).find((l)=>l.name===t);return t0(e,o,(l)=>{let u=l.subscriptions&&typeof l.subscriptions==="object"?l.subscriptions:{};u[t]={channel:n.channel,...n.thread_ts?{thread_ts:n.thread_ts}:{},added:n.added??new Date().toISOString(),...n.note?{note:n.note}:{}},l.subscriptions=u}),i}class $a extends Error{constructor(e,t){super(t??`${e.dir} is restricted (restrict_to_subscriptions in settings.yml): only its owner adds subscriptions, with \`slack alias set --shared\` run from the owner's directory`)}}function s0(){return ut(Ns(),"scopes")}function r0(){try{return Yr(s0(),"utf8").split(`
|
|
324
|
+
`).map((e)=>e.trim()).filter((e)=>e&&!e.startsWith("#"))}catch{return[]}}function Ta(){let e=[];for(let s of r0())try{if(Ca(s).isDirectory())e.push({dir:s,global:!1})}catch{}let t=Ns();if((Ef(ut(t,"settings.yml"))||Ef(ut(t,"settings.local.yml")))&&!e.some((s)=>s.dir===t))e.push({dir:t,global:!0});return e}function Oa(e,t,n=Ta()){let s=[];for(let r of n)for(let o of Tf(r))if(o.channel===e&&(o.thread_ts===void 0||o.thread_ts===t))s.push(o);return s}var Pf=c0(new URL("../locales/",import.meta.url)),If=new Map;function vf(e){let t;try{t=a0(e).mtimeMs}catch{return}let n=If.get(e);if(n&&n.mtimeMs===t)return n.pack;let s;try{let r=JSON.parse(i0(e,"utf8"));s=r&&typeof r.lang==="string"?r:void 0}catch{s=void 0}return If.set(e,{mtimeMs:t,pack:s}),s}function Lf(){let e=Xr();return e.global?void 0:Ra(e.dir,"locales")}function l0(){let e=new Set;for(let t of[Pf,Lf()]){if(!t)continue;try{for(let n of o0(t))if(n.endsWith(".json"))e.add(n.slice(0,-5))}catch{}}return[...e].sort()}function Vr(e){let t=vf(Ra(Pf,`${e}.json`)),n=Lf(),s=n?vf(Ra(n,`${e}.json`)):void 0;if(!s)return t;if(!t)return s;return{...t,...s,ask:{...t.ask,...s.ask},choice_patterns:s.choice_patterns??t.choice_patterns??[]}}function Zr(e,t,n={}){let s=Vr(e)?.ask??{},r=s[t]??s[`${t} (WIRE)`]??Vr("en")?.ask?.[t]??Vr("en")?.ask?.[`${t} (WIRE)`];if(r===void 0)throw Error(`language pack ${e}: no ask.${t}`);return r.replace(/\{(\w+)\}/g,(o,i)=>(i in n)?String(n[i]):o)}function Nf(){let e=[];for(let t of l0())for(let n of Vr(t)?.choice_patterns??[])try{e.push({lang:t,re:new RegExp(n,"iu")})}catch{}return e}var Te=[{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"}],Lt=Te.length,st="question",sn=`:${st}: `,Nt="heavy_plus_sign",Qr=`:${Nt}: `,Wf=[Nt,st],rn="information_source",eo=`:${rn}: `,$t=["ja","en"];function Pa(e,t=process.env){for(let[o,i]of[[e.flag,"flag"],[t.SLACK_TERM_LANG,"env"]]){if(o===void 0||o.trim()==="")continue;let l=o.trim().toLowerCase();return $t.includes(l)?{lang:l,source:i}:null}let n=(e.readerLocales??[]).map(Mf);if(n.length&&n[0]&&n.every((o)=>o===n[0]))return{lang:n[0],source:"readers"};let s=La((e.content??[]).join(`
|
|
325
|
+
`));if(s)return{lang:s,source:"content"};let r=Mf(t.LC_ALL||t.LC_MESSAGES||t.LANG);if(r)return{lang:r,source:"system"};return{lang:"en",source:"default"}}function Mf(e){let t=(e??"").toLowerCase();return $t.find((n)=>t===n||/^[_.\-@]/.test(t.slice(n.length))&&t.startsWith(n))??null}function La(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 Be={get ja(){return Bf("ja")},get en(){return Bf("en")}};function Bf(e){let t=(n,s)=>Zr(e,n,s);return{instructionReactionThread:t("instructionReactionThread"),instructionReactionHere:t("instructionReactionHere"),instructionTextThread:t("instructionTextThread"),instructionTextHere:t("instructionTextHere"),overflowNote:t("overflowNote"),otherThread:`${Qr}${t("otherThread")}`,otherHere:`${Qr}${t("otherHere")}`,explainLine:`${eo}${t("explainLine")}`,explainNote:`${eo}${t("explainNote")}`,invalidPrefix:t("invalidPrefix"),answeredVia:(n,s)=>t("answeredVia",{how:n,who:s?` (${s})`:""}),howReaction:(n)=>t("howReaction",{glyph:n}),howReply:t("howReply"),howReplyN:(n)=>t("howReplyN",{n}),voidStamp:(n)=>t("voidStamp",{reason:n?`: ${n}`:""}),supersededBy:(n)=>t("supersededBy",{link:n})}}var u0=$t.flatMap((e)=>[Be[e].otherThread,Be[e].otherHere].map((t)=>sn+t.slice(Qr.length)));function Uf(e){if(e===void 0)return null;if(e.startsWith(Qr)||e.startsWith("➕ "))return Nt;if(e.startsWith(sn)||e.startsWith("❓ "))return st;return null}function d0(e){return e!==void 0&&(e.startsWith(eo)||e.startsWith("ℹ️ "))}function f0(e,t){if(e===void 0)return!1;return(e.startsWith("ℹ️ ")?eo+e.slice(3):e)===t.explainLine}var to="_";function Jf(e){if(e===void 0||!e.endsWith(to))return null;return $t.find((t)=>e.startsWith(Be[t].invalidPrefix))??null}function no(e){let t=e.split(`
|
|
326
|
+
`),n=t[t.length-2];if(!Jf(n))return[];return[...n.matchAll(/<@([UW][A-Z0-9]+)>/g)].map((s)=>s[1])}function so(e,t,n="ja"){let s=e.split(`
|
|
327
|
+
`);if(s.length<2)return e;if(no(e).length)s.splice(s.length-2,1);if(t.length)s.splice(s.length-1,0,`${Be[n].invalidPrefix}${t.map((o)=>`<@${o}>`).join(", ")}${to}`);let r=s.join(`
|
|
328
|
+
`);return r===e?e:r}function ro(e){return typeof e==="string"&&$t.some((t)=>Be[t].explainNote===e.trim())}function jf(e){return Jf(e)!==null}var Na="white_check_mark",Bs=`:${Na}: `,Ma="no_entry_sign",va=`:${Ma}: `,p0=/^【[^】]*(?:作废|作廢|superseded|void)[^】]*】/i;function oo(e){return`:${Te[e].name}:`}function Kf(e,t){let n=Te[t];for(let s of[oo(t),n.glyph]){if(e.startsWith(`${s} `))return e.slice(s.length+1);if(e===s)return""}return null}function h0(e){return Te.some((t,n)=>Kf(e,n)!==null)}function Ne(e){return e.replace(/\s*\n\s*/g," ")}function Ba(e,t,n,s,r,o="ja",i=!1){let l=Be[o],u=[`${sn}*${e}*`];if(t)u.push("",t);if(n.length){if(u.push(""),u.push(...n.map((a,c)=>`${oo(c)} ${Ne(a)}`)),u.push(r?l.otherThread:l.otherHere),i)u.push(l.explainLine);if(s.length)u.push(""),u.push(...s.map((a,c)=>`(${c+11}) ${Ne(a)}`)),u.push(l.overflowNote);u.push(""),u.push(r?l.instructionReactionThread:l.instructionReactionHere)}else{if(u.push(""),i)u.push(l.explainLine,"");u.push(r?l.instructionTextThread:l.instructionTextHere)}return u.join(`
|
|
329
|
+
`)}function qf(e,t,n,s="ja",r){let o=t.answer.split(`
|
|
330
330
|
`).map((l)=>`> ${l}`).join(`
|
|
331
|
-
`),i=`${
|
|
331
|
+
`),i=`${Bs}*${e}*
|
|
332
332
|
${Be[s].answeredVia(t.how,n)}
|
|
333
333
|
|
|
334
|
-
${
|
|
334
|
+
${o}`;if(r?.body)i+=`
|
|
335
335
|
|
|
336
|
-
${
|
|
336
|
+
${r.body}`;if(r?.chosenLine)i+=`
|
|
337
337
|
|
|
338
|
-
${
|
|
339
|
-
${
|
|
340
|
-
${
|
|
338
|
+
${r.chosenLine}`;return i}function Hf(e,t){let n=Ct(e);if(n.kind!=="open")return;let s={};if(n.body)s.body=n.body;if(t!==void 0&&t>=1){if(t<=n.reactable.length)s.chosenLine=`${oo(t-1)} ${Ne(n.reactable[t-1])}`;else if(t-Lt<=n.overflow.length&&t>Lt)s.chosenLine=`(${t}) ${Ne(n.overflow[t-Lt-1])}`}return s.body||s.chosenLine?s:void 0}function zf(e,t,n="ja",s,r){let o=Be[n],i=`${va}*${e}*
|
|
339
|
+
${o.voidStamp(Ne(t.trim()))}`;if(r)i+=`
|
|
340
|
+
${o.supersededBy(r)}`;if(s)i+=`
|
|
341
341
|
|
|
342
|
-
${s}`;return i}function
|
|
343
|
-
`),n=
|
|
344
|
-
`),n=t[t.length-1]??"";if(e.startsWith(
|
|
345
|
-
`),n=(y)=>e.startsWith(`${y}*`)&&t.some((w,x)=>x>0&&w.length>1&&w.startsWith("_")&&w.endsWith("_"));if(n(
|
|
346
|
-
`).slice(
|
|
347
|
-
`).slice(
|
|
348
|
-
`);if(!E)return{kind:"other"};return{kind:"resolved",question:D,answer:E}}let
|
|
349
|
-
`).replace(/^\*/,"").replace(/\*$/,""),f=[],p=[],g=t.length-1;if(
|
|
350
|
-
`).replace(/^\n+|\n+$/g,"");return{kind:"open",question:d,body:m,reactable:f,overflow:p,threadOnly:
|
|
351
|
-
`),s=
|
|
342
|
+
${s}`;return i}function Gf(e){if(!e.startsWith(sn))return null;let t=e.slice(sn.length),n=t.match(/^\*([\s\S]+?)\*(?=\s|$)/);if(!n)return null;let s=t.slice(n[0].length),r=!1;for(let o of $t){let i=Be[o];for(let u of[i.instructionReactionThread,i.instructionReactionHere,i.instructionTextThread,i.instructionTextHere])if(s.includes(u))r=!0;for(let u of[i.instructionReactionThread,i.instructionReactionHere,i.instructionTextThread,i.instructionTextHere,i.overflowNote,i.otherThread,i.otherHere,...u0,i.explainLine])s=s.split(u).join(" ");let l=s.indexOf(i.invalidPrefix);if(l>=0){let u=s.indexOf(to,l+i.invalidPrefix.length);s=s.slice(0,l)+" "+(u>=0?s.slice(u+to.length):"")}}if(!r)return null;return{question:n[1],body:s.replace(/[ \t]{3,}/g," ").trim()}}function Yf(e){if(!e[0]?.startsWith(Bs))return-1;let t=(n)=>!!n&&(n.startsWith("> ")||n.startsWith("> "));for(let n=1;n+2<e.length;n++){let s=e[n];if(s.length>1&&s.startsWith("_")&&s.endsWith("_")&&e[n+1]===""&&t(e[n+2]))return n}return-1}function Xf(e){let t=e.split(`
|
|
343
|
+
`),n=Yf(t),r=((n>0?t[n]:t[1])??"").match(/^_(?:返信|Answered by reply)(?: \((\d+)\))?/);if(!r)return{byReply:!1};return r[1]?{byReply:!0,n:Number(r[1])}:{byReply:!0}}function Ms(e){return e.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&")}function js(e){if(!e.trim())return"the message body is empty (it may be a bot post or an attachment-only message)";let t=e.split(`
|
|
344
|
+
`),n=t[t.length-1]??"";if(e.startsWith(Bs))return"it is marked answered, but the quoted answer text is missing";if(!/_$/.test(n))return"it does not end with the `ask` instructions line — this message was not posted by `slack ask`, or its text has been edited";if(!t[0].startsWith(sn)&&!t[0].startsWith("*"))return"it does not start with the (bold) question — its text may have been edited";return"cannot read the list of choices — they are not numbered consecutively from 1, or the text has been edited"}function Ct(e){let t=e.split(`
|
|
345
|
+
`),n=(y)=>e.startsWith(`${y}*`)&&t.some((w,x)=>x>0&&w.length>1&&w.startsWith("_")&&w.endsWith("_"));if(n(va)){let y=t.findIndex((E,C)=>C>0&&E.startsWith("_")&&E.endsWith("_")),w=Ms(t.slice(0,y>0?y:1).join(`
|
|
346
|
+
`).slice(va.length).replace(/^\*/,"").replace(/\*$/,"")),x=y>0?t[y].replace(/^_|_$/g,""):"",D=y>0?t[y+1]?.match(/^↪ [^::]*[::] (.+)$/)?.[1]:void 0;return D?{kind:"void",question:w,reason:x,supersededBy:D}:{kind:"void",question:w,reason:x}}let s=t[0].match(p0)?e.match(/:question: \*([^\n]*?)\*/):null;if(s)return{kind:"void",question:Ms(s[1]),reason:Ms(t[0])};if(n(Bs)){let y=(C)=>C.startsWith("> ")?C.slice(2):C.startsWith("> ")?C.slice(5):null,w=Yf(t),x;if(w>0){x=[];for(let C=w+2;C<t.length;C++){let S=y(t[C]);if(S===null)break;x.push(S)}}else x=t.map(y).filter((C)=>C!==null);let D=Ms(t.slice(0,w>0?w:1).join(`
|
|
347
|
+
`).slice(Bs.length).replace(/^\*/,"").replace(/\*$/,"")),E=x.map(Ms).join(`
|
|
348
|
+
`);if(!E)return{kind:"other"};return{kind:"resolved",question:D,answer:E}}let r=t[t.length-1]??"",o,i,l=$t.find((y)=>[Be[y].instructionReactionThread,Be[y].instructionReactionHere,Be[y].instructionTextThread,Be[y].instructionTextHere].includes(r));if(!l)return{kind:"other"};let u=Be[l];o=r===u.instructionReactionThread||r===u.instructionTextThread,i=r===u.instructionReactionThread||r===u.instructionReactionHere;let a=t[0].startsWith(sn)?t[0].slice(sn.length):t[0];if(t[0]=a,!t[0].startsWith("*"))return{kind:"other"};let c=0;while(c<t.length&&!(t[c].endsWith("*")&&(c>0||t[0].length>1)))c++;if(c>=t.length)return{kind:"other"};let d=t.slice(0,c+1).join(`
|
|
349
|
+
`).replace(/^\*/,"").replace(/\*$/,""),f=[],p=[],g=t.length-1;if(jf(t[g-1]))g--;let h=!1;if(i){let y=t.length-2;if(jf(t[y]))y--;if(t[y]!=="")return{kind:"other"};if(y--,t[y]===u.overflowNote){y--;while(y>=0&&/^\(\d+\) /.test(t[y]))p.unshift(t[y].replace(/^\(\d+\) /,"")),y--;if(t[y]!=="")return{kind:"other"};y--}if(d0(t[y]))h=!0,y--;if(Uf(t[y]))y--;let w=[];while(y>=0){let x=t[y];if(!h0(x))break;w.unshift(x),y--}if(!w.length||w.length>Lt)return{kind:"other"};for(let x=0;x<w.length;x++){let D=Kf(w[x],x);if(D===null)return{kind:"other"};f.push(D)}if(t[y]!=="")return{kind:"other"};if(y<c+1)return{kind:"other"};g=y;for(let x=0;x<p.length;x++)if(!t.includes(`(${x+11}) ${p[x]}`))return{kind:"other"}}else if(t[g-1]===""&&f0(t[g-2],u)&&t[g-3]===""&&g-3>=c)h=!0,g-=2;let m=t.slice(c+1,g).join(`
|
|
350
|
+
`).replace(/^\n+|\n+$/g,"");return{kind:"open",question:d,body:m,reactable:f,overflow:p,threadOnly:o,lang:l,explain:h}}function Ws(e){let t=Ct(e);if(t.kind!=="open")return null;if(!t.reactable.length)return st;let n=e.split(`
|
|
351
|
+
`),s=oo(t.reactable.length-1),r=Te[t.reactable.length-1].glyph,o=-1;for(let i=n.length-1;i>=0;i--)if(n[i].startsWith(`${s} `)||n[i]===s||n[i].startsWith(`${r} `)||n[i]===r){o=i;break}return(o>=0?Uf(n[o+1]):null)??st}function Ia(e){return e.normalize("NFKC").replace(/[*_`~]/g,"").trim().replace(/^[\s"'`「『((\[]+/,"").replace(/[\s"'`」』))\]。..!!??、,]+$/,"").replace(/\s+/g," ").trim().toLowerCase()}function Vf(e,t,n){let s=Array.from({length:n},(o,i)=>i===n-1?t:""),r=ja(e,s);return r.kind==="chosen"&&r.index===n}function ja(e,t){let n=Ia(e);if(!n)return{kind:"none"};let s=t.map(Ia),r=new Set;s.forEach((a,c)=>{if(a&&a===n)r.add(c+1)}),Te.forEach((a,c)=>{if(c<t.length&&e.trim()===a.glyph)r.add(c+1)});let o=0,i="",l=n.match(/^(\d{1,2})$/);if(l)o=Number(l[1]);else if(l=n.match(/^(\d{1,2})(?:\s*[.)::、。\-\]]\s*|\s+)(.*)$/)){if(o=Number(l[1]),i=Ia(l[2]),!i)return{kind:"none"};if(/^\d+$/.test(i))return{kind:"none"}}if(o>=1&&o<=t.length&&(i===""||i===s[o-1]))r.add(o);let u=[...r].sort((a,c)=>a-c);if(!u.length)return{kind:"none"};if(u.length>1)return{kind:"ambiguous",indexes:u};return{kind:"chosen",index:u[0]}}var On={phi:1.618033988749895,minMs:1000,fastMaxMs:5000,fastWindowMs:120000,slowMaxMs:20000};function Zf(e,t){let n=t<On.fastWindowMs?On.fastMaxMs:On.slowMaxMs;return Math.min(Math.max(e,On.minMs)*On.phi,n)}import{closeSync as g0,existsSync as io,mkdirSync as ao,openSync as m0,readFileSync as lo,realpathSync as y0,renameSync as b0,statSync as Wa,unlinkSync as Qf,writeFileSync as w0}from"node:fs";import{homedir as ep}from"node:os";import{dirname as Ua,join as He,resolve as co}from"node:path";var tp=".slack-term",D0=["inbox","archived","outbox","sent"];function Us(){return process.env.SLACK_TERM_HOME??He(ep(),".config","slack-term")}function Xe(e=process.cwd()){let t=co(e);for(;;){let n=He(t,tp);try{if(Wa(n).isDirectory())return{dir:n,global:!1}}catch{}let s=Ua(t);if(s===t)break;t=s}return{dir:Us(),global:!0}}var k0='# .slack-term/\n\nState for [slack-term](https://github.com/snomiao/slack-term) in this directory.\n`slack` uses the nearest `.slack-term/` walking up from where it runs (like\n`.git`), so everything below this directory shares it. Without one it uses\n~/.config/slack-term/.\n\nNothing here is committed: `.gitignore` holds `*`.\n\n| Path | What |\n|---|---|\n| `settings.yml` | yours to edit: `prefix` (put in front of every `slack reply`, e.g. `"[design]"`), `channel` (default), `as_bot`, `subscriptions` |\n| `settings.local.yml` | written by `slack alias set/unset`; same keys, wins over `settings.yml` |\n| `inbox/` → `archived/` | one file per incoming message (`slack stream --inbox`): who, where, the text with secrets redacted, a files count, the permalink. Handled = moved to `archived/`, by `slack done` or by a sent outbox reply with `in_reply_to` |\n| `outbox/` → `sent/` | one file per queued reply (`slack outbox add`, redacted); `slack outbox flush` sends them and moves each to `sent/` with its ts and permalink. A failure stays, with `error` and `attempts` |\n\n`restrict_to_subscriptions`, `auto_subscribe` and `nudge_after_min` count only in\n`settings.yml`. With `restrict_to_subscriptions: true`, only `settings.yml`\'s\nsubscriptions count, `slack alias set` refuses (the owner uses `--shared`), and\n`reply` / `outbox flush` refuse any other thread.\n\n`subscriptions` maps an alias to a place:\n\n subscriptions:\n board:\n channel: C00000001\n thread_ts: "1700000000.000100"\n\n## Commands\n\n slack alias ls # the aliases here\n slack alias set <name> <permalink> # name a thread (a reply\'s permalink names its root)\n slack alias unset <name>\n slack read <name> # read the thread\n slack reply <name> \'<text>\' # reply in it, with the prefix, behind the --code gate\n slack reply --to <permalink> \'<text>\' # reply in the thread where that message is\n slack reply <name> --to <permalink> … # refused when that message is in another thread\n slack inbox ls | listen | nudge # what was routed here\n slack done <file|ts> # handled without a reply\n slack outbox add <name> \'<text>\' --in-reply-to <ts>\n slack outbox flush # send the queue (one --code for the batch)\n slack alias who <channel> <ts> # which dirs subscribe a thread\n',x0=`# slack-term settings for this directory. settings.local.yml (written by
|
|
352
352
|
# \`slack alias\`) has the same keys and wins over this file.
|
|
353
353
|
#
|
|
354
354
|
# prefix: "[lane]" # put in front of every \`slack reply\`; never doubled
|
|
@@ -365,33 +365,33 @@ ${s}`;return i}function Ff(e){if(!e.startsWith(sn))return null;let t=e.slice(sn.
|
|
|
365
365
|
# owner: ~/ws/x/tree/shr # with restrict: --shared writes run only from under it
|
|
366
366
|
# auto_subscribe: [D00000001] # new top-level messages there are subscribed here
|
|
367
367
|
# nudge_after_min: 30 # \`slack inbox nudge\` reports what waits longer
|
|
368
|
-
`;function
|
|
369
|
-
`),
|
|
370
|
-
`+Bun.YAML.stringify(
|
|
371
|
-
`:"")),n!==
|
|
368
|
+
`;function Ja(e,t={}){let n=He(co(e),tp),s=[];ao(n,{recursive:!0});for(let i of D0){let l=He(n,i);if(!io(l))ao(l,{recursive:!0}),s.push(`${i}/`)}let r=(i,l)=>{let u=He(n,i);if(io(u))return;Ka(u,l),s.push(i)};r(".gitignore",`*
|
|
369
|
+
`),r("README.md",k0);let o=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==void 0));if(r("settings.yml",x0+(Object.keys(o).length?`
|
|
370
|
+
`+Bun.YAML.stringify(o,null,2)+`
|
|
371
|
+
`:"")),n!==Us())C0(n);return{dir:n,created:s}}function Ka(e,t){ao(Ua(e),{recursive:!0});let n=`${e}.tmp-${process.pid}-${Date.now()}`;w0(n,t,{mode:384}),b0(n,e)}function np(e,t,n=1e4,s=5000){let r=`${e}.lock`;ao(Ua(r),{recursive:!0});let o=Date.now()+s;for(;;)try{g0(m0(r,"wx"));break}catch(i){if(i.code!=="EEXIST")throw i;try{if(Date.now()-Wa(r).mtimeMs>n){Qf(r);continue}}catch{continue}if(Date.now()>o)throw Error(`${r} is held by another writer`);Bun.sleepSync(25)}try{return t()}finally{try{Qf(r)}catch{}}}function S0(e){if(!e||typeof e!=="object")return;let t=e;if(typeof t.channel!=="string"||!t.channel)return;let n={channel:t.channel};if(typeof t.thread_ts==="string"&&/^\d{10}\.\d{6}$/.test(t.thread_ts))n.thread_ts=t.thread_ts;if(typeof t.added==="string")n.added=t.added;if(typeof t.note==="string")n.note=t.note;return n}function ts(e){let t;try{t=Bun.YAML.parse(lo(e,"utf8"))}catch(r){if(r.code==="ENOENT")return{};throw Error(`${e}: ${r instanceof Error?r.message:String(r)}`)}if(!t||typeof t!=="object")return{};let n=t,s={};if(typeof n.prefix==="string"&&n.prefix.trim())s.prefix=n.prefix.trim();else if(Array.isArray(n.prefix)&&n.prefix.length===1&&typeof n.prefix[0]==="string")s.prefix=`[${n.prefix[0]}]`;if(typeof n.channel==="string"&&n.channel)s.channel=n.channel;if(typeof n.as_bot==="boolean")s.as_bot=n.as_bot;if(n.restrict_to_subscriptions===!0)s.restrict_to_subscriptions=!0;if(Array.isArray(n.auto_subscribe))s.auto_subscribe=n.auto_subscribe.filter((r)=>typeof r==="string");if(typeof n.nudge_after_min==="number"&&n.nudge_after_min>0)s.nudge_after_min=n.nudge_after_min;if(typeof n.owner==="string"&&n.owner)s.owner=n.owner;if(n.subscriptions&&typeof n.subscriptions==="object"){let r={};for(let[o,i]of Object.entries(n.subscriptions)){let l=S0(i);if(l&&qa(o))r[o]=l}s.subscriptions=r}return s}function ns(e){let t=ts(He(e.dir,"settings.yml")),n=ts(He(e.dir,"settings.local.yml"));if(delete n.restrict_to_subscriptions,delete n.auto_subscribe,delete n.owner,t.restrict_to_subscriptions)delete n.subscriptions,delete n.prefix,delete n.as_bot,delete n.channel;let s={...t.subscriptions,...n.subscriptions},r={...t,...n};if(Object.keys(s).length)r.subscriptions=s;else delete r.subscriptions;return r}var _0=/^[a-z0-9][a-z0-9._-]{0,63}$/;function qa(e){return _0.test(e)&&!/^\d{10}\.\d{6}$/.test(e)}function on(e){let t=ts(He(e.dir,"settings.yml")),n=t.subscriptions??{},s=t.restrict_to_subscriptions?{}:ts(He(e.dir,"settings.local.yml")).subscriptions??{},r=[];for(let[o,i]of Object.entries(n))if(!s[o])r.push({...i,name:o,scope:e,file:"settings.yml"});for(let[o,i]of Object.entries(s))r.push({...i,name:o,scope:e,file:"settings.local.yml"});return r.sort((o,i)=>o.name.localeCompare(i.name))}function Ha(e,t=process.cwd()){if(!qa(e))return;let n=Xe(t),s=n.global?[n]:[n,{dir:Us(),global:!0}];for(let r of s){let o=on(r).find((i)=>i.name===e);if(o)return o}return}var E0="# Written by `slack alias set/unset`; wins over settings.yml. Safe to edit by hand.\n";function $0(e){try{let t=lo(e,"utf8").split(`
|
|
372
372
|
`),n=[];for(let s of t)if(s.startsWith("#")||!s.trim()&&n.length)n.push(s);else break;return n.length?n.join(`
|
|
373
373
|
`).replace(/\n*$/,`
|
|
374
|
-
`):""}catch{return""}}function
|
|
375
|
-
`)})}function In(e){return
|
|
374
|
+
`):""}catch{return""}}function sp(e,t,n){let s=He(e.dir,t?"settings.yml":"settings.local.yml");np(s,()=>{let r=t?$0(s):E0,o={};try{let i=Bun.YAML.parse(lo(s,"utf8"));if(i&&typeof i==="object"&&!Array.isArray(i))o=i}catch(i){if(i.code!=="ENOENT")throw Error(`${s}: ${i instanceof Error?i.message:String(i)}`)}n(o),Ka(s,r+Bun.YAML.stringify(o,null,2)+`
|
|
375
|
+
`)})}function In(e){return ts(He(e.dir,"settings.yml")).restrict_to_subscriptions===!0}function rp(e,t=process.cwd()){if(!In(e))return;let n=ts(He(e.dir,"settings.yml")).owner;if(!n)return`${e.dir} is restricted and names no \`owner\` in settings.yml: nobody may write it with --shared (edit the file)`;let s=(i)=>{try{return y0(co(i))}catch{return co(i)}},r=s(n.replace(/^~(?=\/|$)/,ep())),o=s(t);if(o===r||o.startsWith(r.endsWith("/")?r:r+"/"))return;return`${e.dir} is owned by ${n}: --shared writes run only from under that directory`}function za(e,t,n,s={}){let r=typeof s==="boolean"?{shared:s}:s,o=r.shared===!0;if(!qa(t))throw Error(`invalid alias name "${t}" (a-z 0-9 . _ -, at most 64, not a bare ts)`);if(!o&&In(e))throw new Rn(e);if(o&&!r.asOwner){let l=rp(e,r.cwd);if(l)throw new Rn(e,l)}let i=on(e).find((l)=>l.name===t);return sp(e,o,(l)=>{let u=l.subscriptions&&typeof l.subscriptions==="object"?l.subscriptions:{};u[t]={channel:n.channel,...n.thread_ts?{thread_ts:n.thread_ts}:{},added:n.added??new Date().toISOString(),...n.note?{note:n.note}:{}},l.subscriptions=u}),i}function op(e,t,n=!1,s){let r=on(e).find((o)=>o.name===t);if(!r)return"absent";if(r.file==="settings.yml"&&!n)return"in-settings.yml";if(r.file==="settings.yml"){let o=rp(e,s);if(o)throw new Rn(e,o)}return sp(e,r.file==="settings.yml",(o)=>{let i=o.subscriptions;if(i)delete i[t];if(i&&!Object.keys(i).length)delete o.subscriptions}),"removed"}class Rn extends Error{constructor(e,t){super(t??`${e.dir} is restricted (restrict_to_subscriptions in settings.yml): only its owner adds subscriptions, with \`slack alias set --shared\` run from the owner's directory`)}}function ip(){return He(Us(),"scopes")}function C0(e){let t=ip();np(t,()=>{let n=ap();if(n.includes(e))return;Ka(t,[...n,e].join(`
|
|
376
376
|
`)+`
|
|
377
|
-
`)})}function
|
|
378
|
-
`).map((e)=>e.trim()).filter((e)=>e&&!e.startsWith("#"))}catch{return[]}}function
|
|
377
|
+
`)})}function ap(){try{return lo(ip(),"utf8").split(`
|
|
378
|
+
`).map((e)=>e.trim()).filter((e)=>e&&!e.startsWith("#"))}catch{return[]}}function A0(){let e=[];for(let s of ap())try{if(Wa(s).isDirectory())e.push({dir:s,global:!1})}catch{}let t=Us();if((io(He(t,"settings.yml"))||io(He(t,"settings.local.yml")))&&!e.some((s)=>s.dir===t))e.push({dir:t,global:!0});return e}function cp(e,t,n=A0()){let s=[];for(let r of n)for(let o of on(r))if(o.channel===e&&(o.thread_ts===void 0||o.thread_ts===t))s.push(o);return s}function Ga(e,t){let n=t?.trim();if(!n)return e;let s=/^\[([^\]@\s]+)\]$/.exec(n),r=e;if(s){let o=s[1].replace(/[.*+?^${}()|[\]\\]/g,"\\$&");r=e.replace(new RegExp(`^\\s*\\[${o}(?:@[a-z0-9-]{1,16})?\\][ \\t]*`),"")}else if(e.trimStart().startsWith(n))r=e.trimStart().slice(n.length).replace(/^[ \t]+/,"");return r.trim()?`${n} ${r}`:""}function Ya(e,t){if(e.channel===t.channel&&e.threadTs===t.root)return;let n=(s,r)=>r?`${s} thread ${r}`:`${s} (top level)`;return`the message you are answering (${t.ts}) is in ${n(t.channel,t.root)}, but the destination is ${n(e.channel,e.threadTs)}.
|
|
379
379
|
`+` Drop the destination to reply where the message is: slack reply --to <permalink> '…'
|
|
380
|
-
`+" Or pass --any-thread if the other thread is really meant."}var
|
|
381
|
-
`)){let s=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*?)\s*$/.exec(n);if(!s)continue;let
|
|
380
|
+
`+" Or pass --any-thread if the other thread is really meant."}var lp=/(⬜️?|:white_large_square:)(\s*)(\d+)\./g,F0=/(✅|:white_check_mark:)\s*(\d+)\./g;function up(e,t){let n=[...e.matchAll(lp)].map((i)=>Number(i[3])),s=[...e.matchAll(F0)].map((i)=>Number(i[2]));if(t===void 0){if(n.length===0)return s.length?{kind:"already",n:s[0]}:{kind:"none"};if(n.length>1)return{kind:"ambiguous",open:n};t=n[0]}if(!n.includes(t))return s.includes(t)?{kind:"already",n:t}:{kind:"missing",n:t};let r=!1;return{kind:"ticked",text:e.replace(lp,(i,l,u,a)=>{if(r||Number(a)!==t)return i;return r=!0,`${l.startsWith(":")?":white_check_mark:":"✅"}${u}${a}.`}),n:t}}function dp(e,t,n){let s=/^\[([^\]@\s]+)\]$/.exec(n?.trim()??"");if(!s)return t;let r=s[1].replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`^\\[${r}(?:@[a-z0-9-]{1,16})?\\][ \\t]*`),i=o.exec(e);if(!i)return t;return i[0]+t.replace(o,"")}import{readFileSync as pp}from"node:fs";import{homedir as T0}from"node:os";import{join as fp}from"node:path";var hp=/^@([a-z0-9][a-z0-9._-]{0,63})$/;function gp(e){let t=hp.exec(e[0]??"");return t?{who:t[1],rest:e.slice(1)}:{rest:e}}function O0(e){let t=e;if(!t||typeof t!=="object"||t.kind!=="bot"&&t.kind!=="user")return;let n={kind:t.kind};if(typeof t.env==="string"&&/^[A-Z_][A-Z0-9_]*$/.test(t.env))n.env=t.env;if(typeof t.env_file==="string")n.env_file=t.env_file;if(typeof t.profile==="string")n.profile=t.profile;return n}function Xa(e=process.cwd()){let t=Xr(e),n=t.global?[t]:[{dir:Ns(),global:!0},t],s=new Map;for(let r of n){let i=nn(fp(r.dir,"settings.yml")).restrict_to_subscriptions?["settings.yml"]:["settings.yml","settings.local.yml"];for(let l of i){let u;try{u=Bun.YAML.parse(pp(fp(r.dir,l),"utf8"))}catch{continue}let a=u?.identities;if(!a||typeof a!=="object")continue;for(let[c,d]of Object.entries(a)){let f=O0(d);if(f&&hp.test(`@${c}`))s.set(c,f)}}}return s}function R0(e){let t={};for(let n of pp(e.replace(/^~(?=\/|$)/,T0()),"utf8").split(`
|
|
381
|
+
`)){let s=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*?)\s*$/.exec(n);if(!s)continue;let r=s[2];if(/^(["']).*\1$/.test(r))r=r.slice(1,-1);t[s[1]]=r}return t}function mp(e,t=process.env,n=Xa()){let s=n.get(e),r=[...n.keys()].sort().map((l)=>`@${l}`).join(", ")||"(none: add `identities:` to .slack-term/settings.yml)";if(!s)return{error:`unknown identity @${e}. Known: ${r}`};if(s.kind==="user"&&s.profile&&!s.env&&!s.env_file)return t.SLACK_WORKSPACE=s.profile,delete t.SLACK_TOKEN,delete t.SLACK_BOT_TOKEN,t.SLACK_TERM_IDENTITY=e,{kind:"user"};let o=s.env??(s.kind==="bot"?"SLACK_BOT_TOKEN":"SLACK_TOKEN"),i;try{i=s.env_file?R0(s.env_file)[o]:t[o]}catch{return{error:`@${e}: cannot read ${s.env_file}`}}if(!i)return{error:`@${e}: no ${o}${s.env_file?` in ${s.env_file}`:" in the environment"}`};if(s.kind==="bot"&&!i.startsWith("xoxb-"))return{error:`@${e} is a bot, but ${o} is not a bot token (xoxb-)`};if(s.kind==="user"&&i.startsWith("xoxb-"))return{error:`@${e} is a user, but ${o} holds a bot token`};if(s.kind==="bot")t.SLACK_BOT_TOKEN=i,t.SLACK_TOKEN=i;else t.SLACK_TOKEN=i,delete t.SLACK_BOT_TOKEN;return t.SLACK_TERM_IDENTITY=e,{kind:s.kind}}function yp(e=process.env){return["AY_AGENT_ID","AGENT_YES_PID","CLAUDECODE"].find((t)=>e[t])}function bp(e){if(!e.isWrite||e.who||e.asBot||e.asUser||e.activeIsBot)return null;let t=e.identities.map((s)=>`@${s}`).join(" | "),n=t?` Name who acts: slack ${e.identities[0]?`@${e.identities[0]}`:"@<who>"} ${e.cmd} … (${t})`:" Add identities to .slack-term/settings.yml, then: slack @<who> "+e.cmd+" …";if(e.agent)return[`Error: refusing to post as the user session from inside an agent (${e.agent} is set): \`${e.cmd}\` would go out as a PERSON.`,n," As the app: add --as-bot"," As the person, on purpose: add --as-user"].join(`
|
|
382
382
|
`);if(e.identities.length>=2)return[`Error: several identities are configured (${t}): name the one \`${e.cmd}\` acts as.`,n," Or: --as-bot / --as-user"].join(`
|
|
383
|
-
`);return null}var
|
|
384
|
-
`))for(let s of t)if(s.re.test(n))return s.lang;return}function
|
|
383
|
+
`);return null}var Va=/:([a-z0-9_+'-]+):((?::skin-tone-[2-6]:)?)/g,I0=/<([A-Za-z][A-Za-z0-9+.-]*:[^|<>\s]*)(?:\|([^<>]*))?>/g,v0=/&(amp|lt|gt);/g,P0=/[︎️]/gu,L0=/[\u{1F3FB}-\u{1F3FF}]/gu,wp=String.raw`:[a-z0-9_+'-]+:(?::skin-tone-[2-6]:)?`,N0=String.raw`©®‼⁉™ℹ←-⇿⌀-⏿Ⓜ■-➿⤀-⥿⬀-⯿〰〽㊗㊙\u{1F000}-\u{1FAFF}`,Dp=String.raw`[${N0}][\u{E0020}-\u{E007F}]*`,M0=new RegExp(String.raw`(?<sc>${wp}(?:${wp})*)|(?<emoji>[0-9#*]⃣|[\u{1F1E6}-\u{1F1FF}]{2}|${Dp}(?:${Dp})*)|(?<char>[\s\S])`,"gu");function Za(e){let t=new Map,n=[e??null],s=0;while(n.length&&s++<1e5){let r=n.pop();if(Array.isArray(r))n.push(...r);else if(r&&typeof r==="object"){let{name:o,unicode:i}=r;if(r.type==="emoji"&&typeof o==="string"&&typeof i==="string")try{t.set(o.split("::")[0],i.split("-").filter(Boolean).map((l)=>String.fromCodePoint(parseInt(l,16))).join(""))}catch{}n.push(...Object.values(r))}}return t}function B0(e,t,n){if(n===void 0)return t;for(let s of["http://","mailto:"])if(t.slice(0,s.length).toLowerCase()===s&&n===t.slice(s.length))return n;return e}function Js(e,t){let n=e.normalize("NFC");return n=n.replace(I0,(s,r,o)=>B0(s,r,o)),n=n.replace(v0,(s,r)=>({amp:"&",lt:"<",gt:">"})[r]),n=n.replace(Va,(s,r)=>t.get(r)??s),n=n.replace(P0,"").replace(L0,""),n.split(/\s+/).filter(Boolean).join(" ")}function kp(e){return[...e.matchAll(M0)].map((t)=>{let n=t.groups;return n.sc!==void 0?["sc",n.sc]:n.emoji!==void 0?["emoji",n.emoji]:["char",n.char]})}function xp(e,t){let n=Za(t.blocks),s=Js(e,n),r=Js(typeof t.text==="string"?t.text:"",n);if(s===r)return!0;if(Va.lastIndex=0,!Va.test(r))return!1;let o=kp(s),i=kp(r);return o.length===i.length&&o.every(([l,u],a)=>u===i[a][1]||i[a][0]==="sc"&&l==="emoji")}function Sp(e,t){let n=0;while(n<e.length&&n<t.length&&e[n]===t[n])n++;let s=Math.max(0,n-10);return`char ${n}: sent ${JSON.stringify(e.slice(s,n+30))}, stored ${JSON.stringify(t.slice(s,n+30))}`}function j0(e){return e.replace(/```[\s\S]*?```/g," ").replace(/`[^`\n]*`/g," ").replace(/<[^>\s]*>/g," ").replace(/https?:\/\/\S+/g," ")}function _p(e){let t=Nf();for(let n of j0(e).split(`
|
|
384
|
+
`))for(let s of t)if(s.re.test(n))return s.lang;return}function Ep(e){return`hint: this looks like a choice question — use slack ask '${e}' "<question>" <choice>… so the reader can tap an answer instead of typing it`}import{existsSync as Ap,readdirSync as G0,readFileSync as Y0,renameSync as X0,statSync as V0,unlinkSync as Z0,utimesSync as Q0}from"node:fs";import{join as At}from"node:path";import{readFileSync as W0}from"node:fs";function $p(e){let t="";for(;;){let o=/^\(\?([is]+)\)/.exec(e);if(!o)break;t+=o[1],e=e.slice(o[0].length)}e=e.replaceAll("(?P<","(?<").replaceAll("\\z","$").replaceAll("[[:alnum:]]","[A-Za-z0-9]").replaceAll("[:alnum:]","A-Za-z0-9").replaceAll("[:alpha:]","A-Za-z").replaceAll("[:digit:]","0-9").replaceAll("[:space:]","\\s");let n="",s=[],r=0;for(let o=0;o<e.length;o++){let i=e[o];if(i==="\\"){n+=i+(e[o+1]??""),o++;continue}if(i==="["){let l=o+1;if(e[l]==="^")l++;if(e[l]==="]")l++;while(l<e.length&&e[l]!=="]"){if(e[l]==="\\")l++;l++}n+=e.slice(o,l+1),o=l;continue}if(e.startsWith("(?i)",o)){n+="(?i:",r++,o+=3;continue}if(i==="("){s.push(r),r=0,n+=i;continue}if(i===")"){n+=")".repeat(r),r=s.pop()??0,n+=i;continue}if(i==="|"&&r){n+=")".repeat(r)+"|"+"(?i:".repeat(r);continue}n+=i}return n+=")".repeat(r),{source:n,flags:[...new Set(t)].join("")}}function U0(e){let t=Bun.TOML.parse(e),n=(i)=>{let l=$p(i);return new RegExp(l.source,l.flags)},s=(t.allowlist?.regexes??[]).map(n),r=(t.allowlist?.stopwords??[]).map((i)=>i.toLowerCase()),o=[];for(let i of t.rules){if(!i.regex)continue;let l=[...s],u=[],a=[],c=[...r];for(let f of[...i.allowlists??[],...i.allowlist?[i.allowlist]:[]]){let p=f.regexTarget==="match"?u:f.regexTarget==="line"?a:l;for(let g of f.regexes??[])p.push(n(g));for(let g of f.stopwords??[])c.push(String(g).toLowerCase())}let d=$p(i.regex);o.push({id:i.id,re:new RegExp(d.source,d.flags+"gd"),keywords:(i.keywords??[]).map((f)=>f.toLowerCase()),...i.entropy?{entropy:i.entropy}:{},...i.secretGroup?{group:i.secretGroup}:{},allow:l,...u.length?{allowMatch:u}:{},...a.length?{allowLine:a}:{},stop:c})}return o}var J0=[{id:"url-secret-param",re:/[?&](?:access_token|token|key|api_key|apikey|secret|client_secret|password|passwd|pwd|sig|signature)=([^&\s#<>"'|]{6,})/gid,group:1,keywords:["="],allow:[/^(?:x+|\*+|\.\.\.|your[-_]?\w*|xxx\w*)$/i],stop:[]},{id:"sk-key",re:/\b(sk-(?:proj-|ant-|or-v1-|svcacct-)?[A-Za-z0-9_-]{20,})/gd,group:1,keywords:["sk-"],entropy:3.5,allow:[],stop:[]},{id:"otp-code",re:/(?:code|コード|otp|pin|passcode|認証|確認番号|ワンタイム)[^\d\n]{0,20}(?<![\d.])(\d{6})(?![\d.])/gid,group:1,keywords:[],allow:[],stop:[]}],Cp;function K0(){return Cp??=[...U0(W0(new URL("./vendor/gitleaks.toml",import.meta.url),"utf8")),...J0],Cp}function q0(e){let t=new Map;for(let s of e)t.set(s,(t.get(s)??0)+1);let n=0;for(let s of t.values()){let r=s/e.length;n-=r*Math.log2(r)}return n}function H0(e,t){let n=new Set;for(let r of t){if(r.length<6)continue;n.add(r),n.add(JSON.stringify(r).slice(1,-1))}let s=[];for(let r of[...n].sort((o,i)=>i.length-o.length))for(let o=e.indexOf(r);o>=0;o=e.indexOf(r,o+r.length))s.push({id:"known-secret",start:o,end:o+r.length});return s}function z0(e,t={}){let n=t.rules??K0(),s=e.toLowerCase(),r=t.known?.length?H0(e,t.known):[];for(let o of n){if(o.keywords.length&&!o.keywords.some((i)=>s.includes(i)))continue;for(let i of e.matchAll(o.re)){let l=o.group??i.findIndex((d,f)=>f>0&&!!d),u=l>0?i[l]:i[0];if(!u)continue;if(o.entropy&&q0(u)<o.entropy)continue;if(o.allow.some((d)=>d.test(u)))continue;if(o.allowMatch?.some((d)=>d.test(i[0])))continue;if(o.allowLine){let d=e.lastIndexOf(`
|
|
385
385
|
`,i.index)+1,f=e.indexOf(`
|
|
386
|
-
`,i.index+i[0].length);if(
|
|
387
|
-
`}function
|
|
388
|
-
`),n=t[t.length-2];if(!
|
|
389
|
-
`);if(s.length<2)return e;if(
|
|
390
|
-
`);return
|
|
391
|
-
`),
|
|
392
|
-
`)}function
|
|
393
|
-
`);if(e.startsWith(
|
|
394
|
-
`).replace(/^\*/,"").replace(/\*$/,""),i=t.length-2,l=
|
|
386
|
+
`,i.index+i[0].length);if(o.allowLine.some((p)=>p.test(e.slice(d,f<0?void 0:f))))continue}let a=u.toLowerCase();if(o.stop.some((d)=>a.includes(d)))continue;let c=o.group?i.indices?.[o.group]:void 0;if(c)r.push({id:o.id,start:c[0],end:c[1]});else{let d=i.index,f=i.index+i[0].length,p=/[\s'"`;=:,]/;while(d<f&&p.test(e[d]))d++;for(;;)if(f>d&&p.test(e[f-1]))f--;else if(f-2>=d&&/\\[nr]/.test(e.slice(f-2,f)))f-=2;else break;r.push({id:o.id,start:d,end:f})}}}return r}function uo(e,t={}){let n=z0(e,t).sort((i,l)=>i.start-l.start||l.end-i.end);if(!n.length)return{text:e,kinds:[]};let s=[];for(let i of n){let l=s[s.length-1];if(l&&i.start<l.end){if(i.end-i.start>l.end-l.start)l.id=i.id;l.end=Math.max(l.end,i.end)}else s.push({...i})}let r="",o=0;for(let i of s)r+=e.slice(o,i.start)+`[redacted:${i.id}]`,o=i.end;return{text:r+e.slice(o),kinds:[...new Set(s.map((i)=>i.id))]}}var eD=/^\d{10}\.\d{6}$/;function tD(e,t){return`${e}-${t}.yml`}function Ks(e){return Bun.YAML.stringify(e,null,2)+`
|
|
387
|
+
`}function nD(e,t,n=[]){let s=tD(t.channel,t.ts);if(Ap(At(e.dir,"inbox",s))||Ap(At(e.dir,"archived",s)))return!1;let r=uo(t.text,{known:n}),o={...t,text:r.text,...r.kinds.length?{redacted:r.kinds}:{}};return Tn(At(e.dir,"inbox",s),Ks(o)),!0}function Fp(e,t=Ta(),n=new Date,s=[]){let r=e.thread_ts??e.ts,o=Oa(e.channel.id,r,t);if(!o.length&&!e.thread_ts){for(let u of t){if(!Fa(u).auto_subscribe?.includes(e.channel.id))continue;Rf(u,`t-${e.ts}`,{channel:e.channel.id,thread_ts:e.ts,note:"auto: new top-level message"},{shared:!0,asOwner:!0})}o=Oa(e.channel.id,r,t)}let i=[],l=new Set;for(let u of o){if(l.has(u.scope.dir))continue;if(l.add(u.scope.dir),nD(u.scope,{ts:e.ts,channel:e.channel.id,channel_name:e.channel.name,...e.thread_ts?{thread_ts:e.thread_ts}:{},user:e.user.id,user_name:e.user.name,text:e.text,...e.files?{files:e.files}:{},permalink:e.permalink,alias:u.name,received_at:n.toISOString()},s))i.push(u.scope.dir)}return i}function Tp(e,t){let n;try{n=G0(e).filter((r)=>r.endsWith(".yml"))}catch{return[]}let s=[];for(let r of n.sort()){let o=At(e,r);try{let i=t(Bun.YAML.parse(Y0(o,"utf8")));if(i)s.push({file:o,entry:i,mtimeMs:V0(o).mtimeMs})}catch{}}return s}function sD(e){let t=e;return t&&typeof t.ts==="string"&&typeof t.channel==="string"&&typeof t.text==="string"?t:void 0}function ss(e){return Tp(At(e.dir,"inbox"),sD).sort((t,n)=>Number(t.entry.ts)-Number(n.entry.ts))}function Qa(e,t){let n=ss(e),s=eD.test(t)?n.find((o)=>o.entry.ts===t):n.find((o)=>o.file===t||o.file.endsWith(`/${t}`)||o.file.endsWith(`/${t}.yml`));if(!s)return;let r=At(e.dir,"archived",s.file.slice(s.file.lastIndexOf("/")+1));return X0(s.file,r),r}function rD(e){let t=e;return t&&typeof t.to==="string"&&typeof t.text==="string"?t:void 0}function ec(e){return Tp(At(e.dir,"outbox"),rD)}function Op(e,t,n=new Date){let s=At(e.dir,"outbox",`${n.toISOString().replace(/[:.]/g,"-")}-${process.pid}.yml`),r=uo(t.text);return Tn(s,Ks({...t,text:r.text})),{file:s,redacted:r.kinds}}function Rp(e,t,n,s=new Date){let r=t.file.slice(t.file.lastIndexOf("/")+1),o=uo(t.entry.text),{error:i,...l}=t.entry;if(Tn(At(e.dir,"sent",r),Ks({...l,text:o.text,...o.kinds.length?{redacted:o.kinds}:{},...n,sent_at:s.toISOString()})),Z0(t.file),t.entry.in_reply_to)Qa(e,t.entry.in_reply_to);return At(e.dir,"sent",r)}function Ip(e,t){Tn(e.file,Ks({...e.entry,attempts:(e.entry.attempts??0)+1,error:t}))}function vp(e,t=Date.now()){let n=Fa(e).nudge_after_min??30;return ss(e).filter((s)=>t-s.mtimeMs>=n*60000)}function Pp(e,t=new Date){Tn(e.file,Ks({...e.entry,nudged_at:t.toISOString()}));let n=new Date(e.mtimeMs);Q0(e.file,n,n)}var nc=[{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"}],lC=nc.length,oD="question",iD=`:${oD}: `,aD="heavy_plus_sign",tc=`:${aD}: `;var cD="information_source",Lp=`:${cD}: `,Mp=["ja","en"];var fo={get ja(){return Np("ja")},get en(){return Np("en")}};function Np(e){let t=(n,s)=>Zr(e,n,s);return{instructionReactionThread:t("instructionReactionThread"),instructionReactionHere:t("instructionReactionHere"),instructionTextThread:t("instructionTextThread"),instructionTextHere:t("instructionTextHere"),overflowNote:t("overflowNote"),otherThread:`${tc}${t("otherThread")}`,otherHere:`${tc}${t("otherHere")}`,explainLine:`${Lp}${t("explainLine")}`,explainNote:`${Lp}${t("explainNote")}`,invalidPrefix:t("invalidPrefix"),answeredVia:(n,s)=>t("answeredVia",{how:n,who:s?` (${s})`:""}),howReaction:(n)=>t("howReaction",{glyph:n}),howReply:t("howReply"),howReplyN:(n)=>t("howReplyN",{n}),voidStamp:(n)=>t("voidStamp",{reason:n?`: ${n}`:""}),supersededBy:(n)=>t("supersededBy",{link:n})}}var uC=Mp.flatMap((e)=>[fo[e].otherThread,fo[e].otherHere].map((t)=>iD+t.slice(tc.length)));var Bp="_";function jp(e){if(e===void 0||!e.endsWith(Bp))return null;return Mp.find((t)=>e.startsWith(fo[t].invalidPrefix))??null}function sc(e){let t=e.split(`
|
|
388
|
+
`),n=t[t.length-2];if(!jp(n))return[];return[...n.matchAll(/<@([UW][A-Z0-9]+)>/g)].map((s)=>s[1])}function Wp(e,t,n="ja"){let s=e.split(`
|
|
389
|
+
`);if(s.length<2)return e;if(sc(e).length)s.splice(s.length-2,1);if(t.length)s.splice(s.length-1,0,`${fo[n].invalidPrefix}${t.map((o)=>`<@${o}>`).join(", ")}${Bp}`);let r=s.join(`
|
|
390
|
+
`);return r===e?e:r}function Up(e){return jp(e)!==null}var lD="white_check_mark",dC=`:${lD}: `,uD="no_entry_sign",fC=`:${uD}: `;var kt=nc,rs=kt.length,Hs="ballot_box_with_ballot",rc=`:${Hs}: `,Kp="_下のリアクションで投票してください (1 人 1 票、押し直しで変更できます)。_",qp="_下のリアクションで投票してください (当てはまるものを *いくつでも* 押せます)。_",po="_締切: ",ho="_",ic="bar_chart",oc=`:${ic}: `;function go(e){return`:${kt[e].name}:`}function Jp(e,t){for(let n of[go(t),kt[t].glyph])if(e.startsWith(`${n} `))return e.slice(n.length+1);return null}function dD(e){return kt.some((t,n)=>e.startsWith(`${go(n)} `)||e.startsWith(`${t.glyph} `))}function qs(e){return e.replace(/\s*\n\s*/g," ")}function Hp(e,t,n,s={}){let r=!!s.multi,o=s.deadline??"",i=s.invalid??[];if(!n.length||n.length>rs)throw Error(`poll needs 1..${rs} choices, got ${n.length}`);let l=[`${rc}*${e}*`];if(t)l.push("",t);if(l.push(""),l.push(...n.map((u,a)=>`${go(a)} ${qs(u)}`)),l.push(""),o)l.push(`${po}${qs(o)}${ho}`);return l.push(r?qp:Kp),Wp(l.join(`
|
|
391
|
+
`),r?[]:i)}function zp(e,t){let n=t.reduce((r,o)=>r+o.count,0),s=[`${oc}*${e}*`,`_投票終了 (計 ${n} 票)_`,""];return s.push(...t.map((r,o)=>`${go(o)} ×${r.count} ${qs(r.choice)}`)),s.join(`
|
|
392
|
+
`)}function zs(e){let t=e.split(`
|
|
393
|
+
`);if(e.startsWith(oc)){let f=t[0].slice(oc.length).replace(/^\*/,"").replace(/\*$/,""),p=[];for(let g=0;g<kt.length;g++){let h=t.map((y)=>Jp(y,g)).find((y)=>y!==null&&y.startsWith("×"));if(h===void 0)break;let m=/^×(\d+) (.*)$/.exec(h);if(!m)return{kind:"other"};p.push({choice:m[2],count:Number(m[1])})}if(!p.length)return{kind:"other"};return{kind:"closed",question:f,tallies:p}}let n=t[t.length-1]??"",s;if(n===Kp)s=!1;else if(n===qp)s=!0;else return{kind:"other"};if(t[0].startsWith(rc))t[0]=t[0].slice(rc.length);if(!t[0].startsWith("*"))return{kind:"other"};let r=0;while(r<t.length&&!(t[r].endsWith("*")&&(r>0||t[0].length>1)))r++;if(r>=t.length)return{kind:"other"};let o=t.slice(0,r+1).join(`
|
|
394
|
+
`).replace(/^\*/,"").replace(/\*$/,""),i=t.length-2,l=sc(e);if(Up(t[i]))i--;let u="",a=t[i];if(a!==void 0&&a.startsWith(po)&&a.endsWith(ho)&&a.length>po.length+ho.length)u=a.slice(po.length,-ho.length),i--;if(t[i]!=="")return{kind:"other"};i--;let c=[];while(i>=0){let f=t[i];if(!dD(f))break;c.unshift(f),i--}if(!c.length||c.length>rs)return{kind:"other"};let d=[];for(let f=0;f<c.length;f++){let p=Jp(c[f],f);if(p===null)return{kind:"other"};d.push(p)}if(t[i]!=="")return{kind:"other"};if(i<r+1)return{kind:"other"};return{kind:"open",question:o,choices:d,multi:s,deadline:u,invalid:l}}function Gp(e,t,n,s){let r=new Map(t.map((a)=>[a.name,a.users])),o=e.map((a,c)=>(r.get(kt[c].name)??[]).filter((d)=>!n.has(d))),i=[];if(!s){let a=new Map;for(let c of o)for(let d of c)a.set(d,(a.get(d)??0)+1);for(let[c,d]of a)if(d>1)i.push(c)}let l=new Set(i),u=o.map((a)=>a.filter((c)=>!l.has(c)));return{tallies:e.map((a,c)=>({choice:a,count:u[c].length})),voters:u,ambiguous:i}}function fD(e=process.env){return!!e.VITEST||e.NODE_ENV==="test"||!!e.BUN_TEST}var Yp={isTestEnv:()=>fD(),sleep:(e)=>Yp.isTestEnv()?Promise.resolve():new Promise((t)=>setTimeout(t,e))};function pD(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 mo(e,t,n,s=pD()){for(let r=0;r<e.length;r++){let o=!0;try{await t(e[r])}catch(i){o=!1,n(e[r],i)}if(o&&s>0&&r<e.length-1)await Yp.sleep(s)}}var Xp=["text","select","user","link","date","number","checkbox"];function Zp(e){let t=e.split(":"),n=(t[0]??"").trim(),s=(t[1]??"text").trim();if(!n)throw Error(`--col needs a name: ${e}`);if(!Xp.includes(s))throw Error(`--col ${e}: unknown type "${s}" (expected one of ${Xp.join(", ")})`);if(s==="select"){let r=(t.slice(2).join(":")||"").split(",").map((o)=>o.trim()).filter(Boolean);if(!r.length)throw Error(`--col ${e}: a select column needs choices, e.g. ${n}:select:todo,doing,done`);return{name:n,type:s,choices:r}}if(t.length>2)throw Error(`--col ${e}: only select columns take a third part`);return{name:n,type:s}}var Vp=["gray","blue","green","yellow","red","purple","orange","pink","cyan","indigo","brown"];function Qp(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 s={key:`col${n+1}`,name:t.name,type:t.type};if(n===0)s.is_primary_column=!0;if(t.type==="select")s.options={format:"single_select",choices:t.choices.map((r,o)=>({value:r,label:r,color:Vp[o%Vp.length]}))};if(t.type==="user")s.options={format:"single_entity"};return s})}function eh(e){return((e.list_metadata??e.metadata??{}).schema??e.schema??[]).map((s)=>{let r=s??{},i=((r.options??{}).choices??[]).map((l)=>{let u=l??{};return{value:String(u.value??""),label:String(u.label??u.value??"")}});return{id:String(r.id??""),key:String(r.key??""),name:String(r.name??""),type:String(r.type??""),choices:i}})}function ac(e,t){let n=e.find((s)=>s.name===t)??e.find((s)=>s.key===t)??e.find((s)=>s.id===t);if(!n)throw Error(`no column "${t}" in this list (columns: ${e.map((s)=>s.name||s.key).join(", ")})`);return n}function cc(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((s)=>s.value===t||s.label===t);if(!n)throw Error(`"${t}" is not an option of ${e.name} (options: ${e.choices.map((s)=>s.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 lc(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 th(e){return e.find((t)=>t.key==="todo_completed"||t.type==="todo_completed")}import{spawnSync as dc}from"node:child_process";import{chmodSync as hD,existsSync as sh,mkdirSync as gD}from"node:fs";import{homedir as mD,hostname as yD}from"node:os";import{basename as rh,dirname as bD,join as wD}from"node:path";function bo(){return!/^(0|off|false|no)$/i.test(process.env.SLACK_TERM_ATTRIBUTION??"")}var yo={claude:"claude-code",codex:"codex",gemini:"gemini",opencode:"opencode","cursor-agent":"cursor-agent",aider:"aider",amp:"amp"};function DD(e){try{let n=(dc("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:rh(n[2].trim())}}catch{return}}function kD(){let e=process.ppid;for(let t=0;t<12&&e>1;t++){let n=DD(e);if(!n)return;if(yo[n.comm])return n;e=n.ppid}return}function nh(e){let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function oh(e=process.env){let t={pid:process.pid,host:xD(),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 s=nh(e.SLACK_TERM_AGENT_PID)??nh(e.CLAUDE_PID);if(!s||!n){let i=kD();if(i)s??=i.pid,n??=yo[i.comm]}if(n)t.cli=n;if(s)t.agentPid=s;let r=e.SLACK_TERM_AGENT_SESSION||e.CLAUDE_CODE_SESSION_ID;if(r)t.sessionId=r;let o=SD(t.cwd);if(o)t.gitBranch=o;return t}function xD(){try{return yD()}catch{return""}}function SD(e){try{let t=dc("git",["rev-parse","--abbrev-ref","HEAD"],{cwd:e,encoding:"utf8",timeout:2000});return(t.status===0?(t.stdout??"").trim():"")||void 0}catch{return}}var _D="slack_term_sent";function ih(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:_D,event_payload:n}}function Ft(){if(process.env.SLACK_TERM_SENT_DB)return process.env.SLACK_TERM_SENT_DB;return wD(process.env.HOME||mD(),".config","slack-cli","sent.sqlite")}function ED(e){try{if(typeof globalThis.Bun<"u"){let{Database:n}=gs("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 $D=`
|
|
395
395
|
CREATE TABLE IF NOT EXISTS sent (
|
|
396
396
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
397
397
|
kind TEXT NOT NULL,
|
|
@@ -416,171 +416,173 @@ CREATE TABLE IF NOT EXISTS sent (
|
|
|
416
416
|
answer_exit INTEGER,
|
|
417
417
|
delivered_at INTEGER,
|
|
418
418
|
delivered_answer TEXT,
|
|
419
|
-
delivered_cursor TEXT
|
|
419
|
+
delivered_cursor TEXT,
|
|
420
|
+
pushed_at INTEGER,
|
|
421
|
+
pushed_answer TEXT
|
|
420
422
|
);
|
|
421
423
|
CREATE INDEX IF NOT EXISTS sent_msg ON sent(channel, ts);
|
|
422
424
|
CREATE INDEX IF NOT EXISTS sent_at ON sent(sent_at);
|
|
423
|
-
`;function
|
|
424
|
-
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(` (could not record to the sent log: ${n instanceof Error?n.message:String(n)})`),!1}finally{try{t.close()}catch{}}}var
|
|
425
|
+
`;function wo(){let e=Ft();try{gD(bD(e),{recursive:!0})}catch{}let t=ED(e);if(!t)return;try{hD(e,384)}catch{}try{t.exec($D);for(let n of["delivered_answer TEXT","delivered_cursor TEXT","pushed_at INTEGER","pushed_answer TEXT"])try{t.exec(`ALTER TABLE sent ADD COLUMN ${n}`)}catch{}return t}catch{try{t.close()}catch{}return}}function ah(e){if(!bo())return!1;let t=wo();if(!t)return console.error(` (could not record to the sent log: ${Gs} — ${Ft()})`),!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)
|
|
426
|
+
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(` (could not record to the sent log: ${n instanceof Error?n.message:String(n)})`),!1}finally{try{t.close()}catch{}}}var Gs="cannot open the sent log: this runtime has no SQLite (needs bun, or node >= 22.5 for node:sqlite)";function fc(e){let t=wo();if(!t)return;try{let n=[],s=[];if(e.text)n.push("text LIKE ? ESCAPE '\\'"),s.push(`%${uc(e.text)}%`);if(e.channel)n.push("(channel = ? OR target = ?)"),s.push(e.channel,e.channel);if(e.sinceMs!==void 0)n.push("sent_at >= ?"),s.push(e.sinceMs);if(e.session)n.push("session_id LIKE ? ESCAPE '\\'"),s.push(`${uc(e.session)}%`);if(e.cwd)n.push("cwd LIKE ? ESCAPE '\\'"),s.push(`${uc(e.cwd)}%`);if(e.kind)n.push("kind = ?"),s.push(e.kind);let r=`SELECT * FROM sent${n.length?` WHERE ${n.join(" AND ")}`:""} ORDER BY sent_at DESC, id DESC LIMIT ?`;return s.push(e.limit??50),t.prepare(r).all(...s)}finally{try{t.close()}catch{}}}function uc(e){return e.replace(/[\\%_]/g,(t)=>`\\${t}`)}function os(e,t=Date.now()){let n=e.trim().match(/^(\d+(?:\.\d+)?)\s*(s|m|h|d|w)$/i);if(n){let r={s:1000,m:60000,h:3600000,d:86400000,w:604800000}[n[2].toLowerCase()];return t-Number(n[1])*r}let s=Date.parse(e);return Number.isNaN(s)?void 0:s}function pc(e,...t){if(!bo()||!sh(Ft()))return;let n=wo();if(!n)return;try{n.prepare(e).run(...t)}catch{}finally{try{n.close()}catch{}}}function hc(e,t,n,s){let r=Date.now();pc(`UPDATE sent SET collected_at = COALESCE(collected_at, ?), answer = ?, answer_exit = 0,
|
|
425
427
|
delivered_at = ?, delivered_answer = ?, delivered_cursor = ?
|
|
426
|
-
WHERE kind = 'ask' AND channel = ? AND ts = ?`,
|
|
427
|
-
WHERE kind = 'ask' AND channel = ? AND ts = ? AND collected_at IS NULL`,Date.now(),n,s,e,t)}function
|
|
428
|
+
WHERE kind = 'ask' AND channel = ? AND ts = ?`,r,n,r,n,s,e,t)}function gc(e,t,n,s){pc(`UPDATE sent SET delivered_at = ?, delivered_answer = ?, delivered_cursor = ?
|
|
429
|
+
WHERE kind = 'ask' AND channel = ? AND ts = ? AND collected_at IS NULL`,Date.now(),n,s,e,t)}function ch(e,t,n){pc("UPDATE sent SET pushed_at = ?, pushed_answer = ? WHERE kind = 'ask' AND channel = ? AND ts = ?",Date.now(),n,e,t)}function mc(e){if(!sh(Ft()))return[];let t=wo();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 lh(e){let t=e.agent_pid??e.pid;if(!CD(t))return!1;try{let s=(dc("ps",["-o","lstart=,comm=","-p",String(t)],{encoding:"utf8",timeout:2000}).stdout??"").trim(),r=Date.parse(s.slice(0,24));if(!Number.isNaN(r)&&r>e.sent_at+1000)return!1;let o=rh(s.slice(24).trim()),i=new Set(Object.values(yo));if(e.cli&&i.has(e.cli)&&o&&yo[o]!==e.cli)return!1}catch{}return!0}function CD(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}class dt 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 wc(){return(process.env.SLACK_API_BASE??"https://slack.com/api").replace(/\/$/,"")}var fh=(()=>{let e=Number(process.env.SLACK_RATELIMIT_WAIT_SEC);return Number.isFinite(e)&&e>=0?e:120})();function Dc(e){fh=e}async function ph(e,t=(n)=>new Promise((s)=>setTimeout(s,n))){let n=0;for(;;)try{return await e()}catch(s){if(!(s instanceof dt)||n+s.retryAfter>fh)throw s;n+=s.retryAfter,console.error(`slack: ${s.message} — waiting`),await t(s.retryAfter*1000)}}function hh(e,t,n,s){return ph(()=>AD(e,t,n,s))}async function AD(e,t,n,s){s=e.startsWith("xoxc-")?s??Zt():void 0;let r={};if(s)r.Cookie=`d=${s}`;let o=await fetch(`${wc()}/${t}`,{...n,headers:{...n.headers??{},Authorization:`Bearer ${e}`,...r}});if(o.status===429){let l=parseInt(o.headers.get("retry-after")??"60",10);throw new dt(isNaN(l)?60:l,t)}let i=await o.json();if(i.ok!==!0){let l=i.error??"unknown";if(l==="ratelimited")throw new dt(60,t);if(l==="invalid_auth"&&e.startsWith("xoxc-")&&!s)throw Error(`Desktop app token (xoxc-) needs its session cookie to be accepted by the public Slack API.
|
|
428
430
|
Attach it: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)
|
|
429
431
|
Or replace the token with an xoxp- user token:
|
|
430
432
|
slack auth login`);if((l==="missing_scope"||l==="cannot_dm_bot")&&e.startsWith("xoxb-")){if(t.startsWith("agents.sessions."))throw Error(`Slack error on ${t}: ${l}. Agent sessions need a granular bot token with chat:write and app membership in the channel.`);throw Error(`Slack error on ${t}: ${l} — ${l==="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"}.
|
|
431
433
|
Tailing/DMing people and listing users need a user session, not a bot token.
|
|
432
434
|
Switch workspace: slack auth ls then slack auth use <name>
|
|
433
|
-
Or import your Slack desktop session: slack auth login`)}throw Error(`Slack error on ${t}: ${l}`)}return i}function
|
|
435
|
+
Or import your Slack desktop session: slack auth login`)}throw Error(`Slack error on ${t}: ${l}`)}return i}function FD(e,t,n,s){return ph(()=>TD(e,t,n,s))}async function TD(e,t,n,s){let r={};if(s)r.Cookie=`d=${s}`;let o=await fetch(`${wc()}/${t}`,{...n,headers:{...n.headers??{},Authorization:`Bearer ${e}`,...r}});if(o.status===429){let l=parseInt(o.headers.get("retry-after")??"60",10);throw new dt(isNaN(l)?60:l,t)}let i=await o.json();if(i.ok!==!0){let l=i.error??"unknown";if(l==="ratelimited")throw new dt(60,t);if((l==="invalid_auth"||l==="not_authed")&&!e.startsWith("xoxc-"))throw Error(`${t} requires a desktop app session token (xoxc-).
|
|
434
436
|
Import from Slack desktop: slack auth login`);if((l==="invalid_auth"||l==="not_authed")&&!s)throw Error(`${t} also requires the xoxd session cookie.
|
|
435
|
-
Attach it with: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)`);throw Error(`Slack error on ${t}: ${l}`)}return i}function
|
|
437
|
+
Attach it with: slack auth firefox (Linux/macOS/Windows) or slack auth chrome (macOS/Linux)`);throw Error(`Slack error on ${t}: ${l}`)}return i}function xt(e,t,n={},s){let r=new URLSearchParams({token:e,...n});return FD(e,t,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()},s)}function be(e,t,n,s){let r=new URLSearchParams(n).toString();return hh(e,`${t}?${r}`,{method:"GET"},s)}function Oe(e,t,n,s){return hh(e,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)},s)}async function kc(e,t){let n=await be(e,"auth.test",{},t);return{team:n.team??"",teamId:n.team_id??"",url:n.url??"",user:n.user??"",userId:n.user_id??""}}async function Mt(e,t){t=e.startsWith("xoxc-")?t??Zt():void 0;let n={Authorization:`Bearer ${e}`};if(t)n.Cookie=`d=${t}`;let s=await fetch(`${wc()}/auth.test`,{method:"GET",headers:n});if(s.status===429){let i=parseInt(s.headers.get("retry-after")??"60",10);throw new dt(isNaN(i)?60:i,"auth.test")}let r=s.headers.get("x-oauth-scopes")??"",o=await s.json();if(o.ok!==!0)throw Error(`Slack error on auth.test: ${o.error??"unknown"}`);return{userId:o.user_id??"",user:o.user??"",botId:o.bot_id??"",team:o.team??"",url:o.url??"",scopes:r.split(",").map((i)=>i.trim()).filter(Boolean)}}async function gh(e,t,n){let s=await be(e,"bots.info",{bot:t},n);return{appId:s.bot?.app_id??"",userId:s.bot?.user_id??""}}async function rt(e,t,n=20,s,r,o,i){let l={channel:t,limit:String(n)};if(s!==void 0)l.oldest=s;if(r!==void 0)l.cursor=r;if(i)l.inclusive="true";return Do(await be(e,"conversations.history",l,o))}function Do(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 s of n)Or(s);return e}async function Pe(e,t,n,s=50,r){return Do(await be(e,"conversations.replies",{channel:t,ts:n,limit:String(s)},r))}async function xc(e,t,n,s={},r){let o={channel:t,ts:n,limit:String(s.limit??200)};if(s.oldest!==void 0)o.oldest=s.oldest;if(s.cursor!==void 0)o.cursor=s.cursor;return Do(await be(e,"conversations.replies",o,r))}async function mh(e,t,n){return be(e,"files.info",{file:t},n)}async function yh(e,t={},n){let s={count:String(Math.min(Math.max(t.count??100,1),200)),page:String(Math.max(t.page??1,1))};if(t.types)s.types=t.types;if(t.channel)s.channel=t.channel;if(t.user)s.user=t.user;return be(e,"files.list",s,n)}async function bh(e,t,n,s){let r={name:t,schema:n};if(s)r.todo_mode=!0;return await Oe(e,"slackLists.create",r)}async function Sc(e,t,n={}){let s={list_id:t};if(n.limit)s.limit=n.limit;if(n.cursor)s.cursor=n.cursor;if(n.includeList)s.include_list=!0;return await Oe(e,"slackLists.items.list",s)}async function wh(e,t,n){return await Oe(e,"slackLists.items.create",{list_id:t,initial_fields:n})}async function Dh(e,t,n,s){let r={list_id:t,access_level:n};if(s.userIds?.length)r.user_ids=s.userIds;if(s.channelIds?.length)r.channel_ids=s.channelIds;return await Oe(e,"slackLists.access.set",r)}async function kh(e,t,n){return await Oe(e,"slackLists.items.update",{list_id:t,cells:n})}async function xh(e,t,n={},s){let r={list_id:t};if(n.limit)r.limit=String(n.limit);if(n.cursor)r.cursor=n.cursor;return xt(e,"lists.records.list",r,s)}async function Sh(e,t,n,s,r){return Do(await be(e,"search.messages",{query:t,sort:"timestamp",sort_dir:"desc",count:String(Math.min(Math.max(n,1),100)),page:String(Math.max(s,1))},r))}async function _h(e,t,n){return Sh(e,t,100,1,n)}async function _c(e,t,n,s){let o=1,i=[],l={ok:!0,messages:{}};while(!0){let a=await Sh(e,t,100,o,s),c=Ys(a,["messages","matches"]),d=Array.isArray(c)?c:[];i.push(...d);let f=Number(Ys(a,["messages","paging","pages"])??1);if(l=a,d.length===0||o>=f||i.length>=n)break;o+=1}let u=l;if(!u.messages)u.messages={};return u.messages.matches=i.slice(0,n),u}async function Bt(e,t,n,s,r,o,i,l){let u=i?{channel:t,text:n}:{channel:t,text:n,blocks:[{type:"markdown",text:n}]};if(s!==void 0)u.thread_ts=s;if(r&&s!==void 0)u.reply_broadcast=!0;return(await Eh(e,"chat.postMessage",u,l,o)).ts??""}function OD(e){return e instanceof Error&&/: (invalid_metadata\w*|metadata_\w+)$/.test(e.message)}async function Eh(e,t,n,s,r){if(!s)return Oe(e,t,n,r);try{return await Oe(e,t,{...n,metadata:s},r)}catch(o){if(!OD(o))throw o;return Oe(e,t,n,r)}}async function $h(e,t,n,s,r,o){let i={channel:t,text:n,post_at:s,blocks:[{type:"markdown",text:n}]};if(r!==void 0)i.thread_ts=r;return(await Oe(e,"chat.scheduleMessage",i,o)).scheduled_message_id??""}async function Ch(e,t,n){let s={};if(t)s.channel=t;return be(e,"chat.scheduledMessages.list",s,n)}async function Ah(e,t,n,s){await Oe(e,"chat.deleteScheduledMessage",{channel:t,scheduled_message_id:n},s)}async function Pn(e,t,n,s){return(await be(e,"chat.getPermalink",{channel:t,message_ts:n},s)).permalink??""}async function jt(e,t,n,s,r,o,i){return(await Eh(e,"chat.update",o?{channel:t,ts:n,text:s}:{channel:t,ts:n,text:s,blocks:[{type:"markdown",text:s}]},i,r)).ts??n}async function Fh(e,t,n,s){await Oe(e,"chat.delete",{channel:t,ts:n},s)}async function Th(e,t,n,s,r=200,o){let i={channel:t,ts:n,limit:String(r)};if(s!==void 0)i.cursor=s;return be(e,"conversations.replies",i,o)}async function Ec(e,t,n,s){await Oe(e,"pins.add",{channel:t,timestamp:n},s)}async function Tt(e,t,n,s,r){await Oe(e,"reactions.add",{channel:t,timestamp:n,name:s},r)}async function Oh(e,t,n,s){return((await be(e,"reactions.get",{channel:t,timestamp:n,full:"true"},s)).message?.reactions??[]).map((o)=>({name:String(o.name??""),users:Array.isArray(o.users)?o.users.map(String):[]}))}async function Wt(e,t,n,s,r){await Oe(e,"reactions.remove",{channel:t,timestamp:n,name:s},r)}async function Rh(e,t,n=!1,s){let r=await Oe(e,"conversations.create",{name:t,is_private:n},s);return{id:r.channel?.id??"",name:r.channel?.name??t}}async function Ih(e,t,n,s){let r=await Oe(e,"conversations.rename",{channel:t,name:n},s);return{id:r.channel?.id??t,name:r.channel?.name??n}}async function $c(e,t,n,s){await Oe(e,"conversations.invite",{channel:t,users:n.join(",")},s)}async function Xs(e,t){let n=[],s="";while(!0){let r={limit:"200",types:"public_channel,private_channel,im,mpim"};if(s)r.cursor=s;let o=await be(e,"conversations.list",r,t);if(n.push(...o.channels??[]),s=o.response_metadata?.next_cursor??"",!s)break}return{channels:n}}async function Ut(e,t,n){let r=(await Oe(e,"conversations.open",{users:t},n)).channel?.id;if(!r)throw Error(`Failed to open DM with user ${t}`);return r}async function vh(e,t,n){let s="";while(!0){let r={types:"im",limit:"200"};if(s)r.cursor=s;let o=await be(e,"conversations.list",r,n);for(let i of o.channels??[])if(i.user===t)return String(i.id??"");if(s=o.response_metadata?.next_cursor??"",!s)break}return""}async function yc(e,t,n,s){let r=await vh(e,t,n);if(r)return r;let o=s?`${s} (${t})`:t;throw Error(`No existing DM with ${o}. Open it once in Slack first.`)}function vn(e){return e.toLowerCase().replace(/[-_\s]/g,"")}function uh(e,t){let n=vn(e.name??""),s=vn(e.real_name??e.profile?.real_name??""),r=vn(e.profile?.display_name??"");return n===t||s===t||!!r&&r===t}var Ph=200;async function Lh(e,t,n){let s=0,r=new Set,o="";while(!0){let c={limit:"200"};if(o)c.cursor=o;let d=await be(e,"users.list",c,n);for(let f of d.members??[]){if(s++,f.id)r.add(f.id);if(uh(f,t))return{id:f.id??"",workspaceCount:s,connectCount:0,skipped:0,capped:!1}}if(o=d.response_metadata?.next_cursor??"",!o)break}let i=0,l=0,u=!1,a="";while(!0){let c={types:"im",limit:"200"};if(a)c.cursor=a;let d=await be(e,"conversations.list",c,n);for(let f of d.channels??[]){let p=f.user;if(!p||r.has(p))continue;if(i>=Ph){u=!0;break}r.add(p),i++;let g;try{g=(await be(e,"users.info",{user:p},n)).user}catch(h){if(h instanceof dt)throw h;l++;continue}if(g&&uh(g,t))return{id:p,dm:String(f.id??""),workspaceCount:s,connectCount:i,skipped:l,capped:u}}if(u)break;if(a=d.response_metadata?.next_cursor??"",!a)break}return{id:"",workspaceCount:s,connectCount:i,skipped:l,capped:u}}function Nh(e,t){if(t.workspaceCount===0)return Error(`Cannot resolve ${e}: users.list returned no members at all, so nothing could have matched.
|
|
436
438
|
`+`That is a token or scope fault, not a wrong handle — this says nothing about whether ${e} exists.
|
|
437
|
-
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)`,s=[];if(t.capped)s.push(`stopped after ${
|
|
439
|
+
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)`,s=[];if(t.capped)s.push(`stopped after ${Ph} Slack Connect DM partners, so there may be more`);if(t.skipped)s.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.
|
|
438
440
|
`+(s.length?`This search was incomplete: ${s.join("; ")}.
|
|
439
441
|
`:"")+`Slack Connect people from another workspace are not in users.list, so if they never
|
|
440
442
|
DMed you they cannot be found by name at all. Look them up and use their ID:
|
|
441
|
-
slack user ls --external`)}async function
|
|
442
|
-
`)}catch{}}function
|
|
443
|
-
`)[0]??"",emoji:w,keep:w[0]})}if(
|
|
444
|
-
`;case"t":return"\t";case"\\":case"¥":return n==="¥"?"¥":"\\";default:return t}})}function
|
|
445
|
-
`)}function
|
|
443
|
+
slack user ls --external`)}async function Ot(e,t,n){let s=t.startsWith("@")?t.slice(1):t;if(bc(s))return s;if(!t.startsWith("@"))throw Error(`Expected @user or a user ID, got: ${t}`);let r=vn(s),o=await be(e,"auth.test",{},n);if(r==="you"||r==="me"||vn(o.user??"")===r){if(!o.user_id)throw Error("auth.test did not return user_id");return o.user_id}let i=await Lh(e,r,n);if(i.id)return i.id;throw Nh(t,i)}function ft(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],s=t[2]&&t[3]?`${t[2]}.${t[3]}`:void 0,r=e.indexOf("?"),o=r>=0?new URLSearchParams(e.slice(r)):void 0,i=o?.get("thread_ts")??void 0,a={channel:o?.get("cid")??void 0??n};if(s)a.ts=s;if(i)a.threadTs=i;return a}function RD(e){return ft(e)?.channel}function dh(e){return/^[CDG][A-Z0-9]{8,}$/.test(e)}function bc(e){return/^[UW][A-Z0-9]{6,}$/.test(e)}async function ye(e,t,n){let s=RD(t);if(s)return s;if(!t.startsWith("@")&&!t.startsWith("#")){if(dh(t))return t;if(bc(t))return yc(e,t,n);throw Error(`Target must start with # or @ (or be a Slack URL/ID), got: ${t}`)}if(t.startsWith("#")&&dh(t.slice(1)))return t.slice(1);let r=t.startsWith("@"),o=t.slice(1),i=vn(o);if(r){if(bc(o))return yc(e,o,n);let a=await be(e,"auth.test",{},n);if(i==="you"||i==="me"||vn(a.user??"")===i){let f=a.user_id;if(!f)throw Error("auth.test did not return user_id");return await vh(e,f,n)||Ut(e,f,n)}let d=await Lh(e,i,n);if(!d.id)throw Nh(t,d);if(d.dm)return d.dm;return yc(e,d.id,n,t)}let l=o.toLowerCase(),u="";while(!0){let a={limit:"200",types:"public_channel,private_channel",exclude_archived:"true"};if(u)a.cursor=u;let c=await be(e,"conversations.list",a,n);for(let d of c.channels??[])if(String(d.name??"").toLowerCase()===l)return String(d.id??"");if(u=c.response_metadata?.next_cursor??"",!u)break}throw Error(`channel not found: ${t}`)}async function Vs(e,t,n){try{let s=await be(e,"users.info",{user:t},n),r=s.user?.profile?.display_name,o=r&&r.length>0?r:s.user?.real_name??s.user?.name??t,i=s.user?.name??t;return[o,i]}catch{return[t,t]}}async function Re(e,t,n){try{let s=await be(e,"users.info",{user:t},n),r=s.user?.profile?.display_name;if(r&&r.length>0)return r;return s.user?.real_name??s.user?.name??t}catch{return t}}async function Mh(e,t){let n=[],s="";while(!0){let r={limit:"200"};if(s)r.cursor=s;let o=await be(e,"users.list",r,t);if(n.push(...o.members??[]),s=o.response_metadata?.next_cursor??"",!s)break}return{members:n}}async function Bh(e,t,n){let s=[],r="";while(!0){let o={channel:t,limit:"200"};if(r)o.cursor=r;let i=await be(e,"conversations.members",o,n);if(s.push(...i.members??[]),r=i.response_metadata?.next_cursor??"",!r)break}return s}async function Cc(e,t={},n){let s={limit:String(t.limit??50)};if(t.filter)s.filter=t.filter;if(t.cursor)s.cursor=t.cursor;return xt(e,"saved.list",s,n)}var Ac=(e)=>({item_type:"message",item_id:e.channel,ts:e.ts});async function jh(e,t,n={},s){let r={...Ac(t),todo_state:n.todo===!1?"saved":"to_do"};if(n.due)r.date_due=String(n.due);return xt(e,"saved.add",r,s)}async function Fc(e,t,n,s){let r=Ac(t);if(n.mark)r.mark=n.mark;if(n.todo!==void 0)r.todo_state=n.todo?"to_do":"saved";if(n.due!==void 0)r.date_due=String(n.due);return xt(e,"saved.update",r,s)}async function Wh(e,t,n){return xt(e,"saved.delete",Ac(t),n)}async function Zs(e,t){return xt(e,"drafts.list",{},t)}async function Uh(e,t,n,s){let{randomUUID:r}=await import("node:crypto"),o=JSON.stringify([{type:"rich_text",elements:[{type:"rich_text_section",elements:Tr(n)}]}]);return xt(e,"drafts.create",{client_msg_id:r(),destinations:JSON.stringify([{channel_id:t}]),blocks:o,file_ids:JSON.stringify([]),is_from_composer:"true"},s)}async function Jh(e,t,n,s,r){let o=JSON.stringify([{type:"rich_text",elements:[{type:"rich_text_section",elements:Tr(s)}]}]),i=(Date.now()/1000).toFixed(6);return xt(e,"drafts.update",{draft_id:t,client_last_updated_ts:i,destinations:JSON.stringify([{channel_id:n}]),blocks:o,file_ids:JSON.stringify([])},r)}async function Kh(e,t,n){return xt(e,"conversations.info",{channel:t},n)}async function is(e,t,n){return be(e,"users.info",{user:t},n)}async function qh(e,t,n){try{let s=await be(e,"users.info",{user:t,include_locale:"true"},n);return typeof s.user?.locale==="string"?s.user.locale:void 0}catch{return}}async function Ln(e,t,n){return be(e,"conversations.info",{channel:t},n)}async function Hh(e,t,n){let s=(Date.now()/1000).toFixed(6);return xt(e,"drafts.delete",{draft_id:t,client_last_updated_ts:s},n)}async function Tc(e,t){let n=await xt(e,"auth.test",{},t);return{userId:String(n.user_id??""),teamId:String(n.team_id??"")}}async function zh(e,t,n,s={},r){let{statSync:o,readFileSync:i}=await import("node:fs"),{basename:l}=await import("node:path"),u=o(n),a=l(n),c=await be(e,"files.getUploadURLExternal",{filename:a,length:String(u.size)},r),{upload_url:d,file_id:f}=c;if(!d||!f)throw Error("files.getUploadURLExternal returned no upload_url/file_id");let p=i(n),g=await fetch(d,{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:p});if(!g.ok)throw Error(`Upload PUT failed: ${g.status} ${g.statusText}`);let h={files:[{id:f,title:s.title??a}],channel_id:t};if(s.threadTs)h.thread_ts=s.threadTs;if(s.initialComment)h.initial_comment=s.initialComment;let m=await Oe(e,"files.completeUploadExternal",h,r),y={fileId:f},w=m.files?.[0]?.permalink;if(w)y.permalink=w;return y}function Ys(e,t){let n=e;for(let s of t){if(n===void 0||n===null)return;if(typeof s==="number"){if(!Array.isArray(n))return;n=n[s]??void 0}else{if(typeof n!=="object"||Array.isArray(n))return;n=n[s]}}return n}var Yh=["todo","saved","completed","archived"],Qs=(e)=>typeof e==="string"?e:"",Gh=(e)=>{let t=typeof e==="number"||typeof e==="string"?Number(e):0;return Number.isFinite(t)?t:0};function Oc(e){let t=e&&typeof e==="object"&&!Array.isArray(e)?e:{};return(Array.isArray(t.saved_items)?t.saved_items:[]).filter((s)=>!!s&&typeof s==="object"&&!Array.isArray(s)).map((s)=>({channel:Qs(s.item_id),ts:Qs(s.ts),due:Gh(s.date_due),completed:Gh(s.date_completed),todoState:Qs(s.todo_state),state:Qs(s.state),archived:s.is_archived===!0,itemType:Qs(s.item_type)}))}function Xh(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 er(e){return e.completed>0||e.state==="completed"||e.todoState==="completed"}function Rc(e,t,n){let s=er(e)?"☑":e.todoState==="to_do"?"☐":"·";if(!e.due)return`${s} no due date`;let r=!er(e)&&e.due<t?" OVERDUE":"";return`${s} due ${n(e.due)}${r}`}function Ic(e,t,n){return`${e.replace(/\/+$/,"")}/archives/${t}/p${n.replace(".","")}`}import{existsSync as UD,readFileSync as JD}from"node:fs";import{homedir as KD}from"node:os";import{join as qD}from"node:path";import{existsSync as ID,mkdirSync as vD,readFileSync as PD,writeFileSync as LD}from"node:fs";import{homedir as ND}from"node:os";import{dirname as MD,join as BD}from"node:path";var jD=3600000,ko={now:()=>Date.now(),path:()=>BD(process.env.HOME||ND(),".config","slack-cli","cache.json")},xo=!0,an;function Vh(){return{channels:{},users:{}}}function vc(){if(an)return an;if(an=Vh(),!xo)return an;try{let e=ko.path();if(!ID(e))return an;let t=JSON.parse(PD(e,"utf8"));for(let n of["channels","users"]){let s=t?.[n];if(!s||typeof s!=="object"||Array.isArray(s))continue;for(let[r,o]of Object.entries(s))if(o&&typeof o==="object"&&typeof o.value==="string"&&typeof o.expires==="number")an[n][r]={value:o.value,expires:o.expires}}}catch{an=Vh()}return an}function WD(e){if(!xo)return;try{let t=ko.path();vD(MD(t),{recursive:!0}),LD(t,JSON.stringify(e,null,2)+`
|
|
444
|
+
`)}catch{}}function Zh(e,t){return e?`${e} ${t}`:void 0}function So(e,t,n){if(!xo)return;let s=Zh(t,n);if(!s)return;let r=vc()[e][s];if(!r)return;if(r.expires<=ko.now()){delete vc()[e][s];return}return r.value}function _o(e,t,n,s,r=jD){if(!xo)return;let o=Zh(t,n);if(!o)return;let i=vc();i[e][o]={value:s,expires:ko.now()+r},WD(i)}var Pc={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"}},as=["done","dropped","doing","pending"],ng=["alert","needs-discussion","waiting","blocked"];function HD(){return qD(process.env.HOME||KD(),".config","slack-cli","todo.json")}function Eo(e){return e.replace(/^:+|:+$/g,"")}function tr(e=HD()){let t={marker:Pc.marker,progress:{...Pc.progress},flags:{...Pc.flags}};try{if(!UD(e))return t;let n=JSON.parse(JD(e,"utf8"));if(typeof n.marker==="string"&&n.marker.trim())t.marker=Eo(n.marker.trim());for(let s of as){let r=n.progress?.[s];if(typeof r==="string"&&r.trim())t.progress[s]=Eo(r.trim())}for(let s of ng){let r=n.flags?.[s];if(typeof r==="string"&&r.trim())t.flags[s]=Eo(r.trim())}}catch{}return t}function Qh(e,t,n=!1){return`${n?"-":""}${t?"has":"hasmy"}::${Eo(e)}:`}function sg(e,t,n={}){let s=n.shared===!0,r=(l)=>Qh(l,s),o=(l)=>Qh(l,s,!0),i=[];if(e==="untriaged")i.push(r(t.marker),...as.map((l)=>o(t.progress[l])));else if(e==="stuck")i.push(r(t.marker),o(t.progress.done),o(t.progress.dropped),`(${ng.map((l)=>r(t.flags[l])).join(" OR ")})`);else if(e==="open")i.push(r(t.marker),o(t.progress.done),o(t.progress.dropped));else{let l=as.indexOf(e);i.push(r(t.progress[e]));for(let u of as.slice(0,l))i.push(o(t.progress[u]))}if(n.in){let l=n.in.startsWith("#")||n.in.startsWith("@")?n.in:`#${n.in}`;i.push(`in:${l}`)}if(n.from){let l=n.from==="me"||n.from.startsWith("@")?n.from:`@${n.from}`;i.push(`from:${l}`)}return i.join(" ")}var zD=3,GD={sleep:(e)=>YD()?Promise.resolve():new Promise((t)=>setTimeout(t,e))};function YD(){return!!process.env.VITEST||!1||!!process.env.BUN_TEST}async function Ve(e,t,n=zD){for(let s=0;;s++)try{return await t()}catch(r){if(!(r instanceof qe))throw r;if(s>=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 ${r.retryAfter}s`),await GD.sleep(r.retryAfter*1000)}}var eg=new Map;async function rg(e,t){let n=eg.get(e);if(n)return n;let s=await Ve("auth.test",()=>Vn(e,t)),r={userId:s.userId,teamId:s.teamId};return eg.set(e,r),r}async function og(e,t){return(await rg(e,t)).userId}async function Lc(e,t){try{return(await rg(e,t)).teamId}catch{return""}}async function Nc(e,t,n,s){if(!t.startsWith("#"))return n(e,t,s);let r=await Lc(e,s),o=So("channels",r,t);if(o)return o;let i=await Ve("resolveChannel",()=>n(e,t,s));return _o("channels",r,t,i),i}async function ig(e,t,n,s){let r=await Lc(e,s),o=So("users",r,t);if(o)return o;let i=await Ve("users.info",()=>n(e,t,s));if(i&&i!==t)_o("users",r,t,i);return i}async function ag(e,t,n,s){let r=await Lc(e,s),o=So("users",r,`tz:${t}`);if(o)return o==="?"?null:o;let i=null;try{let l=await Ve("users.info",()=>n(e,t,s));if(l?.user?.is_bot===!0||t==="USLACKBOT")return tg(r,t,null);let u=l?.user?.tz;i=typeof u==="string"&&u?u:null}catch{return null}return tg(r,t,i)}function tg(e,t,n){return _o("users",e,`tz:${t}`,n??"?"),n}async function cg(e,t,n,s,r,o){let i=r.progress[s],l=await og(e,o),u=await Ve("reactions.get",()=>Dd(e,t,n,o)),a=new Set(u.filter((p)=>p.users.includes(l)).map((p)=>p.name)),c=as.map((p)=>r.progress[p]).filter((p)=>a.has(p));if(c.length===1&&c[0]===i)return{noop:!0,removed:[],leftover:[]};if(!a.has(i))await Ve("reactions.add",()=>Rr(e,t,n,i,o));let d=[],f=[];for(let p of c){if(p===i)continue;try{await Ve("reactions.remove",()=>Ir(e,t,n,p,o)),d.push(p)}catch{f.push(p)}}return{noop:!1,added:s,removed:d,leftover:f}}async function lg(e,t,n,s,r,o,i){let l=r.flags[s];if(o)await Ve("reactions.remove",()=>Ir(e,t,n,l,i));else await Ve("reactions.add",()=>Rr(e,t,n,l,i));return l}var Mc=1000;async function ug(e,t,n,s={}){let r=s.limit??Mc,o=s.cookie,i=await og(e,o),l=as.map((f)=>n.progress[f]),u=[],a=0,c,d=!1;while(a<r){let f=Math.min(200,r-a),p=await Ve("conversations.history",()=>An(e,t,f,void 0,c,o)),g=p.messages??[];a+=g.length;for(let h of g){let m=String(h.ts??"");if(!m)continue;let y=new Set((h.reactions??[]).filter((x)=>(x.users??[]).map(String).includes(i)).map((x)=>String(x.name??""))),w=l.filter((x)=>y.has(x));if(w.length<2)continue;u.push({ts:m,text:String(h.text??"").split(`
|
|
445
|
+
`)[0]??"",emoji:w,keep:w[0]})}if(c=p.response_metadata?.next_cursor||void 0,!c||g.length===0)break;if(a>=r){d=!0;break}}if(s.fix)for(let f of u)try{try{await Ve("reactions.add",()=>Rr(e,t,f.ts,f.keep,o))}catch(p){if(!(p instanceof Error)||!/already_reacted/.test(p.message))throw p}for(let p of f.emoji){if(p===f.keep)continue;await Ve("reactions.remove",()=>Ir(e,t,f.ts,p,o))}f.fixed=!0}catch(p){f.fixed=!1,f.error=p instanceof Error?p.message:String(p)}return{scanned:a,findings:u,truncated:d}}var XD=!0,VD;function Bc(e){if(XD=e,!e)VD=void 0}function je(e){return e.replace(new RegExp(`[${"\\\\¥"}](.)`,"gs"),(t,n)=>{switch(n){case"n":return`
|
|
446
|
+
`;case"t":return"\t";case"\\":case"¥":return n==="¥"?"¥":"\\";default:return t}})}function cs(e){return e.replace(new RegExp(`[${"\\\\¥"}]`,"g"),(t)=>`\\${t}`).replace(/\n/g,"\\n").replace(/\t/g,"\\t")}var ls=(e)=>e&&typeof e==="object"&&!Array.isArray(e)?e:{},We=(e)=>typeof e==="string"?e:"";function ZD(e){return(Array.isArray(e.message_blocks)?e.message_blocks:[]).map((n)=>We(ls(ls(n).message).text)).filter(Boolean).join(`
|
|
447
|
+
`)}function jc(e){return(Array.isArray(e.attachments)?e.attachments:[]).map(ls).map((n)=>{let s=n.is_share===!0||n.is_msg_unfurl===!0||Array.isArray(n.message_blocks),r=ls(ls((Array.isArray(n.message_blocks)?n.message_blocks:[])[0]));return{shared:s,unfurl:!s&&!!We(n.original_url),author_id:We(n.author_id)||We(ls(r.message).user)||null,author_name:We(n.author_name)||null,channel_id:We(n.channel_id)||We(r.channel)||null,ts:We(n.ts)||We(r.ts)||null,title:We(n.title)||null,text:We(n.text)||ZD(n)||We(n.pretext)||We(n.fallback),permalink:We(n.from_url)||We(n.title_link)||We(n.original_url)||null}})}function dg(e,t){return e.filter((n)=>!n.unfurl&&(n.text||n.title)).map((n)=>{let s=n.author_name??n.author_id,r=n.shared?`↪ shared message${s?` from @${s}`:""}${n.channel_id?` in <#${n.channel_id}>`:""}${n.ts?` · ${t(n.ts)}`:""}`:`▸ ${n.title??"attachment"}`,o=n.text?n.text.replace(/\n+$/,"").split(`
|
|
446
448
|
`).map((l)=>`
|
|
447
449
|
│ ${l}`).join(""):"",i=n.permalink?`
|
|
448
450
|
${n.permalink}`:"";return`
|
|
449
|
-
${
|
|
450
|
-
`)}function Nn(e){return e.toLowerCase().replace(/[-_\s]/g,"")}function cn(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function
|
|
451
|
-
`)),
|
|
452
|
-
⚠ QUIET HOURS (${
|
|
453
|
-
`)}catch{}process.exit(1)}}function
|
|
454
|
-
`),console.info=console.log;if(!
|
|
455
|
-
`),console.warn=console.error}import{closeSync as
|
|
451
|
+
${r}${o}${i}`}).join("")}var fg=new Set(["send","reply","outbox flush","channel invite","channels invite","ch invite","inbox nudge","ask","poll","vote","edit","tick","delete","react","upload","schedule send","schedule rm","pinlog new","pinlog set","pinlog note","pinlog pin","todo set","todo flag","todos add","todos done","todos complete","todos edit","todos rm","todos remove","todos delete","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"]),QD={channels:"channel",ch:"channel"};function Wc(e){let[t="",n=""]=e.map(String),s=QD[t]??t;return fg.has(s)||fg.has(`${s} ${n}`)}function Uc(e,t){return String(e[0]??"")==="ask"&&(t.ls===!0||t.pending===!0&&t.push!==!0)}function pg(e,t,n){let s=n.botTokenSource;if(!s||n.globalPaths.includes(s))return null;if(n.slackTokenSet||n.activeTokenIsBot)return null;if(!Wc(e)||Uc(e,t)||t["as-bot"]===!0)return null;let r=s==="shell"?"exported in the environment":`set in ${s}`,o="as-bot"in t;return[`Error: refusing to act as YOU — SLACK_BOT_TOKEN is ${r}, but \`${e.slice(0,2).join(" ")}\` would use your user session, not the bot.`,o?" 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(`
|
|
452
|
+
`)}function Nn(e){return e.toLowerCase().replace(/[-_\s]/g,"")}function cn(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function ek(e,t){let n=Nn(t),s=cn(e.profile);for(let o of[e.name,e.real_name,s.display_name,s.real_name])if(typeof o==="string"&&o&&Nn(o)===n)return!0;let r=typeof s.email==="string"?s.email.toLowerCase():"";return r!==""&&r===t.toLowerCase()}function tk(e){let t=cn(e.profile),n=new Set;for(let s of[t.display_name,e.real_name,e.name,t.real_name])if(typeof s==="string"&&s){let r=Nn(s);if(r.length>=2)n.add(r)}return[...n]}function nk(e,t){let n=Nn(e),s,r=!1;for(let o of t){let i=typeof o.id==="string"?o.id:"";if(!i)continue;for(let l of tk(o)){let u=-1;if(n===l)u=e.length;else for(let a of gg)if(e.length>a.length&&e.endsWith(a)&&Nn(e.slice(0,e.length-a.length))===l){u=e.length-a.length;break}if(u<0)continue;if(!s||l.length>s.formLen)s={userId:i,matchLen:u,formLen:l.length,display:qc(o)},r=!1;else if(l.length===s.formLen&&s.userId!==i)r=!0}}if(!s)return;return r?"ambiguous":{userId:s.userId,matchLen:s.matchLen,display:s.display}}async function ln(e,t,n,s){let r=`[${mg}ー]+`,o=`${r}(?:[._-]+${r})*`,i=new RegExp(`(?<![A-Za-z0-9._@<-])@(${o})`,"gu"),l=new Set;for(let w of t.matchAll(i))l.add(w[1]);if(l.size===0)return{text:t,resolved:[],unresolved:[]};let u=new Map;for(let w of l)u.set(w,{status:"pending"});let a=(w)=>{for(let x of l){if(u.get(x).status!=="pending")continue;if(Kc(x)){let D=nk(x,w);if(D==="ambiguous")u.set(x,{status:"ambiguous"});else if(D)u.set(x,{status:"resolved",userId:D.userId,matchLen:D.matchLen,display:D.display})}else{let D=w.filter((C)=>ek(C,x)),E=new Set(D.map((C)=>typeof C.id==="string"?C.id:"").filter(Boolean));if(E.size===1){let C=D.find((S)=>typeof S.id==="string");u.set(x,{status:"resolved",userId:C.id,matchLen:x.length,display:qc(C)})}else if(E.size>1)u.set(x,{status:"ambiguous"})}}},c=!1;try{let w=await Lr(e,s);a((w.members??[]).map(cn)),c=!0}catch{c=!1}let d=[...l].some((w)=>u.get(w).status==="pending"),f=!1,p=!0;if(d&&n){f=!0;try{let w=await Xi(e,n,s),x=[];for(let D of w){let E=cn(await Vi(e,D,s)),C=cn(E.user);if(typeof C.id!=="string")C.id=D;x.push(C)}a(x)}catch{p=!1}}let g=c&&(n?f&&p:!0),h=[],m=[];for(let w of l){let x=u.get(w);if(x.status==="resolved")h.push({surface:`@${w.slice(0,x.matchLen)}`,display:x.display,userId:x.userId});else if(x.status==="ambiguous")m.push({surface:`@${w}`,reason:"ambiguous"});else m.push({surface:`@${w}`,reason:g?"no-match":"unavailable"})}return{text:t.replace(i,(w,x)=>{let D=u.get(x);if(D&&D.status==="resolved")return`<@${D.userId}>${x.slice(D.matchLen)}`;return w}),resolved:h,unresolved:m}}function $o(e){let t=[],n=!1;for(let s of e)if(s.reason==="ambiguous")t.push(`${s.surface} matches multiple people — not tagged, sent as plain text (use <@USERID> to tag)`);else if(s.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(`${s.surface} matched no one — not tagged, sent as plain text`);return t}async function hg(e,t,n,s={}){let r=s.warn??((i)=>process.stderr.write(`${i}
|
|
453
|
+
`)),o=await ln(e,t,n,s.cookie);for(let i of $o(o.unresolved))r(`warn: ${i}`);return o.text}var gg=["さん","さま","様","君","くん","ちゃん","氏","先生","先輩","殿","老师","老師","兄","姐","哥","姐妹"],mg="\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}A-Za-z0-9";function Kc(e){return/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]/u.test(e)}function sk(e){let t=[],n=new RegExp(`([${mg}]{1,12})(${gg.join("|")})`,"gu");for(let s of e.matchAll(n))t.push({ref:s[1],honorific:s[2]});for(let s of e.matchAll(/\b(?:dear|hi|hello|hey)\b[ \t]+([A-Z][A-Za-z'’-]{1,20})/gi))t.push({ref:s[1],honorific:""});for(let s of e.matchAll(/(?:^|\n)[ \t]*([A-Z][A-Za-z'’-]{1,20}),/g))t.push({ref:s[1],honorific:""});return t}function rk(e){let t=cn(e.profile),n=new Set;for(let s of[e.name,e.real_name,t.display_name,t.real_name]){if(typeof s!=="string"||!s)continue;for(let r of[s,...s.split(/\s+/)]){let o=Nn(r);if(o.length>=2)n.add(o)}}return[...n]}function ok(e,t){let n=Nn(e);if(n.length<2)return;for(let s of t)if(n===s)return s;if(Kc(e)){for(let s of t)if(n.includes(s)||s.includes(n))return s}return}function qc(e){return[cn(e.profile).display_name,e.real_name,e.name].filter((s)=>typeof s==="string"&&s!=="")[0]??String(e.id??"?")}async function yg(e,t,n){let s=sk(t);if(s.length===0)return[];let r=new Set;for(let a of t.matchAll(/<@([A-Z0-9]+)(?:\|[^>]*)?>/g))r.add(a[1]);let i=((await Lr(e,n)).members??[]).map(cn).filter((a)=>a.deleted!==!0&&a.is_bot!==!0&&a.id!=="USLACKBOT").map((a)=>({id:typeof a.id==="string"?a.id:"",forms:rk(a),display:qc(a)})).filter((a)=>a.id!==""),l=[],u=new Set;for(let{ref:a,honorific:c}of s)for(let d of i){let f=ok(a,d.forms);if(!f)continue;if(r.has(d.id)||u.has(d.id))break;u.add(d.id),l.push({surface:Kc(a)?`${f}${c}`:a,display:d.display,userId:d.id});break}return l}async function Mn(e,t,n,s){let r=t,o=[],i=r,l=0;while(!0){let u=i.indexOf("<@U",l);if(u===-1)break;let a=i.slice(u+2),c=a.search(/[>|]/),d=c===-1?a:a.slice(0,c);if(d.length>=9)o.push(d);l=u+1}for(let u of o){if(!n.has(u))n.set(u,await Zn(e,u,s));let a=n.get(u)??u;r=r.replaceAll(`<@${u}>`,`@${a}`),r=r.replace(new RegExp(`<@${u}\\|[^>]*>`,"g"),`@${a}`)}return r}function us(e){return e.replace(/<!date\^(\d+)\^[^|>]*(?:\|([^>]*))?>/g,(t,n,s)=>{let r=Number(n);if(!Number.isFinite(r))return s??"date";let o=new Date(r*1000);if(Number.isNaN(o.getTime()))return s??"date";let i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],l=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],u=i[o.getUTCDay()]??"",a=l[o.getUTCMonth()]??"";return`${u}, ${a} ${String(o.getUTCDate()).padStart(2,"0")}, ${o.getUTCFullYear()}`})}function bg(e,t=new Date){let n=new Date(e*1000),s=Jc(t),r=Jc(new Date(t.getTime()-86400000)),o=Jc(n);if(o===s)return"Today";if(o===r)return"Yesterday";let i=n.toLocaleDateString("en-US",{weekday:"long"}),l=n.toLocaleDateString("en-US",{month:"short"});return`${i}, ${l} ${String(n.getDate()).padStart(2,"0")}`}function Jc(e){return`${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`}function Bn(e){let t=new Date(e*1000),n=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0"),o=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0");return`${n}-${s}-${r} ${o}:${i}`}var ik=/[A-Za-z0-9_-]{32,}/g;function ds(e){return e.replace(ik,(t)=>`${t.slice(0,4)}…(${t.length-4} masked)`)}function Hc(e=new Date,t){let n=process.env.SLACK_QUIET_TZ??"Asia/Tokyo",s=!!t&&ak(t),r=s?t:n,o=Number(process.env.SLACK_QUIET_START??23),i=Number(process.env.SLACK_QUIET_END??8),l,u;try{let p=new Intl.DateTimeFormat("en-GB",{timeZone:r,hour12:!1,weekday:"short",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"});u=p.format(e),l=Number(p.formatToParts(e).find((g)=>g.type==="hour")?.value??"12")}catch{return null}let a=o>i?l>=o||l<i:l>=o&&l<i,c=s?`${r}, recipient`:`${r}, sender — recipient's timezone unknown`,d=`\uD83D\uDD50 ${u} (${c})`;if(!a)return d;return`${d}
|
|
454
|
+
⚠ QUIET HOURS (${o}:00-${i}:00) — this will buzz a phone.${s?"":" Their local time may differ."} Send only for a production incident; otherwise hold it until morning.`}function ak(e){try{return new Intl.DateTimeFormat("en-GB",{timeZone:e}),!0}catch{return!1}}import{writeSync as wg}from"node:fs";import{isatty as Dg}from"node:tty";import{format as kg}from"node:util";var ck=new Int32Array(new SharedArrayBuffer(4)),lk=141;function xg(e,t){let n=Buffer.from(t,"utf8"),s=0;while(s<n.length)try{s+=wg(e,n,s,n.length-s)}catch(r){let o=r.code;if(o==="EAGAIN"||o==="EWOULDBLOCK"){Atomics.wait(ck,0,0,2);continue}if(o==="EPIPE")process.exit(lk);if(e!==2)try{wg(2,`slack: cannot write output (${o??String(r)}); output is incomplete
|
|
455
|
+
`)}catch{}process.exit(1)}}function Sg(){if(!Dg(1))console.log=(...e)=>xg(1,kg(...e)+`
|
|
456
|
+
`),console.info=console.log;if(!Dg(2))console.error=(...e)=>xg(2,kg(...e)+`
|
|
457
|
+
`),console.warn=console.error}import{closeSync as _g,mkdirSync as uk,openSync as Eg,readFileSync as fs,statSync as $g,unlinkSync as Co,writeFileSync as Cg}from"node:fs";import{homedir as dk}from"node:os";import{join as Ag}from"node:path";var sr="Pinlog · 最終更新";function zc(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=(r)=>t.find((o)=>o.type===r)?.value??"??",s=n("hour")==="24"?"00":n("hour");return`${n("year")}-${n("month")}-${n("day")} ${s}:${n("minute")} JST`}function fk(e){return`_${sr} ${zc(e)} · 更新はスレッドに_`}var Gc=new RegExp(`(^|\\n+)_?${sr} \\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2} JST · 更新はスレッドに_?[ \\t]*\\n*$`);function ps(e){return Gc.test(e)}function rr(e){return e.replace(Gc,"")}function Yc(e,t){return`${rr(e).trimEnd()}
|
|
456
458
|
|
|
457
|
-
${
|
|
458
|
-
`,
|
|
459
|
-
`;for(let i=0;i<3;i++)try{let l=
|
|
460
|
-
`)){let s=n.trim();if(!s||s.startsWith("#"))continue;let
|
|
461
|
-
`)}function
|
|
462
|
-
`),d=
|
|
463
|
-
`+
|
|
464
|
-
`):""),f=s?`${s} @${l}`:`@${l}`,p=
|
|
465
|
-
\uD83D\uDCCE ${D}${E}${C}`}).join(""),h=Number(t.reply_count??0),m=h>0?` [+${h} ${h===1?"reply":"replies"}]`:"",y=await Promise.all(
|
|
466
|
-
${p}`:"")+g+
|
|
467
|
-
`)[0]??"",f=await Mn(e,d,s);console.log(` ${
|
|
468
|
-
`)[0]?.slice(0,60)}`:"";console.log(`${p}${
|
|
459
|
+
${fk(t)}`}function Xc(e){let n=e.match(Gc)?.[0]?.match(/(\d{4}-\d{2}-\d{2} \d{2}:\d{2} JST)/);return n?n[1]:null}class nr extends Error{holder;constructor(e){super(`locked by ${e}`);this.holder=e;this.name="LockBusyError"}}function pk(){return Ag(process.env.HOME||dk(),".config","slack-cli","locks")}function Fg(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 hk(e,t){let n=`${e}.break`,s=`pid=${process.pid} nonce=${Math.random().toString(36).slice(2)}${Date.now()}
|
|
460
|
+
`,r;try{r=Eg(n,"wx"),Cg(r,s)}catch(o){if(o.code!=="EEXIST")throw o;try{let i=fs(n,"utf8");if((/^pid=\d+/.test(i)?!Fg(i):Date.now()-$g(n).mtimeMs>1e4)&&fs(n,"utf8")===i)Co(n)}catch{}return}try{if(fs(e,"utf8")===t)Co(e)}catch{}finally{_g(r);try{if(fs(n,"utf8")===s)Co(n)}catch{}}}function Tg(e,t={}){let n=t.dir??pk(),s=t.staleMs??120000;uk(n,{recursive:!0});let r=Ag(n,`${e.replace(/[^A-Za-z0-9._-]/g,"_")}.lock`),o=`pid=${process.pid} since=${new Date().toISOString()} nonce=${Math.random().toString(36).slice(2)}${Date.now()}
|
|
461
|
+
`;for(let i=0;i<3;i++)try{let l=Eg(r,"wx");Cg(l,o),_g(l);let u=!0,a=()=>{if(!u)return;u=!1;try{if(fs(r,"utf8")===o)Co(r)}catch{}};return process.once("exit",a),a}catch(l){if(l.code!=="EEXIST")throw l;let u,a;try{u=fs(r,"utf8"),a=Date.now()-$g(r).mtimeMs}catch{continue}if(/^pid=\d+/.test(u)?!Fg(u):a>s){hk(r,u);continue}throw new nr(u.trim().replace(/ nonce=\S+/,"")||"another process")}throw new nr("another process")}function pt(e,t){return`${e}:${t}`}function Ao(e){let t=e.match(/^([CDG][A-Z0-9]{8,}):(\d{10}\.\d{6})$/);return t?{channel:t[1],ts:t[2]}:null}var Vg=new Map,el=new Map,ol=[gt(Io(),".slack-cli",".env.local"),gt(Io(),".config/slack-cli",".env")];function Fo(e){if(!Yg(e))return;let t=rl(e,"utf8");for(let n of t.split(`
|
|
462
|
+
`)){let s=n.trim();if(!s||s.startsWith("#"))continue;let r=s.indexOf("=");if(r===-1)continue;let o=s.slice(0,r).trim(),i=s.slice(r+1).trim();if(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))i=i.slice(1,-1);if(ol.includes(e))el.set(o,[...el.get(o)??[],{path:e,val:i}]);if(!(o in process.env))process.env[o]=i,Vg.set(o,e)}}function Dk(e){gk(e,{recursive:!0});let t=gt(e,".gitignore");if(!Yg(t))Xg(t,`*
|
|
463
|
+
`)}function kk(){for(let e of ol)Fo(e);Fo(gt(process.cwd(),".slack-cli",".env.local")),Fo(gt(process.cwd(),".env.local")),Fo(gt(process.cwd(),".env"))}function xk(e){return Gg("sha256").update(e).digest("hex")}function T(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function G(e){return Array.isArray(e)?e:[]}function vo(e){return Number(e.ts??0)}async function Zg(e,t,n){let s=t.user;if(typeof s==="string"){if(!n.has(s))n.set(s,await Re(e,s));return n.get(s)??s}return typeof t.username==="string"?t.username:"bot"}function tl(e){let t=new Date(e*1000),n=t.getUTCFullYear(),s=String(t.getUTCMonth()+1).padStart(2,"0"),r=String(t.getUTCDate()).padStart(2,"0"),o=String(t.getUTCHours()).padStart(2,"0"),i=String(t.getUTCMinutes()).padStart(2,"0"),l=String(t.getUTCSeconds()).padStart(2,"0");return`${n}-${s}-${r} ${o}:${i}:${l}`}function Po(e){let[t,n="000000"]=e.split("."),s=Number(t),r=new Date(s*1000),o=r.getUTCFullYear(),i=String(r.getUTCMonth()+1).padStart(2,"0"),l=String(r.getUTCDate()).padStart(2,"0"),u=String(r.getUTCHours()).padStart(2,"0"),a=String(r.getUTCMinutes()).padStart(2,"0"),c=String(r.getUTCSeconds()).padStart(2,"0"),d=n.padEnd(6,"0").slice(0,6);return`${o}-${i}-${l}T${u}:${a}:${c}.${d}`}function il(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 Vc(e){return/^\d{4}-\d{2}-\d{2}T/.test(e)?il(e):e}async function jo(e,t,n,s,r){let o=typeof t.ts==="string"?t.ts:`${vo(t)}.000000`,i=Po(o),l="?";if(typeof t.user==="string"){let x=t.user,D="@"+x;if(!n.has(D)){let E=await ig(e,x,async(C,S,k)=>(await Vs(C,S,k))[1],r);n.set(D,E)}l=n.get(D)??x}else if(typeof t.username==="string")l=t.username;let u=typeof t.text==="string"?t.text:"",c=us(await Mn(e,u,n,r)).split(`
|
|
464
|
+
`),d=c[0]+(c.length>1?`
|
|
465
|
+
`+c.slice(1).map((x)=>` ${x}`).join(`
|
|
466
|
+
`):""),f=s?`${s} @${l}`:`@${l}`,p=G(t.reactions).map(T).map((x)=>{let D=typeof x.name==="string"?x.name:"",E=Number(x.count??G(x.users).length??0);return D?`:${D}:\xD7${E}`:""}).filter(Boolean).join(" "),g=G(t.files).map(T).map((x)=>{let D=typeof x.name==="string"?x.name:typeof x.title==="string"?x.title:"(file)",E=typeof x.size==="number"?` (${Wo(x.size)})`:"",C=typeof x.id==="string"?` [${x.id}]`:"";return`
|
|
467
|
+
\uD83D\uDCCE ${D}${E}${C}`}).join(""),h=Number(t.reply_count??0),m=h>0?` [+${h} ${h===1?"reply":"replies"}]`:"",y=await Promise.all(jc(t).map(async(x)=>({...x,text:x.text?us(await Mn(e,x.text,n,r)):""}))),w=(p?`
|
|
468
|
+
${p}`:"")+g+dg(y,Po);return`${i} ${f}: ${d}${m}${w}`}function Wo(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function Sk(e){return G(e.files).map(T).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 Qg(e){let t=Sk(e),n=jc(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:G(e.reactions).map(T).map((s)=>({name:s.name??null,count:s.count??null,users:Array.isArray(s.users)?s.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 _k(e,t,n,s,r){let o=[];for(let i of n){let l=i;if(Number(i.reply_count??0)>0&&typeof i.ts==="string"){let u=await Pe(e,t,i.ts,200,r),a=G(u.messages).map(T);l=a[a.length-1]??i}if(l.user!==s)o.push(i)}return o}async function Og(e,t,n,s="text",r=!1,o){let i=ft(t),l=await ye(e,t,o),u=new Map,c=await(async()=>{if(i?.threadTs){let f=await Pe(e,l,i.threadTs,n,o);return G(f.messages).map(T)}let d=await rt(e,l,n,void 0,void 0,o);return G(d.messages).map(T).reverse()})();if(r){let{userId:d}=await kc(e,o);c=await _k(e,l,c,d,o)}if(s==="jsonl"){for(let d of c)console.log(JSON.stringify(Qg(d)));return}for(let d of c)console.log(await jo(e,d,u,void 0,o))}function Ek(e){let t=(r)=>r.replace(/\\/g,"\\\\").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"),n=typeof e.user==="string"?e.user:typeof e.bot_id==="string"?e.bot_id:"",s=Array.isArray(e.files)&&e.files.length?` [files: ${e.files.length}]`:"";return`${String(e.ts)} ${n} ${t(typeof e.text==="string"?e.text:"")}${s}`}async function $k(e,t,n,s){let r=[],o;for(let i=0;i<200;i++){let l=T(await xc(e,t,n,o?{cursor:o}:{},s));for(let u of G(l.messages).map(T))if(!r.some((a)=>a.ts===u.ts))r.push(u);if(o=String(T(l.response_metadata).next_cursor??"")||void 0,!o)return r}throw Error("thread has more than 200 pages: refusing to return it partially")}async function Rg(e,t,n,s,r="text",o,i){let l=await ye(e,t,o),a=i!==void 0||r==="tsv"?await $k(e,l,Vc(n),o):G((await Pe(e,l,Vc(n),s,o)).messages).map(T);if(i!==void 0){let d=Number(Vc(i));if(!Number.isFinite(d))throw Error(`--since needs a message ts (1700000000.000100) or ISO stamp (got ${N(i)})`);a=a.filter((f)=>Number(f.ts)>d)}if(r==="tsv"){for(let d of a)console.log(Ek(d));return}if(r==="jsonl"){for(let d of a)console.log(JSON.stringify(Qg(d)));return}let c=new Map;for(let d of a)console.log(await jo(e,d,c,void 0,o))}async function Ck(e){let t=await Xs(e),n=G(t.channels).map(T).filter((r)=>r.is_member===!0).sort((r,o)=>Number(o.updated??0)-Number(r.updated??0)).slice(0,10),s=new Map;for(let r of n){let o=String(r.id??""),i=typeof r.name==="string"?r.name:typeof r.user==="string"?r.user:o,l=await rt(e,o,5),u=G(l.messages).map(T).filter((a)=>a.subtype===void 0||a.subtype===null).filter((a)=>{let c=typeof a.text==="string"?a.text:"";return c.length>0&&!c.startsWith("<@")}).slice(0,3).reverse();if(u.length===0)continue;console.log(`-- #${i} --------------------------------`);for(let a of u){let c=await Zg(e,a,s),d=(typeof a.text==="string"?a.text:"").split(`
|
|
469
|
+
`)[0]??"",f=await Mn(e,d,s);console.log(` ${c}: ${f}`)}}}async function Ak(e,t){let n=await _h(e,"to:me"),s=G(Ys(n,["messages","matches"])).map(T).slice(0,t),r=new Map,o=[];for(let i of s){let l=bg(vo(i)),u=o[o.length-1];if(u?.label===l)u.msgs.push(i);else o.push({label:l,msgs:[i]})}for(let i=0;i<o.length;i++){let{label:l,msgs:u}=o[i];if(i>0)console.log("");console.log(` ${l}`),console.log(" ----------------------------");for(let a of[...u].reverse()){let c=T(a.channel),d=c.is_im===!0,f=typeof c.name==="string"?c.name:"dm",p;if(d&&f.startsWith("U")){let g="@"+f;if(!r.has(g)){let[,h]=await Vs(e,f);r.set(g,h)}p=`@${r.get(g)??f}`}else if(d)p=`@${f}`;else p=`#${f}`;console.log(await jo(e,a,r,p))}}}async function Fk(e,t,n,s,r="text",o){let i=await Xs(e,o),l=G(i.channels).map(T).filter((u)=>s||u.is_member===!0).filter((u)=>{if(!n)return!0;return(typeof u.name==="string"?u.name:"").toLowerCase().includes(n.toLowerCase())}).sort((u,a)=>Number(a.updated??0)-Number(u.updated??0)).slice(0,t);if(r==="jsonl"){for(let u of l)console.log(JSON.stringify(u));return}for(let u of l){let a=String(u.id??""),c=typeof u.name==="string"?u.name:typeof u.user==="string"?u.user:a,d=u.is_im===!0,f=u.is_mpim===!0,p=d||f?"@":"#",g=u.is_member===!0?"":" (not joined)",h=typeof T(u.purpose).value==="string"?String(T(u.purpose).value):"",m=h?` ${h.split(`
|
|
470
|
+
`)[0]?.slice(0,60)}`:"";console.log(`${p}${c} ${a}${g}${m}`)}}function Tk(e){let t=(r)=>r.startsWith("xoxp-")||r.startsWith("xoxc-"),n=Ri(),s=n.find((r)=>r.profile.token===e);if(!s)return;return n.find((r)=>t(r.profile.token)&&r.profile.teamId===s.profile.teamId)}async function em(e,t,n,s,r){let o=e,i=r,l;try{l=await _c(o,t,n,i)}catch(c){let d=c instanceof Error?c.message:String(c);if(e.startsWith("xoxb-")&&d.includes("not_allowed_token_type")){let f=Tk(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}".`),o=f.profile.token,i=f.profile.cookie,l=await _c(o,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.
|
|
469
471
|
`+` Add a user-token profile: slack auth login (or slack auth login --token <token>)
|
|
470
|
-
Then select it: slack auth use <name> (or pass --workspace <name>)`),process.exit(1)}else throw
|
|
471
|
-
`);for(let h of[...g].reverse()){let m=await
|
|
472
|
-
`).join(" \u21B5 ");console.log(`[${Bn(
|
|
473
|
-
`))console.log(` ${w}`)}}var
|
|
474
|
-
`)[0]??"":"(message not readable)",y=m.length>100?`${m.slice(0,100)}\u2026`:m;if(console.log(`${
|
|
475
|
-
`)[0]??"":"(message not readable)",m=
|
|
476
|
-
`)).slice(0,4)}function N(e){return e.replace(/\x1b\[[0-9;:?]*[ -/]*[@-~]/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"").replace(/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/g,"")}var
|
|
472
|
+
Then select it: slack auth use <name> (or pass --workspace <name>)`),process.exit(1)}else throw c}if(s){console.log(JSON.stringify(l,null,2));return}let u=G(Ys(l,["messages","matches"])).map(T),a=new Map;for(let c of u){let d=T(c.channel),f=d.is_im===!0,p=typeof d.name==="string"?d.name:"dm",g;if(f&&p.startsWith("U")){let h="@"+p;if(!a.has(h)){let[,m]=await Vs(o,p,i);a.set(h,m)}g=`@${a.get(h)??p}`}else if(f)g=`@${p}`;else g=`#${p}`;console.log(await jo(o,c,a,g,i))}}async function tm(e,t,n,s){let{ref:r,ts:o}=Kt(t);if(!o)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 Nc(e,r,ye,s),ts:o}}async function Ok(e,t){let n=tr(),s={};if(!t.mine)s.shared=!0;if(t.in)s.in=t.in;if(t.from)s.from=t.from;let r=sg(t.state,n,s);if(!t.json){let o=await Me(e,t.cookie),i=t.mine?"your reactions only [hasmy:]":"anyone's reactions [has:]";console.error(`(From: ${Ko(o)} \xB7 matching ${i})`),console.error(`(query: ${r})`)}await Ve("search.messages",()=>em(e,r,t.count,t.json,t.cookie))}async function Rk(e,t){let n=tr(),{channelId:s,ts:r}=await tm(e,t.target,t.channelId,t.cookie),o=await cg(e,s,r,t.state,n,t.cookie);if(o.noop){console.log(`= Already ${t.state} (ts: ${r})`);return}let i=o.removed.length?`, removed ${o.removed.map((l)=>`:${l}:`).join(" ")}`:"";if(console.log(`\u2713 ${t.state} :${n.progress[t.state]}: (ts: ${r})${i}`),o.leftover.length)console.error(`\u26A0 ${o.leftover.map((l)=>`:${l}:`).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 Ik(e,t){let n=tr(),{channelId:s,ts:r}=await tm(e,t.target,t.channelId,t.cookie),o=await lg(e,s,r,t.flag,n,t.remove===!0,t.cookie);console.log(`\u2713 ${t.remove?"Cleared":"Flagged"} ${t.flag} :${o}: (ts: ${r})`)}async function vk(e,t){let n=tr(),s=t.channelId??await Nc(e,t.channel,ye,t.cookie),r={limit:t.limit};if(t.fix)r.fix=!0;if(t.cookie)r.cookie=t.cookie;let o=await ug(e,s,n,r);if(o.findings.length===0)console.log(`\u2713 No multi-state tasks in ${o.scanned} message(s).`);else{for(let i of o.findings){let l=i.fixed===!0?"fixed":i.fixed===!1?`FAILED: ${i.error??"?"}`:"needs --fix";console.log(`${i.ts} ${i.emoji.map((u)=>`:${u}:`).join(" ")} \u2192 keep :${i.keep}: [${l}] ${N(i.text).slice(0,60)}`)}console.log(`${o.findings.length} multi-state task(s) in ${o.scanned} message(s).`)}if(o.truncated)console.error(`\u26A0 Scan limit reached (${t.limit} messages) \u2014 older history was NOT checked. Raise it with --limit N.`)}async function Pk(e,t,n,s){let r=Math.floor(Date.now()/1000)-t*86400,o=await Xs(e),i=G(o.channels).map(T).filter((c)=>c.is_member===!0&&c.is_im!==!0&&c.is_mpim!==!0).filter((c)=>{if(!s)return!0;return(typeof c.name==="string"?c.name:"").toLowerCase().includes(s.toLowerCase())}).sort((c,d)=>Number(d.updated??0)-Number(c.updated??0)),l=new Map,u=0,a=0;for(let c of i){let d=String(c.id??""),f=typeof c.name==="string"?c.name:d,p;try{p=await rt(e,d,n)}catch(h){console.error(` SKIP #${f}: ${h.message}`);continue}let g=G(p.messages).map(T).filter((h)=>(h.subtype===void 0||h.subtype===null)&&vo(h)>=r);if(g.length===0)continue;a+=1,u+=g.length,console.log(`## #${f} (${g.length} msgs)
|
|
473
|
+
`);for(let h of[...g].reverse()){let m=await Zg(e,h,l),y=typeof h.text==="string"?h.text:"",x=us(await Mn(e,y,l)).split(`
|
|
474
|
+
`).join(" \u21B5 ");console.log(`[${Bn(vo(h))}] ${m}: ${x}`)}console.log("")}console.error(`Dumped ${u} messages across ${a} channels (cutoff: ${t}d)`)}function Lk(e){let t=[];function n(s){if(typeof s==="string"){t.push(s);return}if(Array.isArray(s)){for(let r of s)n(r);return}if(s&&typeof s==="object"){let r=s;if(typeof r.text==="string"){t.push(r.text);return}if(r.type==="link"&&typeof r.url==="string"){t.push(r.url);return}if(Array.isArray(r.elements))n(r.elements);else if(Array.isArray(r.content))n(r.content)}}for(let s of e)n(s);return t.join("").trim()}async function Uo(e,t,n){let s=new Map;return async(r)=>{if(!r)return"(unknown)";if(s.has(r))return s.get(r);try{let o=await Kh(e,r,t),i=T(o.channel),l;if(i.is_im===!0){let u=typeof i.user==="string"?i.user:"";if(!u||u===n)l="@self";else{let[a]=await Vs(e,u);l=`@${a}`}}else l=`#${typeof i.name==="string"?i.name:r}`;return s.set(r,l),l}catch{return r}}}function al(e){let t=T(G(e.destinations)[0]);return String(t.channel_id??e.channel_id??e.channel??"")}function Lo(e){return Lk(G(e.blocks))||(typeof e.text==="string"?e.text:"(no text)")}async function Nk(e,t,n=!1){let s=await Zs(e,t),r=G(s.drafts??s.messages??[]).map(T).filter((a)=>a.is_deleted!==!0),o=n?r:r.filter((a)=>a.is_sent!==!0);if(o.length===0){console.log(n?"No drafts.":"No pending drafts. Run with --all to include sent.");return}let i="";try{({userId:i}=await Tc(e,t))}catch{}let l=await Uo(e,t,i),u=new Map;for(let a of o){let c=al(a),d=Lo(a),f=Number(a.date_created??a.date_create??0),p=f?tl(f):"?",g=await l(c),h=typeof a.id==="string"?a.id:"",m=a.is_sent===!0?" [SENT]":"",y=us(await Mn(e,d,u));console.log(`-- ${h} ${g} [${p}]${m}`);for(let w of y.split(`
|
|
475
|
+
`))console.log(` ${w}`)}}var No=50,or=20;async function Mk(e,t,n){let s=[],r,o=0;do{let d=T(await Cc(e,{filter:n.filter,limit:No,cursor:r},t));s.push(...Oc(d));let f=T(d.response_metadata).next_cursor;r=typeof f==="string"&&f?f:void 0}while(r&&++o<or);if(r)console.error(`Note: read the first ${s.length} items only (${or} pages); the order covers those.`);let i=Xh(s).slice(0,n.limit);if(i.length===0){(n.json?console.error:console.log)(`No ${n.filter==="todo"?"to-dos":`${n.filter} items`}.`);return}let l="",u="";try{({url:l,userId:u}=await Mt(e,t))}catch{}let a=await Uo(e,t,u),c=Date.now()/1000;for(let d of i){let f;if(d.channel&&d.ts)try{let w=T(await Pe(e,d.channel,d.ts,1,t));f=G(w.messages).map(T).find((x)=>x.ts===d.ts)}catch{}let p=d.channel&&d.ts?l?Ic(l,d.channel,d.ts):`${d.channel}:${d.ts}`:"";if(n.json){console.log(JSON.stringify({...d,done:er(d),permalink:p,user:f?.user??null,text:f?.text??null}));continue}let g=d.channel?await a(d.channel):`(${d.itemType||"item"})`,h=typeof f?.user==="string"?`@${await Re(e,f.user,t)}: `:"",m=typeof f?.text==="string"?f.text.split(`
|
|
476
|
+
`)[0]??"":"(message not readable)",y=m.length>100?`${m.slice(0,100)}\u2026`:m;if(console.log(`${Rc(d,c,Bn)} ${N(g)}`),console.log(` ${N(h+y)}`),p)console.log(` ${p}`)}}function Bk(e){if(e.kind==="done")return e.undo?["completed","todo","saved","archived"]:["todo","saved","completed","archived"];return["todo","saved","completed","archived"]}async function jk(e,t,n,s,r){let o=0;for(let i of r){let l;do{if(o++>=or)return"unknown";let u=T(await Cc(e,{filter:i,limit:No,cursor:l},t)),a=Oc(u).find((d)=>d.channel===n&&d.ts===s);if(a)return a;let c=T(u.response_metadata).next_cursor;l=typeof c==="string"&&c?c:void 0}while(l)}return}function Wk(e,t){let n=(s)=>s===void 0?[]:[` Due: ${s?t(s):"(clear the due date)"}`];switch(e.kind){case"add":return[` Action: add as ${e.saved?"a saved item (no checkbox)":"a to-do"}`,...n(e.due)];case"done":return[` Action: mark ${e.undo?"NOT done (reopen)":"done"}`];case"edit":return[" Action: edit",...e.todo===void 0?[]:[` Kind: ${e.todo?"to-do":"saved item (no checkbox)"}`],...n(e.due)];case"rm":return[" Action: REMOVE from your To-dos (the message itself is untouched)"]}}async function To(e,t,n,s,r){let{ref:o,ts:i}=Kt(n);if(!i)console.error("Error: a To-do points at a message \u2014 give its permalink or #chan:<ts> (see `slack todos ls`)."),process.exit(2);if(s.kind==="edit"&&s.due===void 0&&s.todo===void 0)console.error("Error: nothing to edit \u2014 pass --due <time|none>, --todo or --saved."),process.exit(2);let l=await ye(e,o,t),u=await jk(e,t,l,i,Bk(s));if(u==="unknown"&&s.kind!=="add")console.error(`Error: not found in the first ${or*No} saved items \u2014 stopped there to stay under Slack's rate limits. Nothing was changed.`),process.exit(1);let a=u==="unknown"?void 0:u;if(s.kind==="add"&&a)console.error(`Error: that message is already in your To-dos (${er(a)?"done":a.todoState||"saved"}) \u2014 use \`slack todos edit\` or \`done\`.`),process.exit(1);if(s.kind!=="add"&&!a)console.error("Error: that message is not in your To-dos \u2014 nothing to change. `slack todos ls --filter saved` lists everything saved."),process.exit(1);let c="",d="";try{({url:c,userId:d}=await Mt(e,t))}catch{}let f=await(await Uo(e,t,d))(l),p;try{let D=T(await Pe(e,l,i,1,t));p=G(D.messages).map(T).find((E)=>E.ts===i)}catch{}let g=typeof p?.user==="string"?`@${await Re(e,p.user,t)}: `:"",h=typeof p?.text==="string"?p.text.split(`
|
|
477
|
+
`)[0]??"":"(message not readable)",m=ds(h.length>100?`${h.slice(0,100)}\u2026`:h),y=Date.now()/1000,w=we("todos",JSON.stringify(s),l,i,d);if(r!==w)xe(r,w,["--- To-do ------------------------------------",` For: ${d?`@${await Re(e,d,t)} (your own To-dos)`:"(your own To-dos)"}`,` Where: ${N(f)}`,` Msg: ${N(g+m)}`,...c?[` Link: ${Ic(c,l,i)}`]:[],...a?[` Now: ${Rc(a,y,Bn)}`]:[],...u==="unknown"?[` Note: not checked beyond the first ${or*No} saved items \u2014 it may already be saved`]:[],...Wk(s,ym),"----------------------------------------------"]);let x={channel:l,ts:i};switch(s.kind){case"add":await jh(e,x,{todo:!s.saved,...s.due?{due:s.due}:{}},t),console.log(`\u2713 Added to your To-dos${s.due?` (due ${Bn(s.due)})`:""}`);break;case"done":await Fc(e,x,{mark:s.undo?"uncompleted":"completed"},t),console.log(s.undo?"\u2713 Reopened":"\u2713 Marked done");break;case"edit":await Fc(e,x,{...s.todo===void 0?{}:{todo:s.todo},...s.due===void 0?{}:{due:s.due}},t),console.log("\u2713 Updated");break;case"rm":await Wh(e,x,t),console.log("\u2713 Removed from your To-dos");break}}async function Uk(e,t,n){let s=await Zs(e,t),r=G(s.drafts).map(T).find((g)=>String(g.id)===n);if(!r)console.error(`Draft not found: ${n}`),process.exit(1);let o="";try{({userId:o}=await Tc(e,t))}catch{}let i=await Uo(e,t,o),l=al(r),u=Lo(r),a=Number(r.date_created??0),c=String(r.last_updated_ts??"?"),d=await i(l),p=us(await Mn(e,u,new Map));console.log(`id: ${r.id}`),console.log(`channel: ${d} (${l})`),console.log(`created: ${a?tl(a):"?"}`),console.log(`updated: ${tl(Number(c.split(".")[0]))}`),console.log(`status: ${r.is_sent===!0?"sent":"pending"}`),console.log("---"),console.log(p)}function we(...e){return xk(e.join(`
|
|
478
|
+
`)).slice(0,4)}function N(e){return e.replace(/\x1b\[[0-9;:?]*[ -/]*[@-~]/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"").replace(/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/g,"")}var Jk={"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[,s,r]=n;switch(r){case"missing_scope":return`Error: token lacks the ${Jk[s]??"the required"} scope (needed for ${s}). 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 Jo(e,t,n){if(!t.startsWith("D"))return null;try{let s=await qo(e,t,n);if(!s)return null;return await ag(e,s,is,n)}catch{return null}}function xe(e,t,n,s,r=new Date){for(let i of n)console.log(i);let o=Hc(r,s);if(o)console.log(o);if(e!==void 0)console.error(`Code mismatch (got ${e}, expected ${t})`);console.error(`Rerun with --code=${t}`),process.exit(1)}function Kt(e){let t=ft(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 s=e.slice(n+1);if(/^\d{10}\.\d{6}$/.test(s))return{ref:e.slice(0,n),ts:s};if(/^\d{4}-\d{2}-\d{2}T/.test(s))return{ref:e.slice(0,n),ts:il(s)}}}return{ref:e}}function St(e,t=!0){let n=ft(e);if(n){if(!t)return{ref:n.channel};let o=n.threadTs??n.ts;return o?{ref:n.channel,threadTs:o}:{ref:n.channel}}let s=e.indexOf(":");if(s>0){let o=e.slice(s+1);if(/^\d{10}\.\d{6}$/.test(o))return{ref:e.slice(0,s),threadTs:o};if(/^\d{4}-\d{2}-\d{2}T/.test(o))return{ref:e.slice(0,s),threadTs:il(o)}}let r=Ha(e);if(r)return r.thread_ts?{ref:r.channel,threadTs:r.thread_ts}:{ref:r.channel};return{ref:e}}async function Ig(e,t,n,s,r,o=!1){let i=ns(n),l,u;if(s)if(ft(s)){let a=await hs(e,s,t);l=a.channel,u=a.root}else{let a=St(s);if(!a.threadTs&&/^\d{10}\.\d{6}$/.test(s)){if(!i.channel)return{error:`a bare ts needs a channel: set \`channel\` in .slack-term/settings.yml, or pass #chan:${s}`};a={ref:i.channel,threadTs:s}}if(!a.threadTs)return{error:`"${s}" is not a thread \u2014 reply only posts in threads. For a top-level post use \`slack send\`.`};l=await ye(e,a.ref,t),u=a.threadTs}if(r){let a=await hs(e,r,t);if(l===void 0)l=a.channel,u=a.root;else if(!o){let c=Ya({channel:l,...u?{threadTs:u}:{}},a);if(c)return{error:c}}}if(!l||!u)return{error:"reply needs a destination (alias, permalink, #chan:<ts>) or --to <permalink>"};if(In(n)&&!on(n).some((a)=>a.channel===l&&(a.thread_ts===void 0||a.thread_ts===u)))return{error:`${l} thread ${u} is not one of ${n.dir}'s subscriptions (restrict_to_subscriptions)`};return{channel:l,threadTs:u}}async function hs(e,t,n){let s=ft(t),r,o,i;if(s)r=s.channel,o=s.ts,i=s.threadTs;else{let u=St(t);r=u.ref,o=u.threadTs}if(!o)throw Error(`--to needs a message permalink (or #chan:<ts>), got "${t}"`);let l=await ye(e,r,n);if(!i)try{let u=T(await Pe(e,l,o,1,n)).messages??[],a=u.map(T).find((c)=>c.ts===o)??T(u[0]);i=typeof a.thread_ts==="string"?a.thread_ts:o}catch(u){if(!/thread_not_found/.test(u instanceof Error?u.message:String(u)))throw u;i=o}return{channel:l,ts:o,root:i}}async function Jt(e,t,n,s){let r=n;if(/^#?[CDG][A-Z0-9]{8,}$/.test(n)||!n.startsWith("#")&&!n.startsWith("@"))try{let i=T(await Ln(e,t,s)),l=T(i.channel);if(l.is_im===!0){let u=typeof l.user==="string"?l.user:"";r=u?`@${await Re(e,u,s)}`:t}else r=typeof l.name==="string"?`#${l.name}`:t}catch{r=t}return r===t?t:`${r} (${t})`}async function Me(e,t){try{return await Mt(e,t)}catch{return null}}function qt(e,t){let n;return async()=>{if(n===void 0)n=await Me(e,t);return n}}function Wn(e){if(!bo())return{record:()=>{}};let t=oh();return{metadata:ih(e,t),record:(n)=>{ah({...n,kind:e,attribution:t})}}}function Kk(e){let t=N(e.text.split(`
|
|
477
479
|
`)[0]??"").slice(0,100),n=e.permalink||`${e.channel}:${e.ts}`,s=[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`${Bn(e.sent_at/1000)} ${e.kind.padEnd(4)} ${N(e.target??e.channel)} ${n}
|
|
478
480
|
${t}
|
|
479
|
-
${N(s)}`}function
|
|
480
|
-
`)[0]??""),i=
|
|
481
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);if(s)return{botToken:
|
|
481
|
+
${N(s)}`}function Ko(e,t){let n=t?" [as bot]":"";if(!e)return`(unknown \u2014 auth.test failed)${n}`;let s=N(e.user||e.userId||"?"),r=e.userId?` (${e.userId})`:"",o=e.team?` \u2014 ${N(e.team)}`:"";return`@${s}${r}${o}${n}`}function _e(e,t={}){return` ${"From:".padEnd(t.pad??6)}${Ko(e,t.asBot)}`}async function nl(e,t,n=60,s){let r=typeof t.user==="string"?await Re(e,t.user,s):typeof t.username==="string"?t.username:"?",o=ds((typeof t.text==="string"?t.text:"").split(`
|
|
482
|
+
`)[0]??""),i=o.length>n?`${o.slice(0,n)}\u2026`:o,l=typeof t.ts==="string"?t.ts:"";return`${l?Po(l).slice(0,16).replace("T"," "):""} @${r}${i?`: ${i}`:""}`}async function qk(e,t,n,s){let r=n.find((o)=>String(o.ts)===t)??n[0];if(!r)return t;return nl(e,r,40,s)}function vg(e){return e.toLowerCase().replace(/<[@#!][^>]+>/g," ").replace(/[^\p{L}\p{N}\s]/gu," ").replace(/\s+/g," ").trim()}function Hk(e,t){let n=vg(e),s=vg(t);if(!n||!s)return 0;if(n===s)return 1;let r=(a)=>{let c=new Map;for(let d=0;d<a.length-1;d++){let f=a.slice(d,d+2);c.set(f,(c.get(f)??0)+1)}return c},o=r(n),i=r(s);if(o.size===0||i.size===0)return 0;let l=0;for(let[a,c]of o){let d=i.get(a);if(d)l+=Math.min(c,d)}let u=Pg(o)+Pg(i);return u===0?0:2*l/u}function Pg(e){let t=0;for(let n of e.values())t+=n;return t}async function Lg(e,t,n,s){let r=Le();if(!r)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
483
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);if(s)return{botToken:r};let{ref:o}=Kt(e);if(!o.startsWith("@"))return{botToken:r};try{let i=await Ot(t,o,n);return{botToken:r,channelId:await Ut(r,i)}}catch(i){console.error(`Error: could not resolve ${N(o)} to the bot's DM.
|
|
482
484
|
${i instanceof Error?i.message:String(i)}
|
|
483
|
-
`+" Tip: pass the message permalink, or --channel-id <D\u2026>, to skip the lookup."),process.exit(1)}}async function
|
|
485
|
+
`+" Tip: pass the message permalink, or --channel-id <D\u2026>, to skip the lookup."),process.exit(1)}}async function zk(e,t){let n=qt(e,t.cookie),{ref:s,ts:r}=Kt(t.target);if(!r)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 o;if(t.channelId)o=t.channelId;else o=await ye(e,s,t.cookie);let i=await Pe(e,o,r,1,t.cookie),u=G(i.messages).map(T).find((S)=>String(S.ts)===r);if(!u)console.error(`Message not found at ts=${r} in channel ${o}`),process.exit(1);let a=typeof u.text==="string"?u.text:"",c=t.newText;if(t.tick){let S=up(a,t.tick.n);if(S.kind==="already")console.log(`already ticked (${S.n}.)`),process.exit(0);if(S.kind==="none")console.error("Error: the message has no \u2B1C <n>. item"),process.exit(2);if(S.kind==="missing")console.error(`Error: the message has no \u2B1C ${S.n}. item`),process.exit(2);if(S.kind==="ambiguous")console.error(`Error: several open items (${S.open.join(", ")}): name one, e.g. slack tick <target> ${S.open[0]}`),process.exit(2);c=S.text}else c=dp(a,c,t.lanePrefix);let d=t.mentionCookie??t.cookie,f=t.mentions&&!t.tick?await hg(t.mentionToken??e,c,o,d?{cookie:d}:{}):c;Ke(f,t.allowUrlAdjacent);let p=Ct(a).kind,g=Ct(f).kind,h=zs(a).kind!=="other",m=h?zs(f).kind==="other":p!=="other"&&(g==="other"||p!=="open"&&g==="open");if(m&&!t.force)console.error(`Error: this message is ${h?"a `slack poll`":`a \`slack ask\` question (${p==="open"?"open":p==="resolved"?"answered":"void"})`}, and ${h||g==="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"}.
|
|
484
486
|
`+(h?" Edit it anyway with --force.":` To retire it: slack ask --void='${t.target}' --reason '\u2026'
|
|
485
|
-
Edit it anyway with --force.`)),process.exit(1);let y=m,w=await n(),x=y?we("force-edit-ask-poll",
|
|
487
|
+
Edit it anyway with --force.`)),process.exit(1);let y=m,w=await n(),x=y?we("force-edit-ask-poll",a,f,w?.userId??""):we(a,f,w?.userId??"");if(t.code!==x)xe(t.code,x,[...y?[`\u26A0 --force: rewriting a \`slack ${h?"poll":"ask"}\` message by hand \u2014 collect may no longer read it back`]:[],"--- Editing as -------------------------------",_e(w,{asBot:t.asBot}),"--- Original message -------------------------",...a.split(`
|
|
486
488
|
`).map((S)=>` ${S}`),"--- Replacing with ---------------------------",...f.split(`
|
|
487
|
-
`).map((S)=>` ${S}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let D=Wn("edit"),E=p!=="other"||g!=="other"||h||
|
|
488
|
-
`).map((p)=>` ${p}`),"---------------------------------------------"])}await
|
|
489
|
+
`).map((S)=>` ${S}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let D=Wn("edit"),E=p!=="other"||g!=="other"||h||zs(f).kind!=="other",C=await jt(e,o,r,f,t.cookie,E?!0:void 0,D.metadata);console.log(`\u2713 Edited (ts: ${C})`),D.record({team:w?.team,channel:o,target:t.target,ts:r,text:f,asBot:t.asBot})}async function Gk(e,t){let n=qt(e,t.cookie),{ref:s,ts:r}=Kt(t.target);if(!r)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 o;if(t.channelId)o=t.channelId;else o=await ye(e,s,t.cookie);let i=await Pe(e,o,r,1,t.cookie),u=G(i.messages).map(T).find((f)=>String(f.ts)===r);if(!u)console.error(`Message not found at ts=${r} in channel ${o}`),process.exit(1);let a=typeof u.text==="string"?u.text:"",c=await n(),d=we(o,r,a,c?.userId??"");if(t.code!==d){let f=await Jt(e,o,s,t.cookie);xe(t.code,d,["--- Deleting message -------------------------",_e(c,{asBot:t.asBot}),` \u2192 ${f} at ${Po(r)}`,...a.split(`
|
|
490
|
+
`).map((p)=>` ${p}`),"---------------------------------------------"])}await Fh(e,o,r,t.cookie),console.log(`\u2713 Deleted (ts: ${r})`)}function dn(e){return`'${e.replace(/'/g,"'\\''")}'`}async function cl(e,t,n){let s=Ao(t);if(s)return{...s,ref:s.channel};let{ref:r,ts:o}=Kt(t);if(!o)console.error(`Error: ${N(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 ${dn(t)}`),process.exit(2);return{channel:await ye(e,r,n),ts:o,ref:r}}async function Yk(e,t,n,s){let r=T(await Pe(e,t,n,1,s)),o=G(r.messages).map(T).find((i)=>String(i.ts)===n);if(!o)console.error(`Error: no message at ts=${n} in ${t}.`),process.exit(1);return o}function Oo(e,t){if(t!==void 0)try{return rl(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:je(e)}var Ng=40000;function Mo(e,t){if(t.length>Ng)console.error(`Error: the ${e} is ${t.length} characters; Slack truncates past ${Ng}. Shorten it \u2014 move detail to a linked page.`),process.exit(2)}function Bo(e){let n=(e instanceof Error?e.message:String(e)).match(/Slack error on \S+: (\w+)/);if(e instanceof dt)return!0;return!!n&&!["internal_error","fatal_error","request_timeout","service_unavailable"].includes(n[1])}function nm(e,t){let n=Hc(e);return n&&n.includes("QUIET HOURS")?`\u26A0 Quiet hours (JST): ${t}.`:null}async function Xk(e,t){let{ref:n,ts:s}=Kt(t.target);if(s||Ao(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 ${dn(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(Ke(t.state,t.allowUrlAdjacent),t.log!==void 0)Ke(t.log,t.allowUrlAdjacent),Mo("reason",t.log);let r=`${t.workspace?` -w ${dn(t.workspace)}`:""}${t.asBot?" --as-bot":""}`,o=qt(e,t.cookie),i=await ye(e,n,t.cookie),l=await o(),u=we("pinlog-create",i,t.state,t.log??"",l?.userId??""),a=new Date,c=Yc(t.state,a);if(Mo("HEAD (state + footer)",c),t.code!==u){let h=await Jt(e,i,n,t.cookie),m=(await sm(e,i,200,t.cookie)).found;xe(t.code,u,["--- New pinlog -------------------------------",_e(l,{asBot:t.asBot}),` \u2192 ${h} \u2014 NEW top-level message, then pinned`,...m.length?[`\u26A0 ${m.length} board(s) already in this channel \u2014 to change one, use \`slack pinlog set <board> \u2026\` instead:`,...m.slice(0,5).map((y)=>` ${pt(i,String(y.ts))} ${rm(String(y.text))}`)]:[" (no other boards in the last 200 messages of this channel)"],"--- State (the top-level message) ------------",...c.split(`
|
|
489
491
|
`).map((y)=>` ${N(y)}`),...t.log?["--- Reason (first thread reply \u2014 notifies) ---",...t.log.split(`
|
|
490
|
-
`).map((y)=>` ${N(y)}`)]:[],"---------------------------------------------"])}let d=Wn("send"),f;try{f=await
|
|
491
|
-
Check before retrying, or you will have two boards: slack pinlog ls ${dn(t.target)}${
|
|
492
|
+
`).map((y)=>` ${N(y)}`)]:[],"---------------------------------------------"])}let d=Wn("send"),f;try{f=await Bt(e,i,c,void 0,!1,t.cookie,!0,d.metadata)}catch(h){if(Bo(h))console.error(`\u2717 HEAD was NOT posted: ${pe(h)}`);else console.error(`\u26A0 UNKNOWN whether the HEAD was posted: ${pe(h)}
|
|
493
|
+
Check before retrying, or you will have two boards: slack pinlog ls ${dn(t.target)}${r}`);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:l?.team,channel:i,target:t.target,ts:f,text:c,asBot:t.asBot});let p=pt(i,f);console.log(`\u2713 Posted HEAD: ${p}`);let g=nm(a,"this new top-level post notified everyone who follows the channel");if(g)console.error(g);try{await Ec(e,i,f,t.cookie),console.log("\u2713 Pinned")}catch(h){let m=h instanceof Error?h.message:String(h),y=/missing_scope/.test(m)?`the ${t.asBot?"bot":"user"} token lacks the pins:write scope`:pe(h);console.error(`\u26A0 NOT pinned: ${y}.`),console.error(` The board works unpinned; pin it later with: slack pinlog pin ${p}${r}`)}if(t.log)try{let h=await Bt(e,i,t.log,f,!1,t.cookie,!0);console.log(`\u2713 Reason posted in the thread (ts: ${h})`)}catch(h){let m=we("pinlog-log",i,f,t.log,l?.userId??"");console.error(`${Bo(h)?"\u2717 The reason was NOT posted":"\u26A0 UNKNOWN whether the reason was posted"}: ${pe(h)}
|
|
492
494
|
The board IS posted. Retry just the reason (check the thread first):
|
|
493
|
-
slack pinlog note ${p} ${dn(
|
|
494
|
-
`+" Refusing to overwrite it \u2014 check the id. To turn this message into a board on purpose, add --adopt."),process.exit(1);let u=await n(),
|
|
495
|
-
`).map((w)=>` ${N(w)}`),"---------------------------------------------"])}}else{let y=
|
|
495
|
+
slack pinlog note ${p} ${dn(cs(t.log))}${t.allowUrlAdjacent?" --allow-url-adjacent":""}${r} --code=${m}`),process.exit(1)}}async function Mg(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(Ke(t.log,t.allowUrlAdjacent),t.state!==void 0)Ke(t.state,t.allowUrlAdjacent);Mo("log line",t.log);let n=qt(e,t.cookie),{channel:s,ts:r,ref:o}=await cl(e,t.target,t.cookie);try{Tg(`pinlog-${s}-${r}`)}catch(y){if(!(y instanceof nr))throw y;console.error(`Error: another update of ${pt(s,r)} is running (${y.holder}). Re-run when it has finished \u2014 then re-read the board, it has changed.`),process.exit(1)}let i=await Yk(e,s,r,t.cookie),l=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(!ps(l)&&!t.adopt)console.error(`Error: the message at ${pt(s,r)} is not a pinlog HEAD (no "${sr}" footer).
|
|
496
|
+
`+" Refusing to overwrite it \u2014 check the id. To turn this message into a board on purpose, add --adopt."),process.exit(1);let u=await n(),a=pt(s,r),c=new Date,d=`${t.workspace?` -w ${dn(t.workspace)}`:""}${t.asBot?" --as-bot":""}`,f=we("pinlog-log",s,r,t.log,u?.userId??""),p=`slack pinlog note ${a} ${dn(cs(t.log))}${t.allowUrlAdjacent?" --allow-url-adjacent":""}${d} --code=${f}`,g=nm(c,"the log reply notified everyone following this thread \u2014 hold non-urgent updates until 08:00");if(t.logOnly){if(t.code!==f){let y=await Jt(e,s,o,t.cookie);xe(t.code,f,["--- Pinlog log reply (HEAD unchanged) --------",_e(u,{asBot:t.asBot}),` \u2192 ${y}, thread of ${a}`,...t.log.split(`
|
|
497
|
+
`).map((w)=>` ${N(w)}`),"---------------------------------------------"])}}else{let y=Yc(t.state,c);Mo("new HEAD (state + footer)",y);let w=!ps(l),x=we("pinlog-update",s,r,l,t.state,t.log,u?.userId??"");if(t.code!==x){let C=await Jt(e,s,o,t.cookie),S=rr(l).trim()===rr(t.state).trim();xe(t.code,x,["--- Updating pinlog --------------------------",_e(u,{asBot:t.asBot}),` \u2192 ${C}, ${a}`,"--- Current HEAD -----------------------------",...l.split(`
|
|
496
498
|
`).map((k)=>` ${N(k)}`),"--- New HEAD (edited in place \u2014 silent) ------",...y.split(`
|
|
497
499
|
`).map((k)=>` ${N(k)}`),"--- Log reply (in the thread \u2014 notifies) -----",...t.log.split(`
|
|
498
|
-
`).map((k)=>` ${N(k)}`),"---------------------------------------------",...S?["\u26A0 The state text is unchanged \u2014 only the footer time moves. Replies are for real changes."]:[],...w?["\u26A0 Adopting: this message has no pinlog footer yet \u2014 it becomes a board now."]:[]])}let D=Wn("edit");try{await
|
|
499
|
-
Only the HEAD's author can edit it${t.asBot?"":" \u2014 if the bot created this board, add --as-bot"}.`:"",O=
|
|
500
|
-
Check it first: slack pinlog get ${
|
|
501
|
-
The log reply was NOT posted (a log line for a change the board may not show would be a lie).`),process.exit(1)}D.record({team:u?.team,channel:s,target:t.target,ts:
|
|
502
|
-
The log reply was NOT posted. Check it: slack pinlog get ${
|
|
500
|
+
`).map((k)=>` ${N(k)}`),"---------------------------------------------",...S?["\u26A0 The state text is unchanged \u2014 only the footer time moves. Replies are for real changes."]:[],...w?["\u26A0 Adopting: this message has no pinlog footer yet \u2014 it becomes a board now."]:[]])}let D=Wn("edit");try{await jt(e,s,r,y,t.cookie,!0,D.metadata)}catch(C){let S=C instanceof Error?C.message:String(C),k=/cant_update_message/.test(S)?`
|
|
501
|
+
Only the HEAD's author can edit it${t.asBot?"":" \u2014 if the bot created this board, add --as-bot"}.`:"",O=Bo(C)?`\u2717 HEAD was NOT updated: ${pe(C)}${k}`:`\u26A0 UNKNOWN whether the HEAD was updated: ${pe(C)}
|
|
502
|
+
Check it first: slack pinlog get ${a}${d}`;console.error(`${O}
|
|
503
|
+
The log reply was NOT posted (a log line for a change the board may not show would be a lie).`),process.exit(1)}D.record({team:u?.team,channel:s,target:t.target,ts:r,text:y,asBot:t.asBot});let E;try{if(E=G(T(await Pe(e,s,r,1,t.cookie)).messages).map(T).find((S)=>S.ts===r),!E)console.error("\u26A0 HEAD updated, but the read-back did not return it, so it was not checked")}catch(C){console.error(`\u26A0 HEAD updated, but it could not be read back to check: ${pe(C)}`)}if(E&&!xp(y,E)){let C=Za(E.blocks);console.error(`\u2717 HEAD was edited, but Slack does not show what was sent (${Sp(Js(y,C),Js(typeof E.text==="string"?E.text:"",C))}).
|
|
504
|
+
The log reply was NOT posted. Check it: slack pinlog get ${a}${d}`),process.exit(3)}console.log(`\u2713 HEAD updated${E?" (read back: matches)":""}: ${a}`)}let h=Wn("send"),m;try{m=await Bt(e,s,t.log,r,!1,t.cookie,!0,h.metadata)}catch(y){let w=Bo(y);console.error((w?`\u2717 Log reply was NOT posted: ${pe(y)}
|
|
503
505
|
`:`\u26A0 UNKNOWN whether the log reply was posted: ${pe(y)}
|
|
504
506
|
`)+(t.logOnly?"":` The HEAD IS updated \u2014 only the log line ${w?"is":"may be"} missing.
|
|
505
|
-
`)+(w?"":` Check the thread first (retrying a reply that landed notifies everyone twice): slack pinlog get ${
|
|
507
|
+
`)+(w?"":` Check the thread first (retrying a reply that landed notifies everyone twice): slack pinlog get ${a}${d}
|
|
506
508
|
`)+` Retry just the log line${w?"":" (only if it is not there)"}:
|
|
507
|
-
${p}`),process.exit(1)}if(h.record({team:u?.team,channel:s,target:t.target,ts:m,text:t.log,asBot:t.asBot}),console.log(`\u2713 Logged (ts: ${m})`),g)console.error(g)}function
|
|
508
|
-
`))console.log(N(h));let p=
|
|
509
|
-
`).map((x)=>N(x));console.log(`${
|
|
510
|
-
`).find((t)=>t.trim())??"").slice(0,80)}async function
|
|
511
|
-
`+` To reach yourself with a notification, send as the bot: slack send '${t.target}' '...' --as-bot`);let l=je(t.message);Ke(l,t.allowUrlAdjacent);let u=l,
|
|
512
|
-
`)[0]??"").slice(0,100)}`,...
|
|
509
|
+
${p}`),process.exit(1)}if(h.record({team:u?.team,channel:s,target:t.target,ts:m,text:t.log,asBot:t.asBot}),console.log(`\u2713 Logged (ts: ${m})`),g)console.error(g)}function Bg(e){return e.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&")}function Vk(e){return zc(new Date(Number(e.split(".")[0])*1000))}async function Zk(e,t,n,s){if(typeof t.user==="string"){let o=n.get(t.user);if(o!==void 0)return o;let i;try{i=await Re(e,t.user,s)}catch{i=t.user}return n.set(t.user,i),i}let r=T(t.bot_profile);if(typeof r.name==="string")return r.name;return typeof t.username==="string"?t.username:"bot"}async function Qk(e,t,n,s){let{channel:r,ts:o}=await cl(e,t,n),i=[],l,u=0;do{let h=T(await Th(e,r,o,l,200,n));for(let y of G(h.messages).map(T)){if(String(y.ts)===o&&i.some((w)=>String(w.ts)===o))continue;i.push(y)}let m=T(h.response_metadata).next_cursor;l=typeof m==="string"&&m?m:void 0,u++}while(l&&u<50);let a=l===void 0,c=i.find((h)=>String(h.ts)===o);if(!c)console.error(`Error: no message at ts=${o} in ${r}.`),process.exit(1);let d=typeof c.text==="string"?c.text:"",f=i.filter((h)=>String(h.ts)!==o);if(s){console.log(JSON.stringify({id:pt(r,o),isPinlog:ps(d),updated:Xc(d),complete:a,head:d,log:f.map((h)=>({ts:String(h.ts),user:h.user??null,text:typeof h.text==="string"?h.text:""}))}));return}if(!ps(d))console.error(`\u26A0 ${pt(r,o)} has no "${sr}" footer \u2014 showing it anyway, but it is not a pinlog HEAD.`);console.log(`=== HEAD ${pt(r,o)} ===`);for(let h of Bg(d).split(`
|
|
510
|
+
`))console.log(N(h));let p=a?"":" \u2014 INCOMPLETE: the newest entries are not shown";console.log(`=== log (${f.length}${p}) ===`);let g=new Map;for(let h of f){let m=typeof h.text==="string"?h.text:"",y=N(await Zk(e,h,g,n)),w=Bg(m).split(`
|
|
511
|
+
`).map((x)=>N(x));console.log(`${Vk(String(h.ts))} @${y}: ${w[0]??""}`);for(let x of w.slice(1))console.log(` ${x}`)}}async function sm(e,t,n,s){let r=0,o,i=[];do{let l=T(await rt(e,t,Math.min(200,n-r),void 0,o,s)),u=G(l.messages).map(T);r+=u.length;for(let c of u)if(typeof c.text==="string"&&ps(c.text))i.push(c);let a=T(l.response_metadata).next_cursor;o=typeof a==="string"&&a?a:void 0}while(o&&r<n);return{found:i,scanned:r}}function rm(e){return N(rr(e).split(`
|
|
512
|
+
`).find((t)=>t.trim())??"").slice(0,80)}async function ex(e,t,n,s){let{ref:r,ts:o}=Kt(t);if(o||Ao(t))console.error(`Error: \`pinlog ls\` takes a channel. For one board: slack pinlog get ${dn(t)}`),process.exit(2);let i=await ye(e,r,s),{found:l,scanned:u}=await sm(e,i,n,s),a=await Jt(e,i,r,s);if(l.length===0){console.log(`No pinlogs in the last ${u} messages of ${a}.${u>=n?` (Older ones: --limit ${n*2})`:""}`);return}for(let c of l){let d=String(c.ts),f=pt(i,d),p=String(c.text),g=G(c.pinned_to).some((y)=>y===i)?"\uD83D\uDCCC":" ",h=rm(p),m=typeof c.reply_count==="number"?c.reply_count:0;console.log(`${g} ${f} updated ${Xc(p)??"?"} log ${m}`),console.log(` ${h}`)}}async function tx(e,t,n){let{channel:s,ts:r}=await cl(e,t,n);try{await Ec(e,s,r,n),console.log(`\u2713 Pinned ${pt(s,r)}`)}catch(o){let i=o instanceof Error?o.message:String(o);if(/already_pinned/.test(i)){console.log(`\u2713 Already pinned: ${pt(s,r)}`);return}console.error(`\u2717 NOT pinned: ${pe(o)}`),process.exit(1)}}async function nx(e,t){let{ref:n,ts:s}=Kt(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=t.emoji.replace(/^:|:$/g,""),o;if(t.channelId)o=t.channelId;else o=await ye(e,n,t.cookie);if(t.remove)await Wt(e,o,s,r,t.cookie),console.log(`\u2713 Removed :${r}: (ts: ${s})`);else await Tt(e,o,s,r,t.cookie),console.log(`\u2713 Reacted :${r}: (ts: ${s})`)}async function ll(e,t,n,s){if(!n||!t.startsWith("D"))return!1;try{let r=T(await Ln(e,t,s)),o=T(r.channel);return o.is_im===!0&&o.user===n}catch{return!1}}function sx(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 s of G(n.reply_users))if(typeof s==="string")t.add(s)}return t}async function rx(e,t,n){if(!t.startsWith("D"))return;try{let s=T(T(await Ln(e,t,n)).channel);return s.is_im===!0&&typeof s.user==="string"?s.user:void 0}catch{return}}async function ox(e,t){let{ref:n,threadTs:s}=St(t.target),r=t.cookie;if(!t.code&&_p(t.message))console.error(Ep(t.target));let o=qt(e,r),i;if(t.channelId)i=t.channelId;else if(t.userId)i=await Ut(e,t.userId,r);else i=await ye(e,n,r);if(!t.asBot&&await ll(e,i,(await o())?.userId,r))console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you of your own message.
|
|
513
|
+
`+` To reach yourself with a notification, send as the bot: slack send '${t.target}' '...' --as-bot`);let l=je(t.message);Ke(l,t.allowUrlAdjacent);let u=l,a=null;if(t.mentions){a=await ln(t.mentionToken??e,l,i,t.mentionCookie),u=a.text;for(let S of $o(a.unresolved))console.error(`\u26A0 ${N(S)}`)}let c=[];if(a&&(a.resolved.length>0||a.unresolved.length>0)){c.push("--- Mentions ---------------------------------");for(let S of a.resolved)c.push(` \u2713 ${N(S.surface)} \u2192 @${N(S.display)} (${S.userId}) \u2014 will notify`);for(let S of a.unresolved){let k=S.reason==="ambiguous"?"ambiguous":S.reason==="unavailable"?"lookup unavailable":"no match";c.push(` \u26A0 ${N(S.surface)} \u2014 plain text, NOT notified (${k})`)}}let d="",f="?",p=[],g,h,m;if(s)try{let S=await Pe(e,i,s,100,r);p=G(S.messages).map(T);let k=p[p.length-1];d=typeof k?.text==="string"?k.text:"",g=typeof k?.user==="string"?k.user:void 0,h=typeof k?.bot_id==="string"?k.bot_id:void 0,m=typeof k?.ts==="string"?k.ts:void 0}catch{}else try{let S=await rt(e,i,1,void 0,void 0,r),k=G(S.messages).map(T),O=k.filter((P)=>P.subtype===void 0||P.subtype===null)[0];d=typeof O?.text==="string"?O.text:"",f=typeof O?.user==="string"?await Re(e,O.user,r):typeof O?.username==="string"?O.username:"?";let L=k[0];g=typeof L?.user==="string"?L.user:void 0,h=typeof L?.bot_id==="string"?L.bot_id:void 0,m=typeof L?.ts==="string"?L.ts:void 0}catch{}try{let S=s?sx(p):new Set([await rx(e,i,r)].filter((k)=>!!k));for(let k of await yg(t.mentionToken??e,u,t.mentionCookie)){if(S.has(k.userId))continue;console.error(`\u26A0 possible untagged mention: ${N(k.surface)} \u2014 @${N(k.display)} won't be notified (did you mean <@${k.userId}>?)`)}}catch{}if(process.env.SLACK_UNREPLIED_WARN!=="0"&&m&&(g||h))try{let S=await o();if(!!S&&(!!g&&!!S.userId&&S.userId===g||!!h&&!!S.botId&&S.botId===h)){let O=`slack edit "#${i}:${m}" "<new text>" --channel-id ${i}`;try{let L=await Pn(e,i,m,r);if(L)O=`slack edit "${L}" "<new text>"`}catch{}console.error("\u26A0 They haven't replied yet (the last message is yours)."),console.error(" To avoid a string of messages, consider editing your last message instead of sending a new one:"),console.error(` ${O}`),console.error(" To send anyway, confirm with --code=XXXX.")}}catch{}if(s&&p.length){let S={sim:0,msg:null};for(let k of p){let O=typeof k.text==="string"?k.text:"";if(!O)continue;let L=Hk(u,O);if(L>S.sim)S={sim:L,msg:k}}if(S.msg&&S.sim>=0.82){let k=Math.round(S.sim*100);console.error(`\u26A0 possible duplicate: ${k}% similar to an existing thread message \u2014 ${await nl(e,S.msg,60,r)}`)}}let y=await o(),w=await Jo(e,i,r),x=we(i,s??"",d,u,y?.userId??"");if(t.code!==x){let S=await Jt(e,i,n,r),k=_e(y,{asBot:t.asBot});if(s){let O=await qk(e,s,p,r),L=p.slice(-3),P=L.length?await Promise.all(L.map(async(v)=>` ${await nl(e,v,60,r)}`)):[" (thread context unavailable)"];xe(t.code,x,["--- Recent messages in thread ----------------",...P,...c,"--- Sending ----------------------------------",k,` \u2192 ${S} thread of ${O} \u2014 THREAD REPLY`,` Message: ${u}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],w)}else xe(t.code,x,["--- Last message in channel ------------------",` ${f}: ${ds(d.split(`
|
|
514
|
+
`)[0]??"").slice(0,100)}`,...c,"--- Sending ----------------------------------",k,` \u2192 ${S} \u2014 NEW top-level message`,` Message: ${u}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],w)}let D=Wn("send"),E=await Bt(e,i,u,s,t.broadcast,r,void 0,D.metadata),C="";try{C=await Pn(e,i,E,r)}catch{}if(D.record({team:(await o())?.team,channel:i,target:t.target,ts:E,threadTs:s,permalink:C,text:u,asBot:t.asBot}),t.json)console.log(JSON.stringify({ok:!0,channel:i,ts:E,...s?{thread_ts:s}:{},...C?{permalink:C}:{}}));else if(C)console.log(`\u2713 Sent: ${C}`);else console.log(`\u2713 Sent (ts: ${E})`);if(t.asBot&&i.startsWith("D"))try{let S=await Mr(e);if(!S.ok)for(let k of Br(S,!0))console.error(k);else{let k=S.appId?`https://api.slack.com/apps/${S.appId}`:"https://api.slack.com/apps";console.error(`Note: if ${t.target} can't reply (app messaging may be off), enable Messages Tab: ${k} \u2192 App Home.`)}}catch{}}var ix=2,le=3,ax=4,cx=5,om=6,lx=7,ux=10;function dx(){return/^(1|true|yes|on)$/i.test(process.env.SLACK_TERM_ASK_EXPLAIN??"")}var jg=8,fx=(e)=>new Promise((t)=>setTimeout(t,e));function Zc(e){return e==="-"||e===""&&process.argv.slice(2).includes("-")}async function Qc(){return(await Bun.stdin.text()).replace(/\s+$/,"")}var im=new Set(["thread_broadcast"]),px=/(?<![A-Za-z0-9._@<-])@(here|channel|everyone)(?![A-Za-z0-9._-])/giu;function am(e){if(!e.length)return;let t=e.map((n)=>{let s=N(n.surface);if(n.reason==="unavailable")return`${s}: could not fetch the user list or channel members (users:read missing or an API/connection error)`;if(n.reason==="ambiguous")return`${s}: matches multiple people \u2014 use an explicit <@USERID> tag`;return`${s}: matched no one`});console.error(`Error: \`ask\` will not post with unresolved answerer tags.
|
|
513
515
|
${t.join(`
|
|
514
|
-
`)}`),process.exit(le)}function
|
|
515
|
-
`).entries())console.error(` ${
|
|
516
|
-
`+` To reach yourself with a notification, ask as the bot: slack ask '${t.target}' '...' --as-bot`);let
|
|
517
|
-
${
|
|
518
|
-
${m}`.matchAll(/<@([UW][A-Z0-9]+)(?:\|[^>]*)?>/g)){let W=
|
|
516
|
+
`)}`),process.exit(le)}function ir(e){let t=new Set;return{text:e.replace(px,(s,r)=>{let o=r.toLowerCase();return t.add(o),`<!${o}>`}),kinds:t}}async function qo(e,t,n){if(!t.startsWith("D"))return;try{let s=T(await Ln(e,t,n)),r=T(s.channel);return r.is_im===!0&&typeof r.user==="string"?r.user:void 0}catch{return}}async function cm(e,t,n,s){let r=new Map;if(t.threadParentTs||t.replyCount!==0)try{let l=T(await Pe(e,t.channelId,t.threadParentTs??t.ts,100,t.cookie));for(let u of G(l.messages).map(T))r.set(String(u.ts),u)}catch(l){console.error(` (could not read the thread's follow-up notes: ${l instanceof Error?l.message:String(l)})`)}if(!t.threadOnly&&!t.threadParentTs)try{let l=T(await rt(e,t.channelId,30,t.ts,void 0,t.cookie,!0)),u=G(l.messages).map(T),a=u.filter((c)=>Number(c.ts)>Number(t.ts)&&(t.askerBotId&&c.bot_id===t.askerBotId||t.askerUserId&&c.user===t.askerUserId)).reduce((c,d)=>Math.min(c,Number(d.ts)),1/0);for(let c of u)if(Number(c.ts)<a&&!r.has(String(c.ts)))r.set(String(c.ts),c)}catch(l){console.error(` (could not read the DM's follow-up notes: ${l instanceof Error?l.message:String(l)})`)}let o=[...r.values()].filter((l)=>Number(l.ts)>Number(t.ts)).filter((l)=>!n||Number(l.ts)>Number(n)).filter((l)=>t.isAnswerer(l.user)&&!l.bot_id).filter((l)=>typeof l.subtype!=="string"||im.has(l.subtype)).filter((l)=>typeof l.text==="string"&&l.text.trim()!==""&&!ro(l.text)).sort((l,u)=>Number(l.ts)-Number(u.ts)).filter((l)=>!s(l)),i=[];for(let l of o){let u="";try{u=await Pn(e,t.channelId,String(l.ts),t.cookie)}catch{}i.push({ts:String(l.ts),user:String(l.user),text:l.text.trim(),permalink:u})}return i}function Rt(...e){return e.filter((t)=>!!t).reduce((t,n)=>!t||Number(n)>Number(t)?n:t,"")}async function un(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}:{},...n.explain?.length?{explain:n.explain}:{},notes:n.notes,cursor:n.cursor,permalink:t.shown}));return}if(n.notes.length){console.error(` ${n.notes.length} thread note(s) (separate from the answer):`);for(let s of n.notes){let r=s.user;try{r=await Re(e,s.user,t.cookie)}catch{}for(let[o,i]of s.text.split(`
|
|
517
|
+
`).entries())console.error(` ${o?" ".repeat(N(r).length+2):`${N(r)}: `}${N(i)}`)}}if(n.status==="answered")console.error(` To pick up later notes: ${jn(t.shown,t.asBot,n.cursor)}`);if(n.answer!==null)console.log(n.answer)}function lm(e,t,n=!1){let{channelId:s,ts:r,reactable:o,threadOnly:i,audience:l,broadcast:u,cookie:a}=t,c=Be[t.lang],d={explainNow:[],explainPosted:!1},{askerUserId:f,askerBotId:p}=t,g=(B)=>typeof B==="string"&&!!B&&B!==f&&(u||l.has(B)),h=(B)=>{if(d.replyCount=Number(B.reply_count)||0,typeof B.text==="string")d.ownText=B.text},m=(B)=>{let q=typeof B.text==="string"?Ct(B.text):void 0;if(q?.kind==="void")d.voided=q;return!!d.voided};function y(B){let q=G(B.reactions).map(T),z=[];for(let R=0;R<o.length;R++){let te=q.find((M)=>M.name===Te[R].name),Q=te?G(te.users).filter(g):[];if(Q.length)z.push({index:R,users:Q})}return z}async function w(B,q){if(n)return;let z=typeof B.text==="string"?B.text:"";if(!z)return;let R=so(z,q,t.lang);if(R===z)return;try{await jt(e,s,r,R,a,!0)}catch(te){console.error(` (could not add the notice to the question text: ${te instanceof Error?te.message:String(te)})`)}}let x=new Set;function D(B){for(let q of G(B.reactions).map(T)){if(typeof q.name!=="string"||!Wf.includes(q.name))continue;let z=q.name===Nt?"\u2795":"\u2753";for(let R of G(q.users).filter(g)){if(x.has(R))continue;if(x.add(R),!n)console.error(` (<@${R}> pressed ${z} other; waiting for their reply)`)}}}let E=new Set,C=new Map,S=!1;async function k(B){if(B==="USLACKBOT")return!0;let q=C.get(B);if(q!==void 0)return q;try{let z=T(T(await is(e,B,a)).user).is_bot;if(typeof z!=="boolean")return null;return C.set(B,z),z}catch{return null}}async function O(){let B=t.threadParentTs??r;try{let q,z=0;for(;;){let R=T(await xc(e,s,B,{oldest:r,...q?{cursor:q}:{}},a));if(G(R.messages).map(T).some((te)=>Number(te.ts)>Number(r)&&ro(te.text)))return"exists";if(q=String(T(R.response_metadata).next_cursor??"")||void 0,!q)break;if(++z>=ux)return"exists"}}catch(q){return console.error(` (could not read the thread, so the explain-request note has not been posted yet: ${q instanceof Error?q.message:String(q)})`),"unread"}try{await Bt(e,s,c.explainNote,B,!1,a,!0)}catch(q){return console.error(` (could not post the explain-request note to the thread: ${q instanceof Error?q.message:String(q)})`),"failed"}return"posted"}async function L(B){let q=G(B.reactions).map(T).find((R)=>R.name===rn),z=[];for(let R of q?G(q.users).filter(g):[]){if(await k(R)!==!1)continue;if(z.push(R),E.has(R))continue;if(E.add(R),!n)console.error(` (<@${R}> pressed \u2139\uFE0F explain \u2014 not an answer. Explain in the thread; still waiting for an answer)`)}if(d.explainNow=z,z.length&&!S&&!n){let R=await O();if(R!=="unread")S=!0,d.explainPosted=R==="posted"}}async function P(B){if(t.explain)await L(B);if(o.length)D(B);let q=y(B);if(q.length<=1&&no(typeof B.text==="string"?B.text:"").length)await w(B,[]);if(!q.length)return null;if(q.length===1){let{index:M,users:re}=q[0];return{answer:o[M],how:c.howReaction(Te[M].glyph),who:re[0],choice:M+1}}let z=q.map((M)=>Te[M.index].glyph).join(" / "),R=new Map;for(let M of q)for(let re of M.users)R.set(re,(R.get(re)??0)+1);let te=[...R].filter(([,M])=>M>1).map(([M])=>M);if(!n)console.error(te.length?` (${z} are pressed at once; waiting until it is narrowed to one)`:` (answers are split: ${z}; waiting until they agree on one)`);let Q=te.sort();return await w(B,Q),null}let v=[...o,...t.overflow];function j(B,q=1/0){let z=[...B].sort((R,te)=>Number(R.ts)-Number(te.ts));for(let R of z){if(!(Number(R.ts)>Number(r)))continue;if(t.after&&!(Number(R.ts)>Number(t.after)))continue;if(!g(R.user))continue;if(typeof R.subtype==="string"&&!im.has(R.subtype))continue;if(Number(R.ts)>=q)break;let te=typeof R.text==="string"?R.text.trim():"";if(!te||t.explain&&ro(te))continue;if(!v.length)return{answer:te,how:c.howReply,who:R.user,ts:String(R.ts)};let Q=ja(te,v);if(Q.kind==="chosen")return{answer:v[Q.index-1],how:c.howReplyN(Q.index),who:R.user,ts:String(R.ts),choice:Q.index};let M=Q.kind==="ambiguous",re=d.unchosen;if(!re||re.ambiguous&&!M||re.ambiguous===M&&Number(R.ts)<Number(re.ts))d.unchosen={text:te,who:typeof R.user==="string"?R.user:"",ts:String(R.ts),ambiguous:M}}return null}async function H(){if(delete d.unchosen,t.threadParentTs){let R=T(await Pe(e,s,t.threadParentTs,100,a)),te=G(R.messages).map(T),Q=te.find((M)=>M.ts===r);if(Q){if(h(Q),m(Q))return null;let M=await P(Q);if(M)return M}return j(te)}let B=T(await rt(e,s,30,r,void 0,a,!0)),q=G(B.messages).map(T),z=q.find((R)=>R.ts===r);if(z){if(h(z),m(z))return null}if(z){let R=await P(z);if(R)return R}if(!i){let R=q.filter((Q)=>Number(Q.ts)>Number(r)&&(p&&Q.bot_id===p||f&&Q.user===f)).reduce((Q,M)=>Math.min(Q,Number(M.ts)),1/0),te=j(q,R);if(te)return te}if(z&&Number(z.reply_count)>0){let R=T(await Pe(e,s,r,30,a)),te=j(G(R.messages).map(T));if(te)return te}return null}return{poll:H,state:d,isAnswerer:g,candidates:v}}async function um(e,t){let{channelId:n,ts:s,question:r,reactable:o,threadOnly:i,cookie:l,timeout:u,shown:a}=t,{askerUserId:c,askerBotId:d}=t,{poll:f,state:p,isAnswerer:g,candidates:h}=lm(e,t),m="";async function y(k){for(let L=0;L<o.length;L++)try{await Wt(e,n,s,Te[L].name,l)}catch{}let O="";if(k.who)try{O=await Re(e,k.who,l)}catch{O=k.who}if(O)console.error(` Answered by: ${N(O)}`);try{let L=p.ownText?Hf(p.ownText,k.choice):void 0;await jt(e,n,s,qf(r,k,O,t.lang,L),l,!0);try{await Tt(e,n,s,Na,l),await Wt(e,n,s,t.seedMarker,l)}catch{}try{if(t.explain)await Wt(e,n,s,rn,l)}catch{}}catch(L){console.error(` (failed to update the original message: ${L instanceof Error?L.message:String(L)})`)}}let w=Date.now()+u*1000,x=Date.now(),D=0,E=On.minMs,C=0,S;for(;;){let k=null;try{k=await f(),D=0}catch(L){if(L instanceof dt)C=L.retryAfter*1000;else{if(D++,D>=jg)console.error(`Error: Slack requests failed ${D} times in a row: ${L instanceof Error?L.message:String(L)}`),process.exit(le);console.error(` (Slack error ${D}/${jg}, retrying: ${L instanceof Error?L.message:String(L)})`)}}S=p.unchosen;let O=p.voided;if(O){if(dm(O,a),t.json)await un(e,t,{status:"void",answer:null,reason:O.reason,...O.supersededBy?{supersededBy:O.supersededBy}:{},notes:[],cursor:Rt(s,t.after)});process.exit(om)}if(k){let L=await cm(e,{channelId:n,ts:s,threadOnly:i,replyCount:p.replyCount,isAnswerer:g,askerUserId:c,askerBotId:d,...t.threadParentTs?{threadParentTs:t.threadParentTs}:{},...l?{cookie:l}:{}},t.after,(v)=>v.ts===k.ts);await y(k);let P={status:"answered",answer:k.answer,how:k.how,notes:L,cursor:Rt(s,t.after,k.ts,...L.map((v)=>v.ts))};if(hc(n,s,k.answer,P.cursor),k.who)P.who=k.who;await un(e,t,P),process.exit(0)}if(p.explainPosted&&t.explainExit){if(console.error(` An explanation was requested (the question is still open). Explain in the thread, then collect with: ${jn(a,t.asBot,t.after)}`),t.json)await un(e,t,{status:"explain",answer:null,notes:[],cursor:Rt(s,t.after),explain:p.explainNow});process.exit(lx)}if(S&&!S.ambiguous){let L=S.who;try{if(L)L=await Re(e,L,l)}catch{}if(console.error(` (${N(L)} replied with something that is not a choice \u2014 not a decision. Printing the reply on stdout)`),console.error(` Choices: ${h.map((P,v)=>`${v+1}. ${N(Ne(P))}`).join(" ")}`),console.error(` ${a}`),console.error(` To wait for what comes after this reply: ${jn(a,t.asBot,S.ts)}`),gc(n,s,S.text,Rt(s,t.after,S.ts)),t.json)await un(e,t,{status:"freetext",answer:S.text,who:S.who,notes:[],cursor:Rt(s,t.after,S.ts),explain:p.explainNow});else console.log(S.text);process.exit(cx)}if(S&&S.ts!==m){m=S.ts;let L=S.who;try{if(L)L=await Re(e,L,l)}catch{}console.error(` (${N(L)}'s reply matches several choices; waiting until it is narrowed to one)`),console.error(` "${N(S.text)}"`)}if(Date.now()>=w)break;await fx(Math.min(Math.max(E,C),Math.max(0,w-Date.now()))),C=0,E=Zf(E,Date.now()-x)}if(S){if(console.error("Error: there was a reply, but it matches several choices so it cannot be settled (the message is left in place)"),console.error(` Reply: "${N(S.text)}"`),console.error(` Choices: ${h.map((k,O)=>`${O+1}. ${N(Ne(k))}`).join(" ")}`),console.error(` ${a}`),console.error(` Reply in the thread, then collect with: ${jn(a,t.asBot,t.after)}`),t.json)await un(e,t,{status:"ambiguous",answer:null,notes:[],cursor:Rt(s,t.after),explain:p.explainNow});process.exit(ax)}if(u===0)console.error(`No answer yet: ${a}`);else console.error(`Error: no answer within ${u}s (the message is left in place)`),console.error(` ${a}`),console.error(` To collect later: ${jn(a,t.asBot,t.after)}`);if(t.json)await un(e,t,{status:"timeout",answer:null,notes:[],cursor:Rt(s,t.after),explain:p.explainNow});process.exit(ix)}function jn(e,t,n){return`slack ask --waitFor='${e}'${t?" --as-bot":""}${n?` --after=${n}`:""}`}async function hx(e,t){let{ref:n,threadTs:s}=St(t.target,!1),r=t.cookie,o=qt(e,r),i;if(t.channelId)i=t.channelId;else if(t.userId)i=await Ut(e,t.userId,r);else i=await ye(e,n,r);let l=(await o())?.userId??"",u=await qo(e,i,r);if(!t.asBot&&!!l&&u===l)console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you of your own message.
|
|
518
|
+
`+` To reach yourself with a notification, ask as the bot: slack ask '${t.target}' '...' --as-bot`);let a=ir(je(t.question)),c=ir(je(t.body??"")),d=new Set([...a.kinds,...c.kinds]);for(let Y of`${a.text}
|
|
519
|
+
${c.text}`.matchAll(/<!(here|channel|everyone)(?:\|[^>]*)?>/g))d.add(Y[1]);let f=t.mentionToken??e,p=await ln(f,a.text,i,t.mentionCookie),g=c.text?await ln(f,c.text,i,t.mentionCookie):{text:"",resolved:[],unresolved:[]},h=p.text,m=g.text,y=[...p.resolved,...g.resolved],w=[...p.unresolved,...g.unresolved];am(w);let x=d.size>0,D=new Set(y.map((Y)=>Y.userId).filter((Y)=>Y!==l)),E=new Map(y.map((Y)=>[Y.userId,Y.display]));for(let Y of`${h}
|
|
520
|
+
${m}`.matchAll(/<@([UW][A-Z0-9]+)(?:\|[^>]*)?>/g)){let W=Y[1];if(W===l||D.has(W))continue;D.add(W),E.set(W,await Re(f,W,t.mentionCookie))}let C;if(x)C=`anyone in ${n} (${[...d].map((Y)=>`@${Y}`).join(", ")})`;else{if(!D.size&&u&&u!==l)D.add(u),E.set(u,await Re(e,u,r));if(!D.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}' ...
|
|
519
521
|
Or open it to the whole channel: slack ask '${t.target}' '@here ${t.question}' ...
|
|
520
|
-
(In a 1:1 DM the other person counts automatically.)`),process.exit(le);C=[...D].map((
|
|
521
|
-
`)[0]??"").slice(0,100)}`,...W,"--- Asking -----------------------------------",_e(R,{asBot:t.asBot}),` \u2192 ${
|
|
522
|
-
`)[0]??"")}) \u2014 cannot be changed`),null;if(
|
|
522
|
+
(In a 1:1 DM the other person counts automatically.)`),process.exit(le);C=[...D].map((Y)=>`@${N(E.get(Y)??Y)} (${Y})`).join(", ")}let S=t.choices.map(je),k=S.slice(0,Lt),O=S.slice(Lt),L=!i.startsWith("D")||!!s,P=x?[]:await Promise.all([...D].map((Y)=>qh(f,Y,t.mentionCookie))),v=Pa({flag:t.lang,readerLocales:P,content:[h,m,...k,...O]});if(!v)console.error(`Error: unsupported language "${N(t.lang??process.env.SLACK_TERM_LANG??"")}" \u2014 use one of: ${$t.join(", ")}`),process.exit(le);let j=v.lang,H=t.explain??dx(),B=Ba(h,m,k,O,L,j,H);Ke(B,t.allowUrlAdjacent);let q="",z="?";try{let Y=await rt(e,i,1,void 0,void 0,r),W=G(Y.messages).map(T).filter((he)=>he.subtype===void 0||he.subtype===null)[0];q=typeof W?.text==="string"?W.text:"",z=typeof W?.user==="string"?await Re(e,W.user,r):typeof W?.username==="string"?W.username:"?"}catch{}let R=await o(),te=await Jo(e,i,r),Q=we(i,s??"",q,B,R?.userId??"",...t.voidAfter?["reask",`${t.voidAfter.channelId}:${t.voidAfter.ts}`,t.voidAfter.reason]:[]);if(t.code!==Q){let Y=await Jt(e,i,n,r),W=k.length?["--- Choices (seeded as reactions) ------------",...k.map((he,De)=>` ${Te[De].glyph} ${Ne(he)}`),...O.map((he,De)=>` (${De+11}) ${Ne(he)} \u2014 text answer only`)]:["--- Choices ----------------------------------"," (none \u2014 free-text reply)"];xe(t.code,Q,["--- Last message in channel ------------------",` ${z}: ${ds(q.split(`
|
|
523
|
+
`)[0]??"").slice(0,100)}`,...W,"--- Asking -----------------------------------",_e(R,{asBot:t.asBot}),` \u2192 ${Y}${s?" \u2014 THREAD REPLY":" \u2014 NEW top-level message"}`,` Question: ${h}`,` Answerable by: ${C}`,` Via: ${L?"reactions or thread replies":"reactions or replies in this DM"}`,...H?[" Explain: \u2139\uFE0F pill offered \u2014 pressing it asks you to explain; it is never an answer"]:[],...t.voidAfter?[` Then void: ${N(t.voidAfter.link)} (reason: ${N(t.voidAfter.reason||"none")}) \u2014 replaced by this question`]:[],` Language: ${j} (${{flag:"--lang",env:"SLACK_TERM_LANG",readers:"answerers' Slack locale",content:"the question's text",system:"system locale",default:"default"}[v.source]}; override with --lang)`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],te)}let M=Wn("ask"),re=await Bt(e,i,B,s,!1,r,!0,M.metadata),J=k.length?Nt:st;await mo([...k.map((Y,W)=>Te[W].name),J,...H?[rn]:[]],(Y)=>Tt(e,i,re,Y,r),(Y,W)=>{let he=W instanceof Error?W.message:String(W);if(Y===J)console.error(` (could not add marker ${Y}: ${he})`);else console.error(` (could not add reaction ${Y}: ${he})`)});let de="";try{de=await Pn(e,i,re,r)}catch{}let oe=de||`${i}:${re}`;if(console.error(`\u2713 Asked: ${oe}`),M.record({team:R?.team,channel:i,target:t.target,ts:re,threadTs:s,permalink:de,text:B,asBot:t.asBot}),t.voidAfter){if(!await pm(e,t.voidAfter,t.voidAfter.reason,oe,r))console.error(` \u26A0 The new question is posted, but the old one could not be voided \u2014 do it by hand: slack ask --void='${N(t.voidAfter.link)}' --superseded-by='${oe}'`)}if(!t.wait){console.log(jn(oe,!!t.asBot));return}let K=t.timeout??3600;console.error(` Waiting for an answer (up to ${K}s)\u2026 Ctrl-C to stop`);let ie={channelId:i,ts:re,question:h,reactable:k,overflow:O,threadOnly:L,seedMarker:J,lang:j,audience:D,broadcast:x,askerUserId:R?.userId??"",askerBotId:R?.botId??"",timeout:K,shown:oe,asBot:!!t.asBot,json:!!t.json,explain:H,explainExit:!!t.explainExit};if(s)ie.threadParentTs=s;if(r)ie.cookie=r;await um(e,ie)}function dm(e,t){if(console.error(`This question is void \u2014 it will never be answered. Stop waiting on it: ${N(t)}`),e.reason)console.error(` ${N(e.reason)}`);if(e.supersededBy)console.error(` New question: ${N(e.supersededBy)}`)}async function sl(e,t,n){let s=ft(t),r,o,i;if(s?.ts)r=s.channel,o=s.ts,i=s.threadTs&&s.threadTs!==s.ts?s.threadTs:void 0;else{let l=t.match(/^([A-Za-z0-9]+):(\d{10}\.\d{6})$/);if(!l)return null;r=l[1],o=l[2]}return Ho(e,{channelId:r,ts:o,threadTs:i},n)}async function Ho(e,t,n){let{channelId:s,ts:r}=t,o=t.threadTs&&t.threadTs!==t.ts?t.threadTs:void 0,i;if(o){let u=T(await Pe(e,s,o,100,n));i=G(u.messages).map(T).find((a)=>a.ts===r)}else{let u=T(await rt(e,s,1,r,void 0,n,!0));i=G(u.messages).map(T).find((a)=>a.ts===r)}let l={channelId:s,ts:r};if(o)l.threadTs=o;if(i)l.msg=i;return l}async function fm(e,t,n,s,r){let o=N(t),i=await sl(e,t,r);if(!i)return console.error(`\u2717 ${o}: not a permalink (or 'C\u2026:1700000000.000100')`),null;if(!i.msg)return console.error(`\u2717 ${o}: message not found`),null;let l=i.msg;if(!(!!n?.userId&&l.user===n.userId||!!n?.botId&&l.bot_id===n.botId))return console.error(`\u2717 ${o}: not a question posted by you (${Ko(n,s)})${s?"":" \u2014 if the bot posted it, use --as-bot"}`),null;let a=typeof l.text==="string"?l.text:"",c=Ct(a);if(c.kind==="void")return"void";if(c.kind==="resolved")return console.error(`\u2717 ${o}: already answered (answer: ${N(c.answer.split(`
|
|
524
|
+
`)[0]??"")}) \u2014 cannot be changed`),null;if(c.kind!=="open")return console.error(`\u2717 ${o}: cannot be read as a \`slack ask\` question \u2014 ${js(a)}`),null;let d={link:t,channelId:i.channelId,ts:i.ts,parsed:c,seedMarker:Ws(a)??st,msg:l};if(i.threadTs)d.threadTs=i.threadTs;return d}async function gx(e,t,n,s){let r=(i)=>typeof i==="string"&&i!==n?.userId;if(G(t.msg.reactions).map(T).some((i)=>Te.some((l)=>l.name===i.name)&&G(i.users).some(r)))return!0;if(Number(t.msg.reply_count)>0){let i=T(await Pe(e,t.channelId,t.ts,100,s));if(G(i.messages).map(T).some((l)=>Number(l.ts)>Number(t.ts)&&r(l.user)&&!l.bot_id))return!0}if(t.channelId.startsWith("D")){let i=T(await rt(e,t.channelId,30,t.ts,void 0,s,!0));if(G(i.messages).map(T).some((l)=>Number(l.ts)>Number(t.ts)&&r(l.user)&&!l.bot_id))return!0}return!1}async function mx(e,t){let n=await Me(e,t.cookie),s=await fm(e,t.link,n,t.asBot,t.cookie);if(s==="void")console.error(`\u2717 ${N(t.link)}: a voided question cannot be edited`),process.exit(le);if(!s)process.exit(le);let r=s.parsed,o=async(C)=>{let S=ir(je(C)),k=await ln(t.mentionToken,S.text,s.channelId,t.mentionCookie);return am(k.unresolved),k.text},i=t.question!==void 0?await o(t.question):r.question,l=t.body!==void 0?await o(t.body):r.body,u=[...r.reactable,...r.overflow],a=t.choices?t.choices.map(je):u,c=JSON.stringify(a.map(Ne))!==JSON.stringify(u.map(Ne));if(c&&await gx(e,s,n,t.cookie))console.error(`\u2717 This question already has responses (reactions or replies) \u2014 changing the choices would change what the pressed reactions mean.
|
|
523
525
|
`+` The question and body can still be changed. To change the choices, void it and ask again:
|
|
524
526
|
slack ask --void='${N(t.link)}' --reask${t.asBot?" --as-bot":""} \u2026`),process.exit(le);if(!([...`${i}
|
|
525
527
|
${l}`.matchAll(/<@([UW][A-Z0-9]+)(?:\|[^>]*)?>/g)].some((C)=>C[1]!==n?.userId)||/<!(?:here|channel|everyone)/.test(`${i}
|
|
526
|
-
${l}`)||s.channelId.startsWith("D")))console.error("\u2717 The question would be addressed to nobody \u2014 keep an @mention of who can answer"),process.exit(le);let p=t.lang?
|
|
527
|
-
`).map((
|
|
528
|
-
`).map((
|
|
529
|
-
(${
|
|
530
|
-
`)[0]??"").replace(/^:question: /,""),f;if(u)try{let g=await
|
|
531
|
-
${N(l.question).slice(0,100)}`);console.error(`${
|
|
532
|
-
slack ask ${u.map((
|
|
533
|
-
(${
|
|
534
|
-
`)[0]??"")})`),
|
|
528
|
+
${l}`)||s.channelId.startsWith("D")))console.error("\u2717 The question would be addressed to nobody \u2014 keep an @mention of who can answer"),process.exit(le);let p=t.lang?Pa({flag:t.lang})?.lang??r.lang:r.lang,g=a.slice(0,Lt),h=a.slice(Lt),m=typeof s.msg.text==="string"?s.msg.text:"",y=Ba(i,l,g,h,r.threadOnly,p,r.explain),w=no(m);if(w.length)y=so(y,w,p);if(Ke(y,t.allowUrlAdjacent),y===m){console.error("No changes.");return}let x=we("ask-edit",`${s.channelId}:${s.ts}`,y,n?.userId??"");if(t.code!==x){let C=(S,k,O)=>k===O?[` ${S}: (unchanged)`]:[` ${S}:`,...k.split(`
|
|
529
|
+
`).map((L)=>` - ${L}`),...O.split(`
|
|
530
|
+
`).map((L)=>` + ${L}`)];xe(t.code,x,["--- Editing question --------------------------",_e(n,{asBot:t.asBot}),` ${N(t.link)}`,...C("Question",r.question,i),...C("Body",r.body,l),...c?[" Choices (nobody has answered yet \u2014 pills are re-seeded):",...u.map((S,k)=>` - ${k+1}. ${Ne(S)}`),...a.map((S,k)=>` + ${k+1}. ${Ne(S)}`)]:[" Choices: (unchanged)"],...p!==r.lang?[` Language: ${r.lang} \u2192 ${p} (the instructions are rewritten)`]:[],"----------------------------------------------"])}await jt(e,s.channelId,s.ts,y,t.cookie,!0);let D=g.length?Nt:st,E=Ws(m)??st;if(c){let C=(S)=>r.explain?[S,rn]:[S];for(let S of[...r.reactable.map((k,O)=>Te[O].name),...C(E)])try{await Wt(e,s.channelId,s.ts,S,t.cookie)}catch{}await mo([...g.map((S,k)=>Te[k].name),...C(D)],(S)=>Tt(e,s.channelId,s.ts,S,t.cookie),(S,k)=>console.error(` (could not add reaction ${S}: ${k instanceof Error?k.message:String(k)})`))}else if(E!==D)try{await Tt(e,s.channelId,s.ts,D,t.cookie),await Wt(e,s.channelId,s.ts,E,t.cookie)}catch(C){console.error(` (could not swap the marker to ${D}: ${C instanceof Error?C.message:String(C)})`)}console.error(`\u2713 Edited: ${N(t.link)}`)}async function yx(e,t){let n={kind:"ask",limit:t.limit};if(t.channel)n.channel=t.channel;let s=fc(n);if(!s)console.error(`Error: ${Gs}
|
|
531
|
+
(${Ft()})`),process.exit(le);let r;if(t.stale){if(r=os(t.stale),r===void 0)console.error(`Error: --stale needs a duration like 24h / 3d (got ${N(t.stale)})`),process.exit(le)}let o=[];for(let l of s){if(r!==void 0&&l.sent_at>r)continue;let u=l.as_bot?e.bot:e.user,a=l.permalink||`${l.channel}:${l.ts}`,c="unknown",d=(l.text.split(`
|
|
532
|
+
`)[0]??"").replace(/^:question: /,""),f;if(u)try{let g=await Ho(u,{channelId:l.channel,ts:l.ts,threadTs:l.thread_ts??void 0},l.as_bot?void 0:e.cookie);if(!g.msg)c="gone";else{let h=Ct(typeof g.msg.text==="string"?g.msg.text:"");if(c=h.kind==="resolved"?"answered":h.kind==="other"?"edited":h.kind,h.kind!=="other"&&h.question)d=h.question;if(h.kind==="resolved")f=h.answer}}catch{c="unknown"}if(t.state!=="all"&&c!==t.state)continue;let p={state:c,age_h:Math.round((Date.now()-l.sent_at)/3600000),asBot:!!l.as_bot,channel:l.channel,target:l.target??l.channel,link:a,question:Ne(d)};if(f!==void 0)p.answer=f;o.push(p)}if(t.json)console.log(JSON.stringify(o));else{for(let l of o)console.log(`${l.state.padEnd(8)} ${String(l.age_h).padStart(4)}h ${l.asBot?"bot ":"user"} ${N(l.target)} ${l.link}
|
|
533
|
+
${N(l.question).slice(0,100)}`);console.error(`${o.length} question(s)${t.state==="all"?"":` in state "${t.state}"`}${t.stale?`, older than ${t.stale}`:""}.`)}let i=o.filter((l)=>l.state==="open");if(t.stale&&i.length)for(let l of[!1,!0]){let u=i.filter((a)=>a.asBot===l);if(!u.length)continue;console.error(`To void them (${u.length}, ${l?"bot":"user"}):
|
|
534
|
+
slack ask ${u.map((a)=>`--void='${a.link}'`).join(" ")} --reason 'stale'${l?" --as-bot":""}`)}}async function Wg(e,t){Dc(0);let n=mc(t.sinceMs);if(!n)console.error(`Error: ${Gs}
|
|
535
|
+
(${Ft()})`),process.exit(le);let s=n.filter((d)=>(!t.channel||d.channel===t.channel||d.target===t.channel)&&(!t.only||t.only.has(`${d.channel}:${d.ts}`))),r=[],o={unanswered:0,ambiguous:0,resolved:0,void:0,explain:0,throttled:0},i=[],l=[],u=e.user?(await Me(e.user,e.cookie))?.team??"":e.bot?(await Me(e.bot))?.team??"":"",a=new Map;for(let[d,f]of s.entries()){if(f.team&&u&&f.team!==u){a.set(f.team,(a.get(f.team)??0)+1);continue}let p=f.permalink||`${f.channel}:${f.ts}`,g=!!f.as_bot,h=g?e.bot:e.user;if(!h){l.push(`${p}: ${g?"asked with --as-bot, but there is no bot token":"no user token"}`);continue}let m=g?void 0:e.cookie,y=f.delivered_cursor??void 0;try{let w={channelId:f.channel,ts:f.ts,threadTs:f.thread_ts??void 0},x=await Ho(h,w,m);if(!x.msg){l.push(`${p}: message not found (deleted?)`);continue}let D=await hm(h,{channelId:f.channel,ts:f.ts,msg:x.msg},m),E=D.parsed;if(E.kind==="resolved"){o.resolved++;continue}if(E.kind==="void"){o.void++;continue}if(E.kind==="other"){l.push(`${p}: cannot be read as a \`slack ask\` question \u2014 ${js(D.text)}`);continue}if(!D.audience.size&&!D.broadcast){l.push(`${p}: the question is addressed to nobody`);continue}let C=gm(D,E,w,{timeout:0,link:p,asBot:g,json:!1,cookie:m,after:y}),S=lm(h,C,!0),k=await S.poll(),O=S.state.unchosen;if(S.state.voided){o.void++;continue}let L=jn(p,g,y);if(S.state.explainNow.length)o.explain++,i.push(`${p}: \u2139\uFE0F an explanation was requested (${S.state.explainNow.map((v)=>`<@${v}>`).join(" ")}) \u2014 explain in the thread`);let P={row:f,link:p,question:E.question,collect:L,alive:lh(f)};if(k)r.push({...P,answer:k.answer,how:k.how,freeText:!1});else if(O&&!O.ambiguous&&O.text!==f.delivered_answer)r.push({...P,answer:O.text,how:"reply (not a choice)",freeText:!0,cursor:Rt(f.ts,y,O.ts)});else if(O?.ambiguous)o.ambiguous++;else o.unanswered++}catch(w){if(w instanceof dt){o.throttled=s.length-d,l.push(`rate-limited by Slack (${w.message}): ${o.throttled} question(s) not checked this pass`);break}l.push(`${p}: ${w instanceof Error?w.message:String(w)}`)}}if(t.push)wx(r,t.selfArgs??[],l);let c=t.watch?r.filter((d)=>d.pushed):r;if(t.watch&&!c.length&&!l.length)return;if(t.json)for(let d of c){let f=d.row;console.log(JSON.stringify({id:f.id,link:d.link,channel:f.channel,ts:f.ts,asked_at:f.sent_at,question:d.question,answer:d.answer,how:d.how,free_text:d.freeText,sender:{session_id:f.session_id??null,cli:f.cli??null,agent_pid:f.agent_pid??null,pid:f.pid,alive:d.alive,cwd:f.cwd,git_branch:f.git_branch??null,host:f.host??null},delivered_at:f.delivered_at??null,collect:d.collect,...t.push?{pushed:d.pushed??null}:{}}))}else{let d=new Map;for(let f of c){let p=f.row.session_id?`session ${f.row.session_id}`:`pid ${f.row.agent_pid??f.row.pid}`;d.set(p,[...d.get(p)??[],f])}for(let[f,p]of d){let g=p[0].row;console.log(`${N(f)} ${N(g.cli??"?")} pid ${g.agent_pid??g.pid} ${p[0].alive?"(alive)":"(gone)"}${g.git_branch?` branch=${N(g.git_branch)}`:""} cwd=${N(g.cwd)}`);for(let h of p)if(console.log(` ${N(h.link)} (${Bn(h.row.sent_at/1000)})`),console.log(` Q: ${N(Ne(h.question))}`),console.log(` A: ${N(Ne(h.answer))} \u2014 ${N(h.how)}${h.freeText?" \u2014 not a decision":""}`),console.log(` collect: ${N(h.collect)}`),h.pushed)console.log(` pushed to pid ${h.pushed.pid}${h.pushed.collected?", collected \u2705":""}`)}}for(let d of l)console.error(` (${N(d)})`);for(let d of i)console.error(` (${N(d)})`);for(let[d,f]of a)console.error(` (${f} question(s) belong to another workspace "${N(d)}" \u2014 check with slack -w <name> ask --pending)`);console.error(`${r.length} answered but not collected, ${o.unanswered} unanswered`+(o.ambiguous?`, ${o.ambiguous} with a reply matching several choices (unsettled)`:"")+(o.resolved?`, ${o.resolved} \u2705 already collected`:"")+(o.void?`, ${o.void} voided`:"")+(o.explain?`, ${o.explain} with an \u2139\uFE0F explain request`:"")+(o.throttled?`, ${o.throttled} not checked (rate-limited)`:"")+(t.push?`, ${r.filter((d)=>d.pushed).length} pushed to the asker`:"")+` \u2014 checked ${s.length} uncollected question(s) (log: ${Ft()})`)}async function bx(e,t,n){let s=!1,r=new Set,o=!0,i=async()=>{if(s)return;s=!0;try{while(o||r.size){let a=o?void 0:new Set(r);o=!1,r.clear();try{await e(a)}catch(c){console.error(`slack ask --watch: pass failed: ${pe(c)}`)}}}finally{s=!1}},l=process.env.SLACK_RELAY_URL,u=process.env.SLACK_RELAY_TOKEN;if(l&&u){let a=ka(l,u,void 0,{transport:Da(process.env.SLACK_RELAY_TRANSPORT)});(async()=>{for(let c=0;;c++){try{await a(void 0,new AbortController().signal,{hello:()=>{c=0},bell:(d,f)=>{let p=`${f.channel}:${f.thread_ts??f.ts}`;if(!(mc(t())??[]).some((h)=>`${h.channel}:${h.ts}`===p))return;r.add(p),setTimeout(()=>{i()},3000)}})}catch(d){console.error(`slack ask --watch: relay: ${d instanceof Error?d.message:String(d)} \u2014 reconnecting`)}await new Promise((d)=>setTimeout(d,es(c,2000,300000)))}})()}else console.error("slack ask --watch: no SLACK_RELAY_URL / SLACK_RELAY_TOKEN \u2014 checking every interval only");for(;;)o=!0,await i(),await new Promise((a)=>setTimeout(a,n))}function wx(e,t,n){let s=pf(gt(process.env.XDG_STATE_HOME||gt(Io(),".local","state"),"slack-term","ask-push.lock"));if(!s){n.push("another `ask --pending --push` pass is running: nothing pushed by this one");return}try{for(let r of e){let o=r.row;if(!r.alive||o.pushed_answer===r.answer)continue;let i=df({link:r.link,answer:r.answer,how:r.how,question:r.question,freeText:r.freeText,collected:!r.freeText}),l=ff(o.agent_pid??o.pid,i);if(l===void 0){n.push(`${r.link}: the asker (pid ${o.agent_pid??o.pid}) did not take the push over ay \u2014 tried again next pass`);continue}ch(o.channel,o.ts,r.answer);let u=!1;if(r.freeText)gc(o.channel,o.ts,r.answer,r.cursor??"");else{let a=o.delivered_cursor?[`--after=${o.delivered_cursor}`]:[],c=yk(process.execPath,[...process.argv.slice(1,2),...t,"ask",`--waitFor=${r.link}`,"--timeout","0",...o.as_bot?["--as-bot"]:[],...a],{encoding:"utf8",timeout:120000,stdio:["ignore","pipe","pipe"]});if(u=c.status===0,!u)n.push(`${r.link}: pushed, but collecting it exited ${c.status??"on a signal"} \u2014 collect by hand: ${r.collect}`)}r.pushed={pid:l,collected:u}}}finally{s()}}async function pm(e,t,n,s,r){let o=N(t.link);try{let i=zf(t.parsed.question,n,t.parsed.lang,t.parsed.body||void 0,s);await jt(e,t.channelId,t.ts,i,r,!0)}catch(i){return console.error(`\u2717 ${o}: failed to rewrite: ${i instanceof Error?i.message:String(i)}`),!1}for(let i of[...t.parsed.reactable.map((l,u)=>Te[u].name),t.seedMarker,...t.parsed.explain?[rn]:[]])try{await Wt(e,t.channelId,t.ts,i,r)}catch{}try{await Tt(e,t.channelId,t.ts,Ma,r)}catch(i){console.error(` (${o}: could not add the \uD83D\uDEAB reaction: ${i instanceof Error?i.message:String(i)})`)}return console.error(`\u2713 Voided: ${o}`),!0}async function Dx(e,t){let n=await Me(e,t.cookie);if(t.supersededBy){let l=N(t.supersededBy),u=!1;try{let a=await sl(e,t.supersededBy,t.cookie);if(u=!!a?.msg,!a)console.error(`Error: --superseded-by must be a message permalink (or 'C\u2026:1700000000.000100'): ${l}`),process.exit(le)}catch(a){console.error(`Error: cannot check --superseded-by: ${l} (${a instanceof Error?a.message:String(a)})`),process.exit(le)}if(!u)console.error(`Error: --superseded-by message not found: ${l}`),process.exit(le)}let s=[],r=0;for(let l of t.links){let u=N(l),a=await sl(e,l,t.cookie);if(!a){console.error(`\u2717 ${u}: not a permalink (or 'C\u2026:1700000000.000100')`),r++;continue}if(!a.msg){console.error(`\u2717 ${u}: message not found`),r++;continue}let c=a.msg;if(!(!!n?.userId&&c.user===n.userId||!!n?.botId&&c.bot_id===n.botId)){console.error(`\u2717 ${u}: not a question posted by you (${Ko(n,t.asBot)}), so it cannot be voided${t.asBot?"":" \u2014 if the bot posted it, use --as-bot"}`),r++;continue}let f=typeof c.text==="string"?c.text:"",p=Ct(f),g=!1;if(p.kind==="void"){console.error(`- ${u}: already voided (nothing to do)`);continue}if(p.kind==="resolved"){console.error(`\u2717 ${u}: an answered question cannot be voided (answer: ${N(p.answer.split(`
|
|
536
|
+
`)[0]??"")})`),r++;continue}if(p.kind!=="open"){let y=Gf(f);if(!y){console.error(`\u2717 ${u}: cannot be read as a \`slack ask\` question \u2014 ${js(f)}`),r++;continue}let w=G(c.reactions).map(T).filter((x)=>G(x.users).includes(n?.userId??"\x00")).map((x)=>Te.findIndex((D)=>D.name===x.name)).filter((x)=>x>=0);p={kind:"open",question:y.question,body:y.body,reactable:Array.from({length:w.length?Math.max(...w)+1:0},()=>""),overflow:[],threadOnly:!0,lang:La(f)??"ja",explain:G(c.reactions).map(T).some((x)=>x.name===rn&&G(x.users).includes(n?.userId??"\x00"))},g=!0}let h=g?G(c.reactions).map(T).some((y)=>y.name===Nt&&G(y.users).includes(n?.userId??"\x00"))?Nt:st:Ws(f)??st,m=G(c.reactions).map(T).filter((y)=>typeof y.name==="string"&&Te.some((w)=>w.name===y.name)).filter((y)=>G(y.users).some((w)=>w!==n?.userId)).map((y)=>`:${String(y.name)}:`);s.push({link:l,channelId:a.channelId,ts:a.ts,text:f,parsed:p,seedMarker:h,pressed:m,...g?{unreadable:g}:{}})}if(!s.length)console.error(r?"No questions can be voided.":"Nothing to do."),process.exit(r?le:0);let o=we("ask-void",...s.map((l)=>`${l.channelId}:${l.ts}`),t.reason,t.supersededBy??"",n?.userId??"");if(t.code!==o)xe(t.code,o,["--- Void -----------------------------------------",_e(n,{asBot:t.asBot}),` Reason: ${t.reason?N(t.reason):"(none)"}`,...t.supersededBy?[` Replaced: ${N(t.supersededBy)}`]:[],` ${s.length} question(s):`,...s.map((l)=>` \u2022 ${N(l.link)}
|
|
535
537
|
${N(l.parsed.question.split(`
|
|
536
538
|
`)[0]??"").slice(0,100)}`+(l.pressed.length?`
|
|
537
539
|
(already pressed: ${l.pressed.join(" ")} \u2014 left in place, never collected)`:"")+(l.unreadable?`
|
|
538
|
-
\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 marker (\u2795, or \u2753) come off; a \uD83D\uDEAB reaction is added.",...
|
|
539
|
-
`+` Got: ${N(t.link)}`),process.exit(le);s=h[1],
|
|
540
|
-
Reason: ${
|
|
540
|
+
\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 marker (\u2795, or \u2753) come off; a \uD83D\uDEAB reaction is added.",...r?[` (${r} link(s) above were refused and will be skipped)`]:[],"----------------------------------------------"]);let i=0;for(let l of s)if(!await pm(e,l,t.reason,t.supersededBy,t.cookie))i++;process.exit(i||r?le:0)}async function kx(e,t){let n=ft(t.link),s,r,o;if(n?.ts)s=n.channel,r=n.ts,o=n.threadTs&&n.threadTs!==n.ts?n.threadTs:void 0;else{let h=t.link.match(/^([A-Za-z0-9]+):(\d{10}\.\d{6})$/);if(!h)console.error(`Error: --waitFor needs the permalink of a question (or 'C\u2026:1700000000.000100').
|
|
541
|
+
`+` Got: ${N(t.link)}`),process.exit(le);s=h[1],r=h[2]}let i=await Ho(e,{channelId:s,ts:r,threadTs:o},t.cookie);if(!i.msg)console.error(`Error: message not found: ${N(t.link)}`),process.exit(le);let l=i.msg,u=await hm(e,{channelId:s,ts:r,msg:l},t.cookie),{text:a,parsed:c,audience:d,broadcast:f,askerUserId:p,askerBotId:g}=u;if(c.kind==="other")console.error(`Error: this cannot be read as a \`slack ask\` question.
|
|
542
|
+
Reason: ${js(a)}
|
|
541
543
|
${N(t.link)}
|
|
542
|
-
(the pressed reactions are still there: check with slack read '${N(t.link)}')`),process.exit(le);if(
|
|
543
|
-
`+` To reach yourself with a notification, post as the bot: slack poll '${t.target}' '...' --as-bot`);let
|
|
544
|
-
`)[0]??"").slice(0,100)}`,"--- Ballot (seeded as reactions) -------------",...m.map((H,B)=>` ${
|
|
545
|
-
`+` Got: ${N(t)}`),process.exit(
|
|
546
|
-
${N(t.link)}`),process.exit(
|
|
547
|
-
`+" Only the poster can rewrite a message \u2014 if the bot posted the poll, add --as-bot.")}if(
|
|
548
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);return e}async function
|
|
549
|
-
`+` To be notified, schedule it as the bot: slack schedule send '${t.target}' '...' --at '${t.at}' --as-bot`);let
|
|
544
|
+
(the pressed reactions are still there: check with slack read '${N(t.link)}')`),process.exit(le);if(c.kind==="void"){if(dm(c,t.link),t.json)await un(e,{json:!0,shown:t.link,asBot:t.asBot,cookie:t.cookie},{status:"void",answer:null,reason:c.reason,...c.supersededBy?{supersededBy:c.supersededBy}:{},notes:[],cursor:Rt(r,t.after)});process.exit(om)}if(c.kind==="resolved"){console.error(`\u2713 Answered: ${N(c.question)}`);let h=typeof T(l.edited).ts==="string"?String(T(l.edited).ts):void 0,m=Xf(a),y=!1,w=(C)=>{if(y||!m.byReply)return!1;if(h&&Number(C.ts)>Number(h))return!1;let S=typeof C.text==="string"?C.text.trim():"",k=S===c.answer||m.n!==void 0&&(new RegExp(`^[(\uFF08]?${m.n}(?![0-9])`).test(S)||Vf(S,c.answer,m.n));if(k)y=!0;return k},x=t.after,D=[];if(d.size||f){let C=(S)=>typeof S==="string"&&!!S&&S!==p&&(f||d.has(S));D=await cm(e,{channelId:s,ts:r,threadOnly:!!o||!s.startsWith("D"),replyCount:Number(l.reply_count)||0,isAnswerer:C,askerUserId:p,askerBotId:g,...o?{threadParentTs:o}:{},...t.cookie?{cookie:t.cookie}:{}},x,w)}let E=Rt(r,x,...D.map((C)=>C.ts));await un(e,{json:t.json,shown:t.link,asBot:t.asBot,cookie:t.cookie},{status:"answered",answer:c.answer,notes:D,cursor:E}),hc(s,r,c.answer,E);return}if(!d.size&&!f)console.error(`Error: this question is addressed to nobody, so valid answerers cannot be determined: ${N(t.link)}`),process.exit(le);if(t.timeout>0)console.error(` Waiting for an answer (up to ${t.timeout}s)\u2026 Ctrl-C to stop`);await um(e,gm(u,c,{channelId:s,ts:r,threadTs:o},t))}async function hm(e,t,n){let{msg:s}=t,r=typeof s.text==="string"?s.text:"",o=Ct(r),i=typeof s.user==="string"?s.user:"",l=typeof s.bot_id==="string"?s.bot_id:"",u=/<!(here|channel|everyone)(\^[^>]*)?(\|[^>]*)?>/.test(r),a=new Set;for(let c of r.matchAll(/<@([UW][A-Z0-9]+)>/g))if(c[1]!==i)a.add(c[1]);if(o.kind!=="other"&&!a.size&&!u){let c=await qo(e,t.channelId,n);if(c&&c!==i)a.add(c)}return{text:r,parsed:o,audience:a,broadcast:u,askerUserId:i,askerBotId:l}}function gm(e,t,n,s){let r={channelId:n.channelId,ts:n.ts,question:t.question,reactable:t.reactable,overflow:t.overflow,threadOnly:t.threadOnly,seedMarker:Ws(e.text)??st,lang:t.lang,audience:e.audience,broadcast:e.broadcast,askerUserId:e.askerUserId,askerBotId:e.askerBotId,timeout:s.timeout,shown:s.link,asBot:s.asBot,json:s.json,explain:t.explain,explainExit:!!s.explainExit};if(n.threadTs)r.threadParentTs=n.threadTs;if(s.cookie)r.cookie=s.cookie;if(s.after)r.after=s.after;return r}var ht=3;function xx(e){return`slack poll --results='${e}'`}async function Sx(e,t){let{ref:n,threadTs:s}=St(t.target,!1),r=t.cookie,o=qt(e,r),i;if(t.channelId)i=t.channelId;else if(t.userId)i=await Ut(e,t.userId,r);else i=await ye(e,n,r);let l=(await o())?.userId??"",u=await qo(e,i,r);if(!t.asBot&&!!l&&u===l)console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you of your own message.
|
|
545
|
+
`+` To reach yourself with a notification, post as the bot: slack poll '${t.target}' '...' --as-bot`);let a=ir(je(t.question)),c=ir(je(t.body??"")),d=t.mentionToken??e,f=await ln(d,a.text,i,t.mentionCookie),p=c.text?await ln(d,c.text,i,t.mentionCookie):{text:"",resolved:[],unresolved:[]},g=f.text,h=p.text;for(let j of $o([...f.unresolved,...p.unresolved]))console.error(`\u26A0 ${N(j)}`);let m=t.choices.map(je),y=!!t.multi,w=t.until??"",x=Hp(g,h,m,{multi:y,deadline:w});Ke(x,t.allowUrlAdjacent);let D="",E="?";try{let j=await rt(e,i,1,void 0,void 0,r),H=G(j.messages).map(T).filter((B)=>B.subtype===void 0||B.subtype===null)[0];D=typeof H?.text==="string"?H.text:"",E=typeof H?.user==="string"?await Re(e,H.user,r):typeof H?.username==="string"?H.username:"?"}catch{}let C=await o(),S=await Jo(e,i,r),k=we(i,s??"",D,x,C?.userId??"");if(t.code!==k){let j=await Jt(e,i,n,r);xe(t.code,k,["--- Last message in channel ------------------",` ${E}: ${ds(D.split(`
|
|
546
|
+
`)[0]??"").slice(0,100)}`,"--- Ballot (seeded as reactions) -------------",...m.map((H,B)=>` ${kt[B].glyph} ${qs(H)}`),"--- Posting ----------------------------------",_e(C,{asBot:t.asBot}),` \u2192 ${j}${s?" \u2014 THREAD REPLY":" \u2014 NEW top-level message"}`,` Question: ${g}`,` Rule: ${y?"any number of votes per person (--multi)":"one vote per person"}${w?` \u2014 closes ${w}`:""}`," Note: your own votes are not counted (the pills are seeds you added, so they can't be told apart)","--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],S)}let O=Wn("poll"),L=await Bt(e,i,x,s,!1,r,!0,O.metadata);await mo([Hs,...m.map((j,H)=>kt[H].name)],(j)=>Tt(e,i,L,j,r),(j,H)=>{let B=H instanceof Error?H.message:String(H);if(j===Hs)console.error(` (could not add marker ${j}: ${B})`);else console.error(` (could not add reaction ${j}: ${B})`)});let P="";try{P=await Pn(e,i,L,r)}catch{}let v=P||`${i}:${L}`;console.error(`\u2713 Posted: ${v}`),O.record({team:C?.team,channel:i,target:t.target,ts:L,threadTs:s,permalink:P,text:x,asBot:t.asBot}),console.log(xx(v)),console.error(` To close: slack poll --close='${v}'${t.asBot?" --as-bot":""}`)}async function _x(e,t,n){let s=ft(t),r,o,i;if(s?.ts)r=s.channel,o=s.ts,i=s.threadTs&&s.threadTs!==s.ts?s.threadTs:void 0;else{let u=t.match(/^([A-Za-z0-9]+):(\d{10}\.\d{6})$/);if(!u)console.error(`Error: --results/--close needs the permalink of a poll (or 'C\u2026:1700000000.000100').
|
|
547
|
+
`+` Got: ${N(t)}`),process.exit(ht);r=u[1],o=u[2]}let l;if(i){let u=T(await Pe(e,r,i,100,n));l=G(u.messages).map(T).find((a)=>a.ts===o)}else{let u=T(await rt(e,r,1,o,void 0,n,!0));l=G(u.messages).map(T).find((a)=>a.ts===o)}if(!l)console.error(`Error: message not found: ${N(t)}`),process.exit(ht);return{channelId:r,ts:o,msg:l}}function Ug(e){let t=Math.max(1,...e.map((n)=>n.count));return e.map((n,s)=>`${kt[s].glyph} ${String(n.count).padStart(3)} ${"\u2588".repeat(Math.round(n.count/t*20))}${n.count?" ":""}${n.choice}`)}async function Ex(e,t){let{channelId:n,ts:s,msg:r}=await _x(e,t.link,t.cookie),o=typeof r.text==="string"?r.text:"",i=zs(o);if(i.kind==="other")console.error(`Error: this is not a \`slack poll\` poll (don't know how to count its votes).
|
|
548
|
+
${N(t.link)}`),process.exit(ht);if(i.kind==="closed"){console.error(`\u2713 Poll closed: ${N(i.question)}`);for(let p of Ug(i.tallies))console.log(p);return}let l=new Set;if(typeof r.user==="string"&&r.user)l.add(r.user);let u=await Oh(e,n,s,t.cookie),a=Gp(i.choices,u,l,i.multi);console.error(`${N(i.question)}${i.deadline?` (closes ${i.deadline})`:""}`);for(let p of Ug(a.tallies))console.log(p);let c=a.tallies.reduce((p,g)=>p+g.count,0);if(console.error(` ${c} vote(s) total${i.multi?" (multiple choice)":""}`),t.names)for(let p=0;p<a.voters.length;p++){if(!a.voters[p].length)continue;let g=await Promise.all(a.voters[p].map((h)=>Re(e,h,t.cookie)));console.error(` ${kt[p].glyph} ${g.map((h)=>`@${N(h)}`).join(", ")}`)}let d=i.multi?[]:a.ambiguous,f=so(o,d);if(f!==o&&!t.noNotify)try{await jt(t.writeToken??e,n,s,f,t.writeToken?t.writeCookie:t.cookie,!0)}catch(p){console.error(` (could not add the notice to the poll text: ${p instanceof Error?p.message:String(p)})
|
|
549
|
+
`+" Only the poster can rewrite a message \u2014 if the bot posted the poll, add --as-bot.")}if(a.ambiguous.length){let p=await Promise.all(a.ambiguous.map((g)=>Re(e,g,t.cookie)));console.error(`\u26A0 One vote per person, but some people pressed several (invalid votes): ${p.map((g)=>`@${N(g)}`).join(", ")}`)}if(!t.close)return;await jt(t.writeToken??e,n,s,zp(i.question,a.tallies),t.writeToken?t.writeCookie:t.cookie,!0);try{await Tt(t.writeToken??e,n,s,ic,t.writeToken?t.writeCookie:t.cookie),await Wt(t.writeToken??e,n,s,Hs,t.writeToken?t.writeCookie:t.cookie)}catch{}console.error(`\u2713 Closed the poll: ${N(t.link)}`)}async function $x(e){let t=await Mr(e);for(let n of Br(t,!1))console.log(n);if(!t.ok)process.exit(1)}function Ro(){let e=Le();if(!e)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
550
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);return e}async function Jg(e,t,n,s){let r=await Ot(n,e,s);return Ut(t,r)}function Kg(e){try{return mm(e)}catch{console.error(`Error: cannot parse --due "${e}" \u2014 use an ISO datetime (2026-11-01T18:00) or a Unix ts.`),process.exit(2)}}function mm(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 ym(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 Cx(e,t){Ke(t.message,t.allowUrlAdjacent);let n=qt(e,t.cookie),{ref:s,threadTs:r}=St(t.target),o;if(t.channelId)o=t.channelId;else if(t.userId)o=await Ut(e,t.userId,t.cookie);else o=await ye(e,s,t.cookie);let i=mm(t.at),l=new Date(i*1000).toISOString(),u=await n();if(!t.asBot&&await ll(e,o,u?.userId,t.cookie))console.error(`Warning: "${t.target}" is a DM to yourself \u2014 Slack will NOT notify you when this fires.
|
|
551
|
+
`+` To be notified, schedule it as the bot: slack schedule send '${t.target}' '...' --at '${t.at}' --as-bot`);let a=we(o,t.message,String(i),u?.userId??""),c=t.targetOverride?` [${t.targetOverride} \u2192 ${o}]`:"";if(t.code!==a){let f=await Jo(e,o,t.cookie);xe(t.code,a,["--- Scheduling message -----------------------",_e(u,{asBot:t.asBot,pad:9}),` To: ${s}${r?` (thread ${r})`:""}${c}`,` At: ${ym(i)}`,` Message: ${t.message}`,"---------------------------------------------"],f,new Date(i*1000))}let d=await $h(e,o,t.message,i,r,t.cookie);if(console.log(`\u2713 Scheduled (id: ${d}, at: ${l})`),t.asBot){if(console.error(` Scheduled as the bot \u2014 the user token cannot see or cancel it. Use the same flag:
|
|
550
552
|
`+` slack schedule ls --as-bot
|
|
551
|
-
slack schedule rm '${t.target}' ${d} --as-bot`),
|
|
552
|
-
`)[0]?.slice(0,80)??""}`)}}async function
|
|
553
|
-
`+"Expected F\u2026 or https://<ws>.slack.com/lists/<TEAM>/<F-id>");let
|
|
554
|
-
`+" Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell)."),process.exit(1);return e}async function
|
|
555
|
-
`+" Add it under OAuth & Permissions \u2192 Bot Token Scopes in the Slack app config, then reinstall the app."),process.exit(1)}async function
|
|
556
|
-
`+"Expected F\u2026 or https://<ws>.slack.com/files/<UID>/<FID>/<name>");let
|
|
557
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);if(!
|
|
553
|
+
slack schedule rm '${t.target}' ${d} --as-bot`),o.startsWith("D"))try{let f=await Mr(e);if(!f.ok)for(let p of Br(f,!0))console.error(p);else{let p=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: ${p} \u2192 App Home.`)}}catch{}}}async function qg(e,t,n,s){let r;if(n)r=n;else if(t)r=await ye(e,t,s);let i=(await Ch(e,r,s)).scheduled_messages??[];if(i.length===0){console.log("(no scheduled messages)");return}for(let l of i){let u=new Date(l.post_at*1000).toISOString();console.log(`${l.id} ${u} [${l.channel_id}] ${l.text.split(`
|
|
554
|
+
`)[0]?.slice(0,80)??""}`)}}async function Hg(e,t){let n;if(t.channelId)n=t.channelId;else n=await ye(e,t.target,t.cookie);let s=await Me(e,t.cookie),r=we(n,t.id,s?.userId??"");if(t.code!==r)xe(t.code,r,["--- Deleting scheduled message ---------------",_e(s,{asBot:t.asBot,pad:9}),` Channel: ${t.target}${t.targetOverride?` [${t.targetOverride} \u2192 ${n}]`:""}`,` ID: ${t.id}`,"---------------------------------------------"]);await Ah(e,n,t.id,t.cookie),console.log(`\u2713 Deleted scheduled message ${t.id}`)}async function zg(e,t){if(t.comment!==void 0)Ke(t.comment,t.allowUrlAdjacent);let n=qt(e,t.cookie),{statSync:s,existsSync:r}=await import("fs"),{basename:o}=await import("path");for(let g of t.filePaths)if(!r(g))console.error(`Error: file not found: ${g}`),process.exit(1);let{ref:i,threadTs:l}=St(t.target),u;if(t.channelId)u=t.channelId;else if(t.userId)u=await Ut(e,t.userId,t.cookie);else u=await ye(e,i,t.cookie);if(await ll(e,u,(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 a=t.filePaths.length>1,c=t.filePaths.map((g)=>{let h=o(g),m=a?h:t.title??h;return{fp:g,filename:h,title:m,sizeFmt:Wo(s(g).size)}}),d=await n(),f=we(u,...c.flatMap((g)=>[g.fp,g.title]),d?.userId??"");if(t.code!==f){let g=` To: ${i}${l?` (thread ${l})`:""}`,h=a?[`--- Uploading ${c.length} files ------------------------`,_e(d,{pad:7}),g,...c.map((m)=>` ${m.filename} (${m.sizeFmt})`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]:["--- Uploading file ---------------------------",_e(d,{pad:7}),g,` File: ${c[0].fp}`,` Title: ${c[0].title}`,` Size: ${c[0].sizeFmt}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];xe(t.code,f,h)}let p=c.length;for(let g=0;g<p;g++){let h=c[g],m={title:h.title};if(l!==void 0)m.threadTs=l;if(t.comment!==void 0&&g===0)m.initialComment=t.comment;let{fileId:y,permalink:w}=await zh(e,u,h.fp,m,t.cookie),x=p>1?`[${g+1}/${p}] `:"";console.log(`${x}\u2713 Uploaded (file_id: ${y}${w?`, url: ${w}`:""})`)}}async function Ax(e,t,n){let s=n.channel?await ye(e,n.channel,t):void 0,r=[],o=1,i=1;do{let u={page:o,count:200};if(n.types)u.types=n.types;if(s)u.channel=s;if(n.user)u.user=n.user;let a=T(await yh(e,u,t));for(let c of G(a.files))r.push(T(c));i=Number(T(a.paging).pages??1),o++}while(r.length<n.limit&&o<=i);let l=r.slice(0,n.limit);if(n.format==="jsonl"){for(let u of l)console.log(JSON.stringify({id:u.id??null,name:u.name??u.title??null,filetype:u.filetype??null,size:u.size??null,user:u.user??null,created:u.created??null,permalink:u.permalink??null}));return}for(let u of l){let a=String(u.id??""),c=typeof u.name==="string"?u.name:typeof u.title==="string"?u.title:a,d=typeof u.filetype==="string"?u.filetype:"?",f=typeof u.size==="number"?Wo(u.size):"";console.log(`${a} ${d.padEnd(7)} ${f.padStart(9)} ${c}`)}}function zo(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 Fx(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(T(n).text??T(n).name??T(n).value??"")).filter(Boolean).join(", ");for(let n of["rich_text","select","user","date","number","checkbox","email","phone"]){let s=e[n];if(s!=null)return typeof s==="object"?JSON.stringify(s):String(s)}return""}async function Tx(e,t,n,s){let r=zo(n);if(!r)throw Error(`Not a list ID or list URL: ${n}
|
|
555
|
+
`+"Expected F\u2026 or https://<ws>.slack.com/lists/<TEAM>/<F-id>");let o=[],i;do{let u={limit:200};if(i)u.cursor=i;let a=s.asBot?await Sc(ar(),r,u):T(await xh(e,r,u,t));for(let d of G(a.items??a.records))o.push(T(d));let c=T(a.response_metadata).next_cursor;i=typeof c==="string"&&c?c:void 0}while(i&&o.length<s.limit);let l=o.slice(0,s.limit);if(s.format==="jsonl"){for(let u of l)console.log(JSON.stringify(u));return}for(let u of l){let a=String(u.id??""),c=G(u.fields).map(T).map((d)=>{let f=String(d.key??d.column_id??"?"),p=Fx(d);return p?`${f}=${p}`:""}).filter(Boolean);console.log(`${a} ${c.join(" | ")}`)}}function ar(){let e=Le();if(!e)console.error(`Error: Slack List writes go through the public slackLists.* API, which needs a bot token (xoxb-) \u2014 none was found.
|
|
556
|
+
`+" Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell)."),process.exit(1);return e}async function Go(e){let t=[];try{t=(await Mt(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).
|
|
557
|
+
`+" Add it under OAuth & Permissions \u2192 Bot Token Scopes in the Slack app config, then reinstall the app."),process.exit(1)}async function Ox(e,t){try{let n=await kc(e);if(n.url&&n.teamId)return`${n.url.replace(/\/$/,"")}/lists/${n.teamId}/${t}`}catch{}return t}async function bm(e,t){let n=await Sc(e,t,{limit:1,includeList:!0}),s=eh(T(n.list));if(!s.length)throw Error(`could not read the column schema of list ${t}`);return s}function Yo(e){console.error(pe(e)),process.exit(1)}async function Rx(e){let t=e.cols.map(Zp),n=Qp(t),s=ar();await Go(s);let r=await Me(s),o=we("lists-create",e.name,JSON.stringify(n),String(e.todo),r?.userId??"");if(e.code!==o)xe(e.code,o,["--- Creating Slack List ----------------------",_e(r,{asBot:!0,pad:9}),` name: ${e.name}`,...t.map((u,a)=>` column: ${u.name} (${u.type}${u.choices?`: ${u.choices.join("/")}`:""})${a===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 bh(s,e.name,n,e.todo)}catch(u){Yo(u)}let l=String(i.list_id??T(i.list).id??"");console.log(`\u2713 Created list ${e.name} (${l})`),console.log(await Ox(s,l))}async function Ix(e){let t=zo(e.list);if(!t)throw Error(`Not a list ID or list URL: ${e.list}`);let n=ar();await Go(n);let s=await bm(n,t),o=[{col:s.find((c)=>c.type==="text")??s[0],value:e.text},...lc(e.sets).map((c)=>({col:ac(s,c.col),value:c.value}))],i=o.map((c)=>({column_id:c.col.id,...cc(c.col,c.value)})),l=await Me(n),u=we("lists-add",t,JSON.stringify(i),l?.userId??"");if(e.code!==u)xe(e.code,u,["--- Adding a row to Slack List ---------------",_e(l,{asBot:!0,pad:9}),` list: ${t}`,...o.map((c)=>` ${(c.col.name||c.col.key).padEnd(8)} ${c.value}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let a;try{a=await wh(n,t,i)}catch(c){Yo(c)}console.log(`\u2713 Added row ${String(T(a.item).id??"")} ${e.text}`)}async function vx(e){let t=zo(e.list);if(!t)throw Error(`Not a list ID or list URL: ${e.list}`);let n=ar();await Go(n);let s=await bm(n,t),r=lc(e.sets).map((u)=>({col:ac(s,u.col),value:u.value}));if(e.done!==void 0){let u=th(s);if(!u)throw Error(`list ${t} has no Completed column \u2014 it was not created with todo mode`);r.push({col:{...u,type:"checkbox"},value:String(e.done)})}if(!r.length)throw Error("nothing to set \u2014 pass --set name=value and/or --done / --no-done");let o=r.map((u)=>({row_id:e.row,column_id:u.col.id,...cc(u.col,u.value)})),i=await Me(n),l=we("lists-set",t,e.row,JSON.stringify(o),i?.userId??"");if(e.code!==l)xe(e.code,l,["--- Updating Slack List row -----------------",_e(i,{asBot:!0,pad:9}),` list: ${t}`,` row: ${e.row}`,...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"]);try{await kh(n,t,o)}catch(u){Yo(u)}console.log(`\u2713 Updated row ${e.row}`)}async function Px(e){let t=zo(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=ar();await Go(n);let s=e.users.length?e.users:e.channels,r=await Me(n),o=we("lists-share",t,e.level,s.join(","),r?.userId??"");if(e.code!==o)xe(e.code,o,["--- Sharing Slack List ----------------------",_e(r,{asBot:!0,pad:9}),` list: ${t}`,` ${e.users.length?"users: ":"channels:"} ${s.join(", ")}`,` access: ${e.level}${e.level==="owner"?" \u26A0 transfers ownership":""}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);try{await Dh(n,t,e.level,e.users.length?{userIds:e.users}:{channelIds:e.channels})}catch(i){Yo(i)}console.log(`\u2713 Granted ${e.level} on ${t} to ${s.join(", ")}`)}function Lx(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 Nx(e,t,n,s){let r=Lx(n);if(!r)throw Error(`Not a file ID or file permalink: ${n}
|
|
558
|
+
`+"Expected F\u2026 or https://<ws>.slack.com/files/<UID>/<FID>/<name>");let o=T(await mh(e,r,t)),i=T(o.file),l=typeof i.name==="string"?i.name:typeof i.title==="string"?i.title:r,u=typeof i.url_private_download==="string"?i.url_private_download:typeof i.url_private==="string"?i.url_private:"";if(!u)throw Error(`files.info returned no download URL for ${r}`);let a={Authorization:`Bearer ${e}`};if(t)a.Cookie=`d=${t}`;let c=await fetch(u,{headers:a});if(!c.ok)throw Error(`Download failed: HTTP ${c.status} ${c.statusText}`);let d=Buffer.from(await c.arrayBuffer()),{statSync:f,existsSync:p}=await import("fs"),{basename:g}=await import("path"),h=s??l;if(s&&p(s)&&f(s).isDirectory())h=gt(s,g(l));Xg(h,d),console.log(`\u2713 Downloaded ${l} (${Wo(d.length)}) \u2192 ${h}`)}async function Mx(){Sg(),kk();let e=(a)=>Es(a.workspace),t=(a)=>Ii(a.workspace),n=async(a)=>{let c=Xe(),d=ns(c);if(In(c))try{let g=await hs(e(a),a.target,t(a));if(!on(c).some((h)=>h.channel===g.channel&&(h.thread_ts===void 0||h.thread_ts===g.root)))console.error(`Error: that message is not in one of ${c.dir}'s subscriptions (restrict_to_subscriptions)`),process.exit(2)}catch(g){console.error(pe(g)),process.exit(1)}if(a["fix-urls"]&&a.newText)a={...a,newText:ks(a.newText)};let f={target:a.target,newText:a.newText??"",allowUrlAdjacent:a["allow-url-adjacent"]===!0};if(a.tick)f.tick=a.tick;if(d.prefix)f.lanePrefix=d.prefix;if(a.force)f.force=!0;if(a.code)f.code=a.code;if(a["channel-id"])f.channelId=a["channel-id"];if(a.mentions!==!1)f.mentions=!0;let p;if(a["as-bot"]){let g=await Lg(f.target,e(a),t(a),f.channelId);if(p=g.botToken,g.channelId&&!f.channelId)f.channelId=g.channelId;f.asBot=!0,f.mentionToken=e(a);let h=t(a);if(h)f.mentionCookie=h}else{p=e(a);let g=t(a);if(g)f.cookie=g}await zk(p,f)},s=async(a)=>{if(Zc(a.message))a={...a,message:await Qc()};if(!String(a.message??"").trim())console.error("Error: message is empty"),process.exit(1);if(a["fix-urls"])a={...a,message:ks(a.message)};let c={target:a.target,message:a.message,allowUrlAdjacent:a["allow-url-adjacent"]===!0};if(a.json)c.json=!0;if(a.code)c.code=a.code;if(a["channel-id"])c.channelId=a["channel-id"];if(a["user-id"])c.userId=a["user-id"];if(a.broadcast)c.broadcast=!0;if(a.mentions!==!1){c.mentions=!0,c.mentionToken=e(a);let f=t(a);if(f)c.mentionCookie=f}let d;if(a["as-bot"]){let f=Le();if(!f)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
559
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);if(!c.channelId&&!c.userId&&c.target.startsWith("@"))try{c.userId=await Ot(e(a),c.target,t(a))}catch(p){console.error(`Error: could not resolve ${c.target} to a user for the bot DM.
|
|
558
560
|
${p instanceof Error?p.message:String(p)}
|
|
559
|
-
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(1)}d=f,
|
|
560
|
-
`),await
|
|
561
|
-
The inviter must be a member of the channel first.`:""}`),process.exit(1)}console.log(`\u2713 Invited ${g.length} to ${m}`)}).command(["create <name>","new <name>"],"Create a channel (confirm-hash safety gate)",(
|
|
561
|
+
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(1)}d=f,c.asBot=!0}else{d=e(a);let f=t(a);if(f)c.cookie=f}try{await ox(d,c)}catch(f){console.error(pe(f)),process.exit(1)}},r={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(a,c)=>{let d={state:a.state??"open",mine:c||a.mine===!0,count:a.n??50,json:a.json===!0};if(a.in)d.in=a.in;if(a.from)d.from=a.from;let f=t(a);if(f)d.cookie=f;await Ok(e(a),d)},{who:i,rest:l}=gp(ui(process.argv)),u;if(i){let a=mp(i);if("error"in a)console.error(`Error: ${a.error}`),process.exit(2);u=a.kind}await qu(l).scriptName("slack").showHelpOnFail(!1).fail((a,c,d)=>{if(c)console.error(c.message),process.exit(1);console.error(a),console.error(""),d.showHelp(),process.exit(1)}).option("workspace",{alias:"w",type:"string",describe:"Workspace name"}).option("as-user",{type:"boolean",describe:"Act as the user session on purpose (needed for writes from inside an agent, or when several identities exist)"}).middleware(async(a)=>{let c=String((a._??[])[0]??"");if(u==="bot"&&"as-bot"in a)a["as-bot"]=!0,a.asBot=!0;if(u==="user"&&a["as-bot"]===!0)console.error(`Error: @${i} is a user identity, but --as-bot was given`),process.exit(2);if(!c||c==="auth"||c==="login"||c==="agent"||c==="sent"||c==="relay")return;try{let d=Es(a.workspace),f=Le(),p=pg(a._??[],a,{botTokenSource:f?Vg.get("SLACK_BOT_TOKEN")??el.get("SLACK_BOT_TOKEN")?.find((h)=>h.val===f)?.path??"shell":void 0,globalPaths:ol,slackTokenSet:!!process.env.SLACK_TOKEN,activeTokenIsBot:!!f&&d===f});if(p)console.error(p),process.exit(2);let g=bp({isWrite:Wc(a._??[])&&!Uc(a._??[],a),who:i,asBot:a["as-bot"]===!0,asUser:a["as-user"]===!0,activeIsBot:d.startsWith("xoxb-"),agent:yp(),identities:[...Xa().keys()].sort(),cmd:(a._??[]).slice(0,2).join(" ")});if(g)console.error(g),process.exit(2)}catch(d){if((d instanceof Error?d.message:String(d)).startsWith("No profiles configured"))console.log(`No workspace configured. Let's set that up:
|
|
562
|
+
`),await Ls(),process.exit(0);throw d}},!0).command("agent","Bot agent session status and command heartbeat",(a)=>_f(a,St)).command(["read [target]","msgs [target]"],"Browse messages",(a)=>a.positional("target",{type:"string",describe:"#channel, @user, URL, or an alias (slack alias ls)"}).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(a)=>{let c=e(a),d=a.json?"jsonl":a.format,f=a.target?Ha(a.target):void 0;if(f?.thread_ts)await Rg(c,f.channel,f.thread_ts,Math.max(a.limit,100),d,t(a));else if(f)await Og(c,f.channel,a.limit,d,a.unreplied,t(a));else if(a.target)await Og(c,a.target,a.limit,d,a.unreplied,t(a));else await Ck(c)}).command("thread <target> <ts>","Show thread messages",(a)=>a.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","tsv"],default:"text",describe:"jsonl exposes raw ts/user/text (incl. external-guest user IDs); tsv: <ts> TAB <user|bot id> TAB <text, \\ \\n \\r \\t escaped> [files: N], every page"}).option("json",{type:"boolean",default:!1,describe:"Alias for --format=jsonl"}).option("since",{type:"string",describe:"Only messages after this ts (reads every page)"}),async(a)=>{let c=a.json?"jsonl":a.format;await Rg(e(a),a.target,a.ts,a.limit,c,t(a),a.since)}).command(["channel","channels","ch"],"Channel commands",(a)=>a.command(["ls","list"],"List channels",(c)=>c.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(c)=>{await Fk(e(c),c.limit,c.filter,c.all,c.json?"jsonl":c.format,t(c))}).command("get <channel>","Show channel details",(c)=>c.positional("channel",{type:"string",demandOption:!0,describe:"#name or channel ID"}),async(c)=>{let d=e(c),f=t(c),p=c.channel,g=p.startsWith("#")||p.startsWith("@")||p.startsWith("C")||p.startsWith("G")||p.startsWith("D")?p:`#${p}`,h=await ye(d,g,f),m=T(await Ln(d,h,f)),y=T(m.channel),w=typeof y.name==="string"?y.name:h,D=y.is_im===!0?"@":"#",E=String(T(y.purpose).value??""),C=String(T(y.topic).value??""),S=y.num_members??y.member_count??"";if(console.log(`${D}${w} ${h}`),C)console.log(`topic: ${C}`);if(E)console.log(`purpose: ${E}`);if(S)console.log(`members: ${S}`);console.log(`private: ${y.is_private===!0}`)}).command("invite <channel> <users..>","Invite people to a channel (conversations.invite; confirm-hash gate). Acts as the current identity, e.g. slack @bot channel invite \u2026",(c)=>c.positional("channel",{type:"string",demandOption:!0,describe:"#name, channel id, or permalink"}).positional("users",{type:"string",array:!0,demandOption:!0,describe:"@handle or U\u2026 ids"}).option("code",{type:"string",describe:"Safety hash to confirm"}),async(c)=>{let d=e(c),f=t(c),p,g=[];try{p=await ye(d,String(c.channel),f);for(let w of c.users.map(String))g.push(/^[UW][A-Z0-9]{2,}$/.test(w)?w:await Ot(d,w,f))}catch(w){console.error(pe(w)),process.exit(1)}let h=await Me(d,f),m=await Jt(d,p,String(c.channel),f),y=we("channel-invite",p,g.join(","),h?.userId??"");if(c.code!==y)xe(c.code,y,["--- Inviting to a channel --------------------",_e(h,{pad:9}),` channel: ${m}`,` users: ${g.join(", ")}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);try{await $c(d,p,g,f)}catch(w){let x=w instanceof Error?w.message:String(w);if(!/already_in_channel/.test(x))console.error(`\u2717 invite failed: ${pe(w)}${/not_in_channel/.test(x)?`
|
|
563
|
+
The inviter must be a member of the channel first.`:""}`),process.exit(1)}console.log(`\u2713 Invited ${g.length} to ${m}`)}).command(["create <name>","new <name>"],"Create a channel (confirm-hash safety gate)",(c)=>c.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(c)=>{let d=e(c),f=t(c),p=c.name.replace(/^#/,"").toLowerCase(),g=c.private===!0,h=c.invite.filter(Boolean),m=await Me(d,f),y=we(p,String(g),h.join(","),m?.userId??"");if(c.code!==y)xe(c.code,y,["--- Creating channel -------------------------",_e(m,{pad:9}),` name: ${g?"\uD83D\uDD12 ":"#"}${p}`,` private: ${g}`,...h.length?[` invite: ${h.join(", ")}`]:[],"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let w;try{w=await Rh(d,p,g,f)}catch(x){console.error(x instanceof Error?x.message:String(x)),process.exit(1)}if(console.log(`\u2713 Created ${g?"\uD83D\uDD12 ":"#"}${w.name} (${w.id})`),h.length){let x=[];for(let D of h)try{x.push(D.startsWith("U")||D.startsWith("W")?D:await Ot(d,D,f))}catch(E){console.error(` ! could not resolve ${D}: ${E instanceof Error?E.message:String(E)}`)}for(let D of x)try{let E=T(await is(d,D,f)),C=T(E.user);if(C.is_ultra_restricted===!0)console.error(`\u26A0 ${D} 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(C.is_restricted===!0)console.error(`\u26A0 ${D} is a multi-channel guest \u2014 double-check they were actually added (guest invites can silently no-op depending on workspace restrictions).`)}catch{}if(x.length)try{await $c(d,w.id,x,f),console.log(`\u2713 Invited ${x.length} member${x.length===1?"":"s"}`)}catch(D){console.error(` ! invite failed: ${D instanceof Error?D.message:String(D)}`)}}}).command(["rename <channel> <new-name>","mv <channel> <new-name>"],"Rename a channel (confirm-hash safety gate)",(c)=>c.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(c)=>{let d=e(c),f=t(c),p=c.channel;if(p.startsWith("@"))console.error(`Error: ${p} is a DM \u2014 only channels can be renamed.`),process.exit(1);let g=p.startsWith("#")||/^[CG][A-Z0-9]{8,}$/.test(p)?p:`#${p}`,h=c.newName.replace(/^#/,"").toLowerCase(),m,y;try{m=await ye(d,g,f)}catch(E){console.error(`Error: could not resolve channel ${p}: ${E instanceof Error?E.message:String(E)}`),process.exit(1)}try{let E=T(T(await Ln(d,m,f)).channel);if(E.is_im===!0||E.is_mpim===!0)console.error(`Error: ${m} is a DM \u2014 only channels can be renamed.`),process.exit(1);y=typeof E.name==="string"?E.name:g.replace(/^#/,"")}catch(E){let C=E instanceof Error?E.message:String(E);if(/channel_not_found/.test(C))console.error(`Error: could not resolve channel ${p}: channel not found (or not visible to this token).`),process.exit(1);y=g.replace(/^#/,"")}if(c.dryRun===!0){console.log(`#${y} -> #${h} (${m})`),console.log("(dry run \u2014 conversations.rename not called)");return}let w=await Me(d,f),x=we("rename",m,h,w?.userId??"");if(c.code!==x)xe(c.code,x,["--- Renaming channel -------------------------",_e(w,{pad:9}),` channel: ${m}`,` from: #${y}`,` to: #${h}`,"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let D;try{D=await Ih(d,m,h,f)}catch(E){let S=(E instanceof Error?E.message:String(E)).match(/Slack error on conversations\.rename: (\w+)/)?.[1],k={name_taken:`Error: a channel named #${h} already exists.`,invalid_name:`Error: "${h}" is not a valid channel name (lowercase letters, numbers, hyphens, underscores; max 80 chars).`,invalid_name_specials:`Error: "${h}" contains characters Slack doesn't allow in channel names.`,invalid_name_maxlength:`Error: "${h}" 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 #${y} (workspace settings may restrict renaming to admins or the channel creator).`,not_in_channel:`Error: this token isn't a member of #${y} \u2014 join it first.`,is_archived:`Error: #${y} is archived \u2014 unarchive it before renaming.`};console.error((S&&k[S])??pe(E)),process.exit(1)}console.log(`\u2713 Renamed #${y} -> #${D.name} (${D.id})`)}).demandCommand(1,"").showHelpOnFail(!0)).command(["user","usr"],"User commands",(a)=>a.command(["ls","list"],"List workspace members",(c)=>c.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(c)=>{let d=c.json?"jsonl":c.format,f=e(c),p=t(c),g=await Mh(f,p),h=c.filter?.toLowerCase(),m=G(g.members).map(T);if(c.external){let D=new Set(m.map((k)=>String(k.id))),E=T(await Xs(f,p)),C=G(E.channels).map(T).filter((k)=>k.is_ext_shared===!0&&!!k.name),S=new Set;for(let k of C)try{for(let O of await Bh(f,String(k.id),p))if(!D.has(O))S.add(O)}catch{}for(let k of S)try{let O=T(await is(f,k,p)),L=T(O.user);if(L.id)m.push(L)}catch{}}let y=m.filter((D)=>D.deleted!==!0&&D.is_bot!==!0&&String(D.id)!=="USLACKBOT").filter((D)=>{if(!h)return!0;let E=String(D.name??"").toLowerCase(),C=String(T(D.profile).real_name??"").toLowerCase(),S=String(T(D.profile).email??"").toLowerCase();return E.includes(h)||C.includes(h)||S.includes(h)}).slice(0,c.limit);if(d==="jsonl"){for(let D of y)console.log(JSON.stringify(D));return}if(d==="yaml"){for(let D of y){let E=function(C,S=""){if(C===null)return"null";if(typeof C==="string")return C.includes(`
|
|
562
564
|
`)?`|
|
|
563
565
|
${C.split(`
|
|
564
566
|
`).join(`
|
|
565
567
|
`)}`:C;if(typeof C!=="object")return String(C);if(Array.isArray(C))return C.map((k)=>`
|
|
566
568
|
${S} - ${E(k,S+" ")}`).join("");return Object.entries(C).map(([k,O])=>`
|
|
567
|
-
${S} ${k}: ${E(O,S+" ")}`).join("")};console.log("---");for(let[C,S]of Object.entries(D))console.log(`${C}: ${E(S)}`)}return}let w=Intl.DateTimeFormat().resolvedOptions().timeZone,x=y.length?String(T(
|
|
568
|
-
`)){let[h,m]=g.trim().split("\t");if(!h||g.startsWith("#")||!m)continue;let y=d.get(m);if(!y||!/^\d{10}\.\d{6}$/.test(h)){p.set(m,(p.get(m)??0)+1);continue}let w={dir:Ba(y).dir,global:!1};Ua(w,`t-${h}`,{channel:a.channel,thread_ts:h,note:"imported from legacy allowlist"},!0),f++}console.log(`imported ${f} subscription(s)`);for(let[g,h]of p)console.error(`skipped ${h} line(s) for lane "${g}" (no --lane-dir, or not a ts)`)}).demandCommand(1,"alias needs a subcommand: ls, set, unset, who, import")).command("reply [dest] [message]","Reply in a thread \u2014 an alias, a permalink or #chan:<ts> \u2014 with the directory's prefix (confirm-hash gate, like send)",(c)=>c.positional("dest",{type:"string",describe:"alias | permalink | #chan:<ts> | <ts> (in settings' channel). Omit with --to"}).positional("message",{type:"string",describe:"Text, or - for stdin"}).option("json",{type:"boolean",default:!1,describe:"On success print one JSON line: {ok, channel, ts, thread_ts, permalink?}"}).option("to",{type:"string",describe:"Permalink of the message you are answering: replies in ITS thread; with a dest, refuses when they differ"}).option("any-thread",{type:"boolean",default:!1,describe:"With --to and a dest: post to dest even when the message is in another thread"}).option("prefix",{type:"string",describe:`Override settings' prefix ("" for none)`}).option("code",{type:"string",describe:"Safety hash to confirm send"}).option("as-bot",{type:"boolean",describe:"Send via the bot token (default: settings' as_bot)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("broadcast",{type:"boolean",default:!1,describe:"Also send to channel"}).option("mentions",{type:"boolean",default:!0,describe:"Convert @handle tokens to real mentions (--no-mentions for literal text)"}),async(c)=>{let{dest:a,message:d}=c;if(c.to&&d===void 0)d=a,a=void 0;if(Kc(d))d=await qc();if(d===void 0||!d.trim())console.error("Error: message is empty"),process.exit(1);if(!a&&!c.to)console.error("Error: reply needs a destination (alias, permalink, #chan:<ts>) or --to <permalink>"),process.exit(2);let f=e(c),p=t(c),g=Xe(),h=ts(g),m;try{let D=await yg(f,p,g,a,c.to,c["any-thread"]);if("error"in D)console.error(`Error: ${D.error}`),process.exit(2);m=D}catch(D){console.error(pe(D)),process.exit(1)}let{channel:y,threadTs:w}=m;if(In(g)&&(c.prefix!==void 0||c["as-bot"]!==void 0&&c["as-bot"]!==(h.as_bot??!1)))console.error(`Error: ${g.dir} is restricted: who it posts as (prefix, as_bot) comes from settings.yml; --prefix / --as-bot are refused`),process.exit(2);let x=Ka(d,c.prefix??h.prefix);if(!x.trim())console.error("Error: message is empty (only the prefix)"),process.exit(1);await s({workspace:c.workspace,target:`${y}:${w}`,message:x,code:c.code,"allow-url-adjacent":c["allow-url-adjacent"],"as-bot":c["as-bot"]??h.as_bot??!1,broadcast:c.broadcast,mentions:c.mentions,json:c.json})}).command("inbox","This directory's .slack-term/inbox/: messages routed here by `slack stream --inbox`",(c)=>c.command(["ls","list"],"Pending messages: ts, from, alias, text (redacted)",(a)=>a.option("json",{type:"boolean",default:!1}),(a)=>{let d=ns(Xe());if(a.json){console.log(JSON.stringify(d.map((f)=>({file:f.file,...f.entry}))));return}for(let f of d)console.log(`${f.entry.ts} ${f.entry.user_name??f.entry.user} ${f.entry.alias} ${f.entry.text.replace(/\\/g,"\\\\").replace(/\n/g,"\\n").replace(/\t/g,"\\t")}${f.entry.files?` [files: ${f.entry.files}]`:""}`)}).command("listen","Print each message as it arrives in inbox/ (one JSON line each); pending ones first. Exits 0 at --timeout",(a)=>a.option("timeout",{type:"number",default:3600,describe:"Seconds"}).option("new-only",{type:"boolean",default:!1,describe:"Skip what is already pending"}).option("thread",{type:"string",describe:"Only messages in this thread (its root ts)"}).option("alias",{type:"string",describe:"Only messages routed by this alias"}).option("from",{type:"array",string:!0,describe:"Only messages from these user ids; repeatable"}),async(a)=>{let d=Xe(),f=a.from?.length?new Set(a.from.map(String)):void 0,p=(m)=>(!a.thread||(m.thread_ts??m.ts)===a.thread)&&(!a.alias||m.alias===a.alias)&&(!f||f.has(m.user)),g=new Set;if(a["new-only"])for(let m of ns(d))g.add(m.file);let h=Date.now()+a.timeout*1000;for(;;){for(let m of ns(d)){if(g.has(m.file))continue;if(g.add(m.file),p(m.entry))console.log(JSON.stringify({file:m.file,...m.entry}))}if(Date.now()>=h)break;await new Promise((m)=>setTimeout(m,Math.min(500,Math.max(0,h-Date.now()))))}}).command("nudge","Pending messages older than settings' nudge_after_min (default 30): exit 1 when there are any; --eyes also puts \uD83D\uDC40 on each, once",(a)=>a.option("json",{type:"boolean",default:!1}).option("eyes",{type:"boolean",default:!1,describe:"React \uD83D\uDC40 on each overdue message (once per message: recorded as nudged_at)"}).option("as-bot",{type:"boolean",describe:"React via the bot token (default: settings' as_bot)"}),async(a)=>{let d=Xe(),f=gp(d);if(a.eyes){let p=a["as-bot"]??ts(d).as_bot??!1,g=p?Le():e(a);if(!g)console.error("Error: as_bot needs a bot token (SLACK_BOT_TOKEN)"),process.exit(1);let h=p?void 0:t(a);for(let m of f){if(m.entry.nudged_at)continue;try{await Ft(g,m.entry.channel,m.entry.ts,"eyes",h)}catch(y){if(!/already_reacted/.test(y instanceof Error?y.message:String(y))){console.error(`\u26A0 ${m.entry.channel}:${m.entry.ts}: could not add \uD83D\uDC40: ${pe(y)}`);continue}}mp(m),m.entry.nudged_at=new Date().toISOString()}}if(a.json)console.log(JSON.stringify(f.map((p)=>({file:p.file,ts:p.entry.ts,channel:p.entry.channel,permalink:p.entry.permalink,waiting_min:Math.round((Date.now()-p.mtimeMs)/60000),...p.entry.nudged_at?{nudged_at:p.entry.nudged_at}:{}}))));else for(let p of f)console.log(`${p.entry.ts} ${Math.round((Date.now()-p.mtimeMs)/60000)} min ${p.entry.permalink}${p.entry.nudged_at?"\t\uD83D\uDC40":""}`);if(f.length)process.exitCode=1}).demandCommand(1,"inbox needs a subcommand: ls, listen, nudge")).command("done <ref..>","Mark inbox messages handled (moved to archived/) without replying: a file name, path or message ts",(c)=>c.positional("ref",{type:"string",array:!0,demandOption:!0}),(c)=>{let a=Xe(),d=0;for(let f of c.ref){let p=Ga(a,f);if(p)console.log(`archived ${p}`);else console.error(`not in ${a.dir}/inbox: ${f}`),d++}if(d)process.exit(2)}).command("outbox","This directory's .slack-term/outbox/: replies queued as files, sent by `outbox flush`",(c)=>c.command("add <dest> <message>","Queue a reply (text redacted before it is written; - reads stdin)",(a)=>a.positional("dest",{type:"string",demandOption:!0,describe:"alias | permalink | #chan:<ts>"}).positional("message",{type:"string",demandOption:!0}).option("in-reply-to",{type:"string",describe:"ts of the inbox message this answers: archived once sent"}),async(a)=>{let d=Kc(a.message)?await qc():a.message;if(!d.trim())console.error("Error: message is empty"),process.exit(1);let f=fp(Xe(),{to:a.dest,text:d,...a["in-reply-to"]?{in_reply_to:a["in-reply-to"]}:{}});if(f.redacted.length)console.error(`\u26A0 redacted before queueing: ${f.redacted.join(", ")}`);console.log(f.file)}).command(["ls","list"],"Queued replies: file, dest, attempts, error",(a)=>a,()=>{for(let a of Xa(Xe()))console.log(`${a.file} ${a.entry.to}${a.entry.attempts?` attempts=${a.entry.attempts} ${a.entry.error??""}`:""}`)}).command("flush","Send every queued reply (prefix, thread and restrict checks as `reply`); a --code covers the whole batch",(a)=>a.option("code",{type:"string",describe:"Safety hash to confirm the batch"}).option("as-bot",{type:"boolean",describe:"Send via the bot token (default: settings' as_bot)"}),async(a)=>{let d=Xe(),f=ts(d),p=Xa(d);if(!p.length){console.error(`nothing in ${d.dir}/outbox`);return}if(In(d)&&a["as-bot"]!==void 0&&a["as-bot"]!==(f.as_bot??!1))console.error(`Error: ${d.dir} is restricted: as_bot comes from settings.yml; --as-bot is refused`),process.exit(2);let g=a["as-bot"]??f.as_bot??!1,h=e(a),m=t(a),y,w;if(g){let k=Le();if(!k)console.error("Error: as_bot needs a bot token (SLACK_BOT_TOKEN)"),process.exit(1);y=k}else y=h,w=m;let x=[],D=[];for(let k of p)try{let O=await yg(h,m,d,k.entry.to,void 0);if("error"in O){D.push(`${k.file}: ${O.error}`);continue}let P=Ka(k.entry.text,f.prefix);if(!P.trim()){D.push(`${k.file}: empty`);continue}Ke(P),x.push({item:k,...O,text:P})}catch(O){D.push(`${k.file}: ${pe(O)}`)}for(let k of D)console.error(`refused (stays queued): ${k}`);if(!x.length)process.exit(2);let E=[`OUTBOX \u2014 ${x.length} repl${x.length===1?"y":"ies"}${g?" as the bot":""}:`];for(let k of x)E.push(` \u2192 ${k.channel} thread ${k.threadTs}: ${N(k.text).replace(/\n/g,"\u23CE").slice(0,120)}${k.text.includes("[redacted:")?" (secrets were masked when queued: this is what posts)":""}`);let C=we("outbox",g?"bot":"user",...x.map((k)=>`${k.channel}:${k.threadTs}:${k.text}`));if(a.code!==C)xe(a.code,C,E);let S=0;for(let k of x)try{let O=await Mt(y,k.channel,k.text,k.threadTs,!1,w),P="";try{P=await Pn(y,k.channel,O,w)}catch{}let L=pp(d,k.item,{ts:O,permalink:P,channel:k.channel,thread_ts:k.threadTs});console.log(`\u2713 ${P||O} (${L})`)}catch(O){hp(k.item,pe(O)),console.error(`\u2717 ${k.item.file}: ${pe(O)}`),S++}if(S)process.exit(1)}).demandCommand(1,"outbox needs a subcommand: add, ls, flush")).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> void (verb aliases: `ask collect <link>`, `ask void <link\u2026>`)",(c)=>c.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:[...Et],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 (`slack ask void`) \u2014 stop waiting. 7 = only with --explain-exit: \u2139\uFE0F pressed, explain and collect again (the question stays open)."}).option("waitFor",{type:"string",describe:"Collect the answer to a question already posted: pass its permalink. Nothing is posted (except, on an --explain question someone pressed \u2139\uFE0F on, one thread note per question). 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:"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("explain",{type:"boolean",describe:"Also offer an \u2139\uFE0F 'explain' pill (seeded after \u2795): pressing it asks YOU to explain the question in its thread and is never an answer \u2014 the question stays open. --wait/--waitFor report it on stderr (and as `explain` in --json), and post one thread note per question. Default: $SLACK_TERM_ASK_EXPLAIN=1 turns it on; --no-explain turns it off."}).option("explain-exit",{type:"boolean",default:!1,describe:'With --wait / --waitFor: exit 7 (stdout empty; --json status "explain") when someone presses \u2139\uFE0F \u2014 once per question, on the run that posts the thread note. The question stays open: explain, then collect again.'}).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(c)=>{if(c.ls||c.pending){if(c.ls&&c.pending)console.error("Error: --ls and --pending are separate lists \u2014 pick one."),process.exit(le);let D=(()=>{try{return e(c)}catch{return}})(),E={};if(D)E.user=D;let C=Le();if(C)E.bot=C;let S=t(c);if(S)E.cookie=S;if(c.pending){if(c.target||c.question||c.waitFor||c.wait||c.void||c.edit)console.error("Error: --pending reads the local log \u2014 do not also pass a target/question or another ask action."),process.exit(le);let O=br(String(c.since));if(O===void 0)console.error(`Error: --since needs 30m / 2h / 7d / 1w or an ISO date (got ${N(String(c.since))})`),process.exit(le);let P={sinceMs:O,json:!!c.json};if(c.channel)P.channel=String(c.channel);try{await Gk(E,P)}catch(L){console.error(pe(L)),process.exit(le)}return}let k={state:String(c.state??"open"),json:!!c.json,limit:Number(c.limit)||50};if(c.stale)k.stale=String(c.stale);if(c.channel)k.channel=String(c.channel);await Yk(E,k);return}let a=(D)=>{if(!D){let C=t(c);return C?{token:e(c),cookie:C}:{token:e(c)}}let E=Le();if(!E)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
569
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(le);return{token:E}},d=
|
|
570
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(le);C=O}else C=e(
|
|
571
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(le);D=C}else D=e(
|
|
572
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(le);if(!w.channelId&&!w.userId&&w.target.startsWith("@"))try{w.userId=await
|
|
569
|
+
${S} ${k}: ${E(O,S+" ")}`).join("")};console.log("---");for(let[C,S]of Object.entries(D))console.log(`${C}: ${E(S)}`)}return}let w=Intl.DateTimeFormat().resolvedOptions().timeZone,x=y.length?String(T(G(g.members).map(T)[0]??{}).team_id??""):"";for(let D of y){let E=T(D.profile),C=String(D.name??D.id),S=String(D.id??""),k=String(E.display_name||""),O=String(E.real_name||""),L=String(E.email||""),P=String(D.tz??""),j=[...new Set([k,O].filter((R)=>R&&R!==C))].join(" / "),H=P&&P!==w?P:"",B=String(D.team_id??""),q=D.is_stranger===!0||x&&B&&B!==x?`external:${B||"?"}`:D.is_ultra_restricted===!0?"single-channel guest":D.is_restricted===!0?"guest":"",z=[L,H].filter(Boolean).join(" ");console.log(`@${C} ${S} ${j}${z?" "+z:""}${q?` [${q}]`:""}`)}}).command("get <user>","Show user details",(c)=>c.positional("user",{type:"string",demandOption:!0,describe:"@handle or user ID"}),async(c)=>{let d=e(c),f=t(c),p=c.user.startsWith("@")?c.user:`@${c.user}`,g="";try{g=await Ot(d,p,f)}catch(v){console.error(v instanceof Error?v.message:String(v)),process.exit(1)}let h=T(await is(d,g,f)),m=T(h.user),y=T(m.profile),w=Intl.DateTimeFormat().resolvedOptions().timeZone,x=String(m.name??g),D=String(m.id??g),E=String(y.display_name||""),C=String(y.real_name||""),S=String(y.email||""),k=String(m.tz??""),O=String(y.phone||""),L=String(y.title||"");console.log(`@${x} ${D}`);let P=[...new Set([E,C].filter((v)=>v&&v!==x))];if(P.length)console.log(`name: ${P.join(" / ")}`);if(S)console.log(`email: ${S}`);if(O)console.log(`phone: ${O}`);if(L)console.log(`title: ${L}`);if(k&&k!==w)console.log(`tz: ${k}`)}).demandCommand(1,"").showHelpOnFail(!0)).command("news","Activity feed (mentions to you)",(a)=>a.option("limit",{alias:"l",type:"number",default:20}),async(a)=>{await Ak(e(a),a.limit)}).command("search <query>","Full-text search",(a)=>a.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(a)=>{await em(e(a),a.query,a.count,a.json,t(a))}).command("send <target> <message>","Send a message (confirm-hash safety gate); - as the message reads stdin",(a)=>a.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("fix-urls",{type:"boolean",default:!1,describe:"Wrap ambiguous bare URLs as <url> (cut at the first non-ASCII character / trailing punctuation) before sending"}).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."}).option("to",{type:"string",describe:"Permalink of the message you are answering: refuses when it is not in the target's thread (see also `slack reply --to`)"}).option("json",{type:"boolean",default:!1,describe:"On success print one JSON line: {ok, channel, ts, thread_ts?, permalink?}"}).option("any-thread",{type:"boolean",default:!1,describe:"With --to: send even when the message is in another thread"}),async(a)=>{if(a.to&&!a["any-thread"])try{let c=e(a),d=t(a),f=await hs(c,a.to,d),p=ft(a.target)?await hs(c,a.target,d):void 0,g=p?{channel:p.channel,threadTs:p.root}:(()=>{let y=St(a.target);return{ref:y.ref,...y.threadTs?{threadTs:y.threadTs}:{}}})(),h="channel"in g?g.channel:await ye(c,g.ref,d),m=Ya({channel:h,...g.threadTs?{threadTs:g.threadTs}:{}},f);if(m)console.error(`Error: ${m}`),process.exit(2)}catch(c){console.error(pe(c)),process.exit(1)}await s(a)}).command("init [dir]","Create .slack-term/ in a directory: aliases, settings, inbox/outbox (never committed)",(a)=>a.positional("dir",{type:"string",default:".",describe:"Directory to put .slack-term/ in"}).option("prefix",{type:"string",describe:'Put in front of every `slack reply`, e.g. "[design]"'}).option("channel",{type:"string",describe:"Default channel (id)"}).option("as-bot",{type:"boolean",describe:"Reply as the bot by default"}),(a)=>{let{dir:c,created:d}=Ja(a.dir,{...a.prefix?{prefix:a.prefix}:{},...a.channel?{channel:a.channel}:{},...a["as-bot"]!==void 0?{as_bot:a["as-bot"]}:{}});console.log(d.length?`${c}: created ${d.join(", ")}`:`${c}: already set up`)}).command("alias","Name channels and threads for this directory (the nearest .slack-term/)",(a)=>a.command(["ls","list"],"List aliases: name, channel, thread, file",(c)=>c.option("json",{type:"boolean",default:!1}),(c)=>{let d=Xe(),f=on(d);if(c.json){console.log(JSON.stringify(f.map(({scope:p,...g})=>g)));return}for(let p of f)console.log(`${p.name} ${p.channel} ${p.thread_ts??"-"} ${p.file}${p.note?` ${p.note}`:""}`);if(!f.length)console.error(`no aliases in ${d.dir}${d.global?" (no .slack-term/ above here: `slack init` makes one)":""}`)}).command("set <name> <target>","Name a channel or thread: a permalink (a reply's names its thread root), #chan:<ts>, or #chan",(c)=>c.positional("name",{type:"string",demandOption:!0}).positional("target",{type:"string",demandOption:!0}).option("note",{type:"string",describe:"Free text shown by `alias ls`"}).option("shared",{type:"boolean",default:!1,describe:"Write settings.yml (the allowlist owner's file) instead of settings.local.yml"}).option("dir",{type:"string",describe:"Use the .slack-term/ above this directory instead of the cwd's (with --shared: a lane's dir)"}),async(c)=>{let d=e(c),f=t(c),p=Xe(c.dir),g=ft(c.target)?.ts!==void 0||St(c.target).threadTs!==void 0,h,m,y="";if(g){let D=await hs(d,c.target,f);if(h=D.channel,m=D.root,D.root!==D.ts)y=` (${D.ts} is a reply: named its thread root)`}else h=await ye(d,St(c.target).ref,f);let w;try{w=za(p,c.name,{channel:h,...m?{thread_ts:m}:{},...c.note?{note:c.note}:{}},c.shared)}catch(D){if(D instanceof Rn)console.error(`Error: ${D.message}`),process.exit(2);throw D}let x=w&&(w.channel!==h||w.thread_ts!==m)?` (was ${w.channel} ${w.thread_ts??"-"})`:"";console.log(`${c.name} \u2192 ${h} ${m??"-"}${y}${x} [${p.dir}]`)}).command(["unset <name>","rm <name>"],"Remove an alias (from settings.local.yml; --shared: also from settings.yml)",(c)=>c.positional("name",{type:"string",demandOption:!0}).option("shared",{type:"boolean",default:!1,describe:"Allow removing one defined in settings.yml"}).option("dir",{type:"string",describe:"Use the .slack-term/ above this directory"}),(c)=>{let d=Xe(c.dir),f;try{f=op(d,c.name,c.shared)}catch(p){if(p instanceof Rn)console.error(`Error: ${p.message}`),process.exit(2);throw p}if(f==="removed")console.log(`${c.name} removed [${d.dir}]`);else if(f==="absent")console.error(`no alias "${c.name}" in ${d.dir}`),process.exit(2);else console.error(`"${c.name}" is defined in ${d.dir}/settings.yml: edit that file to remove it`),process.exit(2)}).command("who <channel> <ts>","Which registered .slack-term/ dirs subscribe this thread (or message): dir, alias",(c)=>c.positional("channel",{type:"string",demandOption:!0,describe:"Channel id"}).positional("ts",{type:"string",demandOption:!0,describe:"Thread root ts (a reply's own ts is not its thread)"}).option("json",{type:"boolean",default:!1}),(c)=>{let d=cp(c.channel,c.ts).map((f)=>({dir:bk(f.scope.dir),scope:f.scope.dir,alias:f.name,file:f.file}));if(c.json)console.log(JSON.stringify(d));else for(let f of d)console.log(`${f.dir} ${f.alias}`);if(!d.length)process.exitCode=2}).command("import <tsv>","One-shot: import a legacy allowlist.tsv (<thread_ts> TAB <lane>) into each lane's settings.yml",(c)=>c.positional("tsv",{type:"string",demandOption:!0}).option("channel",{type:"string",demandOption:!0,describe:"The channel every thread is in (for a DM: the DM id)"}).option("lane-dir",{type:"array",string:!0,demandOption:!0,describe:"<lane>=<dir> (a directory holding .slack-term/, made if missing); repeatable"}),(c)=>{let d=new Map;for(let g of c["lane-dir"]??[]){let h=String(g).indexOf("=");if(h<=0)console.error(`Error: --lane-dir ${g}: want <lane>=<dir>`),process.exit(2);d.set(String(g).slice(0,h),String(g).slice(h+1))}let f=0,p=new Map;for(let g of rl(c.tsv,"utf8").split(`
|
|
570
|
+
`)){let[h,m]=g.trim().split("\t");if(!h||g.startsWith("#")||!m)continue;let y=d.get(m);if(!y||!/^\d{10}\.\d{6}$/.test(h)){p.set(m,(p.get(m)??0)+1);continue}let w={dir:Ja(y).dir,global:!1};za(w,`t-${h}`,{channel:c.channel,thread_ts:h,note:"imported from legacy allowlist"},!0),f++}console.log(`imported ${f} subscription(s)`);for(let[g,h]of p)console.error(`skipped ${h} line(s) for lane "${g}" (no --lane-dir, or not a ts)`)}).demandCommand(1,"alias needs a subcommand: ls, set, unset, who, import")).command("reply [dest] [message]","Reply in a thread \u2014 an alias, a permalink or #chan:<ts> \u2014 with the directory's prefix (confirm-hash gate, like send)",(a)=>a.positional("dest",{type:"string",describe:"alias | permalink | #chan:<ts> | <ts> (in settings' channel). Omit with --to"}).positional("message",{type:"string",describe:"Text, or - for stdin"}).option("json",{type:"boolean",default:!1,describe:"On success print one JSON line: {ok, channel, ts, thread_ts, permalink?}"}).option("to",{type:"string",describe:"Permalink of the message you are answering: replies in ITS thread; with a dest, refuses when they differ"}).option("any-thread",{type:"boolean",default:!1,describe:"With --to and a dest: post to dest even when the message is in another thread"}).option("prefix",{type:"string",describe:`Override settings' prefix ("" for none)`}).option("code",{type:"string",describe:"Safety hash to confirm send"}).option("as-bot",{type:"boolean",describe:"Send via the bot token (default: settings' as_bot)"}).option("allow-url-adjacent",{type:"boolean",default:!1,describe:"Warn instead of refusing ambiguous bare URL boundaries"}).option("fix-urls",{type:"boolean",default:!1,describe:"Wrap ambiguous bare URLs as <url> (cut at the first non-ASCII character / trailing punctuation) before sending"}).option("broadcast",{type:"boolean",default:!1,describe:"Also send to channel"}).option("mentions",{type:"boolean",default:!0,describe:"Convert @handle tokens to real mentions (--no-mentions for literal text)"}),async(a)=>{let{dest:c,message:d}=a;if(a.to&&d===void 0)d=c,c=void 0;if(Zc(d))d=await Qc();if(d===void 0||!d.trim())console.error("Error: message is empty"),process.exit(1);if(!c&&!a.to)console.error("Error: reply needs a destination (alias, permalink, #chan:<ts>) or --to <permalink>"),process.exit(2);let f=e(a),p=t(a),g=Xe(),h=ns(g),m;try{let D=await Ig(f,p,g,c,a.to,a["any-thread"]);if("error"in D)console.error(`Error: ${D.error}`),process.exit(2);m=D}catch(D){console.error(pe(D)),process.exit(1)}let{channel:y,threadTs:w}=m;if(In(g)&&(a.prefix!==void 0||a["as-bot"]!==void 0&&a["as-bot"]!==(h.as_bot??!1)))console.error(`Error: ${g.dir} is restricted: who it posts as (prefix, as_bot) comes from settings.yml; --prefix / --as-bot are refused`),process.exit(2);let x=Ga(d,a.prefix??h.prefix);if(!x.trim())console.error("Error: message is empty (only the prefix)"),process.exit(1);await s({workspace:a.workspace,target:`${y}:${w}`,message:x,code:a.code,"allow-url-adjacent":a["allow-url-adjacent"],"fix-urls":a["fix-urls"],"as-bot":a["as-bot"]??h.as_bot??!1,broadcast:a.broadcast,mentions:a.mentions,json:a.json})}).command("inbox","This directory's .slack-term/inbox/: messages routed here by `slack stream --inbox`",(a)=>a.command(["ls","list"],"Pending messages: ts, from, alias, text (redacted)",(c)=>c.option("json",{type:"boolean",default:!1}),(c)=>{let d=ss(Xe());if(c.json){console.log(JSON.stringify(d.map((f)=>({file:f.file,...f.entry}))));return}for(let f of d)console.log(`${f.entry.ts} ${f.entry.user_name??f.entry.user} ${f.entry.alias} ${f.entry.text.replace(/\\/g,"\\\\").replace(/\n/g,"\\n").replace(/\t/g,"\\t")}${f.entry.files?` [files: ${f.entry.files}]`:""}`)}).command("listen","Print each message as it arrives in inbox/ (one JSON line each); pending ones first. Exits 0 at --timeout",(c)=>c.option("timeout",{type:"number",default:3600,describe:"Seconds"}).option("new-only",{type:"boolean",default:!1,describe:"Skip what is already pending"}).option("thread",{type:"string",describe:"Only messages in this thread (its root ts)"}).option("alias",{type:"string",describe:"Only messages routed by this alias"}).option("from",{type:"array",string:!0,describe:"Only messages from these user ids; repeatable"}),async(c)=>{let d=Xe(),f=c.from?.length?new Set(c.from.map(String)):void 0,p=(m)=>(!c.thread||(m.thread_ts??m.ts)===c.thread)&&(!c.alias||m.alias===c.alias)&&(!f||f.has(m.user)),g=new Set;if(c["new-only"])for(let m of ss(d))g.add(m.file);let h=Date.now()+c.timeout*1000;for(;;){for(let m of ss(d)){if(g.has(m.file))continue;if(g.add(m.file),p(m.entry))console.log(JSON.stringify({file:m.file,...m.entry}))}if(Date.now()>=h)break;await new Promise((m)=>setTimeout(m,Math.min(500,Math.max(0,h-Date.now()))))}}).command("nudge","Pending messages older than settings' nudge_after_min (default 30): exit 1 when there are any; --eyes also puts \uD83D\uDC40 on each, once",(c)=>c.option("json",{type:"boolean",default:!1}).option("eyes",{type:"boolean",default:!1,describe:"React \uD83D\uDC40 on each overdue message (once per message: recorded as nudged_at)"}).option("as-bot",{type:"boolean",describe:"React via the bot token (default: settings' as_bot)"}),async(c)=>{let d=Xe(),f=vp(d);if(c.eyes){let p=c["as-bot"]??ns(d).as_bot??!1,g=p?Le():e(c);if(!g)console.error("Error: as_bot needs a bot token (SLACK_BOT_TOKEN)"),process.exit(1);let h=p?void 0:t(c);for(let m of f){if(m.entry.nudged_at)continue;try{await Tt(g,m.entry.channel,m.entry.ts,"eyes",h)}catch(y){if(!/already_reacted/.test(y instanceof Error?y.message:String(y))){console.error(`\u26A0 ${m.entry.channel}:${m.entry.ts}: could not add \uD83D\uDC40: ${pe(y)}`);continue}}Pp(m),m.entry.nudged_at=new Date().toISOString()}}if(c.json)console.log(JSON.stringify(f.map((p)=>({file:p.file,ts:p.entry.ts,channel:p.entry.channel,permalink:p.entry.permalink,waiting_min:Math.round((Date.now()-p.mtimeMs)/60000),...p.entry.nudged_at?{nudged_at:p.entry.nudged_at}:{}}))));else for(let p of f)console.log(`${p.entry.ts} ${Math.round((Date.now()-p.mtimeMs)/60000)} min ${p.entry.permalink}${p.entry.nudged_at?"\t\uD83D\uDC40":""}`);if(f.length)process.exitCode=1}).demandCommand(1,"inbox needs a subcommand: ls, listen, nudge")).command("done <ref..>","Mark inbox messages handled (moved to archived/) without replying: a file name, path or message ts",(a)=>a.positional("ref",{type:"string",array:!0,demandOption:!0}),(a)=>{let c=Xe(),d=0;for(let f of a.ref){let p=Qa(c,f);if(p)console.log(`archived ${p}`);else console.error(`not in ${c.dir}/inbox: ${f}`),d++}if(d)process.exit(2)}).command("outbox","This directory's .slack-term/outbox/: replies queued as files, sent by `outbox flush`",(a)=>a.command("add <dest> <message>","Queue a reply (text redacted before it is written; - reads stdin)",(c)=>c.positional("dest",{type:"string",demandOption:!0,describe:"alias | permalink | #chan:<ts>"}).positional("message",{type:"string",demandOption:!0}).option("in-reply-to",{type:"string",describe:"ts of the inbox message this answers: archived once sent"}),async(c)=>{let d=Zc(c.message)?await Qc():c.message;if(!d.trim())console.error("Error: message is empty"),process.exit(1);let f=Op(Xe(),{to:c.dest,text:d,...c["in-reply-to"]?{in_reply_to:c["in-reply-to"]}:{}});if(f.redacted.length)console.error(`\u26A0 redacted before queueing: ${f.redacted.join(", ")}`);console.log(f.file)}).command(["ls","list"],"Queued replies: file, dest, attempts, error",(c)=>c,()=>{for(let c of ec(Xe()))console.log(`${c.file} ${c.entry.to}${c.entry.attempts?` attempts=${c.entry.attempts} ${c.entry.error??""}`:""}`)}).command("flush","Send every queued reply (prefix, thread and restrict checks as `reply`); a --code covers the whole batch",(c)=>c.option("code",{type:"string",describe:"Safety hash to confirm the batch"}).option("as-bot",{type:"boolean",describe:"Send via the bot token (default: settings' as_bot)"}),async(c)=>{let d=Xe(),f=ns(d),p=ec(d);if(!p.length){console.error(`nothing in ${d.dir}/outbox`);return}if(In(d)&&c["as-bot"]!==void 0&&c["as-bot"]!==(f.as_bot??!1))console.error(`Error: ${d.dir} is restricted: as_bot comes from settings.yml; --as-bot is refused`),process.exit(2);let g=c["as-bot"]??f.as_bot??!1,h=e(c),m=t(c),y,w;if(g){let k=Le();if(!k)console.error("Error: as_bot needs a bot token (SLACK_BOT_TOKEN)"),process.exit(1);y=k}else y=h,w=m;let x=[],D=[];for(let k of p)try{let O=await Ig(h,m,d,k.entry.to,void 0);if("error"in O){D.push(`${k.file}: ${O.error}`);continue}let L=Ga(k.entry.text,f.prefix);if(!L.trim()){D.push(`${k.file}: empty`);continue}Ke(L),x.push({item:k,...O,text:L})}catch(O){D.push(`${k.file}: ${pe(O)}`)}for(let k of D)console.error(`refused (stays queued): ${k}`);if(!x.length)process.exit(2);let E=[`OUTBOX \u2014 ${x.length} repl${x.length===1?"y":"ies"}${g?" as the bot":""}:`];for(let k of x)E.push(` \u2192 ${k.channel} thread ${k.threadTs}: ${N(k.text).replace(/\n/g,"\u23CE").slice(0,120)}${k.text.includes("[redacted:")?" (secrets were masked when queued: this is what posts)":""}`);let C=we("outbox",g?"bot":"user",...x.map((k)=>`${k.channel}:${k.threadTs}:${k.text}`));if(c.code!==C)xe(c.code,C,E);let S=0;for(let k of x)try{let O=await Bt(y,k.channel,k.text,k.threadTs,!1,w),L="";try{L=await Pn(y,k.channel,O,w)}catch{}let P=Rp(d,k.item,{ts:O,permalink:L,channel:k.channel,thread_ts:k.threadTs});console.log(`\u2713 ${L||O} (${P})`)}catch(O){Ip(k.item,pe(O)),console.error(`\u2717 ${k.item.file}: ${pe(O)}`),S++}if(S)process.exit(1)}).demandCommand(1,"outbox needs a subcommand: add, ls, flush")).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> void (verb aliases: `ask collect <link>`, `ask void <link\u2026>`)",(a)=>a.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:[...$t],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 (`slack ask void`) \u2014 stop waiting. 7 = only with --explain-exit: \u2139\uFE0F pressed, explain and collect again (the question stays open)."}).option("waitFor",{type:"string",describe:"Collect the answer to a question already posted: pass its permalink. Nothing is posted (except, on an --explain question someone pressed \u2139\uFE0F on, one thread note per question). 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:"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 unless --push: --since 7d, --channel, --json. Never waits out a rate limit: a throttled pass says how many it skipped."}).option("push",{type:"boolean",default:!1,describe:"With --pending: send each answer to the agent that asked (ay send to the pid in the sent-log, or up to 3 of its parents), then collect a decision (\u2705, off this list); a free-text reply is marked delivered, the question stays open. Askers that are gone get nothing. Each answer is pushed once."}).option("watch",{type:"boolean",default:!1,describe:"With --pending --push: keep running \u2014 a pass every --interval, and one for a question as soon as the relay rings for it (SLACK_RELAY_URL / SLACK_RELAY_TOKEN). Prints only what it pushed."}).option("interval",{type:"number",default:10,describe:"With --watch: minutes between full passes"}).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("explain",{type:"boolean",describe:"Also offer an \u2139\uFE0F 'explain' pill (seeded after \u2795): pressing it asks YOU to explain the question in its thread and is never an answer \u2014 the question stays open. --wait/--waitFor report it on stderr (and as `explain` in --json), and post one thread note per question. Default: $SLACK_TERM_ASK_EXPLAIN=1 turns it on; --no-explain turns it off."}).option("explain-exit",{type:"boolean",default:!1,describe:'With --wait / --waitFor: exit 7 (stdout empty; --json status "explain") when someone presses \u2139\uFE0F \u2014 once per question, on the run that posts the thread note. The question stays open: explain, then collect again.'}).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(a)=>{if(a.ls||a.pending){if(a.ls&&a.pending)console.error("Error: --ls and --pending are separate lists \u2014 pick one."),process.exit(le);let D=(()=>{try{return e(a)}catch{return}})(),E={};if(D)E.user=D;let C=Le();if(C)E.bot=C;let S=t(a);if(S)E.cookie=S;if(a.pending){if(a.target||a.question||a.waitFor||a.wait||a.void||a.edit)console.error("Error: --pending reads the local log \u2014 do not also pass a target/question or another ask action."),process.exit(le);let O=os(String(a.since));if(O===void 0)console.error(`Error: --since needs 30m / 2h / 7d / 1w or an ISO date (got ${N(String(a.since))})`),process.exit(le);if(a.watch&&!a.push)console.error("Error: --watch keeps pushing answers \u2014 use it with --push."),process.exit(le);let L={sinceMs:O,json:!!a.json,push:!!a.push};if(a.channel)L.channel=String(a.channel);if(a.workspace)L.selfArgs=["-w",String(a.workspace)];if(a.watch){let P=Number(a.interval);if(!(P>0))console.error("Error: --interval needs a number of minutes above 0."),process.exit(le);let v=String(a.since);await bx((j)=>Wg(E,{...L,sinceMs:os(v)??O,watch:!0,...j?{only:j}:{}}),()=>os(v)??O,P*60000)}try{await Wg(E,L)}catch(P){console.error(pe(P)),process.exit(le)}return}let k={state:String(a.state??"open"),json:!!a.json,limit:Number(a.limit)||50};if(a.stale)k.stale=String(a.stale);if(a.channel)k.channel=String(a.channel);await yx(E,k);return}let c=(D)=>{if(!D){let C=t(a);return C?{token:e(a),cookie:C}:{token:e(a)}}let E=Le();if(!E)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
571
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(le);return{token:E}},d=a.target!==void 0&&a.target!=="void"&&a.target!=="collect"?String(a.target):void 0,f=[a.question,...a.choices??[]].filter((D)=>D!==void 0).map(String);if(a.edit){if(a.void||a.wait||a.waitFor)console.error("Error: --edit changes one open question \u2014 do not combine it with --void/--wait/--waitFor."),process.exit(le);let{token:D,cookie:E}=c(!!a["as-bot"]),C={link:String(a.edit),asBot:!!a["as-bot"],mentionToken:D,allowUrlAdjacent:!!a["allow-url-adjacent"]};if(d!==void 0)C.question=d;if(f.length)C.choices=f.map((S)=>S.trim()).filter(Boolean);if(a.body!==void 0)C.body=String(a.body);if(a.lang)C.lang=String(a.lang);if(a.code)C.code=String(a.code);if(E)C.cookie=E,C.mentionCookie=E;try{await mx(D,C)}catch(S){console.error(pe(S)),process.exit(le)}return}let p,g=(a.void??[]).map(String).filter(Boolean);if(a.reask){if(g.length!==1||a.target==="void")console.error("Error: --reask goes with exactly one --void=<permalink> (the question to replace)."),process.exit(le);if(a.waitFor)console.error("Error: --reask posts a new question \u2014 --wait works, --waitFor does not."),process.exit(le);let{token:D,cookie:E}=c(!!a["as-bot"]),C=await Me(D,E),S=await fm(D,g[0],C,!!a["as-bot"],E);if(S==="void")console.error(`\u2717 ${N(g[0])}: already voided \u2014 to ask again, just use slack ask`),process.exit(le);if(!S)process.exit(le);if(p={...S,reason:je(String(a.reason??"")).trim()},a.target=S.threadTs?`${S.channelId}:${S.threadTs}`:S.channelId,a["channel-id"]=S.channelId,a.question=d??cs(S.parsed.question),a.choices=f.length?f:[...S.parsed.reactable,...S.parsed.overflow].map(cs),a.body===void 0&&S.parsed.body)a.body=cs(S.parsed.body);if(!a.lang)a.lang=S.parsed.lang;if(a.explain===void 0&&S.parsed.explain)a.explain=!0;a.void=void 0}if(!p&&(a.target==="void"||g.length)){let D=a.target==="void"?[a.question,...a.choices??[]]:[];if(a.target!=="void"&&(a.target||a.question||a.choices?.length))console.error("Error: --void voids existing questions \u2014 do not also pass a target/question/choices."),process.exit(le);let E=[...g,...D.map((O)=>String(O??""))].filter(Boolean);if(!E.length)console.error("Error: --void=<permalink> \u2014 which question(s)?"),process.exit(le);if(a.wait||a.waitFor)console.error("Error: --void voids existing questions \u2014 do not also pass --wait/--waitFor."),process.exit(le);let C,S;if(a["as-bot"]){let O=Le();if(!O)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
572
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(le);C=O}else C=e(a),S=t(a);let k={links:E,reason:je(String(a.reason??"")).trim(),asBot:!!a["as-bot"]};if(a["superseded-by"])k.supersededBy=String(a["superseded-by"]);if(a.code)k.code=String(a.code);if(S)k.cookie=S;try{await Dx(C,k)}catch(O){console.error(pe(O)),process.exit(le)}return}if(a.target==="collect"){if(!a.question||a.choices?.length)console.error("Error: slack ask collect <permalink> \u2014 exactly one question."),process.exit(le);a.waitFor=String(a.question),a.target=void 0,a.question=void 0}let h=a.waitFor?String(a.waitFor):"",m=Number(a.timeout);if(!Number.isFinite(m)||m<0||m===0&&!h)console.error("Error: --timeout must be a positive number of seconds"),process.exit(le);if(h){if(a.target||a.question||a.choices?.length)console.error("Error: --waitFor collects an existing question \u2014 do not also pass a target/question/choices."),process.exit(le);let D,E;if(a["as-bot"]){let C=Le();if(!C)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
573
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(le);D=C}else D=e(a),E=t(a);try{let C={link:h,timeout:m,asBot:!!a["as-bot"],json:!!a.json};if(a["explain-exit"])C.explainExit=!0;if(E)C.cookie=E;if(a.after){let S=String(a.after);if(!/^\d{10}\.\d{6}$/.test(S))console.error(`Error: --after needs a message ts like 1700000000.000100 (got ${N(S)})`),process.exit(le);C.after=S}await kx(D,C)}catch(C){console.error(pe(C)),process.exit(le)}return}if(!a.target)console.error("Error: target is required (or use --waitFor <permalink> to collect an answer)"),process.exit(le);let y=String(a.question??"").trim();if(!y)console.error("Error: question is empty"),process.exit(le);let w={allowUrlAdjacent:a["allow-url-adjacent"],target:a.target,question:y,choices:(a.choices??[]).map((D)=>String(D).trim()).filter(Boolean),timeout:m};if(a.code)w.code=a.code;if(a.body)w.body=a.body;if(a.lang)w.lang=String(a.lang);if(a.wait)w.wait=!0;if(a.json)w.json=!0;if(typeof a.explain==="boolean")w.explain=a.explain;if(a["explain-exit"])w.explainExit=!0;if(p)w.voidAfter=p;if(a["channel-id"])w.channelId=a["channel-id"];if(a["user-id"])w.userId=a["user-id"];let x;if(a["as-bot"]){let D=Le();if(!D)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
574
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(le);if(!w.channelId&&!w.userId&&w.target.startsWith("@"))try{w.userId=await Ot(D,w.target)}catch(E){console.error(`Error: could not resolve ${w.target} to a user for the bot DM.
|
|
573
575
|
${E instanceof Error?E.message:String(E)}
|
|
574
|
-
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(le)}x=D,w.mentionToken=D,w.asBot=!0}else{x=e(
|
|
575
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(
|
|
576
|
+
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(le)}x=D,w.mentionToken=D,w.asBot=!0}else{x=e(a),w.mentionToken=x;let D=t(a);if(D)w.cookie=D,w.mentionCookie=D}try{await hx(x,w)}catch(D){console.error(pe(D)),process.exit(le)}}).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)",(a)=>a.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: one vote per person)"}).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(a)=>{let c=a.close?String(a.close):a.results?String(a.results):"";if(a.results&&a.close)console.error("Error: pass --results or --close, not both (--close counts as well)."),process.exit(ht);let d=()=>{let m=Le();if(!m)console.error(`Error: --as-bot needs a bot token, but no xoxb- token was found.
|
|
577
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(ht);return m};if(c){if(a.target||a.question||a.choices?.length)console.error("Error: --results/--close reads an existing poll \u2014 do not also pass a target/question/choices."),process.exit(ht);let m=e(a),y=t(a);try{let w={link:c};if(a.close)w.close=!0;if(a.names)w.names=!0;if(a["no-notify"])w.noNotify=!0;if(y)w.cookie=y;if(a["as-bot"])w.writeToken=d();await Ex(m,w)}catch(w){console.error(pe(w)),process.exit(ht)}return}if(!a.target)console.error("Error: target is required (or use --results <permalink> to count a poll)"),process.exit(ht);let f=String(a.question??"").trim();if(!f)console.error("Error: question is empty"),process.exit(ht);let p=(a.choices??[]).map((m)=>String(m).trim()).filter(Boolean);if(p.length<2||p.length>rs)console.error(`Error: poll needs 2..${rs} choices (got ${p.length}). For a free-text question use \`slack ask\`.`),process.exit(ht);let g={target:a.target,question:f,choices:p};if(a.multi)g.multi=!0;if(a.until)g.until=String(a.until);if(a.code)g.code=a.code;if(a.body)g.body=a.body;if(a["allow-url-adjacent"])g.allowUrlAdjacent=!0;if(a["channel-id"])g.channelId=a["channel-id"];if(a["user-id"])g.userId=a["user-id"];let h;if(a["as-bot"]){let m=d();if(!g.channelId&&!g.userId&&g.target.startsWith("@"))try{g.userId=await Ot(m,g.target)}catch(y){console.error(`Error: could not resolve ${g.target} to a user for the bot DM.
|
|
576
578
|
${y instanceof Error?y.message:String(y)}
|
|
577
|
-
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(
|
|
578
|
-
(${
|
|
579
|
-
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);await
|
|
579
|
+
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(ht)}h=m,g.mentionToken=m,g.asBot=!0}else{h=e(a),g.mentionToken=h;let m=t(a);if(m)g.cookie=m,g.mentionCookie=m}try{await Sx(h,g)}catch(m){console.error(pe(m)),process.exit(ht)}}).command("sent [query]","Search what THIS machine posted/edited (send, ask, poll, edit) and who sent it \u2014 read-only, local log",(a)=>a.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)"}),(a)=>{let c;if(a.since!==void 0){if(c=os(String(a.since)),c===void 0)console.error(`Error: --since needs 30m / 2h / 7d / 1w or an ISO date (got ${N(String(a.since))})`),process.exit(1)}let d={limit:Number(a.count)||50};if(a.query)d.text=String(a.query);if(a.channel)d.channel=String(a.channel);if(c!==void 0)d.sinceMs=c;if(a.session)d.session=String(a.session);if(a.cwd){let p=wk(String(a.cwd));try{d.cwd=mk(p)}catch{d.cwd=p}}if(a.kind)d.kind=a.kind;let f=fc(d);if(!f)console.error(`Error: ${Gs}
|
|
580
|
+
(${Ft()})`),process.exit(1);if(a.json){for(let p of f)console.log(JSON.stringify(p));return}if(!f.length){console.error(`No sent messages match (log: ${Ft()}).`);return}for(let p of f)console.log(Kk(p))}).command("doctor","Check the bot token (xoxb) can carry a two-way DM (scopes + Messages Tab)",(a)=>a,async()=>{let a=Le();if(!a)console.error(`Error: slack doctor checks the bot token, but no xoxb- token was found.
|
|
581
|
+
Set SLACK_BOT_TOKEN=xoxb-... in ~/.config/slack-cli/.env (or your shell).`),process.exit(1);await $x(a)}).command("schedule","Manage scheduled messages",(a)=>a.command("send <target> <message>","Schedule a message for later delivery",(c)=>c.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(c)=>{if(!String(c.message??"").trim())console.error("Error: message is empty"),process.exit(1);let d={target:c.target,message:c.message,at:c.at};if(c.code)d.code=c.code;if(c["allow-url-adjacent"])d.allowUrlAdjacent=!0;if(c["channel-id"])d.channelId=c["channel-id"],d.targetOverride=`--channel-id ${c["channel-id"]}`;if(c["user-id"])d.userId=c["user-id"],d.targetOverride=`--user-id ${c["user-id"]}`;let f;if(c["as-bot"]){let p=Ro();if(!d.channelId&&!d.userId&&d.target.startsWith("@"))try{d.userId=await Ot(e(c),d.target,t(c))}catch(g){console.error(`Error: could not resolve ${d.target} to a user for the bot DM.
|
|
580
582
|
${g instanceof Error?g.message:String(g)}
|
|
581
|
-
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(1)}f=p,d.asBot=!0}else{f=e(
|
|
582
|
-
Drop -w, or set SLACK_BOT_TOKEN to that workspace's bot token.`),process.exit(2)}return{token:h,asBot:!0}}let g=t(p);return{token:e(p),...g?{cookie:g}:{},asBot:!1}},f=(p)=>{console.error(pe(p)),process.exit(1)};return c.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)",(p)=>p.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",a).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(p)=>{let g=p.file!==void 0;if(g&&p.state!==void 0&&p.reason!==void 0)console.error("Error: with --file, pass only the reason after <channel> (the state comes from the file)."),process.exit(2);let h=g?Tr(void 0,p.file):Tr(p.state,void 0),m=g?p.state:p.reason;if(h===void 0)console.error("Error: the state is required (positional or --file)."),process.exit(2);let y=await d(p),w={target:p.channel,state:h,asBot:y.asBot,allowUrlAdjacent:p["allow-url-adjacent"]};if(m!==void 0)w.log=je(m);if(y.cookie)w.cookie=y.cookie;if(typeof p.workspace==="string")w.workspace=p.workspace;if(p.code)w.code=p.code;await Ck(y.token,w).catch(f)}).command("set <board> [state] [reason]","Change a board: replace its state (silent edit) AND post the reason in its thread (notifies)",(p)=>p.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",a).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(p)=>{let g=p.file!==void 0;if(g&&p.state!==void 0&&p.reason!==void 0)console.error("Error: with --file, pass only the reason after <board> (the state comes from the file)."),process.exit(2);let h=g?Tr(void 0,p.file):Tr(p.state,void 0),m=g?p.state:p.reason;if(h===void 0||m===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 y=await d(p),w={target:p.board,state:h,log:je(m),adopt:p.adopt,asBot:y.asBot,allowUrlAdjacent:p["allow-url-adjacent"]};if(typeof p.workspace==="string")w.workspace=p.workspace;if(y.cookie)w.cookie=y.cookie;if(p.code)w.code=p.code;await xg(y.token,w).catch(f)}).command("note <board> <reason>","Post only a reason in a board's thread (notifies); the state stays as is",(p)=>p.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",a),async(p)=>{let g=await d(p),h={target:p.board,log:je(p.reason),logOnly:!0,asBot:g.asBot,allowUrlAdjacent:p["allow-url-adjacent"]};if(typeof p.workspace==="string")h.workspace=p.workspace;if(g.cookie)h.cookie=g.cookie;if(p.code)h.code=p.code;await xg(g.token,h).catch(f)}).command(["get <board>","show <board>"],"Show a board's state and its log (read-only)",(p)=>p.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",a),async(p)=>{let g=await d(p);await Tk(g.token,p.board,g.cookie,p.json).catch(f)}).command(["ls <channel>","list <channel>"],"List the boards in a channel, found by their footer (read-only)",(p)=>p.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",a),async(p)=>{let g=await d(p);await Ok(g.token,p.channel,p.limit,g.cookie).catch(f)}).command("pin <board>",!1,(p)=>p.positional("board",{type:"string",demandOption:!0}).option("as-bot",a),async(p)=>{let g=await d(p);await Rk(g.token,p.board,g.cookie).catch(f)}).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",(c)=>c.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(c)=>{let a={target:c.target,emoji:c.emoji};if(c.remove)a.remove=!0;if(c["channel-id"])a.channelId=c["channel-id"];let d=t(c);if(d)a.cookie=d;try{await Ik(e(c),a)}catch(f){console.error(pe(f)),process.exit(1)}}).command("todo","Reaction-backed task tracking (:pushpin: marks a task, progress lives in a second reaction)",(c)=>c.option("cache",{type:"boolean",default:!0,describe:"Use ~/.config/slack-cli/cache.json for channel/user lookups (--no-cache to bypass)"}).middleware((a)=>{if(a.cache===!1)Oc(!1)}).command(["ls","list"],"List everyone's tasks (has: \u2014 read-only, one search per run)",(a)=>a.options(o).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(a)=>{await r(a,!1)}).command("set <target> <state>","Move a task to a progress state (adds the new reaction before removing the old one)",(a)=>a.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(a)=>{let d={target:a.target,state:a.state};if(a["channel-id"])d.channelId=a["channel-id"];let f=t(a);if(f)d.cookie=f;try{await lk(e(a),d)}catch(p){console.error(pe(p)),process.exit(1)}}).command("flag <target> <flag>","Add (or --remove) a reason flag (alert | needs-discussion | waiting | blocked) \u2014 flags stack, independent of progress",(a)=>a.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(a)=>{let d={target:a.target,flag:a.flag};if(a.remove)d.remove=!0;if(a["channel-id"])d.channelId=a["channel-id"];let f=t(a);if(f)d.cookie=f;try{await uk(e(a),d)}catch(p){console.error(pe(p)),process.exit(1)}}).command("doctor","Find messages carrying two or more progress reactions (--fix repairs them)",(a)=>a.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:Tc,describe:"Max messages to scan"}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(a)=>{let d={channel:a.in,limit:a.limit};if(a.fix)d.fix=!0;if(a["channel-id"])d.channelId=a["channel-id"];let f=t(a);if(f)d.cookie=f;await dk(e(a),d)}).demandCommand(1,"Specify a todo subcommand (ls, set, flag, doctor)"),()=>{}).command("mytodo","Tasks carrying YOUR reactions (hasmy:) \u2014 the my-only half of `todo`",(c)=>c.option("cache",{type:"boolean",default:!0,describe:"Use ~/.config/slack-cli/cache.json for channel/user lookups (--no-cache to bypass)"}).middleware((a)=>{if(a.cache===!1)Oc(!1)}).command(["ls","list"],"List tasks you have reacted to (hasmy: \u2014 read-only, one search per run)",(a)=>a.options(o),async(a)=>{await r(a,!0)}).demandCommand(1,"Specify a mytodo subcommand (ls)"),()=>{}).command("upload <target> <file..>","Upload one or more files to a channel or DM",(c)=>c.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"}).option("as-bot",{type:"boolean",default:!1,describe:"Upload via the bot token (xoxb / SLACK_BOT_TOKEN); `slack @bot upload \u2026` does this too"}),async(c)=>{let a={target:c.target,filePaths:c.file};if(c.title)a.title=c.title;if(c.comment)a.comment=c.comment;if(c["allow-url-adjacent"])a.allowUrlAdjacent=!0;if(c.code)a.code=c.code;if(c["channel-id"])a.channelId=c["channel-id"];if(c["user-id"])a.userId=c["user-id"];if(c["as-bot"]){let f=Le();if(!f)console.error("Error: --as-bot needs a bot token (SLACK_BOT_TOKEN)"),process.exit(1);await Tg(f,a);return}let d=t(c);if(d)a.cookie=d;await Tg(e(c),a)}).command("files","File commands",(c)=>c.command(["ls","list"],"List files visible to you (files.list)",(a)=>a.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(a)=>{let d={limit:a.limit,format:a.json?"jsonl":a.format};if(a.type)d.types=a.type;if(a.channel)d.channel=a.channel;if(a.user)d.user=a.user;await ox(e(a),t(a),d)}).demandCommand(1,"").showHelpOnFail(!0),()=>{}).command("lists","Slack Lists \u2014 read rows (lists <ref>), or create / add / set (gated, as the bot)",(c)=>c.command("create <name>","Create a Slack List (confirm-hash safety gate; bot token, lists:write)",(a)=>a.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(a)=>{try{let d={name:a.name,cols:a.col,todo:a.todo===!0};if(a.code!==void 0)d.code=a.code;await cx(d)}catch(d){console.error(pe(d)),process.exit(1)}}).command("add <list> <text>","Add a row to a Slack List (confirm-hash safety gate; bot token)",(a)=>a.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(a)=>{try{let d={list:a.list,text:a.text,sets:a.set};if(a.code!==void 0)d.code=a.code;await lx(d)}catch(d){console.error(pe(d)),process.exit(1)}}).command("set <list> <row>","Update cells of a Slack List row; --done checks it off (confirm-hash safety gate; bot token)",(a)=>a.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(a)=>{try{let d={list:a.list,row:a.row,sets:a.set};if(a.done!==void 0)d.done=a.done;if(a.code!==void 0)d.code=a.code;await ux(d)}catch(d){console.error(pe(d)),process.exit(1)}}).command("share <list>","Grant users or channels access to a Slack List (confirm-hash safety gate; bot token)",(a)=>a.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(a)=>{try{let d={list:a.list,users:a.user,channels:a.channel,level:a.level};if(a.code!==void 0)d.code=a.code;await dx(d)}catch(d){console.error(pe(d)),process.exit(1)}}).command("$0 <ref>","Read a Slack List's rows (by list URL or F-id) \u2014 read-only",(a)=>a.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(a)=>{let d=a.json?"jsonl":a.format;try{let f=a.asBot===!0;await ix(f?"":e(a),f?void 0:t(a),a.ref,{limit:a.limit,format:d,asBot:f})}catch(f){console.error(pe(f)),process.exit(1)}})).command("download <ref> [dest]","Download a file attachment (by file ID or file permalink) to disk",(c)=>c.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(c)=>{await px(e(c),t(c),c.ref,c.dest)}).command("dump","Bulk export channel history as markdown",(c)=>c.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(c)=>{await fk(e(c),c.days,c.limit,c.filter)}).command("todos","Slack's To-dos tab \u2014 your personal to-dos (requires xoxc desktop token). Not `slack todo` (reaction tasks)",(c)=>c.command(["$0","ls","list"],"List your To-dos, soonest due first",(a)=>a.option("filter",{type:"string",choices:[...Ih],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(a)=>{if(!Number.isInteger(a.limit)||a.limit<1)console.error(`Error: --limit must be a whole number of at least 1 (got ${a.limit}).`),process.exit(2);await gk(e(a),t(a),{filter:a.filter,limit:a.limit,json:a.json})}).command("add <target>","Add a message to your To-dos (two-step: preview, then --code)",(a)=>a.positional("target",{type:"string",demandOption:!0,describe:"Message permalink or #chan:<ts>"}).option("due",{type:"string",describe:"Due time (ISO datetime or Unix ts)"}).option("saved",{type:"boolean",default:!1,describe:"Save it without a checkbox instead of as a to-do"}).option("code",{type:"string",describe:"Confirmation code from the preview"}),async(a)=>{let d=a.due===void 0?void 0:Cg(a.due);await Fr(e(a),t(a),a.target,{kind:"add",...d?{due:d}:{},saved:a.saved},a.code)}).command(["done <target>","complete <target>"],"Check a to-do off (--undo reopens it)",(a)=>a.positional("target",{type:"string",demandOption:!0,describe:"Message permalink or #chan:<ts>"}).option("undo",{type:"boolean",default:!1,describe:"Mark it not done again"}).option("code",{type:"string",describe:"Confirmation code from the preview"}),async(a)=>{await Fr(e(a),t(a),a.target,{kind:"done",undo:a.undo},a.code)}).command("edit <target>","Change a to-do's due date, or switch it between to-do and saved item",(a)=>a.positional("target",{type:"string",demandOption:!0,describe:"Message permalink or #chan:<ts>"}).option("due",{type:"string",describe:"New due time (ISO datetime or Unix ts), or `none` to clear it"}).option("todo",{type:"boolean",describe:"Make it a to-do (with a checkbox)"}).option("saved",{type:"boolean",describe:"Make it a plain saved item (no checkbox)"}).conflicts("todo","saved").option("code",{type:"string",describe:"Confirmation code from the preview"}),async(a)=>{let d=a.due===void 0?void 0:a.due==="none"?0:Cg(a.due),f=a.todo?!0:a.saved?!1:void 0;await Fr(e(a),t(a),a.target,{kind:"edit",...d===void 0?{}:{due:d},...f===void 0?{}:{todo:f}},a.code)}).command(["rm <target>","remove <target>","delete <target>"],"Remove a message from your To-dos (the message stays)",(a)=>a.positional("target",{type:"string",demandOption:!0,describe:"Message permalink or #chan:<ts>"}).option("code",{type:"string",describe:"Confirmation code from the preview"}),async(a)=>{await Fr(e(a),t(a),a.target,{kind:"rm"},a.code)})).command("drafts","Manage message drafts (requires xoxc desktop token)",(c)=>c.command(["$0","ls","list"],"List pending drafts",(a)=>a.option("all",{alias:"a",type:"boolean",default:!1,describe:"Include sent drafts"}),async(a)=>{await hk(e(a),t(a),a.all)}).command(["new <channel> [text..]","save <channel> [text..]"],"Create a draft",(a)=>a.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(a)=>{let d=e(a),f=t(a),p=a.text.join(" ");if(!p)console.error("Usage: slack drafts new <#channel|@user> <text>"),process.exit(2);Ke(p,a["allow-url-adjacent"],void 0,{sides:["after"],markdown:!1});let g=await ye(d,a.channel,f),h=await $h(d,g,p,f);console.log(`\u2713 Draft created (id: ${T(h.draft).id??"?"})`)}).command("get <id>","Show a draft",(a)=>a.positional("id",{type:"string",demandOption:!0}),async(a)=>{await wk(e(a),t(a),a.id)}).command(["edit <id> [text..]","update <id> [text..]"],"Edit a draft",(a)=>a.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(a)=>{let d=e(a),f=t(a),p=a.text.join(" ");if(!p)console.error("Usage: slack drafts edit <id> <new-text>"),process.exit(2);Ke(p,a["allow-url-adjacent"],void 0,{sides:["after"],markdown:!1});let g=await Gs(d,f),h=Y(g.drafts).map(T).find((D)=>String(D.id)===a.id);if(!h)console.error(`Draft not found: ${a.id}`),process.exit(1);let m=vr(h),y=await Me(d,f),w=we(m,p,y?.userId??"");if(a.code!==w)xe(a.code,w,["--- Editing draft as -------------------------",_e(y),"--- Current draft ----------------------------",...m.split(`
|
|
583
|
+
Tip: pass --user-id <Uxxxx> to skip the lookup.`),process.exit(1)}f=p,d.asBot=!0}else{f=e(c);let p=t(c);if(p)d.cookie=p}await Cx(f,d)}).command(["ls","list"],"List pending scheduled messages",(c)=>c.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(c)=>{let d=c.target;if(c["as-bot"]){let f=Ro(),p=c["channel-id"];if(!p&&d?.startsWith("@"))p=await Jg(d,f,e(c),t(c));await qg(f,d,p);return}await qg(e(c),d,c["channel-id"],t(c))}).command("rm <target> <id>","Delete a scheduled message",(c)=>c.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(c)=>{let d={target:c.target,id:c.id};if(c.code)d.code=c.code;if(c["channel-id"])d.channelId=c["channel-id"],d.targetOverride=`--channel-id ${c["channel-id"]}`;if(c["as-bot"]){let p=Ro();if(!d.channelId&&d.target.startsWith("@"))d.channelId=await Jg(d.target,p,e(c),t(c));d.asBot=!0,await Hg(p,d);return}let f=t(c);if(f)d.cookie=f;await Hg(e(c),d)}).demandCommand(1,"").showHelpOnFail(!0),()=>{}).command("edit <target> <newText>","Edit a sent message",(a)=>a.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("fix-urls",{type:"boolean",default:!1,describe:"Wrap ambiguous bare URLs as <url> (cut at the first non-ASCII character / trailing punctuation) before sending"}).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(a)=>n(a)).command("tick <target> [n]","Tick item n of a posted checklist (\u2B1C n. \u2192 \u2705 n.), nothing else changed; without n, the one open item (confirm-hash gate, like edit)",(a)=>a.positional("target",{type:"string",demandOption:!0,describe:"#chan:ts, @user:ts, or permalink"}).positional("n",{type:"number",describe:"Item number"}).option("code",{type:"string",describe:"Safety hash to confirm the edit"}).option("channel-id",{type:"string",describe:"Raw channel ID"}).option("as-bot",{type:"boolean",default:!1,describe:"Edit as the bot (needed for a message the bot posted)"}),async(a)=>n({...a,tick:a.n!==void 0?{n:a.n}:{},mentions:!1})).command("delete <target>","Delete a sent message (confirm-hash safety gate)",(a)=>a.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(a)=>{let c={target:a.target};if(a.code)c.code=a.code;if(a["channel-id"])c.channelId=a["channel-id"];let d;if(a["as-bot"]){let f=await Lg(c.target,e(a),t(a),c.channelId);if(d=f.botToken,f.channelId&&!c.channelId)c.channelId=f.channelId;c.asBot=!0}else{d=e(a);let f=t(a);if(f)c.cookie=f}await Gk(d,c)}).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)",(a)=>{let c={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."},d=async(p)=>{if(p["as-bot"]){let h=Ro();if(typeof p.workspace==="string"){let m=t(p),[y,w]=await Promise.all([Mt(e(p),m),Mt(h)]);if(y.url!==w.url)console.error(`Error: --as-bot acts with SLACK_BOT_TOKEN, which belongs to ${w.url}, but -w ${p.workspace} is ${y.url}.
|
|
584
|
+
Drop -w, or set SLACK_BOT_TOKEN to that workspace's bot token.`),process.exit(2)}return{token:h,asBot:!0}}let g=t(p);return{token:e(p),...g?{cookie:g}:{},asBot:!1}},f=(p)=>{console.error(pe(p)),process.exit(1)};return a.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)",(p)=>p.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",c).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(p)=>{let g=p.file!==void 0;if(g&&p.state!==void 0&&p.reason!==void 0)console.error("Error: with --file, pass only the reason after <channel> (the state comes from the file)."),process.exit(2);let h=g?Oo(void 0,p.file):Oo(p.state,void 0),m=g?p.state:p.reason;if(h===void 0)console.error("Error: the state is required (positional or --file)."),process.exit(2);let y=await d(p),w={target:p.channel,state:h,asBot:y.asBot,allowUrlAdjacent:p["allow-url-adjacent"]};if(m!==void 0)w.log=je(m);if(y.cookie)w.cookie=y.cookie;if(typeof p.workspace==="string")w.workspace=p.workspace;if(p.code)w.code=p.code;await Xk(y.token,w).catch(f)}).command("set <board> [state] [reason]","Change a board: replace its state (silent edit) AND post the reason in its thread (notifies)",(p)=>p.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",c).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(p)=>{let g=p.file!==void 0;if(g&&p.state!==void 0&&p.reason!==void 0)console.error("Error: with --file, pass only the reason after <board> (the state comes from the file)."),process.exit(2);let h=g?Oo(void 0,p.file):Oo(p.state,void 0),m=g?p.state:p.reason;if(h===void 0||m===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 y=await d(p),w={target:p.board,state:h,log:je(m),adopt:p.adopt,asBot:y.asBot,allowUrlAdjacent:p["allow-url-adjacent"]};if(typeof p.workspace==="string")w.workspace=p.workspace;if(y.cookie)w.cookie=y.cookie;if(p.code)w.code=p.code;await Mg(y.token,w).catch(f)}).command("note <board> <reason>","Post only a reason in a board's thread (notifies); the state stays as is",(p)=>p.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",c),async(p)=>{let g=await d(p),h={target:p.board,log:je(p.reason),logOnly:!0,asBot:g.asBot,allowUrlAdjacent:p["allow-url-adjacent"]};if(typeof p.workspace==="string")h.workspace=p.workspace;if(g.cookie)h.cookie=g.cookie;if(p.code)h.code=p.code;await Mg(g.token,h).catch(f)}).command(["get <board>","show <board>"],"Show a board's state and its log (read-only)",(p)=>p.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",c),async(p)=>{let g=await d(p);await Qk(g.token,p.board,g.cookie,p.json).catch(f)}).command(["ls <channel>","list <channel>"],"List the boards in a channel, found by their footer (read-only)",(p)=>p.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",c),async(p)=>{let g=await d(p);await ex(g.token,p.channel,p.limit,g.cookie).catch(f)}).command("pin <board>",!1,(p)=>p.positional("board",{type:"string",demandOption:!0}).option("as-bot",c),async(p)=>{let g=await d(p);await tx(g.token,p.board,g.cookie).catch(f)}).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",(a)=>a.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(a)=>{let c={target:a.target,emoji:a.emoji};if(a.remove)c.remove=!0;if(a["channel-id"])c.channelId=a["channel-id"];let d=t(a);if(d)c.cookie=d;try{await nx(e(a),c)}catch(f){console.error(pe(f)),process.exit(1)}}).command("todo","Reaction-backed task tracking (:pushpin: marks a task, progress lives in a second reaction)",(a)=>a.option("cache",{type:"boolean",default:!0,describe:"Use ~/.config/slack-cli/cache.json for channel/user lookups (--no-cache to bypass)"}).middleware((c)=>{if(c.cache===!1)Bc(!1)}).command(["ls","list"],"List everyone's tasks (has: \u2014 read-only, one search per run)",(c)=>c.options(r).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(c)=>{await o(c,!1)}).command("set <target> <state>","Move a task to a progress state (adds the new reaction before removing the old one)",(c)=>c.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(c)=>{let d={target:c.target,state:c.state};if(c["channel-id"])d.channelId=c["channel-id"];let f=t(c);if(f)d.cookie=f;try{await Rk(e(c),d)}catch(p){console.error(pe(p)),process.exit(1)}}).command("flag <target> <flag>","Add (or --remove) a reason flag (alert | needs-discussion | waiting | blocked) \u2014 flags stack, independent of progress",(c)=>c.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(c)=>{let d={target:c.target,flag:c.flag};if(c.remove)d.remove=!0;if(c["channel-id"])d.channelId=c["channel-id"];let f=t(c);if(f)d.cookie=f;try{await Ik(e(c),d)}catch(p){console.error(pe(p)),process.exit(1)}}).command("doctor","Find messages carrying two or more progress reactions (--fix repairs them)",(c)=>c.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:Mc,describe:"Max messages to scan"}).option("channel-id",{type:"string",describe:"Raw channel ID"}),async(c)=>{let d={channel:c.in,limit:c.limit};if(c.fix)d.fix=!0;if(c["channel-id"])d.channelId=c["channel-id"];let f=t(c);if(f)d.cookie=f;await vk(e(c),d)}).demandCommand(1,"Specify a todo subcommand (ls, set, flag, doctor)"),()=>{}).command("mytodo","Tasks carrying YOUR reactions (hasmy:) \u2014 the my-only half of `todo`",(a)=>a.option("cache",{type:"boolean",default:!0,describe:"Use ~/.config/slack-cli/cache.json for channel/user lookups (--no-cache to bypass)"}).middleware((c)=>{if(c.cache===!1)Bc(!1)}).command(["ls","list"],"List tasks you have reacted to (hasmy: \u2014 read-only, one search per run)",(c)=>c.options(r),async(c)=>{await o(c,!0)}).demandCommand(1,"Specify a mytodo subcommand (ls)"),()=>{}).command("upload <target> <file..>","Upload one or more files to a channel or DM",(a)=>a.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"}).option("as-bot",{type:"boolean",default:!1,describe:"Upload via the bot token (xoxb / SLACK_BOT_TOKEN); `slack @bot upload \u2026` does this too"}),async(a)=>{let c={target:a.target,filePaths:a.file};if(a.title)c.title=a.title;if(a.comment)c.comment=a.comment;if(a["allow-url-adjacent"])c.allowUrlAdjacent=!0;if(a.code)c.code=a.code;if(a["channel-id"])c.channelId=a["channel-id"];if(a["user-id"])c.userId=a["user-id"];if(a["as-bot"]){let f=Le();if(!f)console.error("Error: --as-bot needs a bot token (SLACK_BOT_TOKEN)"),process.exit(1);await zg(f,c);return}let d=t(a);if(d)c.cookie=d;await zg(e(a),c)}).command("files","File commands",(a)=>a.command(["ls","list"],"List files visible to you (files.list)",(c)=>c.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(c)=>{let d={limit:c.limit,format:c.json?"jsonl":c.format};if(c.type)d.types=c.type;if(c.channel)d.channel=c.channel;if(c.user)d.user=c.user;await Ax(e(c),t(c),d)}).demandCommand(1,"").showHelpOnFail(!0),()=>{}).command("lists","Slack Lists \u2014 read rows (lists <ref>), or create / add / set (gated, as the bot)",(a)=>a.command("create <name>","Create a Slack List (confirm-hash safety gate; bot token, lists:write)",(c)=>c.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(c)=>{try{let d={name:c.name,cols:c.col,todo:c.todo===!0};if(c.code!==void 0)d.code=c.code;await Rx(d)}catch(d){console.error(pe(d)),process.exit(1)}}).command("add <list> <text>","Add a row to a Slack List (confirm-hash safety gate; bot token)",(c)=>c.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(c)=>{try{let d={list:c.list,text:c.text,sets:c.set};if(c.code!==void 0)d.code=c.code;await Ix(d)}catch(d){console.error(pe(d)),process.exit(1)}}).command("set <list> <row>","Update cells of a Slack List row; --done checks it off (confirm-hash safety gate; bot token)",(c)=>c.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(c)=>{try{let d={list:c.list,row:c.row,sets:c.set};if(c.done!==void 0)d.done=c.done;if(c.code!==void 0)d.code=c.code;await vx(d)}catch(d){console.error(pe(d)),process.exit(1)}}).command("share <list>","Grant users or channels access to a Slack List (confirm-hash safety gate; bot token)",(c)=>c.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(c)=>{try{let d={list:c.list,users:c.user,channels:c.channel,level:c.level};if(c.code!==void 0)d.code=c.code;await Px(d)}catch(d){console.error(pe(d)),process.exit(1)}}).command("$0 <ref>","Read a Slack List's rows (by list URL or F-id) \u2014 read-only",(c)=>c.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(c)=>{let d=c.json?"jsonl":c.format;try{let f=c.asBot===!0;await Tx(f?"":e(c),f?void 0:t(c),c.ref,{limit:c.limit,format:d,asBot:f})}catch(f){console.error(pe(f)),process.exit(1)}})).command("download <ref> [dest]","Download a file attachment (by file ID or file permalink) to disk",(a)=>a.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(a)=>{await Nx(e(a),t(a),a.ref,a.dest)}).command("dump","Bulk export channel history as markdown",(a)=>a.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(a)=>{await Pk(e(a),a.days,a.limit,a.filter)}).command("todos","Slack's To-dos tab \u2014 your personal to-dos (requires xoxc desktop token). Not `slack todo` (reaction tasks)",(a)=>a.command(["$0","ls","list"],"List your To-dos, soonest due first",(c)=>c.option("filter",{type:"string",choices:[...Yh],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(c)=>{if(!Number.isInteger(c.limit)||c.limit<1)console.error(`Error: --limit must be a whole number of at least 1 (got ${c.limit}).`),process.exit(2);await Mk(e(c),t(c),{filter:c.filter,limit:c.limit,json:c.json})}).command("add <target>","Add a message to your To-dos (two-step: preview, then --code)",(c)=>c.positional("target",{type:"string",demandOption:!0,describe:"Message permalink or #chan:<ts>"}).option("due",{type:"string",describe:"Due time (ISO datetime or Unix ts)"}).option("saved",{type:"boolean",default:!1,describe:"Save it without a checkbox instead of as a to-do"}).option("code",{type:"string",describe:"Confirmation code from the preview"}),async(c)=>{let d=c.due===void 0?void 0:Kg(c.due);await To(e(c),t(c),c.target,{kind:"add",...d?{due:d}:{},saved:c.saved},c.code)}).command(["done <target>","complete <target>"],"Check a to-do off (--undo reopens it)",(c)=>c.positional("target",{type:"string",demandOption:!0,describe:"Message permalink or #chan:<ts>"}).option("undo",{type:"boolean",default:!1,describe:"Mark it not done again"}).option("code",{type:"string",describe:"Confirmation code from the preview"}),async(c)=>{await To(e(c),t(c),c.target,{kind:"done",undo:c.undo},c.code)}).command("edit <target>","Change a to-do's due date, or switch it between to-do and saved item",(c)=>c.positional("target",{type:"string",demandOption:!0,describe:"Message permalink or #chan:<ts>"}).option("due",{type:"string",describe:"New due time (ISO datetime or Unix ts), or `none` to clear it"}).option("todo",{type:"boolean",describe:"Make it a to-do (with a checkbox)"}).option("saved",{type:"boolean",describe:"Make it a plain saved item (no checkbox)"}).conflicts("todo","saved").option("code",{type:"string",describe:"Confirmation code from the preview"}),async(c)=>{let d=c.due===void 0?void 0:c.due==="none"?0:Kg(c.due),f=c.todo?!0:c.saved?!1:void 0;await To(e(c),t(c),c.target,{kind:"edit",...d===void 0?{}:{due:d},...f===void 0?{}:{todo:f}},c.code)}).command(["rm <target>","remove <target>","delete <target>"],"Remove a message from your To-dos (the message stays)",(c)=>c.positional("target",{type:"string",demandOption:!0,describe:"Message permalink or #chan:<ts>"}).option("code",{type:"string",describe:"Confirmation code from the preview"}),async(c)=>{await To(e(c),t(c),c.target,{kind:"rm"},c.code)})).command("drafts","Manage message drafts (requires xoxc desktop token)",(a)=>a.command(["$0","ls","list"],"List pending drafts",(c)=>c.option("all",{alias:"a",type:"boolean",default:!1,describe:"Include sent drafts"}),async(c)=>{await Nk(e(c),t(c),c.all)}).command(["new <channel> [text..]","save <channel> [text..]"],"Create a draft",(c)=>c.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(c)=>{let d=e(c),f=t(c),p=c.text.join(" ");if(!p)console.error("Usage: slack drafts new <#channel|@user> <text>"),process.exit(2);Ke(p,c["allow-url-adjacent"],void 0,{sides:["after"],markdown:!1});let g=await ye(d,c.channel,f),h=await Uh(d,g,p,f);console.log(`\u2713 Draft created (id: ${T(h.draft).id??"?"})`)}).command("get <id>","Show a draft",(c)=>c.positional("id",{type:"string",demandOption:!0}),async(c)=>{await Uk(e(c),t(c),c.id)}).command(["edit <id> [text..]","update <id> [text..]"],"Edit a draft",(c)=>c.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(c)=>{let d=e(c),f=t(c),p=c.text.join(" ");if(!p)console.error("Usage: slack drafts edit <id> <new-text>"),process.exit(2);Ke(p,c["allow-url-adjacent"],void 0,{sides:["after"],markdown:!1});let g=await Zs(d,f),h=G(g.drafts).map(T).find((D)=>String(D.id)===c.id);if(!h)console.error(`Draft not found: ${c.id}`),process.exit(1);let m=Lo(h),y=await Me(d,f),w=we(m,p,y?.userId??"");if(c.code!==w)xe(c.code,w,["--- Editing draft as -------------------------",_e(y),"--- Current draft ----------------------------",...m.split(`
|
|
583
585
|
`).map((D)=>` ${D}`),"--- Replacing with ---------------------------",...p.split(`
|
|
584
|
-
`).map((D)=>` ${D}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let x=await
|
|
585
|
-
`).map((w)=>` ${w}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);await
|
|
586
|
-
`))}).command("app","Create a new Slack app and obtain a token (guided wizard)",(a)=>a.option("bot",{type:"boolean",describe:"Create a bot token (xoxb-) instead of user (xoxp-)"}),async(a)=>{await Cd({...a.bot!==void 0?{bot:a.bot}:{}})}).command("login","Log in: interactive wizard, or a source (chrome, firefox)",(a)=>a.command("chrome","Import workspaces from Chrome, grouped by account (all platforms)",(d)=>d.option("profile",{type:"string",alias:"p",describe:'Chrome profile email or dir (e.g. "you@example.com" or "Profile 3")'}),async(d)=>{await ca({...d.profile!==void 0?{profile:d.profile}:{}})}).command("firefox","Import the xoxd cookie from Firefox into a workspace",(d)=>d.option("workspace",{type:"string",alias:"w",describe:"Workspace name to update (default: active)"}),async(d)=>{await la({...d.workspace!==void 0?{workspace:d.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(d)=>{await Is({...d.token!==void 0?{token:d.token}:{},...d.name!==void 0?{name:d.name}:{},yes:d.yes,fromDesktop:d.fromDesktop,fromChrome:d.fromChrome,fromFirefox:d.fromFirefox,fromAll:d.fromAll})}),async(a)=>{await Is({...a.token!==void 0?{token:a.token}:{},...a.name!==void 0?{name:a.name}:{},yes:a.yes,fromDesktop:a.fromDesktop,fromChrome:a.fromChrome,fromFirefox:a.fromFirefox,fromAll:a.fromAll})}).command("tokens","Print the selected credentials as dotenv assignments",(a)=>a.option("workspace",{type:"string",alias:"w",describe:"Workspace name (default: active)"}),(a)=>Ad({...a.workspace!==void 0?{workspace:a.workspace}:{}})).command("save","Save the active profile token and cookie to an env file",(a)=>a.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)"}),(a)=>Fd({envfile:a.envfile,...a.workspace!==void 0?{workspace:a.workspace}:{}})).command(["ls","status"],"Show auth status",()=>{},()=>{let a=Ti();if(a.length===0){console.log("No workspaces configured. Run: slack auth login");return}for(let{name:d,profile:f,current:p}of a)console.log(`${p?"* ":" "}${d} ${f.team} (${f.user}) ${f.url??""}`)}).command("use <name>","Switch active workspace",(a)=>a.positional("name",{type:"string",demandOption:!0}).option("g",{type:"boolean",default:!1,describe:"Write global lockfile (~/.slack-cli/workspace)"}),(a)=>{if(!a.g)V0(Ot(process.cwd(),".slack-cli"));qu(a.name,a.g),console.log(`Switched to workspace "${a.name}" ${a.g?"globally":"locally"}`)}).command(["logout <name>","rm <name>","remove <name>"],"Remove a workspace",(a)=>a.positional("name",{type:"string",demandOption:!0}),(a)=>{Ku(a.name),console.log(`Removed workspace "${a.name}"`)}).command(["cookie","chrome"],"Attach a Chrome xoxd cookie to a workspace (macOS/Linux/Windows). To import workspaces, use: slack auth login chrome",(a)=>a.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(a)=>{await Ed({...a.workspace!==void 0?{workspace:a.workspace}:{},...a.profile!==void 0?{profile:a.profile}:{},yes:a.yes})}).command("firefox","Attach Firefox browser xoxd cookie to a workspace (all platforms)",(a)=>a.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(a)=>{await la({...a.workspace!==void 0?{workspace:a.workspace}:{},yes:a.yes})}).command("$0",!1,()=>{},()=>{c.showHelp(),process.exit(0)})).command("relay","Set up / check the real-time relay for `slack stream` (a Cloudflare Worker)",(c)=>c.command("init [dir]","Scaffold a deployable relay Worker folder (local files only; prints a fresh RELAY_TOKEN and the next steps)",(a)=>a.positional("dir",{type:"string",default:wa,describe:"Folder to create"}).option("name",{type:"string",describe:"Worker name (default: the folder's name)"}).option("force",{type:"boolean",default:!1,describe:"Overwrite files that already exist"}).option("slack-term",{type:"string",describe:"slack-term dependency spec (default: this CLI's version), e.g. latest or file:../slack-term"}),(a)=>{let d=Vd(a.dir,{force:a.force,...a.name!==void 0?{name:a.name}:{},...a["slack-term"]!==void 0?{slackTerm:a["slack-term"]}:{}});if(!d.ok){console.error(`slack relay init: ${d.error}`);for(let f of d.existing??[])console.error(` exists: ${f}`);process.exit(2)}console.log(Zd(d))}).command("health","GET /health on the relay (SLACK_RELAY_URL / SLACK_RELAY_TOKEN); exit 0 = ok",(a)=>a.option("url",{type:"string",describe:"Relay URL (default: $SLACK_RELAY_URL)"}).option("token",{type:"string",describe:"Relay token (default: $SLACK_RELAY_TOKEN)"}),async(a)=>{let d=await Qd(a.url??process.env.SLACK_RELAY_URL,a.token??process.env.SLACK_RELAY_TOKEN);(d.code===0?console.log:console.error)(d.out),process.exit(d.code)}).demandCommand(1,"Specify a relay subcommand (init, health)")).command("stream","Print every new message matching --grep, across all channels the identity is in (threads included); resumable",(c)=>c.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 (`slack relay init`) 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"}).option("inbox",{type:"boolean",default:!1,describe:"Also write each match into the inbox/ of every .slack-term/ that subscribes its thread (redacted, text-only)"}).option("reactions",{type:"boolean",default:!1,describe:'Relay only: also print reaction_added bells as {type: "reaction", channel, ts, user} (the emoji: reactions.get)'}),async(c)=>{let a,d,f,p,g,h;try{a=new RegExp(c.grep,c["ignore-case"]?"i":""),f=en(c.interval)*1000,p=en(c["thread-window"]),g=en(c["thread-scan"]),h=c.since!==void 0?en(c.since):void 0,d=en(c.reconcile)*1000}catch(R){console.error(`slack stream: ${R instanceof Error?R.message:String(R)}`),process.exit(1)}let m=Le(),y=c["as-user"]===!0||!m,w=y?e(c):m,x=y?t(c):void 0;if(!m&&c["as-user"]!==!0)console.error("slack stream: no bot token (SLACK_BOT_TOKEN) \u2014 streaming as the USER identity, which includes its DMs.");let D;try{D=await Nt(w,x)}catch(R){console.error(`slack stream: fatal: ${R instanceof Error?R.message:String(R)}`),process.exit(3)}let E=new Set([D.userId].filter(Boolean)),C=new Set([D.botId].filter(Boolean));if(y&&m)try{let R=await Nt(m);if(R.userId)E.add(R.userId);if(R.botId)C.add(R.botId)}catch{}let S;if(c["replies-to"]?.length){S=new Set;for(let R of c["replies-to"].map(String)){if(R==="self"){for(let te of[D.userId,D.botId])if(te)S.add(te);continue}if(!/^[UWB][A-Z0-9]{2,}$/.test(R))console.error(`slack stream: --replies-to: "${R}" is not a user or bot id (U\u2026/W\u2026/B\u2026) or "self"`),process.exit(1);if(S.add(R),R.startsWith("B"))try{let{userId:te}=await Qp(w,R,x);if(te)S.add(te)}catch(te){console.error(`slack stream: --replies-to ${R}: cannot resolve its bot user id (${te instanceof Error?te.message:String(te)}); threads where it shows as a user id are missed`)}}}let k;if(c.channel?.length)try{k=[];for(let R of c.channel)k.push(await ye(w,String(R),x))}catch(R){console.error(`slack stream: --channel: ${R instanceof Error?R.message:String(R)}`),process.exit(1)}let O=Og("sha256").update(JSON.stringify([D.url,D.userId,a.source,a.flags,[...k??[]].sort(),...c["replies-to"]?.length?[[...c["replies-to"].map(String)].sort()]:[]])).digest("hex").slice(0,16),P=process.env.XDG_STATE_HOME||Ot(Hc(),".local","state"),L=c.state??Ot(P,"slack-term","stream",`${O}.json`);console.error(`slack stream: as ${y?"user":"bot"} @${D.user} (${D.userId}); state ${L}`);let v=process.env.SLACK_RELAY_URL,j=process.env.SLACK_RELAY_TOKEN,H=c.relay&&!y&&!c.once&&v&&j?{url:v,subscribe:zd(v,j,void 0,{transport:qd(process.env.SLACK_RELAY_TRANSPORT)}),reconcileMs:d}:void 0;if(c.relay&&y&&v)console.error("slack stream: relay not used with --as-user (it only sees the bot's channels)");let B=!c.relay?"--no-relay":y?v?"--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",q=new AbortController;process.on("SIGINT",()=>q.abort()),process.on("SIGTERM",()=>q.abort()),Xp(0);let z=await Ud(Wd(w,x),{grep:a,...S?{repliesTo:S}:{},...k?{channels:k}:{},selfUsers:E,selfBots:C,json:c.json,reactions:c.reactions,...c.inbox?{onMatch:(R,te)=>{try{let Q=[w,x,process.env.SLACK_RELAY_TOKEN].filter((oe)=>!!oe),M=up({...R,...te?{files:te}:{}},void 0,new Date,Q);if(M.length)console.error(`slack stream: delivered ${R.channel.id}:${R.ts} to ${M.length} inbox(es)`)}catch(Q){console.error(`slack stream: inbox delivery failed: ${Q instanceof Error?Q.message:String(Q)}`)}}}:{},once:c.once,...h!==void 0?{sinceSec:h}:{},intervalMs:f,threadWindowSec:p,threadScanSec:g,callsPerMin:c["calls-per-min"],...H?{}:{pollReason:B},statePath:L,teamUrl:D.url,identity:D.userId,signal:q.signal,...H?{relay:H}:{}});process.exit(z)}).command("tail [target]","Stream new messages in real time (like tail -f)",(c)=>c.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(c)=>{let a=e(c),d=t(c),f=new AbortController;process.on("SIGINT",()=>{f.abort(),process.exit(0)}),await Pd(a,c.target,{...c.since!==void 0?{since:c.since}:{},...c.thread!==void 0?{thread:c.thread}:{},...c["watch-thread"]!==void 0?{watchThread:c["watch-thread"]}:{},me:c.me,interval:c.interval,...c.timeout!==void 0?{timeout:c.timeout}:{},...c["exit-on-message"]===!0?{exitOnMessage:!0}:{},...d!==void 0?{cookie:d}:{},...c.rtm===!1?{noRtm:!0}:{}},f.signal)}).command("login",!1,(c)=>c.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(c)=>{await Is({...c.token!==void 0?{token:c.token}:{},...c.name!==void 0?{name:c.name}:{},yes:c.yes,fromDesktop:c.fromDesktop,fromChrome:c.fromChrome,fromFirefox:c.fromFirefox,fromAll:c.fromAll})}).demandCommand(1,"Specify a command. Run with --help for usage.").strict().help().alias("help","h").parseAsync()}hx().catch((e)=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});
|
|
586
|
+
`).map((D)=>` ${D}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);let x=await Jh(d,c.id,al(h),p,f);console.log(`\u2713 Draft updated (id: ${T(x.draft).id??"?"})`)}).command(["delete <id>","rm <id>"],"Delete a draft",(c)=>c.positional("id",{type:"string",demandOption:!0}).option("code",{type:"string"}),async(c)=>{let d=e(c),f=t(c),p=await Zs(d,f),g=G(p.drafts).map(T).find((w)=>String(w.id)===c.id);if(!g)console.error(`Draft not found: ${c.id}`),process.exit(1);let h=Lo(g),m=await Me(d,f),y=we(c.id,h,m?.userId??"");if(c.code!==y)xe(c.code,y,["\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",_e(m),` id: ${c.id}`,...h.split(`
|
|
587
|
+
`).map((w)=>` ${w}`),"--------------------------------\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"]);await Hh(d,c.id,f),console.log(`\u2713 Draft deleted (id: ${c.id})`)})).command("auth","Authentication and workspace management",(a)=>a.command("token","Print the active token (or save one with --token)",(c)=>c.option("token",{type:"string",describe:"Token to save directly (non-interactive)"}).option("name",{type:"string",describe:"Workspace name (used with --token)"}),async(c)=>{if(c.token===void 0){console.log(Es(c.workspace));return}await Md({...c.token!==void 0?{token:c.token}:{},...c.name!==void 0?{name:c.name}:{}})}).command("env","Print active workspace credentials in dotenv format",()=>{},(c)=>{let d=Es(c.workspace),f=d.startsWith("xoxc-")?Ii(c.workspace):void 0,p=[["SLACK_TOKEN",d]];if(f)p.push(["SLACK_COOKIE",f]);let g=p.map(([h,m])=>{if(/[\r\n\0']/.test(m))throw Error(`Cannot export ${h}: unsupported characters in credential`);return`${h}='${m}'`});console.log(g.join(`
|
|
588
|
+
`))}).command("app","Create a new Slack app and obtain a token (guided wizard)",(c)=>c.option("bot",{type:"boolean",describe:"Create a bot token (xoxb-) instead of user (xoxp-)"}),async(c)=>{await Bd({...c.bot!==void 0?{bot:c.bot}:{}})}).command("login","Log in: interactive wizard, or a source (chrome, firefox)",(c)=>c.command("chrome","Import workspaces from Chrome, grouped by account (all platforms)",(d)=>d.option("profile",{type:"string",alias:"p",describe:'Chrome profile email or dir (e.g. "you@example.com" or "Profile 3")'}),async(d)=>{await ua({...d.profile!==void 0?{profile:d.profile}:{}})}).command("firefox","Import the xoxd cookie from Firefox into a workspace",(d)=>d.option("workspace",{type:"string",alias:"w",describe:"Workspace name to update (default: active)"}),async(d)=>{await da({...d.workspace!==void 0?{workspace:d.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(d)=>{await Ls({...d.token!==void 0?{token:d.token}:{},...d.name!==void 0?{name:d.name}:{},yes:d.yes,fromDesktop:d.fromDesktop,fromChrome:d.fromChrome,fromFirefox:d.fromFirefox,fromAll:d.fromAll})}),async(c)=>{await Ls({...c.token!==void 0?{token:c.token}:{},...c.name!==void 0?{name:c.name}:{},yes:c.yes,fromDesktop:c.fromDesktop,fromChrome:c.fromChrome,fromFirefox:c.fromFirefox,fromAll:c.fromAll})}).command("tokens","Print the selected credentials as dotenv assignments",(c)=>c.option("workspace",{type:"string",alias:"w",describe:"Workspace name (default: active)"}),(c)=>jd({...c.workspace!==void 0?{workspace:c.workspace}:{}})).command("save","Save the active profile token and cookie to an env file",(c)=>c.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)"}),(c)=>Wd({envfile:c.envfile,...c.workspace!==void 0?{workspace:c.workspace}:{}})).command(["ls","status"],"Show auth status",()=>{},()=>{let c=Ri();if(c.length===0){console.log("No workspaces configured. Run: slack auth login");return}for(let{name:d,profile:f,current:p}of c)console.log(`${p?"* ":" "}${d} ${f.team} (${f.user}) ${f.url??""}`)}).command("use <name>","Switch active workspace",(c)=>c.positional("name",{type:"string",demandOption:!0}).option("g",{type:"boolean",default:!1,describe:"Write global lockfile (~/.slack-cli/workspace)"}),(c)=>{if(!c.g)Dk(gt(process.cwd(),".slack-cli"));sd(c.name,c.g),console.log(`Switched to workspace "${c.name}" ${c.g?"globally":"locally"}`)}).command(["logout <name>","rm <name>","remove <name>"],"Remove a workspace",(c)=>c.positional("name",{type:"string",demandOption:!0}),(c)=>{nd(c.name),console.log(`Removed workspace "${c.name}"`)}).command(["cookie","chrome"],"Attach a Chrome xoxd cookie to a workspace (macOS/Linux/Windows). To import workspaces, use: slack auth login chrome",(c)=>c.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(c)=>{await Nd({...c.workspace!==void 0?{workspace:c.workspace}:{},...c.profile!==void 0?{profile:c.profile}:{},yes:c.yes})}).command("firefox","Attach Firefox browser xoxd cookie to a workspace (all platforms)",(c)=>c.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(c)=>{await da({...c.workspace!==void 0?{workspace:c.workspace}:{},yes:c.yes})}).command("$0",!1,()=>{},()=>{a.showHelp(),process.exit(0)})).command("relay","Set up / check the real-time relay for `slack stream` (a Cloudflare Worker)",(a)=>a.command("init [dir]","Scaffold a deployable relay Worker folder (local files only; prints a fresh RELAY_TOKEN and the next steps)",(c)=>c.positional("dir",{type:"string",default:Sa,describe:"Folder to create"}).option("name",{type:"string",describe:"Worker name (default: the folder's name)"}).option("force",{type:"boolean",default:!1,describe:"Overwrite files that already exist"}).option("slack-term",{type:"string",describe:"slack-term dependency spec (default: this CLI's version), e.g. latest or file:../slack-term"}),(c)=>{let d=yf(c.dir,{force:c.force,...c.name!==void 0?{name:c.name}:{},...c["slack-term"]!==void 0?{slackTerm:c["slack-term"]}:{}});if(!d.ok){console.error(`slack relay init: ${d.error}`);for(let f of d.existing??[])console.error(` exists: ${f}`);process.exit(2)}console.log(bf(d))}).command("health","GET /health on the relay (SLACK_RELAY_URL / SLACK_RELAY_TOKEN); exit 0 = ok",(c)=>c.option("url",{type:"string",describe:"Relay URL (default: $SLACK_RELAY_URL)"}).option("token",{type:"string",describe:"Relay token (default: $SLACK_RELAY_TOKEN)"}),async(c)=>{let d=await wf(c.url??process.env.SLACK_RELAY_URL,c.token??process.env.SLACK_RELAY_TOKEN);(d.code===0?console.log:console.error)(d.out),process.exit(d.code)}).demandCommand(1,"Specify a relay subcommand (init, health)")).command("stream","Print every new message matching --grep, across all channels the identity is in (threads included); resumable",(a)=>a.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 (`slack relay init`) 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"}).option("inbox",{type:"boolean",default:!1,describe:"Also write each match into the inbox/ of every .slack-term/ that subscribes its thread (redacted, text-only)"}).option("reactions",{type:"boolean",default:!1,describe:'Relay only: also print reaction_added bells as {type: "reaction", channel, ts, user} (the emoji: reactions.get)'}),async(a)=>{let c,d,f,p,g,h;try{c=new RegExp(a.grep,a["ignore-case"]?"i":""),f=en(a.interval)*1000,p=en(a["thread-window"]),g=en(a["thread-scan"]),h=a.since!==void 0?en(a.since):void 0,d=en(a.reconcile)*1000}catch(R){console.error(`slack stream: ${R instanceof Error?R.message:String(R)}`),process.exit(1)}let m=Le(),y=a["as-user"]===!0||!m,w=y?e(a):m,x=y?t(a):void 0;if(!m&&a["as-user"]!==!0)console.error("slack stream: no bot token (SLACK_BOT_TOKEN) \u2014 streaming as the USER identity, which includes its DMs.");let D;try{D=await Mt(w,x)}catch(R){console.error(`slack stream: fatal: ${R instanceof Error?R.message:String(R)}`),process.exit(3)}let E=new Set([D.userId].filter(Boolean)),C=new Set([D.botId].filter(Boolean));if(y&&m)try{let R=await Mt(m);if(R.userId)E.add(R.userId);if(R.botId)C.add(R.botId)}catch{}let S;if(a["replies-to"]?.length){S=new Set;for(let R of a["replies-to"].map(String)){if(R==="self"){for(let te of[D.userId,D.botId])if(te)S.add(te);continue}if(!/^[UWB][A-Z0-9]{2,}$/.test(R))console.error(`slack stream: --replies-to: "${R}" is not a user or bot id (U\u2026/W\u2026/B\u2026) or "self"`),process.exit(1);if(S.add(R),R.startsWith("B"))try{let{userId:te}=await gh(w,R,x);if(te)S.add(te)}catch(te){console.error(`slack stream: --replies-to ${R}: cannot resolve its bot user id (${te instanceof Error?te.message:String(te)}); threads where it shows as a user id are missed`)}}}let k;if(a.channel?.length)try{k=[];for(let R of a.channel)k.push(await ye(w,String(R),x))}catch(R){console.error(`slack stream: --channel: ${R instanceof Error?R.message:String(R)}`),process.exit(1)}let O=Gg("sha256").update(JSON.stringify([D.url,D.userId,c.source,c.flags,[...k??[]].sort(),...a["replies-to"]?.length?[[...a["replies-to"].map(String)].sort()]:[]])).digest("hex").slice(0,16),L=process.env.XDG_STATE_HOME||gt(Io(),".local","state"),P=a.state??gt(L,"slack-term","stream",`${O}.json`);console.error(`slack stream: as ${y?"user":"bot"} @${D.user} (${D.userId}); state ${P}`);let v=process.env.SLACK_RELAY_URL,j=process.env.SLACK_RELAY_TOKEN,H=a.relay&&!y&&!a.once&&v&&j?{url:v,subscribe:ka(v,j,void 0,{transport:Da(process.env.SLACK_RELAY_TRANSPORT)}),reconcileMs:d}:void 0;if(a.relay&&y&&v)console.error("slack stream: relay not used with --as-user (it only sees the bot's channels)");let B=!a.relay?"--no-relay":y?v?"--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",q=new AbortController;process.on("SIGINT",()=>q.abort()),process.on("SIGTERM",()=>q.abort()),Dc(0);let z=await tf(Qd(w,x),{grep:c,...S?{repliesTo:S}:{},...k?{channels:k}:{},selfUsers:E,selfBots:C,json:a.json,reactions:a.reactions,...a.inbox?{onMatch:(R,te)=>{try{let Q=[w,x,process.env.SLACK_RELAY_TOKEN].filter((re)=>!!re),M=Fp({...R,...te?{files:te}:{}},void 0,new Date,Q);if(M.length)console.error(`slack stream: delivered ${R.channel.id}:${R.ts} to ${M.length} inbox(es)`)}catch(Q){console.error(`slack stream: inbox delivery failed: ${Q instanceof Error?Q.message:String(Q)}`)}}}:{},once:a.once,...h!==void 0?{sinceSec:h}:{},intervalMs:f,threadWindowSec:p,threadScanSec:g,callsPerMin:a["calls-per-min"],...H?{}:{pollReason:B},statePath:P,teamUrl:D.url,identity:D.userId,signal:q.signal,...H?{relay:H}:{}});process.exit(z)}).command("tail [target]","Stream new messages in real time (like tail -f)",(a)=>a.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(a)=>{let c=e(a),d=t(a),f=new AbortController;process.on("SIGINT",()=>{f.abort(),process.exit(0)}),await zd(c,a.target,{...a.since!==void 0?{since:a.since}:{},...a.thread!==void 0?{thread:a.thread}:{},...a["watch-thread"]!==void 0?{watchThread:a["watch-thread"]}:{},me:a.me,interval:a.interval,...a.timeout!==void 0?{timeout:a.timeout}:{},...a["exit-on-message"]===!0?{exitOnMessage:!0}:{},...d!==void 0?{cookie:d}:{},...a.rtm===!1?{noRtm:!0}:{}},f.signal)}).command("login",!1,(a)=>a.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(a)=>{await Ls({...a.token!==void 0?{token:a.token}:{},...a.name!==void 0?{name:a.name}:{},yes:a.yes,fromDesktop:a.fromDesktop,fromChrome:a.fromChrome,fromFirefox:a.fromFirefox,fromAll:a.fromAll})}).demandCommand(1,"Specify a command. Run with --help for usage.").strict().help().alias("help","h").parseAsync()}Mx().catch((e)=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});
|