@nocoo/zhe 1.18.0 → 1.24.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.
Files changed (115) hide show
  1. package/README.md +27 -0
  2. package/dist/api/client.d.ts +18 -1
  3. package/dist/api/client.d.ts.map +1 -1
  4. package/dist/api/client.js +25 -8
  5. package/dist/api/client.js.map +1 -1
  6. package/dist/api/types.d.ts.map +1 -1
  7. package/dist/commands/connector.d.ts +2 -0
  8. package/dist/commands/connector.d.ts.map +1 -0
  9. package/dist/commands/connector.js +93 -0
  10. package/dist/commands/connector.js.map +1 -0
  11. package/dist/commands/create.d.ts.map +1 -1
  12. package/dist/commands/create.js +1 -1
  13. package/dist/commands/create.js.map +1 -1
  14. package/dist/commands/delete.js +1 -1
  15. package/dist/commands/delete.js.map +1 -1
  16. package/dist/commands/folder.d.ts.map +1 -1
  17. package/dist/commands/folder.js +1 -1
  18. package/dist/commands/folder.js.map +1 -1
  19. package/dist/commands/folders.js +1 -1
  20. package/dist/commands/folders.js.map +1 -1
  21. package/dist/commands/get.js +1 -1
  22. package/dist/commands/get.js.map +1 -1
  23. package/dist/commands/idea/add.d.ts +22 -0
  24. package/dist/commands/idea/add.d.ts.map +1 -0
  25. package/dist/commands/idea/add.js +55 -0
  26. package/dist/commands/idea/add.js.map +1 -0
  27. package/dist/commands/idea/delete.d.ts +17 -0
  28. package/dist/commands/idea/delete.d.ts.map +1 -0
  29. package/dist/commands/idea/delete.js +47 -0
  30. package/dist/commands/idea/delete.js.map +1 -0
  31. package/dist/commands/idea/get.d.ts +12 -0
  32. package/dist/commands/idea/get.d.ts.map +1 -0
  33. package/dist/commands/idea/get.js +45 -0
  34. package/dist/commands/idea/get.js.map +1 -0
  35. package/dist/commands/idea/helpers.d.ts +13 -0
  36. package/dist/commands/idea/helpers.d.ts.map +1 -0
  37. package/dist/commands/idea/helpers.js +78 -0
  38. package/dist/commands/idea/helpers.js.map +1 -0
  39. package/dist/commands/idea/list.d.ts +22 -0
  40. package/dist/commands/idea/list.d.ts.map +1 -0
  41. package/dist/commands/idea/list.js +64 -0
  42. package/dist/commands/idea/list.js.map +1 -0
  43. package/dist/commands/idea/update.d.ts +27 -0
  44. package/dist/commands/idea/update.d.ts.map +1 -0
  45. package/dist/commands/idea/update.js +78 -0
  46. package/dist/commands/idea/update.js.map +1 -0
  47. package/dist/commands/idea.d.ts +6 -2
  48. package/dist/commands/idea.d.ts.map +1 -1
  49. package/dist/commands/idea.js +12 -393
  50. package/dist/commands/idea.js.map +1 -1
  51. package/dist/commands/inbox.js +1 -1
  52. package/dist/commands/inbox.js.map +1 -1
  53. package/dist/commands/list.d.ts.map +1 -1
  54. package/dist/commands/list.js +98 -98
  55. package/dist/commands/list.js.map +1 -1
  56. package/dist/commands/login.d.ts.map +1 -1
  57. package/dist/commands/login.js +1 -1
  58. package/dist/commands/login.js.map +1 -1
  59. package/dist/commands/logout.js +1 -1
  60. package/dist/commands/logout.js.map +1 -1
  61. package/dist/commands/open.js +1 -1
  62. package/dist/commands/open.js.map +1 -1
  63. package/dist/commands/tag.d.ts.map +1 -1
  64. package/dist/commands/tag.js +1 -1
  65. package/dist/commands/tag.js.map +1 -1
  66. package/dist/commands/tags.js +1 -1
  67. package/dist/commands/tags.js.map +1 -1
  68. package/dist/commands/update.d.ts.map +1 -1
  69. package/dist/commands/update.js +57 -60
  70. package/dist/commands/update.js.map +1 -1
  71. package/dist/config.d.ts +1 -1
  72. package/dist/config.d.ts.map +1 -1
  73. package/dist/config.js +1 -1
  74. package/dist/config.js.map +1 -1
  75. package/dist/connector/core.d.ts +64 -0
  76. package/dist/connector/core.d.ts.map +1 -0
  77. package/dist/connector/core.js +237 -0
  78. package/dist/connector/core.js.map +1 -0
  79. package/dist/connector/dns.d.ts +3 -0
  80. package/dist/connector/dns.d.ts.map +1 -0
  81. package/dist/connector/dns.js +92 -0
  82. package/dist/connector/dns.js.map +1 -0
  83. package/dist/connector/download.d.ts +5 -0
  84. package/dist/connector/download.d.ts.map +1 -0
  85. package/dist/connector/download.js +183 -0
  86. package/dist/connector/download.js.map +1 -0
  87. package/dist/connector/opencli.d.ts +6 -0
  88. package/dist/connector/opencli.d.ts.map +1 -0
  89. package/dist/connector/opencli.js +136 -0
  90. package/dist/connector/opencli.js.map +1 -0
  91. package/dist/connector/runtime.d.ts +11 -0
  92. package/dist/connector/runtime.d.ts.map +1 -0
  93. package/dist/connector/runtime.js +117 -0
  94. package/dist/connector/runtime.js.map +1 -0
  95. package/dist/connector/types.d.ts +25 -0
  96. package/dist/connector/types.d.ts.map +1 -0
  97. package/dist/connector/types.js +2 -0
  98. package/dist/connector/types.js.map +1 -0
  99. package/dist/index.js +3 -1
  100. package/dist/index.js.map +1 -1
  101. package/dist/utils/format.d.ts +27 -0
  102. package/dist/utils/format.d.ts.map +1 -0
  103. package/dist/utils/format.js +157 -0
  104. package/dist/utils/format.js.map +1 -0
  105. package/dist/utils/resolve.d.ts +41 -0
  106. package/dist/utils/resolve.d.ts.map +1 -0
  107. package/dist/utils/resolve.js +69 -0
  108. package/dist/utils/resolve.js.map +1 -0
  109. package/dist/utils.d.ts +17 -90
  110. package/dist/utils.d.ts.map +1 -1
  111. package/dist/utils.js +21 -251
  112. package/dist/utils.js.map +1 -1
  113. package/dist/version.d.ts.map +1 -1
  114. package/dist/version.js.map +1 -1
  115. package/package.json +17 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/connector/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,QAAQ,EACR,MAAM,EACN,eAAe,GAEhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGhD,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEpC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,MAAmB;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;IAC3D,IAAI,GAAG,GAAG,UAAU,CAAC;IACrB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC;QACpD,MAAM,oBAAoB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrF,IAAI,CAAC,IAAI,IAAI,SAAS,KAAK,CAAC;gBAAE,MAAM,IAAI,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAC1E,GAAG,GAAG,IAAI,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/E,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,IACE,QAAQ,CAAC,MAAM,KAAK,GAAG;YACvB,CAAC,QAAQ,CAAC,IAAI;YACd,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;YAC3B,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;YAClD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EACnF,CAAC;YACD,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,SAAiB,EACjB,MAAoB;IAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;IACrC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,IAAI,UAAU,CAAC;IAClC,IAAI,IAAkD,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,SAAS,CAAC;gBACR,OAAO,CAAC,cAAc,EAAE,CAAC;gBACzB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAChB,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;gBACzB,IAAI,QAAQ,GAAG,IAAI;oBAAE,MAAM,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;gBAC/D,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;oBACrB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;oBACtE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpE,IAAI,GAAG,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,QAAQ,KAAK,IAAI;gBAAE,MAAM,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;YACjE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,GAAG,SAAS,CAAC;QACjB,IAAI,KAA8B,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,SAAS,EACT;gBACE,IAAI;gBACJ,OAAO;gBACP,eAAe;gBACf,2DAA2D;gBAC3D,KAAK;gBACL,MAAM;gBACN,OAAO;aACR,EACD,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAC5D,CAAC;YACF,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1C,MAAM,OAAO,CACX,QAAQ,EACR;gBACE,UAAU;gBACV,cAAc;gBACd,IAAI;gBACJ,OAAO;gBACP,SAAS;gBACT,IAAI;gBACJ,OAAO;gBACP,MAAM;gBACN,OAAO;gBACP,MAAM;gBACN,MAAM;gBACN,IAAI;gBACJ,MAAM;gBACN,GAAG;aACJ,EACD,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAC5D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvD,IACE,CAAC,KAAK;YACN,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;YACzB,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC;YAExD,MAAM,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO;YACL,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAC1B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5B,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACvC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,KAAK,YAAY,cAAc;YACnC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAa,EACb,MAAoB;IAEpB,MAAM,IAAI,GAAG,GAAG,KAAK,MAAM,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,CACX,QAAQ,EACR;YACE,UAAU;YACV,cAAc;YACd,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,KAAK;YACL,GAAG;YACH,IAAI;YACJ,KAAK;YACL,WAAW;YACX,GAAG;YACH,KAAK;YACL,cAAc;YACd,MAAM;YACN,GAAG;YACH,IAAI;SACL,EACD,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAClD,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,eAAe;YAAE,MAAM,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type XCapture } from "./core.js";
2
+ export declare function readInChild(postId: string): Promise<XCapture>;
3
+ /** Isolate raw browser responses and upstream logs; IPC only carries the normalized focal post. */
4
+ export declare function readPost(postId: string, signal?: AbortSignal): Promise<XCapture>;
5
+ export declare function runIsolated(postId: string): Promise<void>;
6
+ //# sourceMappingURL=opencli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencli.d.ts","sourceRoot":"","sources":["../../src/connector/opencli.ts"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,WAAW,CAAC;AAgBnB,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsEnE;AAED,mGAAmG;AACnG,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkChF;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/D"}
@@ -0,0 +1,136 @@
1
+ import { fork } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { readFile } from "node:fs/promises";
4
+ import { createRequire } from "node:module";
5
+ import { dirname, join, resolve } from "node:path";
6
+ import { fileURLToPath, pathToFileURL } from "node:url";
7
+ import { ConnectorError, collectTweetEntities, normalizeXPost, record, } from "./core.js";
8
+ export async function readInChild(postId) {
9
+ const root = process.env.ZHE_OPENCLI_ROOT ??
10
+ resolve(dirname(createRequire(import.meta.url).resolve("@jackwener/opencli/registry")), "../..");
11
+ const manifest = JSON.parse(await readFile(join(root, "package.json"), "utf8"));
12
+ if (manifest.version !== "1.8.6")
13
+ throw new ConnectorError("unsupported_opencli_version");
14
+ const { BrowserBridge } = (await import(pathToFileURL(join(root, "dist/src/browser/bridge.js")).href));
15
+ const { getRegistry } = (await import(pathToFileURL(join(root, "dist/src/registry.js")).href));
16
+ await import(pathToFileURL(join(root, "clis/twitter/thread.js")).href);
17
+ const bridge = new BrowserBridge();
18
+ let page;
19
+ const entities = new Map();
20
+ try {
21
+ page = await bridge.connect({
22
+ session: `zhe-connector-${randomUUID()}`,
23
+ windowMode: "background",
24
+ siteSession: "ephemeral",
25
+ });
26
+ await page.goto(`https://x.com/i/status/${postId}`, { waitUntil: "none" });
27
+ await new Promise((r) => setTimeout(r, 1200));
28
+ const proxy = new Proxy(page, {
29
+ get(target, key) {
30
+ if (key === "goto")
31
+ return (url) => target.goto(url, { waitUntil: "none" });
32
+ if (key === "evaluate")
33
+ return async (code) => {
34
+ const value = await target.evaluate(code);
35
+ if (code.includes("TweetDetail")) {
36
+ for (const [id, post] of collectTweetEntities(value))
37
+ entities.set(id, post);
38
+ // Stop reply pagination: the task only concerns its saved focal post.
39
+ const instructions = record(record(record(value).data).threaded_conversation_with_injections_v2).instructions;
40
+ if (Array.isArray(instructions))
41
+ for (const instruction of instructions) {
42
+ const item = record(instruction);
43
+ if (Array.isArray(item.entries))
44
+ item.entries = item.entries.filter((e) => !String(record(e).entryId ?? "").startsWith("cursor-") &&
45
+ !record(record(e).content).cursorType);
46
+ }
47
+ }
48
+ return value;
49
+ };
50
+ const value = Reflect.get(target, key);
51
+ return typeof value === "function" ? value.bind(target) : value;
52
+ },
53
+ });
54
+ const adapter = getRegistry().get("twitter/thread");
55
+ if (adapter?.access !== "read")
56
+ throw new ConnectorError("adapter_contract_changed");
57
+ await adapter.func(proxy, { "tweet-id": postId, limit: 1 });
58
+ const capture = normalizeXPost(entities.get(postId), postId);
59
+ if (!capture)
60
+ throw new ConnectorError("post_unavailable");
61
+ return capture;
62
+ }
63
+ catch (error) {
64
+ throw error instanceof ConnectorError ? error : new ConnectorError("needs_login");
65
+ }
66
+ finally {
67
+ await page?.closeWindow().catch(() => { });
68
+ await bridge.close().catch(() => { });
69
+ }
70
+ }
71
+ /** Isolate raw browser responses and upstream logs; IPC only carries the normalized focal post. */
72
+ export function readPost(postId, signal) {
73
+ if (!/^\d{1,22}$/.test(postId))
74
+ throw new ConnectorError("invalid_post_id");
75
+ return new Promise((resolveResult, reject) => {
76
+ const child = fork(fileURLToPath(import.meta.url), ["--isolated", postId], {
77
+ stdio: ["ignore", "ignore", "ignore", "ipc"],
78
+ });
79
+ const finish = () => {
80
+ clearTimeout(timer);
81
+ signal?.removeEventListener("abort", abort);
82
+ };
83
+ const abort = () => {
84
+ child.kill("SIGTERM");
85
+ finish();
86
+ reject(new ConnectorError("interrupted"));
87
+ };
88
+ const timer = setTimeout(abort, 120_000);
89
+ signal?.addEventListener("abort", abort, { once: true });
90
+ child.once("message", (message) => {
91
+ finish();
92
+ const value = record(message);
93
+ if (value.ok === true)
94
+ resolveResult(value.capture);
95
+ else
96
+ reject(new ConnectorError(typeof value.code === "string" ? value.code : "connector_error"));
97
+ });
98
+ child.once("error", () => {
99
+ finish();
100
+ reject(new ConnectorError("opencli_unavailable"));
101
+ });
102
+ child.once("close", () => {
103
+ finish();
104
+ reject(new ConnectorError("opencli_unavailable"));
105
+ });
106
+ if (signal?.aborted)
107
+ abort();
108
+ });
109
+ }
110
+ export async function runIsolated(postId) {
111
+ let result;
112
+ try {
113
+ result = { ok: true, capture: await readInChild(postId) };
114
+ }
115
+ catch (error) {
116
+ result = {
117
+ ok: false,
118
+ code: error instanceof ConnectorError ? error.code : "opencli_unavailable",
119
+ };
120
+ }
121
+ try {
122
+ await new Promise((done, reject) => {
123
+ if (!process.send)
124
+ return reject(new ConnectorError("opencli_unavailable"));
125
+ process.send(result, (error) => (error ? reject(error) : done()));
126
+ });
127
+ }
128
+ finally {
129
+ process.disconnect?.();
130
+ }
131
+ }
132
+ if (process.argv[2] === "--isolated" &&
133
+ process.argv[1] &&
134
+ resolve(process.argv[1]) === fileURLToPath(import.meta.url))
135
+ await runIsolated(process.argv[3] ?? "");
136
+ //# sourceMappingURL=opencli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencli.js","sourceRoot":"","sources":["../../src/connector/opencli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ApiClient } from "../api/client.js";
2
+ export interface PollResult {
3
+ status: "idle" | "complete" | "partial" | "failed";
4
+ media: number;
5
+ error?: string;
6
+ }
7
+ export declare function authenticatedClient(): ApiClient;
8
+ export declare function processOne(client: ApiClient, parent?: AbortSignal): Promise<PollResult>;
9
+ export declare function runOnce(signal?: AbortSignal): Promise<PollResult>;
10
+ export declare function watchConnector(signal: AbortSignal): Promise<void>;
11
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/connector/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAkB,MAAM,kBAAkB,CAAC;AAO7D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,IAAI,SAAS,CAI/C;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAkE7F;AAuBD,wBAAsB,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAGvE;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvE"}
@@ -0,0 +1,117 @@
1
+ import { mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { ApiClient, ApiClientError } from "../api/client.js";
6
+ import { getApiKey } from "../config.js";
7
+ import { ConnectorError } from "./core.js";
8
+ import { downloadMedia, makePoster } from "./download.js";
9
+ import { readPost } from "./opencli.js";
10
+ export function authenticatedClient() {
11
+ const key = getApiKey();
12
+ if (!key)
13
+ throw new ApiClientError(401, "Not authenticated. Run `zhe login` first.");
14
+ return new ApiClient(key);
15
+ }
16
+ export async function processOne(client, parent) {
17
+ const { job } = await client.claimXJob(parent);
18
+ if (!job)
19
+ return { status: "idle", media: 0 };
20
+ const controller = new AbortController();
21
+ const signal = parent ? AbortSignal.any([parent, controller.signal]) : controller.signal;
22
+ let renewing;
23
+ const heartbeat = setInterval(() => {
24
+ if (renewing)
25
+ return;
26
+ renewing = client
27
+ .connectorAction(job, { action: "renew" }, signal)
28
+ .then(() => { })
29
+ .catch(() => controller.abort())
30
+ .finally(() => {
31
+ renewing = undefined;
32
+ });
33
+ }, 30_000);
34
+ let dir;
35
+ let archived = 0;
36
+ let incomplete = false;
37
+ try {
38
+ dir = await mkdtemp(join(tmpdir(), "zhe-connector-"));
39
+ const capture = await readPost(job.postId, signal);
40
+ await client.connectorAction(job, { action: "capture", capture }, signal);
41
+ for (const media of capture.media) {
42
+ signal.throwIfAborted();
43
+ try {
44
+ const file = await downloadMedia(media, dir, signal);
45
+ const kind = media.type === "PHOTO" ? "photo" : "video";
46
+ if (!(await archive(client, job, media.id, kind, file, signal)))
47
+ continue;
48
+ media.width = file.width;
49
+ media.height = file.height;
50
+ media.duration = file.duration;
51
+ archived++;
52
+ if (kind === "video") {
53
+ const poster = await makePoster(file.path, signal);
54
+ if (poster)
55
+ await archive(client, job, media.id, "poster", poster, signal);
56
+ }
57
+ }
58
+ catch (error) {
59
+ if (signal.aborted ||
60
+ (error instanceof ApiClientError && [401, 403, 409].includes(error.status)))
61
+ throw error;
62
+ incomplete = true;
63
+ }
64
+ }
65
+ signal.throwIfAborted();
66
+ capture.tweet.media = capture.media;
67
+ await client.connectorAction(job, { action: "capture", capture }, signal);
68
+ await client.connectorAction(job, { action: "complete" }, signal);
69
+ return { status: incomplete ? "partial" : "complete", media: archived };
70
+ }
71
+ catch (error) {
72
+ const code = error instanceof ConnectorError
73
+ ? error.code
74
+ : signal.aborted
75
+ ? "interrupted"
76
+ : "connector_error";
77
+ await client.connectorAction(job, { action: "fail", code }).catch(() => { });
78
+ return { status: "failed", media: archived, error: code };
79
+ }
80
+ finally {
81
+ clearInterval(heartbeat);
82
+ controller.abort();
83
+ await renewing;
84
+ if (dir)
85
+ await rm(dir, { recursive: true, force: true });
86
+ }
87
+ }
88
+ async function archive(client, job, mediaId, kind, file, signal) {
89
+ const { asset } = await client.connectorAction(job, {
90
+ action: "reserve",
91
+ media: { mediaId, kind, size: file.size, mime: file.mime, sha256: file.sha256 },
92
+ }, signal);
93
+ if (asset.skipped)
94
+ return false;
95
+ if (!asset.uploaded)
96
+ await client.uploadXMedia(job, asset, file, signal);
97
+ return true;
98
+ }
99
+ export async function runOnce(signal) {
100
+ // Read the shared CLI configuration on each poll, so logout/rotation takes effect.
101
+ return processOne(authenticatedClient(), signal);
102
+ }
103
+ export async function watchConnector(signal) {
104
+ while (!signal.aborted) {
105
+ try {
106
+ console.log(JSON.stringify(await runOnce(signal)));
107
+ }
108
+ catch (error) {
109
+ console.log(JSON.stringify({
110
+ status: "offline",
111
+ code: error instanceof ApiClientError ? error.status : "connector_error",
112
+ }));
113
+ }
114
+ await delay(20_000, undefined, { signal }).catch(() => { });
115
+ }
116
+ }
117
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/connector/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface XJob {
2
+ linkId: number;
3
+ userId: string;
4
+ postId: string;
5
+ sourceUrl: string;
6
+ leaseToken: string;
7
+ leaseUntil: number;
8
+ attempts: number;
9
+ }
10
+ export interface MediaReservation {
11
+ id: string;
12
+ key: string;
13
+ uploaded: boolean;
14
+ skipped?: false;
15
+ }
16
+ export interface DownloadedMedia {
17
+ path: string;
18
+ size: number;
19
+ sha256: string;
20
+ mime: string;
21
+ width?: number | undefined;
22
+ height?: number | undefined;
23
+ duration?: number | undefined;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/connector/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AACD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/connector/types.ts"],"names":[],"mappings":""}
package/dist/index.js CHANGED
@@ -2,7 +2,8 @@
2
2
  /**
3
3
  * zhe CLI — Manage zhe.to short links
4
4
  */
5
- import { defineCommand, runMain } from "@nocoo/cli-base";
5
+ import { defineCommand, runMain } from "@nocoo/base-cli";
6
+ import { connectorCommand } from "./commands/connector.js";
6
7
  import { createCommand } from "./commands/create.js";
7
8
  import { deleteCommand } from "./commands/delete.js";
8
9
  import { folderCommand } from "./commands/folder.js";
@@ -39,6 +40,7 @@ const main = defineCommand({
39
40
  update: updateCommand,
40
41
  delete: deleteCommand,
41
42
  open: openCommand,
43
+ connector: connectorCommand,
42
44
  },
43
45
  });
44
46
  runMain(main);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,IAAI,GAAG,aAAa,CAAC;IAC1B,IAAI,EAAE;QACL,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,qCAAqC;KAClD;IACD,WAAW,EAAE;QACZ,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;KACjB;CACD,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,qCAAqC;KACnD;IACD,WAAW,EAAE;QACX,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,gBAAgB;KAC5B;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Table / detail formatters for the zhe CLI.
3
+ * Extracted from utils.ts to keep that file small.
4
+ */
5
+ import type { Folder, Link, Tag } from "../api/types.js";
6
+ export interface FormatLinksTableOptions {
7
+ wide?: boolean;
8
+ folderMap?: Map<string, string>;
9
+ tagMap?: Map<string, string>;
10
+ showTags?: boolean;
11
+ }
12
+ /** Format links as a table (wide or compact). */
13
+ export declare function formatLinksTable(links: Link[], options?: FormatLinksTableOptions): string;
14
+ /** Minimal one-link-per-line output (just short URLs). */
15
+ export declare function formatLinksMinimal(links: Link[]): string;
16
+ /**
17
+ * Detailed multi-line output for a single link.
18
+ * @param link - The link to format
19
+ * @param folderName - Optional folder name (if not provided, shows folder ID)
20
+ * @param tagMap - Optional map of tagId → name (falls back to tagId if missing)
21
+ */
22
+ export declare function formatLinkDetail(link: Link, folderName?: string, tagMap?: Map<string, string>): string;
23
+ /** Format folders as a table. */
24
+ export declare function formatFoldersTable(folders: Folder[]): string;
25
+ /** Format tags as a table. */
26
+ export declare function formatTagsTable(tags: Tag[]): string;
27
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAsED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,GAAE,uBAA4B,GAAG,MAAM,CAwB7F;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAGxD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,MAAM,CAiCR;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAgB5D;AAED,8BAA8B;AAC9B,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CAenD"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Table / detail formatters for the zhe CLI.
3
+ * Extracted from utils.ts to keep that file small.
4
+ */
5
+ import { formatDate, formatDateTime, truncate } from "../utils.js";
6
+ /** Render the tag column for a single link row. */
7
+ function renderLinkTags(link, tagMap) {
8
+ // Prefer embedded tags (carries names) — avoids needing a tagMap fetch
9
+ // from the caller when /links already returned tag details.
10
+ if (link.tags && link.tags.length > 0) {
11
+ return link.tags.map((t) => t.name).join(",");
12
+ }
13
+ const ids = link.tagIds ?? [];
14
+ if (ids.length === 0)
15
+ return "";
16
+ return ids.map((id) => tagMap?.get(id) ?? id.slice(0, 8)).join(",");
17
+ }
18
+ function renderLinkRowWide(link, opts) {
19
+ const id = String(link.id).padEnd(6);
20
+ const slug = link.slug.padEnd(20);
21
+ const url = link.originalUrl.padEnd(48);
22
+ const clicks = String(link.clicks).padEnd(7);
23
+ const created = formatDate(link.createdAt);
24
+ let row = `${id} ${slug} ${url} `;
25
+ if (opts.showFolders) {
26
+ const folderName = link.folderId
27
+ ? (opts.folderMap?.get(link.folderId) ?? link.folderId.slice(0, 8))
28
+ : "";
29
+ row += `${folderName.padEnd(16)} `;
30
+ }
31
+ if (opts.showTags) {
32
+ row += `${renderLinkTags(link, opts.tagMap).padEnd(26)} `;
33
+ }
34
+ row += `${clicks} ${created}`;
35
+ return row;
36
+ }
37
+ function renderLinkRowCompact(link, opts) {
38
+ const id = String(link.id).padEnd(6);
39
+ const slug = truncate(link.slug, 10).padEnd(11);
40
+ const url = truncate(link.originalUrl, 32).padEnd(32);
41
+ const clicks = String(link.clicks).padEnd(7);
42
+ const created = formatDate(link.createdAt);
43
+ let row = `${id} ${slug} ${url} `;
44
+ if (opts.showFolders) {
45
+ const folderName = link.folderId
46
+ ? (opts.folderMap?.get(link.folderId) ?? link.folderId.slice(0, 8))
47
+ : "";
48
+ row += `${truncate(folderName, 12).padEnd(12)} `;
49
+ }
50
+ if (opts.showTags) {
51
+ row += `${truncate(renderLinkTags(link, opts.tagMap), 12).padEnd(12)} `;
52
+ }
53
+ row += `${clicks} ${created}`;
54
+ return row;
55
+ }
56
+ /** Format links as a table (wide or compact). */
57
+ export function formatLinksTable(links, options = {}) {
58
+ if (links.length === 0)
59
+ return "No links found.";
60
+ const { wide = false, folderMap, tagMap, showTags = false } = options;
61
+ const showFolders = links.some((l) => l.folderId);
62
+ const rowOpts = { showFolders, showTags, folderMap, tagMap };
63
+ if (wide) {
64
+ let header = "ID SLUG URL ";
65
+ if (showFolders)
66
+ header += "FOLDER ";
67
+ if (showTags)
68
+ header += "TAGS ";
69
+ header += "CLICKS CREATED";
70
+ const separator = "─".repeat(header.length);
71
+ const rows = links.map((l) => renderLinkRowWide(l, rowOpts));
72
+ return [header, separator, ...rows].join("\n");
73
+ }
74
+ let header = "ID SLUG URL ";
75
+ if (showFolders)
76
+ header += "FOLDER ";
77
+ if (showTags)
78
+ header += "TAGS ";
79
+ header += "CLICKS CREATED";
80
+ const separator = "─".repeat(header.length);
81
+ const rows = links.map((l) => renderLinkRowCompact(l, rowOpts));
82
+ return [header, separator, ...rows].join("\n");
83
+ }
84
+ /** Minimal one-link-per-line output (just short URLs). */
85
+ export function formatLinksMinimal(links) {
86
+ if (links.length === 0)
87
+ return "";
88
+ return links.map((link) => `zhe.to/${link.slug}`).join("\n");
89
+ }
90
+ /**
91
+ * Detailed multi-line output for a single link.
92
+ * @param link - The link to format
93
+ * @param folderName - Optional folder name (if not provided, shows folder ID)
94
+ * @param tagMap - Optional map of tagId → name (falls back to tagId if missing)
95
+ */
96
+ export function formatLinkDetail(link, folderName, tagMap) {
97
+ const lines = [
98
+ `Link #${link.id}`,
99
+ "",
100
+ ` Short URL: ${link.shortUrl}`,
101
+ ` Original: ${link.originalUrl}`,
102
+ ` Slug: ${link.slug}${link.isCustom ? " (custom)" : ""}`,
103
+ ` Clicks: ${link.clicks}`,
104
+ ];
105
+ if (link.folderId) {
106
+ const folderDisplay = folderName ?? link.folderId;
107
+ lines.push(` Folder: ${folderDisplay}`);
108
+ }
109
+ if (link.tags && link.tags.length > 0) {
110
+ lines.push(` Tags: ${link.tags.map((t) => t.name).join(", ")}`);
111
+ }
112
+ else {
113
+ const tagIds = link.tagIds ?? [];
114
+ if (tagIds.length > 0) {
115
+ const tagDisplay = tagIds.map((id) => tagMap?.get(id) ?? id).join(", ");
116
+ lines.push(` Tags: ${tagDisplay}`);
117
+ }
118
+ }
119
+ if (link.note) {
120
+ lines.push(` Note: ${link.note}`);
121
+ }
122
+ lines.push(` Expires: ${link.expiresAt ? formatDateTime(link.expiresAt) : "Never"}`);
123
+ lines.push(` Created: ${formatDateTime(link.createdAt)}`);
124
+ return lines.join("\n");
125
+ }
126
+ /** Format folders as a table. */
127
+ export function formatFoldersTable(folders) {
128
+ if (folders.length === 0)
129
+ return "No folders found.";
130
+ const header = "ID NAME LINKS ICON CREATED";
131
+ const separator = "─".repeat(header.length);
132
+ const rows = folders.map((folder) => {
133
+ const id = folder.id.padEnd(36);
134
+ const name = truncate(folder.name, 18).padEnd(18);
135
+ const links = String(folder.linkCount).padEnd(6);
136
+ const icon = truncate(folder.icon, 8).padEnd(8);
137
+ const created = formatDate(folder.createdAt);
138
+ return `${id} ${name} ${links} ${icon} ${created}`;
139
+ });
140
+ return [header, separator, ...rows].join("\n");
141
+ }
142
+ /** Format tags as a table. */
143
+ export function formatTagsTable(tags) {
144
+ if (tags.length === 0)
145
+ return "No tags found.";
146
+ const header = "ID NAME COLOR CREATED";
147
+ const separator = "─".repeat(header.length);
148
+ const rows = tags.map((tag) => {
149
+ const id = tag.id.padEnd(36);
150
+ const name = truncate(tag.name, 18).padEnd(18);
151
+ const color = tag.color.padEnd(8);
152
+ const created = formatDate(tag.createdAt);
153
+ return `${id} ${name} ${color} ${created}`;
154
+ });
155
+ return [header, separator, ...rows].join("\n");
156
+ }
157
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Name/UUID resolvers for folders and tags. Extracted from utils.ts.
3
+ */
4
+ import type { ApiClient } from "../api/client.js";
5
+ /**
6
+ * Resolve a folder name to folder ID via API.
7
+ * If input looks like a UUID, use it directly.
8
+ * Returns null if folder is not found (with error message printed).
9
+ */
10
+ export declare function resolveFolderName(client: ApiClient, input: string): Promise<string | null>;
11
+ /**
12
+ * Resolve a tag name to tag ID via API.
13
+ * If input looks like a UUID, use it directly.
14
+ * Returns null if tag is not found (with error message printed).
15
+ */
16
+ export declare function resolveTagName(client: ApiClient, input: string): Promise<string | null>;
17
+ /**
18
+ * Resolve a tag reference (name or UUID) to its canonical id + name.
19
+ *
20
+ * Unlike `resolveTagName`, this:
21
+ * - Distinguishes `not_found` (zero matches) from `ambiguous` (multiple
22
+ * name matches), letting callers map them to different exit codes.
23
+ * - For UUID input, returns immediately without calling `listTags()` so
24
+ * that API keys with only `tags:write` (no `tags:read`) can still
25
+ * update/delete by ID. The server is the source of truth for whether
26
+ * the tag exists. `name` is `undefined` in that case; callers should
27
+ * fall back to the UUID in any prompt text.
28
+ *
29
+ * Does NOT print any error itself — callers decide messaging and exit codes.
30
+ */
31
+ export type TagRef = {
32
+ kind: "found";
33
+ id: string;
34
+ name: string | undefined;
35
+ } | {
36
+ kind: "not_found";
37
+ } | {
38
+ kind: "ambiguous";
39
+ };
40
+ export declare function resolveTagRef(client: ApiClient, input: string): Promise<TagRef>;
41
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/utils/resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBhG;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqB7F;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B,wBAAsB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBrF"}