@kaa5945/slack-cli 2026.4.11

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 (320) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +620 -0
  3. package/README.zh-TW.md +620 -0
  4. package/dist/commands/bookmark.d.ts +3 -0
  5. package/dist/commands/bookmark.d.ts.map +1 -0
  6. package/dist/commands/bookmark.js +62 -0
  7. package/dist/commands/bookmark.js.map +1 -0
  8. package/dist/commands/canvas.d.ts +3 -0
  9. package/dist/commands/canvas.d.ts.map +1 -0
  10. package/dist/commands/canvas.js +92 -0
  11. package/dist/commands/canvas.js.map +1 -0
  12. package/dist/commands/channel.d.ts +3 -0
  13. package/dist/commands/channel.d.ts.map +1 -0
  14. package/dist/commands/channel.js +53 -0
  15. package/dist/commands/channel.js.map +1 -0
  16. package/dist/commands/channels.d.ts +3 -0
  17. package/dist/commands/channels.d.ts.map +1 -0
  18. package/dist/commands/channels.js +41 -0
  19. package/dist/commands/channels.js.map +1 -0
  20. package/dist/commands/config-subcommands.d.ts +17 -0
  21. package/dist/commands/config-subcommands.d.ts.map +1 -0
  22. package/dist/commands/config-subcommands.js +170 -0
  23. package/dist/commands/config-subcommands.js.map +1 -0
  24. package/dist/commands/config.d.ts +3 -0
  25. package/dist/commands/config.d.ts.map +1 -0
  26. package/dist/commands/config.js +40 -0
  27. package/dist/commands/config.js.map +1 -0
  28. package/dist/commands/delete.d.ts +3 -0
  29. package/dist/commands/delete.d.ts.map +1 -0
  30. package/dist/commands/delete.js +28 -0
  31. package/dist/commands/delete.js.map +1 -0
  32. package/dist/commands/edit.d.ts +3 -0
  33. package/dist/commands/edit.d.ts.map +1 -0
  34. package/dist/commands/edit.js +29 -0
  35. package/dist/commands/edit.js.map +1 -0
  36. package/dist/commands/history-display.d.ts +9 -0
  37. package/dist/commands/history-display.d.ts.map +1 -0
  38. package/dist/commands/history-display.js +17 -0
  39. package/dist/commands/history-display.js.map +1 -0
  40. package/dist/commands/history-validators.d.ts +5 -0
  41. package/dist/commands/history-validators.d.ts.map +1 -0
  42. package/dist/commands/history-validators.js +35 -0
  43. package/dist/commands/history-validators.js.map +1 -0
  44. package/dist/commands/history.d.ts +3 -0
  45. package/dist/commands/history.d.ts.map +1 -0
  46. package/dist/commands/history.js +141 -0
  47. package/dist/commands/history.js.map +1 -0
  48. package/dist/commands/invite.d.ts +3 -0
  49. package/dist/commands/invite.d.ts.map +1 -0
  50. package/dist/commands/invite.js +34 -0
  51. package/dist/commands/invite.js.map +1 -0
  52. package/dist/commands/join.d.ts +3 -0
  53. package/dist/commands/join.d.ts.map +1 -0
  54. package/dist/commands/join.js +25 -0
  55. package/dist/commands/join.js.map +1 -0
  56. package/dist/commands/leave.d.ts +3 -0
  57. package/dist/commands/leave.d.ts.map +1 -0
  58. package/dist/commands/leave.js +25 -0
  59. package/dist/commands/leave.js.map +1 -0
  60. package/dist/commands/members.d.ts +3 -0
  61. package/dist/commands/members.d.ts.map +1 -0
  62. package/dist/commands/members.js +53 -0
  63. package/dist/commands/members.js.map +1 -0
  64. package/dist/commands/pin.d.ts +3 -0
  65. package/dist/commands/pin.d.ts.map +1 -0
  66. package/dist/commands/pin.js +91 -0
  67. package/dist/commands/pin.js.map +1 -0
  68. package/dist/commands/reaction.d.ts +3 -0
  69. package/dist/commands/reaction.d.ts.map +1 -0
  70. package/dist/commands/reaction.js +45 -0
  71. package/dist/commands/reaction.js.map +1 -0
  72. package/dist/commands/reminder.d.ts +3 -0
  73. package/dist/commands/reminder.d.ts.map +1 -0
  74. package/dist/commands/reminder.js +78 -0
  75. package/dist/commands/reminder.js.map +1 -0
  76. package/dist/commands/scheduled.d.ts +3 -0
  77. package/dist/commands/scheduled.d.ts.map +1 -0
  78. package/dist/commands/scheduled.js +69 -0
  79. package/dist/commands/scheduled.js.map +1 -0
  80. package/dist/commands/search.d.ts +3 -0
  81. package/dist/commands/search.d.ts.map +1 -0
  82. package/dist/commands/search.js +51 -0
  83. package/dist/commands/search.js.map +1 -0
  84. package/dist/commands/send-ephemeral.d.ts +3 -0
  85. package/dist/commands/send-ephemeral.d.ts.map +1 -0
  86. package/dist/commands/send-ephemeral.js +36 -0
  87. package/dist/commands/send-ephemeral.js.map +1 -0
  88. package/dist/commands/send.d.ts +3 -0
  89. package/dist/commands/send.d.ts.map +1 -0
  90. package/dist/commands/send.js +125 -0
  91. package/dist/commands/send.js.map +1 -0
  92. package/dist/commands/unread.d.ts +3 -0
  93. package/dist/commands/unread.d.ts.map +1 -0
  94. package/dist/commands/unread.js +92 -0
  95. package/dist/commands/unread.js.map +1 -0
  96. package/dist/commands/upload.d.ts +3 -0
  97. package/dist/commands/upload.d.ts.map +1 -0
  98. package/dist/commands/upload.js +99 -0
  99. package/dist/commands/upload.js.map +1 -0
  100. package/dist/commands/users.d.ts +3 -0
  101. package/dist/commands/users.d.ts.map +1 -0
  102. package/dist/commands/users.js +138 -0
  103. package/dist/commands/users.js.map +1 -0
  104. package/dist/index.d.ts +5 -0
  105. package/dist/index.d.ts.map +1 -0
  106. package/dist/index.js +76 -0
  107. package/dist/index.js.map +1 -0
  108. package/dist/types/commands.d.ts +216 -0
  109. package/dist/types/commands.d.ts.map +1 -0
  110. package/dist/types/commands.js +3 -0
  111. package/dist/types/commands.js.map +1 -0
  112. package/dist/types/config.d.ts +18 -0
  113. package/dist/types/config.d.ts.map +1 -0
  114. package/dist/types/config.js +3 -0
  115. package/dist/types/config.js.map +1 -0
  116. package/dist/types/slack.d.ts +198 -0
  117. package/dist/types/slack.d.ts.map +1 -0
  118. package/dist/types/slack.js +3 -0
  119. package/dist/types/slack.js.map +1 -0
  120. package/dist/utils/attachment-downloader.d.ts +22 -0
  121. package/dist/utils/attachment-downloader.d.ts.map +1 -0
  122. package/dist/utils/attachment-downloader.js +138 -0
  123. package/dist/utils/attachment-downloader.js.map +1 -0
  124. package/dist/utils/channel-formatter.d.ts +13 -0
  125. package/dist/utils/channel-formatter.d.ts.map +1 -0
  126. package/dist/utils/channel-formatter.js +43 -0
  127. package/dist/utils/channel-formatter.js.map +1 -0
  128. package/dist/utils/channel-resolver.d.ts +27 -0
  129. package/dist/utils/channel-resolver.d.ts.map +1 -0
  130. package/dist/utils/channel-resolver.js +76 -0
  131. package/dist/utils/channel-resolver.js.map +1 -0
  132. package/dist/utils/client-factory.d.ts +6 -0
  133. package/dist/utils/client-factory.d.ts.map +1 -0
  134. package/dist/utils/client-factory.js +13 -0
  135. package/dist/utils/client-factory.js.map +1 -0
  136. package/dist/utils/command-support.d.ts +16 -0
  137. package/dist/utils/command-support.d.ts.map +1 -0
  138. package/dist/utils/command-support.js +29 -0
  139. package/dist/utils/command-support.js.map +1 -0
  140. package/dist/utils/command-wrapper.d.ts +6 -0
  141. package/dist/utils/command-wrapper.d.ts.map +1 -0
  142. package/dist/utils/command-wrapper.js +27 -0
  143. package/dist/utils/command-wrapper.js.map +1 -0
  144. package/dist/utils/config-helper.d.ts +8 -0
  145. package/dist/utils/config-helper.d.ts.map +1 -0
  146. package/dist/utils/config-helper.js +19 -0
  147. package/dist/utils/config-helper.js.map +1 -0
  148. package/dist/utils/constants.d.ts +64 -0
  149. package/dist/utils/constants.d.ts.map +1 -0
  150. package/dist/utils/constants.js +77 -0
  151. package/dist/utils/constants.js.map +1 -0
  152. package/dist/utils/date-utils.d.ts +4 -0
  153. package/dist/utils/date-utils.d.ts.map +1 -0
  154. package/dist/utils/date-utils.js +24 -0
  155. package/dist/utils/date-utils.js.map +1 -0
  156. package/dist/utils/error-utils.d.ts +4 -0
  157. package/dist/utils/error-utils.d.ts.map +1 -0
  158. package/dist/utils/error-utils.js +46 -0
  159. package/dist/utils/error-utils.js.map +1 -0
  160. package/dist/utils/errors.d.ts +17 -0
  161. package/dist/utils/errors.d.ts.map +1 -0
  162. package/dist/utils/errors.js +36 -0
  163. package/dist/utils/errors.js.map +1 -0
  164. package/dist/utils/format-utils.d.ts +4 -0
  165. package/dist/utils/format-utils.d.ts.map +1 -0
  166. package/dist/utils/format-utils.js +24 -0
  167. package/dist/utils/format-utils.js.map +1 -0
  168. package/dist/utils/formatters/base-formatter.d.ts +23 -0
  169. package/dist/utils/formatters/base-formatter.d.ts.map +1 -0
  170. package/dist/utils/formatters/base-formatter.js +27 -0
  171. package/dist/utils/formatters/base-formatter.js.map +1 -0
  172. package/dist/utils/formatters/bookmark-formatters.d.ts +14 -0
  173. package/dist/utils/formatters/bookmark-formatters.d.ts.map +1 -0
  174. package/dist/utils/formatters/bookmark-formatters.js +60 -0
  175. package/dist/utils/formatters/bookmark-formatters.js.map +1 -0
  176. package/dist/utils/formatters/channel-formatters.d.ts +7 -0
  177. package/dist/utils/formatters/channel-formatters.d.ts.map +1 -0
  178. package/dist/utils/formatters/channel-formatters.js +65 -0
  179. package/dist/utils/formatters/channel-formatters.js.map +1 -0
  180. package/dist/utils/formatters/channel-info-formatters.d.ts +6 -0
  181. package/dist/utils/formatters/channel-info-formatters.d.ts.map +1 -0
  182. package/dist/utils/formatters/channel-info-formatters.js +69 -0
  183. package/dist/utils/formatters/channel-info-formatters.js.map +1 -0
  184. package/dist/utils/formatters/channels-list-formatters.d.ts +6 -0
  185. package/dist/utils/formatters/channels-list-formatters.d.ts.map +1 -0
  186. package/dist/utils/formatters/channels-list-formatters.js +49 -0
  187. package/dist/utils/formatters/channels-list-formatters.js.map +1 -0
  188. package/dist/utils/formatters/history-formatters.d.ts +10 -0
  189. package/dist/utils/formatters/history-formatters.d.ts.map +1 -0
  190. package/dist/utils/formatters/history-formatters.js +87 -0
  191. package/dist/utils/formatters/history-formatters.js.map +1 -0
  192. package/dist/utils/formatters/members-formatters.d.ts +10 -0
  193. package/dist/utils/formatters/members-formatters.d.ts.map +1 -0
  194. package/dist/utils/formatters/members-formatters.js +42 -0
  195. package/dist/utils/formatters/members-formatters.js.map +1 -0
  196. package/dist/utils/formatters/message-formatters.d.ts +12 -0
  197. package/dist/utils/formatters/message-formatters.d.ts.map +1 -0
  198. package/dist/utils/formatters/message-formatters.js +95 -0
  199. package/dist/utils/formatters/message-formatters.js.map +1 -0
  200. package/dist/utils/formatters/reminder-formatters.d.ts +12 -0
  201. package/dist/utils/formatters/reminder-formatters.d.ts.map +1 -0
  202. package/dist/utils/formatters/reminder-formatters.js +64 -0
  203. package/dist/utils/formatters/reminder-formatters.js.map +1 -0
  204. package/dist/utils/formatters/search-formatters.d.ts +10 -0
  205. package/dist/utils/formatters/search-formatters.d.ts.map +1 -0
  206. package/dist/utils/formatters/search-formatters.js +87 -0
  207. package/dist/utils/formatters/search-formatters.js.map +1 -0
  208. package/dist/utils/mention-utils.d.ts +17 -0
  209. package/dist/utils/mention-utils.d.ts.map +1 -0
  210. package/dist/utils/mention-utils.js +45 -0
  211. package/dist/utils/mention-utils.js.map +1 -0
  212. package/dist/utils/option-parsers.d.ts +47 -0
  213. package/dist/utils/option-parsers.d.ts.map +1 -0
  214. package/dist/utils/option-parsers.js +75 -0
  215. package/dist/utils/option-parsers.js.map +1 -0
  216. package/dist/utils/profile-config.d.ts +19 -0
  217. package/dist/utils/profile-config.d.ts.map +1 -0
  218. package/dist/utils/profile-config.js +203 -0
  219. package/dist/utils/profile-config.js.map +1 -0
  220. package/dist/utils/schedule-utils.d.ts +3 -0
  221. package/dist/utils/schedule-utils.d.ts.map +1 -0
  222. package/dist/utils/schedule-utils.js +34 -0
  223. package/dist/utils/schedule-utils.js.map +1 -0
  224. package/dist/utils/slack-api-client.d.ts +3 -0
  225. package/dist/utils/slack-api-client.d.ts.map +1 -0
  226. package/dist/utils/slack-api-client.js +22 -0
  227. package/dist/utils/slack-api-client.js.map +1 -0
  228. package/dist/utils/slack-client-service.d.ts +66 -0
  229. package/dist/utils/slack-client-service.d.ts.map +1 -0
  230. package/dist/utils/slack-client-service.js +181 -0
  231. package/dist/utils/slack-client-service.js.map +1 -0
  232. package/dist/utils/slack-operations/base-client.d.ts +18 -0
  233. package/dist/utils/slack-operations/base-client.d.ts.map +1 -0
  234. package/dist/utils/slack-operations/base-client.js +52 -0
  235. package/dist/utils/slack-operations/base-client.js.map +1 -0
  236. package/dist/utils/slack-operations/canvas-operations.d.ts +10 -0
  237. package/dist/utils/slack-operations/canvas-operations.d.ts.map +1 -0
  238. package/dist/utils/slack-operations/canvas-operations.js +28 -0
  239. package/dist/utils/slack-operations/canvas-operations.js.map +1 -0
  240. package/dist/utils/slack-operations/channel-operations.d.ts +33 -0
  241. package/dist/utils/slack-operations/channel-operations.d.ts.map +1 -0
  242. package/dist/utils/slack-operations/channel-operations.js +276 -0
  243. package/dist/utils/slack-operations/channel-operations.js.map +1 -0
  244. package/dist/utils/slack-operations/file-operations.d.ts +19 -0
  245. package/dist/utils/slack-operations/file-operations.d.ts.map +1 -0
  246. package/dist/utils/slack-operations/file-operations.js +51 -0
  247. package/dist/utils/slack-operations/file-operations.js.map +1 -0
  248. package/dist/utils/slack-operations/index.d.ts +5 -0
  249. package/dist/utils/slack-operations/index.d.ts.map +1 -0
  250. package/dist/utils/slack-operations/index.js +12 -0
  251. package/dist/utils/slack-operations/index.js.map +1 -0
  252. package/dist/utils/slack-operations/message-history-operations.d.ts +17 -0
  253. package/dist/utils/slack-operations/message-history-operations.d.ts.map +1 -0
  254. package/dist/utils/slack-operations/message-history-operations.js +101 -0
  255. package/dist/utils/slack-operations/message-history-operations.js.map +1 -0
  256. package/dist/utils/slack-operations/message-operations.d.ts +24 -0
  257. package/dist/utils/slack-operations/message-operations.d.ts.map +1 -0
  258. package/dist/utils/slack-operations/message-operations.js +61 -0
  259. package/dist/utils/slack-operations/message-operations.js.map +1 -0
  260. package/dist/utils/slack-operations/message-permalink-operations.d.ts +10 -0
  261. package/dist/utils/slack-operations/message-permalink-operations.d.ts.map +1 -0
  262. package/dist/utils/slack-operations/message-permalink-operations.js +49 -0
  263. package/dist/utils/slack-operations/message-permalink-operations.js.map +1 -0
  264. package/dist/utils/slack-operations/message-user-resolver.d.ts +7 -0
  265. package/dist/utils/slack-operations/message-user-resolver.d.ts.map +1 -0
  266. package/dist/utils/slack-operations/message-user-resolver.js +27 -0
  267. package/dist/utils/slack-operations/message-user-resolver.js.map +1 -0
  268. package/dist/utils/slack-operations/message-write-operations.d.ts +17 -0
  269. package/dist/utils/slack-operations/message-write-operations.d.ts.map +1 -0
  270. package/dist/utils/slack-operations/message-write-operations.js +76 -0
  271. package/dist/utils/slack-operations/message-write-operations.js.map +1 -0
  272. package/dist/utils/slack-operations/pin-operations.d.ts +11 -0
  273. package/dist/utils/slack-operations/pin-operations.d.ts.map +1 -0
  274. package/dist/utils/slack-operations/pin-operations.js +34 -0
  275. package/dist/utils/slack-operations/pin-operations.js.map +1 -0
  276. package/dist/utils/slack-operations/reaction-operations.d.ts +10 -0
  277. package/dist/utils/slack-operations/reaction-operations.d.ts.map +1 -0
  278. package/dist/utils/slack-operations/reaction-operations.js +32 -0
  279. package/dist/utils/slack-operations/reaction-operations.js.map +1 -0
  280. package/dist/utils/slack-operations/reminder-operations.d.ts +10 -0
  281. package/dist/utils/slack-operations/reminder-operations.d.ts.map +1 -0
  282. package/dist/utils/slack-operations/reminder-operations.js +32 -0
  283. package/dist/utils/slack-operations/reminder-operations.js.map +1 -0
  284. package/dist/utils/slack-operations/search-operations.d.ts +11 -0
  285. package/dist/utils/slack-operations/search-operations.d.ts.map +1 -0
  286. package/dist/utils/slack-operations/search-operations.js +116 -0
  287. package/dist/utils/slack-operations/search-operations.js.map +1 -0
  288. package/dist/utils/slack-operations/star-operations.d.ts +9 -0
  289. package/dist/utils/slack-operations/star-operations.d.ts.map +1 -0
  290. package/dist/utils/slack-operations/star-operations.js +32 -0
  291. package/dist/utils/slack-operations/star-operations.js.map +1 -0
  292. package/dist/utils/slack-operations/user-operations.d.ts +12 -0
  293. package/dist/utils/slack-operations/user-operations.d.ts.map +1 -0
  294. package/dist/utils/slack-operations/user-operations.js +69 -0
  295. package/dist/utils/slack-operations/user-operations.js.map +1 -0
  296. package/dist/utils/slack-patterns.d.ts +20 -0
  297. package/dist/utils/slack-patterns.d.ts.map +1 -0
  298. package/dist/utils/slack-patterns.js +54 -0
  299. package/dist/utils/slack-patterns.js.map +1 -0
  300. package/dist/utils/terminal-sanitizer.d.ts +7 -0
  301. package/dist/utils/terminal-sanitizer.d.ts.map +1 -0
  302. package/dist/utils/terminal-sanitizer.js +51 -0
  303. package/dist/utils/terminal-sanitizer.js.map +1 -0
  304. package/dist/utils/token-crypto-service.d.ts +40 -0
  305. package/dist/utils/token-crypto-service.d.ts.map +1 -0
  306. package/dist/utils/token-crypto-service.js +273 -0
  307. package/dist/utils/token-crypto-service.js.map +1 -0
  308. package/dist/utils/token-utils.d.ts +7 -0
  309. package/dist/utils/token-utils.d.ts.map +1 -0
  310. package/dist/utils/token-utils.js +18 -0
  311. package/dist/utils/token-utils.js.map +1 -0
  312. package/dist/utils/update-notifier.d.ts +10 -0
  313. package/dist/utils/update-notifier.d.ts.map +1 -0
  314. package/dist/utils/update-notifier.js +147 -0
  315. package/dist/utils/update-notifier.js.map +1 -0
  316. package/dist/utils/validators.d.ts +147 -0
  317. package/dist/utils/validators.d.ts.map +1 -0
  318. package/dist/utils/validators.js +401 -0
  319. package/dist/utils/validators.js.map +1 -0
  320. package/package.json +58 -0
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserOperations = void 0;
4
+ const errors_1 = require("../errors");
5
+ const base_client_1 = require("./base-client");
6
+ class UserOperations extends base_client_1.BaseSlackClient {
7
+ constructor(dependency) {
8
+ super(dependency);
9
+ }
10
+ async listUsers(limit) {
11
+ if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {
12
+ return [];
13
+ }
14
+ const users = [];
15
+ let cursor;
16
+ do {
17
+ const response = await this.client.users.list({
18
+ limit: 200,
19
+ ...(cursor ? { cursor } : {}),
20
+ });
21
+ const members = (response.members || []);
22
+ users.push(...members);
23
+ cursor = response.response_metadata?.next_cursor || undefined;
24
+ if (limit !== undefined && users.length >= limit) {
25
+ return users.slice(0, limit);
26
+ }
27
+ } while (cursor);
28
+ return users;
29
+ }
30
+ async getUserInfo(userId) {
31
+ const response = await this.client.users.info({ user: userId });
32
+ return response.user;
33
+ }
34
+ async lookupByEmail(email) {
35
+ const response = await this.client.users.lookupByEmail({ email });
36
+ return response.user;
37
+ }
38
+ async openDmChannel(userId) {
39
+ const response = await this.client.conversations.open({
40
+ users: userId,
41
+ });
42
+ return response.channel.id;
43
+ }
44
+ async getPresence(userId) {
45
+ const response = await this.client.users.getPresence({ user: userId });
46
+ return { presence: response.presence };
47
+ }
48
+ async resolveUserIdByName(username) {
49
+ const name = username.replace(/^@/, '');
50
+ const nameLower = name.toLowerCase();
51
+ let cursor;
52
+ do {
53
+ const response = await this.client.users.list({
54
+ limit: 200,
55
+ ...(cursor ? { cursor } : {}),
56
+ });
57
+ const members = (response.members || []);
58
+ for (const member of members) {
59
+ if (member.name?.toLowerCase() === nameLower) {
60
+ return member.id;
61
+ }
62
+ }
63
+ cursor = response.response_metadata?.next_cursor || undefined;
64
+ } while (cursor);
65
+ throw new errors_1.ApiError(`User '${name}' not found`);
66
+ }
67
+ }
68
+ exports.UserOperations = UserOperations;
69
+ //# sourceMappingURL=user-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-operations.js","sourceRoot":"","sources":["../../../src/utils/slack-operations/user-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Common regex patterns for Slack message parsing
3
+ */
4
+ export declare const USER_MENTION_PATTERN: RegExp;
5
+ export declare const SINGLE_USER_MENTION_PATTERN: RegExp;
6
+ export interface SlackThreadUrlResult {
7
+ channel: string;
8
+ threadTs: string;
9
+ }
10
+ /**
11
+ * Slack thread URL を解析して channel と thread_ts を取り出す。
12
+ *
13
+ * 対応フォーマット:
14
+ * 1. 親メッセージ: https://xxx.slack.com/archives/C123/p1719207629000100
15
+ * 2. スレッド返信: https://xxx.slack.com/archives/C123/p1719207629999999?thread_ts=1719207629.000100
16
+ *
17
+ * @returns { channel, threadTs } または null(無効な URL の場合)
18
+ */
19
+ export declare function parseSlackThreadUrl(url: string): SlackThreadUrlResult | null;
20
+ //# sourceMappingURL=slack-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-patterns.d.ts","sourceRoot":"","sources":["../../src/utils/slack-patterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,oBAAoB,QAAoB,CAAC;AAGtD,eAAO,MAAM,2BAA2B,QAAmB,CAAC;AAK5D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAoB5E"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Common regex patterns for Slack message parsing
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SINGLE_USER_MENTION_PATTERN = exports.USER_MENTION_PATTERN = void 0;
7
+ exports.parseSlackThreadUrl = parseSlackThreadUrl;
8
+ // Matches Slack user mentions in the format <@USERID>
9
+ exports.USER_MENTION_PATTERN = /<@([A-Z0-9]+)>/g;
10
+ // Matches a single user mention (non-global)
11
+ exports.SINGLE_USER_MENTION_PATTERN = /<@([A-Z0-9]+)>/;
12
+ // Matches Slack thread URL path: /archives/{CHANNEL}/p{TIMESTAMP}
13
+ const SLACK_THREAD_URL_PATTERN = /\/archives\/([A-Z0-9]+)\/p(\d+)/i;
14
+ /**
15
+ * Slack thread URL を解析して channel と thread_ts を取り出す。
16
+ *
17
+ * 対応フォーマット:
18
+ * 1. 親メッセージ: https://xxx.slack.com/archives/C123/p1719207629000100
19
+ * 2. スレッド返信: https://xxx.slack.com/archives/C123/p1719207629999999?thread_ts=1719207629.000100
20
+ *
21
+ * @returns { channel, threadTs } または null(無効な URL の場合)
22
+ */
23
+ function parseSlackThreadUrl(url) {
24
+ if (!url)
25
+ return null;
26
+ const match = SLACK_THREAD_URL_PATTERN.exec(url);
27
+ if (!match)
28
+ return null;
29
+ const channel = match[1];
30
+ // query param に thread_ts があればそちらを優先(スレッド返信 URL の場合)
31
+ const queryThreadTs = extractQueryParam(url, 'thread_ts');
32
+ if (queryThreadTs) {
33
+ return { channel, threadTs: queryThreadTs };
34
+ }
35
+ // path の pXXXXXXXXXXXXXXXX を XXXXXXXXXX.XXXXXX 形式に変換
36
+ const rawTs = match[2];
37
+ if (rawTs.length < 7)
38
+ return null;
39
+ const threadTs = `${rawTs.slice(0, -6)}.${rawTs.slice(-6)}`;
40
+ return { channel, threadTs };
41
+ }
42
+ function extractQueryParam(url, param) {
43
+ const questionMark = url.indexOf('?');
44
+ if (questionMark === -1)
45
+ return null;
46
+ const query = url.slice(questionMark + 1);
47
+ for (const part of query.split('&')) {
48
+ const [key, value] = part.split('=');
49
+ if (key === param && value)
50
+ return decodeURIComponent(value);
51
+ }
52
+ return null;
53
+ }
54
+ //# sourceMappingURL=slack-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-patterns.js","sourceRoot":"","sources":["../../src/utils/slack-patterns.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAyBH,kDAoBC;AA3CD,sDAAsD;AACzC,QAAA,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,6CAA6C;AAChC,QAAA,2BAA2B,GAAG,gBAAgB,CAAC;AAE5D,kEAAkE;AAClE,MAAM,wBAAwB,GAAG,kCAAkC,CAAC;AAOpE;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CAAC,GAAW;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEzB,qDAAqD;IACrD,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC9C,CAAC;IAED,qDAAqD;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,KAAa;IACnD,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,YAAY,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK;YAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Remove control characters to avoid terminal escape injection.
3
+ * Keeps newline and tab for readability.
4
+ */
5
+ export declare function sanitizeTerminalText(value: string): string;
6
+ export declare function sanitizeTerminalData<T>(value: T): T;
7
+ //# sourceMappingURL=terminal-sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-sanitizer.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-sanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA4B1D;AAWD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAgBnD"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeTerminalText = sanitizeTerminalText;
4
+ exports.sanitizeTerminalData = sanitizeTerminalData;
5
+ /**
6
+ * Remove control characters to avoid terminal escape injection.
7
+ * Keeps newline and tab for readability.
8
+ */
9
+ function sanitizeTerminalText(value) {
10
+ if (!value) {
11
+ return '';
12
+ }
13
+ const oscSequencePattern = new RegExp('\\u001B\\][^\\u0007\\u001B]*(?:\\u0007|\\u001B\\\\)', 'g');
14
+ const ansiSequencePattern = new RegExp('\\u001B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])', 'g');
15
+ const withoutAnsiSequences = value
16
+ .replace(oscSequencePattern, '')
17
+ .replace(ansiSequencePattern, '');
18
+ let sanitized = '';
19
+ for (const char of withoutAnsiSequences) {
20
+ const code = char.charCodeAt(0);
21
+ const isAllowedWhitespace = code === 0x09 || code === 0x0a;
22
+ const isAsciiControl = code < 0x20;
23
+ const isDelete = code === 0x7f;
24
+ const isC1Control = code >= 0x80 && code <= 0x9f;
25
+ if ((isAsciiControl || isDelete || isC1Control) && !isAllowedWhitespace) {
26
+ continue;
27
+ }
28
+ sanitized += char;
29
+ }
30
+ return sanitized;
31
+ }
32
+ function isPlainObject(value) {
33
+ if (!value || typeof value !== 'object') {
34
+ return false;
35
+ }
36
+ const prototype = Object.getPrototypeOf(value);
37
+ return prototype === Object.prototype || prototype === null;
38
+ }
39
+ function sanitizeTerminalData(value) {
40
+ if (typeof value === 'string') {
41
+ return sanitizeTerminalText(value);
42
+ }
43
+ if (Array.isArray(value)) {
44
+ return value.map((item) => sanitizeTerminalData(item));
45
+ }
46
+ if (isPlainObject(value)) {
47
+ return Object.fromEntries(Object.entries(value).map(([key, nestedValue]) => [key, sanitizeTerminalData(nestedValue)]));
48
+ }
49
+ return value;
50
+ }
51
+ //# sourceMappingURL=terminal-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-sanitizer.js","sourceRoot":"","sources":["../../src/utils/terminal-sanitizer.ts"],"names":[],"mappings":";;AAIA,oDA4BC;AAWD,oDAgBC;AA3DD;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,KAAa;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,MAAM,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAC;IAClG,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;IAC3F,MAAM,oBAAoB,GAAG,KAAK;SAC/B,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAEpC,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,mBAAmB,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;QAEjD,IAAI,CAAC,cAAc,IAAI,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACxE,SAAS;QACX,CAAC;QAED,SAAS,IAAI,IAAI,CAAC;IACpB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,SAAgB,oBAAoB,CAAI,KAAQ;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,oBAAoB,CAAC,KAAK,CAAM,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAM,CAAC;IAC9D,CAAC;IAED,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,CACvF,CAAC;IACT,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface TokenCryptoServiceOptions {
2
+ masterKey?: string;
3
+ keyFilePath?: string;
4
+ legacyKeyFilePath?: string;
5
+ }
6
+ export declare class TokenCryptoService {
7
+ private readonly algorithm;
8
+ private readonly legacyAlgorithm;
9
+ private readonly keyLength;
10
+ private readonly ivLength;
11
+ private readonly legacyIvLength;
12
+ private readonly authTagLength;
13
+ private readonly separator;
14
+ private readonly version;
15
+ private readonly masterKeySalt;
16
+ private readonly masterKeyIterations;
17
+ private readonly keyFilePath?;
18
+ private readonly legacyKeyFilePath?;
19
+ private readonly injectedMasterKey?;
20
+ private cachedMasterKey;
21
+ constructor(options?: TokenCryptoServiceOptions);
22
+ private getKeyFilePath;
23
+ private getLegacyKeyFilePath;
24
+ private deriveLegacyKey;
25
+ private deriveMasterKey;
26
+ private parseFileKey;
27
+ private readKeyFromFile;
28
+ private writeKeyFile;
29
+ private createKeyFile;
30
+ private migrateLegacyKeyFile;
31
+ private getMasterKey;
32
+ encrypt(token: string): string;
33
+ decrypt(encryptedData: string): string;
34
+ isEncrypted(value: string): boolean;
35
+ isCurrentFormat(value: string): boolean;
36
+ private isLegacyEncrypted;
37
+ private decryptCurrentFormat;
38
+ private decryptLegacyFormat;
39
+ }
40
+ //# sourceMappingURL=token-crypto-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-crypto-service.d.ts","sourceRoot":"","sources":["../../src/utils/token-crypto-service.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAM;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAM;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAO;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAS;IAC5C,OAAO,CAAC,eAAe,CAAuB;gBAElC,OAAO,GAAE,yBAA8B;IAMnD,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,YAAY;IA8CpB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAkB9B,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAuBtC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAInC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAwBvC,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,mBAAmB;CAiB5B"}
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TokenCryptoService = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ const fs = __importStar(require("fs"));
39
+ const os = __importStar(require("os"));
40
+ const path = __importStar(require("path"));
41
+ const constants_1 = require("./constants");
42
+ const errors_1 = require("./errors");
43
+ class TokenCryptoService {
44
+ constructor(options = {}) {
45
+ this.algorithm = 'aes-256-gcm';
46
+ this.legacyAlgorithm = 'aes-256-cbc';
47
+ this.keyLength = 32;
48
+ this.ivLength = 12;
49
+ this.legacyIvLength = 16;
50
+ this.authTagLength = 16;
51
+ this.separator = ':';
52
+ this.version = 'v2';
53
+ this.masterKeySalt = 'slack-cli-master-key-salt-v2';
54
+ this.masterKeyIterations = 100000;
55
+ this.cachedMasterKey = null;
56
+ this.injectedMasterKey = options.masterKey;
57
+ this.keyFilePath = options.keyFilePath;
58
+ this.legacyKeyFilePath = options.legacyKeyFilePath;
59
+ }
60
+ getKeyFilePath() {
61
+ return this.keyFilePath || path.join(os.homedir(), '.slack-cli-secrets', 'master.key');
62
+ }
63
+ getLegacyKeyFilePath() {
64
+ return this.legacyKeyFilePath || path.join(os.homedir(), '.slack-cli', 'master.key');
65
+ }
66
+ deriveLegacyKey() {
67
+ // Legacy fallback for decrypting old tokens.
68
+ const fixedSalt = 'slack-cli-salt-v1';
69
+ return crypto.pbkdf2Sync('slack-cli-key', fixedSalt, 100000, this.keyLength, 'sha256');
70
+ }
71
+ deriveMasterKey(secret) {
72
+ return crypto.pbkdf2Sync(secret, this.masterKeySalt, this.masterKeyIterations, this.keyLength, 'sha256');
73
+ }
74
+ parseFileKey(fileContents) {
75
+ const keyHex = fileContents.trim();
76
+ if (!/^[0-9a-f]{64}$/i.test(keyHex)) {
77
+ throw new errors_1.ConfigurationError('Invalid token encryption key format');
78
+ }
79
+ return Buffer.from(keyHex, 'hex');
80
+ }
81
+ readKeyFromFile(filePath) {
82
+ const keyData = fs.readFileSync(filePath, 'utf-8');
83
+ return this.parseFileKey(keyData);
84
+ }
85
+ writeKeyFile(keyFilePath, keyHex) {
86
+ const keyDir = path.dirname(keyFilePath);
87
+ fs.mkdirSync(keyDir, { recursive: true, mode: constants_1.FILE_PERMISSIONS.CONFIG_DIR });
88
+ const keyBuffer = Buffer.from(keyHex, 'hex');
89
+ fs.writeFileSync(keyFilePath, `${keyHex}\n`, {
90
+ encoding: 'utf-8',
91
+ mode: constants_1.FILE_PERMISSIONS.CONFIG_FILE,
92
+ flag: 'wx',
93
+ });
94
+ return keyBuffer;
95
+ }
96
+ createKeyFile() {
97
+ const keyFilePath = this.getKeyFilePath();
98
+ const keyHex = crypto.randomBytes(this.keyLength).toString('hex');
99
+ try {
100
+ return this.writeKeyFile(keyFilePath, keyHex);
101
+ }
102
+ catch (error) {
103
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'EEXIST') {
104
+ return this.readKeyFromFile(keyFilePath);
105
+ }
106
+ throw new errors_1.ConfigurationError('Failed to initialize token encryption key');
107
+ }
108
+ }
109
+ migrateLegacyKeyFile() {
110
+ const legacyKeyFilePath = this.getLegacyKeyFilePath();
111
+ const keyFilePath = this.getKeyFilePath();
112
+ const legacyKey = this.readKeyFromFile(legacyKeyFilePath);
113
+ const legacyKeyHex = legacyKey.toString('hex');
114
+ try {
115
+ this.writeKeyFile(keyFilePath, legacyKeyHex);
116
+ }
117
+ catch (error) {
118
+ if (!error || typeof error !== 'object' || !('code' in error)) {
119
+ return legacyKey;
120
+ }
121
+ if (error.code !== 'EEXIST' || !fs.existsSync(keyFilePath)) {
122
+ return legacyKey;
123
+ }
124
+ }
125
+ return this.readKeyFromFile(keyFilePath);
126
+ }
127
+ getMasterKey() {
128
+ if (this.cachedMasterKey) {
129
+ return this.cachedMasterKey;
130
+ }
131
+ if (this.injectedMasterKey) {
132
+ this.cachedMasterKey = this.deriveMasterKey(this.injectedMasterKey);
133
+ return this.cachedMasterKey;
134
+ }
135
+ const envMasterKey = process.env.SLACK_CLI_MASTER_KEY?.trim();
136
+ if (envMasterKey) {
137
+ this.cachedMasterKey = this.deriveMasterKey(envMasterKey);
138
+ return this.cachedMasterKey;
139
+ }
140
+ try {
141
+ this.cachedMasterKey = this.readKeyFromFile(this.getKeyFilePath());
142
+ }
143
+ catch (error) {
144
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
145
+ try {
146
+ this.cachedMasterKey = this.migrateLegacyKeyFile();
147
+ }
148
+ catch (legacyError) {
149
+ if (legacyError &&
150
+ typeof legacyError === 'object' &&
151
+ 'code' in legacyError &&
152
+ legacyError.code === 'ENOENT') {
153
+ this.cachedMasterKey = this.createKeyFile();
154
+ }
155
+ else if (legacyError instanceof errors_1.ConfigurationError) {
156
+ throw legacyError;
157
+ }
158
+ else {
159
+ throw new errors_1.ConfigurationError('Failed to migrate token encryption key');
160
+ }
161
+ }
162
+ }
163
+ else if (error instanceof errors_1.ConfigurationError) {
164
+ throw error;
165
+ }
166
+ else {
167
+ throw new errors_1.ConfigurationError('Failed to load token encryption key');
168
+ }
169
+ }
170
+ return this.cachedMasterKey;
171
+ }
172
+ encrypt(token) {
173
+ try {
174
+ const key = this.getMasterKey();
175
+ const iv = crypto.randomBytes(this.ivLength);
176
+ const cipher = crypto.createCipheriv(this.algorithm, key, iv);
177
+ let encrypted = cipher.update(token, 'utf8', 'hex');
178
+ encrypted += cipher.final('hex');
179
+ const authTag = cipher.getAuthTag();
180
+ return [this.version, iv.toString('hex'), encrypted, authTag.toString('hex')].join(this.separator);
181
+ }
182
+ catch {
183
+ throw new errors_1.ConfigurationError('Failed to encrypt token');
184
+ }
185
+ }
186
+ decrypt(encryptedData) {
187
+ try {
188
+ if (!encryptedData) {
189
+ throw new errors_1.ValidationError('Invalid encrypted data format');
190
+ }
191
+ if (this.isCurrentFormat(encryptedData)) {
192
+ return this.decryptCurrentFormat(encryptedData);
193
+ }
194
+ if (this.isLegacyEncrypted(encryptedData)) {
195
+ return this.decryptLegacyFormat(encryptedData);
196
+ }
197
+ throw new errors_1.ValidationError('Invalid encrypted data format');
198
+ }
199
+ catch (error) {
200
+ if (error instanceof errors_1.ValidationError) {
201
+ throw error;
202
+ }
203
+ throw new errors_1.ConfigurationError('Failed to decrypt token');
204
+ }
205
+ }
206
+ isEncrypted(value) {
207
+ return this.isCurrentFormat(value) || this.isLegacyEncrypted(value);
208
+ }
209
+ isCurrentFormat(value) {
210
+ if (!value) {
211
+ return false;
212
+ }
213
+ const parts = value.split(this.separator);
214
+ if (parts.length !== 4 || parts[0] !== this.version) {
215
+ return false;
216
+ }
217
+ const ivHex = parts[1];
218
+ const cipherHex = parts[2];
219
+ const authTagHex = parts[3];
220
+ return (/^[0-9a-fA-F]+$/.test(ivHex) &&
221
+ ivHex.length === this.ivLength * 2 &&
222
+ (cipherHex === '' || /^[0-9a-fA-F]+$/.test(cipherHex)) &&
223
+ cipherHex.length % 2 === 0 &&
224
+ /^[0-9a-fA-F]+$/.test(authTagHex) &&
225
+ authTagHex.length === this.authTagLength * 2);
226
+ }
227
+ isLegacyEncrypted(value) {
228
+ if (!value) {
229
+ return false;
230
+ }
231
+ const parts = value.split(this.separator);
232
+ if (parts.length !== 2) {
233
+ return false;
234
+ }
235
+ const ivHex = parts[0];
236
+ const cipherHex = parts[1];
237
+ return (/^[0-9a-fA-F]+$/.test(ivHex) &&
238
+ ivHex.length === this.legacyIvLength * 2 &&
239
+ /^[0-9a-fA-F]+$/.test(cipherHex) &&
240
+ cipherHex.length > 0 &&
241
+ cipherHex.length % 2 === 0);
242
+ }
243
+ decryptCurrentFormat(encryptedData) {
244
+ if (!this.isCurrentFormat(encryptedData)) {
245
+ throw new errors_1.ValidationError('Invalid encrypted data format');
246
+ }
247
+ const parts = encryptedData.split(this.separator);
248
+ const iv = Buffer.from(parts[1], 'hex');
249
+ const encrypted = parts[2];
250
+ const authTag = Buffer.from(parts[3], 'hex');
251
+ const key = this.getMasterKey();
252
+ const decipher = crypto.createDecipheriv(this.algorithm, key, iv);
253
+ decipher.setAuthTag(authTag);
254
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
255
+ decrypted += decipher.final('utf8');
256
+ return decrypted;
257
+ }
258
+ decryptLegacyFormat(encryptedData) {
259
+ if (!this.isLegacyEncrypted(encryptedData)) {
260
+ throw new errors_1.ValidationError('Invalid encrypted data format');
261
+ }
262
+ const parts = encryptedData.split(this.separator);
263
+ const iv = Buffer.from(parts[0], 'hex');
264
+ const encrypted = parts[1];
265
+ const key = this.deriveLegacyKey();
266
+ const decipher = crypto.createDecipheriv(this.legacyAlgorithm, key, iv);
267
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
268
+ decrypted += decipher.final('utf8');
269
+ return decrypted;
270
+ }
271
+ }
272
+ exports.TokenCryptoService = TokenCryptoService;
273
+ //# sourceMappingURL=token-crypto-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-crypto-service.js","sourceRoot":"","sources":["../../src/utils/token-crypto-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Masks a token for display purposes, showing only first and last few characters
3
+ * @param token The token to mask
4
+ * @returns Masked token in format "xoxb-****-****-abcd"
5
+ */
6
+ export declare function maskToken(token: string): string;
7
+ //# sourceMappingURL=token-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../../src/utils/token-utils.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS/C"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maskToken = maskToken;
4
+ const constants_1 = require("./constants");
5
+ /**
6
+ * Masks a token for display purposes, showing only first and last few characters
7
+ * @param token The token to mask
8
+ * @returns Masked token in format "xoxb-****-****-abcd"
9
+ */
10
+ function maskToken(token) {
11
+ if (token.length <= constants_1.TOKEN_MIN_LENGTH) {
12
+ return '****';
13
+ }
14
+ const prefix = token.substring(0, constants_1.TOKEN_MASK_LENGTH);
15
+ const suffix = token.substring(token.length - constants_1.TOKEN_MASK_LENGTH);
16
+ return `${prefix}-****-****-${suffix}`;
17
+ }
18
+ //# sourceMappingURL=token-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../../src/utils/token-utils.ts"],"names":[],"mappings":";;AAOA,8BASC;AAhBD,2CAAkE;AAElE;;;;GAIG;AACH,SAAgB,SAAS,CAAC,KAAa;IACrC,IAAI,KAAK,CAAC,MAAM,IAAI,4BAAgB,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,6BAAiB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,6BAAiB,CAAC,CAAC;IAEjE,OAAO,GAAG,MAAM,cAAc,MAAM,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,10 @@
1
+ interface CheckForUpdatesOptions {
2
+ packageName: string;
3
+ currentVersion: string;
4
+ cacheDir?: string;
5
+ cacheTtlMs?: number;
6
+ fetchImpl?: typeof fetch;
7
+ }
8
+ export declare function checkForUpdates(options: CheckForUpdatesOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=update-notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-notifier.d.ts","sourceRoot":"","sources":["../../src/utils/update-notifier.ts"],"names":[],"mappings":"AAeA,UAAU,sBAAsB;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBpF"}