@doist/twist-cli 2.21.1 → 2.21.3

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 (202) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/__mocks__/chalk.d.ts +3 -0
  3. package/dist/__mocks__/chalk.d.ts.map +1 -0
  4. package/dist/__mocks__/chalk.js +8 -0
  5. package/dist/__mocks__/chalk.js.map +1 -0
  6. package/dist/commands/auth.d.ts +3 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +155 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/away.d.ts +3 -0
  11. package/dist/commands/away.d.ts.map +1 -0
  12. package/dist/commands/away.js +120 -0
  13. package/dist/commands/away.js.map +1 -0
  14. package/dist/commands/changelog.d.ts +8 -0
  15. package/dist/commands/changelog.d.ts.map +1 -0
  16. package/dist/commands/changelog.js +113 -0
  17. package/dist/commands/changelog.js.map +1 -0
  18. package/dist/commands/channel.d.ts +3 -0
  19. package/dist/commands/channel.d.ts.map +1 -0
  20. package/dist/commands/channel.js +53 -0
  21. package/dist/commands/channel.js.map +1 -0
  22. package/dist/commands/comment.d.ts +3 -0
  23. package/dist/commands/comment.d.ts.map +1 -0
  24. package/dist/commands/comment.js +99 -0
  25. package/dist/commands/comment.js.map +1 -0
  26. package/dist/commands/completion.d.ts +3 -0
  27. package/dist/commands/completion.d.ts.map +1 -0
  28. package/dist/commands/completion.js +121 -0
  29. package/dist/commands/completion.js.map +1 -0
  30. package/dist/commands/conversation.d.ts +3 -0
  31. package/dist/commands/conversation.d.ts.map +1 -0
  32. package/dist/commands/conversation.js +458 -0
  33. package/dist/commands/conversation.js.map +1 -0
  34. package/dist/commands/inbox.d.ts +3 -0
  35. package/dist/commands/inbox.d.ts.map +1 -0
  36. package/dist/commands/inbox.js +127 -0
  37. package/dist/commands/inbox.js.map +1 -0
  38. package/dist/commands/msg.d.ts +3 -0
  39. package/dist/commands/msg.d.ts.map +1 -0
  40. package/dist/commands/msg.js +103 -0
  41. package/dist/commands/msg.js.map +1 -0
  42. package/dist/commands/react.d.ts +3 -0
  43. package/dist/commands/react.d.ts.map +1 -0
  44. package/dist/commands/react.js +102 -0
  45. package/dist/commands/react.js.map +1 -0
  46. package/dist/commands/search.d.ts +3 -0
  47. package/dist/commands/search.d.ts.map +1 -0
  48. package/dist/commands/search.js +160 -0
  49. package/dist/commands/search.js.map +1 -0
  50. package/dist/commands/skill.d.ts +3 -0
  51. package/dist/commands/skill.d.ts.map +1 -0
  52. package/dist/commands/skill.js +119 -0
  53. package/dist/commands/skill.js.map +1 -0
  54. package/dist/commands/thread/create.d.ts +7 -0
  55. package/dist/commands/thread/create.d.ts.map +1 -0
  56. package/dist/commands/thread/create.js +45 -0
  57. package/dist/commands/thread/create.js.map +1 -0
  58. package/dist/commands/thread/helpers.d.ts +10 -0
  59. package/dist/commands/thread/helpers.d.ts.map +1 -0
  60. package/dist/commands/thread/helpers.js +27 -0
  61. package/dist/commands/thread/helpers.js.map +1 -0
  62. package/dist/commands/thread/mutate.d.ts +5 -0
  63. package/dist/commands/thread/mutate.d.ts.map +1 -0
  64. package/dist/commands/thread/mutate.js +21 -0
  65. package/dist/commands/thread/mutate.js.map +1 -0
  66. package/dist/commands/thread/mute.d.ts +8 -0
  67. package/dist/commands/thread/mute.d.ts.map +1 -0
  68. package/dist/commands/thread/mute.js +58 -0
  69. package/dist/commands/thread/mute.js.map +1 -0
  70. package/dist/commands/thread/reply.d.ts +9 -0
  71. package/dist/commands/thread/reply.d.ts.map +1 -0
  72. package/dist/commands/thread/reply.js +68 -0
  73. package/dist/commands/thread/reply.js.map +1 -0
  74. package/dist/commands/thread/view.d.ts +9 -0
  75. package/dist/commands/thread/view.d.ts.map +1 -0
  76. package/dist/commands/thread/view.js +175 -0
  77. package/dist/commands/thread/view.js.map +1 -0
  78. package/dist/commands/thread.d.ts +3 -0
  79. package/dist/commands/thread.d.ts.map +1 -0
  80. package/dist/commands/thread.js +70 -0
  81. package/dist/commands/thread.js.map +1 -0
  82. package/dist/commands/update.d.ts +14 -0
  83. package/dist/commands/update.d.ts.map +1 -0
  84. package/dist/commands/update.js +91 -0
  85. package/dist/commands/update.js.map +1 -0
  86. package/dist/commands/user.d.ts +3 -0
  87. package/dist/commands/user.d.ts.map +1 -0
  88. package/dist/commands/user.js +67 -0
  89. package/dist/commands/user.js.map +1 -0
  90. package/dist/commands/view.d.ts +3 -0
  91. package/dist/commands/view.d.ts.map +1 -0
  92. package/dist/commands/view.js +63 -0
  93. package/dist/commands/view.js.map +1 -0
  94. package/dist/commands/workspace.d.ts +3 -0
  95. package/dist/commands/workspace.d.ts.map +1 -0
  96. package/dist/commands/workspace.js +48 -0
  97. package/dist/commands/workspace.js.map +1 -0
  98. package/dist/index.d.ts +3 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +133 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/lib/api.d.ts +20 -0
  103. package/dist/lib/api.d.ts.map +1 -0
  104. package/dist/lib/api.js +229 -0
  105. package/dist/lib/api.js.map +1 -0
  106. package/dist/lib/auth.d.ts +21 -0
  107. package/dist/lib/auth.d.ts.map +1 -0
  108. package/dist/lib/auth.js +183 -0
  109. package/dist/lib/auth.js.map +1 -0
  110. package/dist/lib/completion.d.ts +31 -0
  111. package/dist/lib/completion.d.ts.map +1 -0
  112. package/dist/lib/completion.js +173 -0
  113. package/dist/lib/completion.js.map +1 -0
  114. package/dist/lib/config.d.ts +13 -0
  115. package/dist/lib/config.d.ts.map +1 -0
  116. package/dist/lib/config.js +26 -0
  117. package/dist/lib/config.js.map +1 -0
  118. package/dist/lib/dates.d.ts +3 -0
  119. package/dist/lib/dates.d.ts.map +1 -0
  120. package/dist/lib/dates.js +44 -0
  121. package/dist/lib/dates.js.map +1 -0
  122. package/dist/lib/input.d.ts +3 -0
  123. package/dist/lib/input.d.ts.map +1 -0
  124. package/dist/lib/input.js +52 -0
  125. package/dist/lib/input.js.map +1 -0
  126. package/dist/lib/markdown.d.ts +2 -0
  127. package/dist/lib/markdown.d.ts.map +1 -0
  128. package/dist/lib/markdown.js +16 -0
  129. package/dist/lib/markdown.js.map +1 -0
  130. package/dist/lib/oauth-server.d.ts +13 -0
  131. package/dist/lib/oauth-server.d.ts.map +1 -0
  132. package/dist/lib/oauth-server.js +824 -0
  133. package/dist/lib/oauth-server.js.map +1 -0
  134. package/dist/lib/oauth.d.ts +31 -0
  135. package/dist/lib/oauth.d.ts.map +1 -0
  136. package/dist/lib/oauth.js +140 -0
  137. package/dist/lib/oauth.js.map +1 -0
  138. package/dist/lib/options.d.ts +17 -0
  139. package/dist/lib/options.d.ts.map +1 -0
  140. package/dist/lib/options.js +2 -0
  141. package/dist/lib/options.js.map +1 -0
  142. package/dist/lib/output.d.ts +25 -0
  143. package/dist/lib/output.d.ts.map +1 -0
  144. package/dist/lib/output.js +128 -0
  145. package/dist/lib/output.js.map +1 -0
  146. package/dist/lib/permissions.d.ts +4 -0
  147. package/dist/lib/permissions.d.ts.map +1 -0
  148. package/dist/lib/permissions.js +35 -0
  149. package/dist/lib/permissions.js.map +1 -0
  150. package/dist/lib/pkce.d.ts +16 -0
  151. package/dist/lib/pkce.d.ts.map +1 -0
  152. package/dist/lib/pkce.js +35 -0
  153. package/dist/lib/pkce.js.map +1 -0
  154. package/dist/lib/progress.d.ts +29 -0
  155. package/dist/lib/progress.d.ts.map +1 -0
  156. package/dist/lib/progress.js +101 -0
  157. package/dist/lib/progress.js.map +1 -0
  158. package/dist/lib/public-channels.d.ts +5 -0
  159. package/dist/lib/public-channels.d.ts.map +1 -0
  160. package/dist/lib/public-channels.js +35 -0
  161. package/dist/lib/public-channels.js.map +1 -0
  162. package/dist/lib/refs.d.ts +37 -0
  163. package/dist/lib/refs.d.ts.map +1 -0
  164. package/dist/lib/refs.js +219 -0
  165. package/dist/lib/refs.js.map +1 -0
  166. package/dist/lib/search-api.d.ts +25 -0
  167. package/dist/lib/search-api.d.ts.map +1 -0
  168. package/dist/lib/search-api.js +85 -0
  169. package/dist/lib/search-api.js.map +1 -0
  170. package/dist/lib/secure-store.d.ts +11 -0
  171. package/dist/lib/secure-store.d.ts.map +1 -0
  172. package/dist/lib/secure-store.js +57 -0
  173. package/dist/lib/secure-store.js.map +1 -0
  174. package/dist/lib/skills/content.d.ts +5 -0
  175. package/dist/lib/skills/content.d.ts.map +1 -0
  176. package/dist/lib/skills/content.js +286 -0
  177. package/dist/lib/skills/content.js.map +1 -0
  178. package/dist/lib/skills/create-installer.d.ts +9 -0
  179. package/dist/lib/skills/create-installer.d.ts.map +1 -0
  180. package/dist/lib/skills/create-installer.js +60 -0
  181. package/dist/lib/skills/create-installer.js.map +1 -0
  182. package/dist/lib/skills/index.d.ts +7 -0
  183. package/dist/lib/skills/index.d.ts.map +1 -0
  184. package/dist/lib/skills/index.js +54 -0
  185. package/dist/lib/skills/index.js.map +1 -0
  186. package/dist/lib/skills/types.d.ts +30 -0
  187. package/dist/lib/skills/types.d.ts.map +1 -0
  188. package/dist/lib/skills/types.js +2 -0
  189. package/dist/lib/skills/types.js.map +1 -0
  190. package/dist/lib/skills/update-installed.d.ts +9 -0
  191. package/dist/lib/skills/update-installed.d.ts.map +1 -0
  192. package/dist/lib/skills/update-installed.js +20 -0
  193. package/dist/lib/skills/update-installed.js.map +1 -0
  194. package/dist/lib/spinner.d.ts +24 -0
  195. package/dist/lib/spinner.d.ts.map +1 -0
  196. package/dist/lib/spinner.js +126 -0
  197. package/dist/lib/spinner.js.map +1 -0
  198. package/dist/postinstall.d.ts +2 -0
  199. package/dist/postinstall.d.ts.map +1 -0
  200. package/dist/postinstall.js +3 -0
  201. package/dist/postinstall.js.map +1 -0
  202. package/package.json +5 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-server.js","sourceRoot":"","sources":["../../src/lib/oauth-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * OAuth flow coordination for Twist API authentication
3
+ */
4
+ export declare const AUTHORIZATION_URL = "https://twist.com/oauth/authorize";
5
+ export declare const TOKEN_URL = "https://twist.com/oauth/access_token";
6
+ export declare const REGISTRATION_URL = "https://twist.com/oauth/register";
7
+ export declare const OAUTH_REDIRECT_URI = "http://localhost:8766/callback";
8
+ export declare const READ_WRITE_SCOPES: string;
9
+ export declare const READ_ONLY_SCOPES: string;
10
+ /**
11
+ * OAuth client credentials from dynamic registration
12
+ */
13
+ export interface OAuthClient {
14
+ client_id: string;
15
+ client_secret: string;
16
+ }
17
+ /**
18
+ * Register a dynamic OAuth client for this CLI session
19
+ */
20
+ export declare function registerDynamicClient(): Promise<OAuthClient>;
21
+ /**
22
+ * Build the authorization URL for the OAuth flow
23
+ */
24
+ export declare function buildAuthorizationUrl(clientId: string, codeChallenge: string, state: string, options?: {
25
+ readOnly?: boolean;
26
+ }): string;
27
+ /**
28
+ * Exchange authorization code for access token using PKCE
29
+ */
30
+ export declare function exchangeCodeForToken(code: string, codeVerifier: string, client: OAuthClient): Promise<string>;
31
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,iBAAiB,sCAAsC,CAAA;AACpE,eAAO,MAAM,SAAS,yCAAyC,CAAA;AAC/D,eAAO,MAAM,gBAAgB,qCAAqC,CAAA;AAClE,eAAO,MAAM,kBAAkB,mCAAmC,CAAA;AAGlE,eAAO,MAAM,iBAAiB,QAenB,CAAA;AAGX,eAAO,MAAM,gBAAgB,QAUlB,CAAA;AAEX;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,WAAW,CAAC,CAgDlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,MAAM,CAaR;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * OAuth flow coordination for Twist API authentication
3
+ */
4
+ // OAuth configuration for Twist (using well-known endpoints with dynamic client registration)
5
+ export const AUTHORIZATION_URL = 'https://twist.com/oauth/authorize';
6
+ export const TOKEN_URL = 'https://twist.com/oauth/access_token';
7
+ export const REGISTRATION_URL = 'https://twist.com/oauth/register';
8
+ export const OAUTH_REDIRECT_URI = 'http://localhost:8766/callback';
9
+ // OAuth scopes needed for full read-write CLI operations
10
+ export const READ_WRITE_SCOPES = [
11
+ 'user:read', // Read user information and session details
12
+ 'user:write', // Update user settings (e.g. away status)
13
+ 'workspaces:read', // Read workspace information
14
+ 'channels:read', // Read channel information
15
+ 'threads:read', // Read thread information
16
+ 'threads:write', // Create and manage threads
17
+ 'comments:read', // Read comments/messages
18
+ 'comments:write', // Send comments/messages
19
+ 'messages:read', // Read messages
20
+ 'messages:write', // Send messages
21
+ 'reactions:read', // Read reactions
22
+ 'reactions:write', // Add reactions
23
+ 'search:read', // Search functionality
24
+ 'notifications:read', // Read notifications
25
+ ].join(' ');
26
+ // OAuth scopes for read-only CLI operations (no :write scopes)
27
+ export const READ_ONLY_SCOPES = [
28
+ 'user:read',
29
+ 'workspaces:read',
30
+ 'channels:read',
31
+ 'threads:read',
32
+ 'comments:read',
33
+ 'messages:read',
34
+ 'reactions:read',
35
+ 'search:read',
36
+ 'notifications:read',
37
+ ].join(' ');
38
+ /**
39
+ * Register a dynamic OAuth client for this CLI session
40
+ */
41
+ export async function registerDynamicClient() {
42
+ const clientData = {
43
+ client_name: 'Twist CLI',
44
+ client_uri: 'https://github.com/doist/twist-cli',
45
+ redirect_uris: [OAUTH_REDIRECT_URI],
46
+ grant_types: ['authorization_code'],
47
+ response_types: ['code'],
48
+ token_endpoint_auth_method: 'client_secret_basic', // Use Basic auth for token exchange
49
+ application_type: 'native', // CLI is a native application
50
+ logo_uri: 'https://raw.githubusercontent.com/Doist/twist-cli/d65c447ff453eb36af585044c2f5f2f602bcdb34/icons/twist-cli.png',
51
+ };
52
+ try {
53
+ const response = await fetch(REGISTRATION_URL, {
54
+ method: 'POST',
55
+ headers: {
56
+ 'Content-Type': 'application/json',
57
+ Accept: 'application/json',
58
+ },
59
+ body: JSON.stringify(clientData),
60
+ });
61
+ if (!response.ok) {
62
+ const errorText = await response.text();
63
+ throw new Error(`Client registration failed: ${response.status} ${response.statusText} - ${errorText}`);
64
+ }
65
+ const result = await response.json();
66
+ if (!result.client_id || !result.client_secret) {
67
+ throw new Error('Invalid client registration response: missing client_id or client_secret');
68
+ }
69
+ return {
70
+ client_id: result.client_id,
71
+ client_secret: result.client_secret,
72
+ };
73
+ }
74
+ catch (error) {
75
+ if (error instanceof Error) {
76
+ throw new Error(`Failed to register OAuth client: ${error.message}`);
77
+ }
78
+ throw new Error('Failed to register OAuth client: Unknown error');
79
+ }
80
+ }
81
+ /**
82
+ * Build the authorization URL for the OAuth flow
83
+ */
84
+ export function buildAuthorizationUrl(clientId, codeChallenge, state, options = {}) {
85
+ const scope = options.readOnly ? READ_ONLY_SCOPES : READ_WRITE_SCOPES;
86
+ const params = new URLSearchParams({
87
+ client_id: clientId,
88
+ response_type: 'code',
89
+ redirect_uri: OAUTH_REDIRECT_URI,
90
+ scope,
91
+ state,
92
+ code_challenge: codeChallenge,
93
+ code_challenge_method: 'S256',
94
+ });
95
+ return `${AUTHORIZATION_URL}?${params.toString()}`;
96
+ }
97
+ /**
98
+ * Exchange authorization code for access token using PKCE
99
+ */
100
+ export async function exchangeCodeForToken(code, codeVerifier, client) {
101
+ const body = new URLSearchParams({
102
+ grant_type: 'authorization_code',
103
+ code,
104
+ redirect_uri: OAUTH_REDIRECT_URI,
105
+ code_verifier: codeVerifier,
106
+ });
107
+ // Use HTTP Basic Authentication for client credentials
108
+ const credentials = `${client.client_id}:${client.client_secret}`;
109
+ const encodedCredentials = btoa(credentials);
110
+ try {
111
+ const response = await fetch(TOKEN_URL, {
112
+ method: 'POST',
113
+ headers: {
114
+ 'Content-Type': 'application/x-www-form-urlencoded',
115
+ Accept: 'application/json',
116
+ Authorization: `Basic ${encodedCredentials}`,
117
+ },
118
+ body: body.toString(),
119
+ });
120
+ if (!response.ok) {
121
+ const errorText = await response.text();
122
+ throw new Error(`Token exchange failed: ${response.status} ${response.statusText} - ${errorText}`);
123
+ }
124
+ const data = await response.json();
125
+ if (data.error) {
126
+ throw new Error(`OAuth error: ${data.error} - ${data.error_description || 'Unknown error'}`);
127
+ }
128
+ if (!data.access_token) {
129
+ throw new Error('No access token received from OAuth server');
130
+ }
131
+ return data.access_token;
132
+ }
133
+ catch (error) {
134
+ if (error instanceof Error) {
135
+ throw new Error(`Failed to exchange code for token: ${error.message}`);
136
+ }
137
+ throw new Error('Failed to exchange code for token: Unknown error');
138
+ }
139
+ }
140
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8FAA8F;AAC9F,MAAM,CAAC,MAAM,iBAAiB,GAAG,mCAAmC,CAAA;AACpE,MAAM,CAAC,MAAM,SAAS,GAAG,sCAAsC,CAAA;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,kCAAkC,CAAA;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,gCAAgC,CAAA;AAElE,yDAAyD;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B,WAAW,EAAE,4CAA4C;IACzD,YAAY,EAAE,0CAA0C;IACxD,iBAAiB,EAAE,6BAA6B;IAChD,eAAe,EAAE,2BAA2B;IAC5C,cAAc,EAAE,0BAA0B;IAC1C,eAAe,EAAE,4BAA4B;IAC7C,eAAe,EAAE,yBAAyB;IAC1C,gBAAgB,EAAE,yBAAyB;IAC3C,eAAe,EAAE,gBAAgB;IACjC,gBAAgB,EAAE,gBAAgB;IAClC,gBAAgB,EAAE,iBAAiB;IACnC,iBAAiB,EAAE,gBAAgB;IACnC,aAAa,EAAE,uBAAuB;IACtC,oBAAoB,EAAE,qBAAqB;CAC9C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEX,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,cAAc;IACd,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,aAAa;IACb,oBAAoB;CACvB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAUX;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACvC,MAAM,UAAU,GAAG;QACf,WAAW,EAAE,WAAW;QACxB,UAAU,EAAE,oCAAoC;QAChD,aAAa,EAAE,CAAC,kBAAkB,CAAC;QACnC,WAAW,EAAE,CAAC,oBAAoB,CAAC;QACnC,cAAc,EAAE,CAAC,MAAM,CAAC;QACxB,0BAA0B,EAAE,qBAAqB,EAAE,oCAAoC;QACvF,gBAAgB,EAAE,QAAQ,EAAE,8BAA8B;QAC1D,QAAQ,EACJ,gHAAgH;KACvH,CAAA;IAED,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC7B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;SACnC,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACvC,MAAM,IAAI,KAAK,CACX,+BAA+B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,CACzF,CAAA;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAEpC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CACX,0EAA0E,CAC7E,CAAA;QACL,CAAC;QAED,OAAO;YACH,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;SACtC,CAAA;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACrE,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACjC,QAAgB,EAChB,aAAqB,EACrB,KAAa,EACb,UAAkC,EAAE;IAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAA;IACrE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QAC/B,SAAS,EAAE,QAAQ;QACnB,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,kBAAkB;QAChC,KAAK;QACL,KAAK;QACL,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,MAAM;KAChC,CAAC,CAAA;IAEF,OAAO,GAAG,iBAAiB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,IAAY,EACZ,YAAoB,EACpB,MAAmB;IAEnB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC7B,UAAU,EAAE,oBAAoB;QAChC,IAAI;QACJ,YAAY,EAAE,kBAAkB;QAChC,aAAa,EAAE,YAAY;KAC9B,CAAC,CAAA;IAEF,uDAAuD;IACvD,MAAM,WAAW,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,aAAa,EAAE,CAAA;IACjE,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,CAAA;IAE5C,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,cAAc,EAAE,mCAAmC;gBACnD,MAAM,EAAE,kBAAkB;gBAC1B,aAAa,EAAE,SAAS,kBAAkB,EAAE;aAC/C;YACD,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;SACxB,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACvC,MAAM,IAAI,KAAK,CACX,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,CACpF,CAAA;QACL,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACX,gBAAgB,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,iBAAiB,IAAI,eAAe,EAAE,CAC9E,CAAA;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QACjE,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAA;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACvE,CAAC;AACL,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type ViewOptions = {
2
+ json?: boolean;
3
+ ndjson?: boolean;
4
+ full?: boolean;
5
+ raw?: boolean;
6
+ };
7
+ export type PaginatedViewOptions = ViewOptions & {
8
+ limit?: string;
9
+ since?: string;
10
+ until?: string;
11
+ };
12
+ export type MutationOptions = {
13
+ dryRun?: boolean;
14
+ json?: boolean;
15
+ full?: boolean;
16
+ };
17
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/lib/options.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/lib/options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ export declare const colors: {
2
+ author: import("chalk").ChalkInstance;
3
+ timestamp: import("chalk").ChalkInstance;
4
+ channel: import("chalk").ChalkInstance;
5
+ unread: import("chalk").ChalkInstance;
6
+ url: import("chalk").ChalkInstance;
7
+ error: import("chalk").ChalkInstance;
8
+ };
9
+ export type EntityType = 'thread' | 'comment' | 'conversation' | 'message' | 'workspace' | 'user' | 'channel';
10
+ export declare function filterEntityFields<T extends object>(data: T, type: EntityType, full?: boolean): T | Partial<T>;
11
+ export declare function filterEntityFields<T extends object>(data: T[], type: EntityType, full?: boolean): Array<T | Partial<T>>;
12
+ export declare function formatJson<T extends object>(data: T | T[], type?: EntityType, full?: boolean): string;
13
+ export declare function formatNdjson<T extends object>(items: T[], type?: EntityType, full?: boolean): string;
14
+ export interface PaginatedOutput<T> {
15
+ results: T[];
16
+ nextCursor: string | null;
17
+ }
18
+ export declare function formatPaginatedJson<T extends object>(data: PaginatedOutput<T>, type?: EntityType, full?: boolean): string;
19
+ export declare function formatPaginatedNdjson<T extends object>(data: PaginatedOutput<T>, type?: EntityType, full?: boolean): string;
20
+ export declare function formatError(message: string): string;
21
+ export declare function printError(message: string): void;
22
+ export declare function printJson<T extends object>(data: T | T[], type?: EntityType, full?: boolean): void;
23
+ export declare function printNdjson<T extends object>(items: T[], type?: EntityType, full?: boolean): void;
24
+ export declare function isAccessible(): boolean;
25
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;;;;;;;CAOlB,CAAA;AAgDD,MAAM,MAAM,UAAU,GAChB,QAAQ,GACR,SAAS,GACT,cAAc,GACd,SAAS,GACT,WAAW,GACX,MAAM,GACN,SAAS,CAAA;AA+Bf,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAC/C,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,UAAU,EAChB,IAAI,CAAC,EAAE,OAAO,GACf,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACjB,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAC/C,IAAI,EAAE,CAAC,EAAE,EACT,IAAI,EAAE,UAAU,EAChB,IAAI,CAAC,EAAE,OAAO,GACf,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AAkBxB,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACvC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EACb,IAAI,CAAC,EAAE,UAAU,EACjB,IAAI,UAAQ,GACb,MAAM,CAKR;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EACzC,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,CAAC,EAAE,UAAU,EACjB,IAAI,UAAQ,GACb,MAAM,CAOR;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAChD,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EACxB,IAAI,CAAC,EAAE,UAAU,EACjB,IAAI,UAAQ,GACb,MAAM,CAGR;AAED,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,EAClD,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EACxB,IAAI,CAAC,EAAE,UAAU,EACjB,IAAI,UAAQ,GACb,MAAM,CAOR;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,UAAQ,GAAG,IAAI,CAEhG;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,UAAQ,GAAG,IAAI,CAE/F;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
@@ -0,0 +1,128 @@
1
+ import chalk from 'chalk';
2
+ export const colors = {
3
+ author: chalk.cyan,
4
+ timestamp: chalk.dim,
5
+ channel: chalk.blue,
6
+ unread: chalk.bold,
7
+ url: chalk.dim,
8
+ error: chalk.red,
9
+ };
10
+ const THREAD_ESSENTIAL_FIELDS = [
11
+ 'id',
12
+ 'title',
13
+ 'channelId',
14
+ 'workspaceId',
15
+ 'creator',
16
+ 'posted',
17
+ 'commentCount',
18
+ 'isArchived',
19
+ 'reactions',
20
+ ];
21
+ const COMMENT_ESSENTIAL_FIELDS = [
22
+ 'id',
23
+ 'content',
24
+ 'creator',
25
+ 'threadId',
26
+ 'posted',
27
+ 'reactions',
28
+ ];
29
+ const CONVERSATION_ESSENTIAL_FIELDS = [
30
+ 'id',
31
+ 'workspaceId',
32
+ 'userIds',
33
+ 'title',
34
+ 'messageCount',
35
+ 'lastActive',
36
+ 'archived',
37
+ ];
38
+ const MESSAGE_ESSENTIAL_FIELDS = [
39
+ 'id',
40
+ 'content',
41
+ 'creator',
42
+ 'conversationId',
43
+ 'posted',
44
+ 'reactions',
45
+ ];
46
+ const WORKSPACE_ESSENTIAL_FIELDS = ['id', 'name', 'creator', 'plan'];
47
+ const USER_ESSENTIAL_FIELDS = ['id', 'name', 'email', 'timezone', 'userType', 'awayMode'];
48
+ const CHANNEL_ESSENTIAL_FIELDS = ['id', 'name', 'workspaceId'];
49
+ function getEssentialFields(type) {
50
+ switch (type) {
51
+ case 'thread':
52
+ return THREAD_ESSENTIAL_FIELDS;
53
+ case 'comment':
54
+ return COMMENT_ESSENTIAL_FIELDS;
55
+ case 'conversation':
56
+ return CONVERSATION_ESSENTIAL_FIELDS;
57
+ case 'message':
58
+ return MESSAGE_ESSENTIAL_FIELDS;
59
+ case 'workspace':
60
+ return WORKSPACE_ESSENTIAL_FIELDS;
61
+ case 'user':
62
+ return USER_ESSENTIAL_FIELDS;
63
+ case 'channel':
64
+ return CHANNEL_ESSENTIAL_FIELDS;
65
+ }
66
+ }
67
+ function pickFields(item, fields) {
68
+ const result = {};
69
+ for (const field of fields) {
70
+ if (field in item) {
71
+ ;
72
+ result[field] = item[field];
73
+ }
74
+ }
75
+ return result;
76
+ }
77
+ export function filterEntityFields(data, type, full = false) {
78
+ if (full) {
79
+ return data;
80
+ }
81
+ const fields = getEssentialFields(type);
82
+ if (Array.isArray(data)) {
83
+ return data.map((item) => pickFields(item, fields));
84
+ }
85
+ return pickFields(data, fields);
86
+ }
87
+ export function formatJson(data, type, full = false) {
88
+ if (full || !type) {
89
+ return JSON.stringify(data, null, 2);
90
+ }
91
+ return JSON.stringify(filterEntityFields(data, type), null, 2);
92
+ }
93
+ export function formatNdjson(items, type, full = false) {
94
+ if (full || !type) {
95
+ return items.map((item) => JSON.stringify(item)).join('\n');
96
+ }
97
+ return filterEntityFields(items, type)
98
+ .map((item) => JSON.stringify(item))
99
+ .join('\n');
100
+ }
101
+ export function formatPaginatedJson(data, type, full = false) {
102
+ const results = type ? filterEntityFields(data.results, type, full) : data.results;
103
+ return JSON.stringify({ results, nextCursor: data.nextCursor }, null, 2);
104
+ }
105
+ export function formatPaginatedNdjson(data, type, full = false) {
106
+ const results = type ? filterEntityFields(data.results, type, full) : data.results;
107
+ const lines = results.map((item) => JSON.stringify(item));
108
+ if (data.nextCursor) {
109
+ lines.push(JSON.stringify({ _meta: true, nextCursor: data.nextCursor }));
110
+ }
111
+ return lines.join('\n');
112
+ }
113
+ export function formatError(message) {
114
+ return colors.error(message);
115
+ }
116
+ export function printError(message) {
117
+ console.error(formatError(message));
118
+ }
119
+ export function printJson(data, type, full = false) {
120
+ console.log(formatJson(data, type, full));
121
+ }
122
+ export function printNdjson(items, type, full = false) {
123
+ console.log(formatNdjson(items, type, full));
124
+ }
125
+ export function isAccessible() {
126
+ return process.env.TW_ACCESSIBLE === '1' || process.argv.includes('--accessible');
127
+ }
128
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,MAAM,EAAE,KAAK,CAAC,IAAI;IAClB,SAAS,EAAE,KAAK,CAAC,GAAG;IACpB,OAAO,EAAE,KAAK,CAAC,IAAI;IACnB,MAAM,EAAE,KAAK,CAAC,IAAI;IAClB,GAAG,EAAE,KAAK,CAAC,GAAG;IACd,KAAK,EAAE,KAAK,CAAC,GAAG;CACnB,CAAA;AAED,MAAM,uBAAuB,GAAG;IAC5B,IAAI;IACJ,OAAO;IACP,WAAW;IACX,aAAa;IACb,SAAS;IACT,QAAQ;IACR,cAAc;IACd,YAAY;IACZ,WAAW;CACL,CAAA;AAEV,MAAM,wBAAwB,GAAG;IAC7B,IAAI;IACJ,SAAS;IACT,SAAS;IACT,UAAU;IACV,QAAQ;IACR,WAAW;CACL,CAAA;AAEV,MAAM,6BAA6B,GAAG;IAClC,IAAI;IACJ,aAAa;IACb,SAAS;IACT,OAAO;IACP,cAAc;IACd,YAAY;IACZ,UAAU;CACJ,CAAA;AAEV,MAAM,wBAAwB,GAAG;IAC7B,IAAI;IACJ,SAAS;IACT,SAAS;IACT,gBAAgB;IAChB,QAAQ;IACR,WAAW;CACL,CAAA;AAEV,MAAM,0BAA0B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAU,CAAA;AAE7E,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAU,CAAA;AAElG,MAAM,wBAAwB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAU,CAAA;AAWvE,SAAS,kBAAkB,CAAC,IAAgB;IACxC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ;YACT,OAAO,uBAAuB,CAAA;QAClC,KAAK,SAAS;YACV,OAAO,wBAAwB,CAAA;QACnC,KAAK,cAAc;YACf,OAAO,6BAA6B,CAAA;QACxC,KAAK,SAAS;YACV,OAAO,wBAAwB,CAAA;QACnC,KAAK,WAAW;YACZ,OAAO,0BAA0B,CAAA;QACrC,KAAK,MAAM;YACP,OAAO,qBAAqB,CAAA;QAChC,KAAK,SAAS;YACV,OAAO,wBAAwB,CAAA;IACvC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAmB,IAAO,EAAE,MAAyB;IACpE,MAAM,MAAM,GAAe,EAAE,CAAA;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAChB,CAAC;YAAC,MAAkC,CAAC,KAAK,CAAC,GAAI,IAAgC,CAAC,KAAK,CAAC,CAAA;QAC1F,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAA;AACjB,CAAC;AAYD,MAAM,UAAU,kBAAkB,CAC9B,IAAa,EACb,IAAgB,EAChB,IAAI,GAAG,KAAK;IAEZ,IAAI,IAAI,EAAE,CAAC;QACP,OAAO,IAAI,CAAA;IACf,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,UAAU,CACtB,IAAa,EACb,IAAiB,EACjB,IAAI,GAAG,KAAK;IAEZ,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,YAAY,CACxB,KAAU,EACV,IAAiB,EACjB,IAAI,GAAG,KAAK;IAEZ,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SACnC,IAAI,CAAC,IAAI,CAAC,CAAA;AACnB,CAAC;AAOD,MAAM,UAAU,mBAAmB,CAC/B,IAAwB,EACxB,IAAiB,EACjB,IAAI,GAAG,KAAK;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;IAClF,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAC5E,CAAC;AAED,MAAM,UAAU,qBAAqB,CACjC,IAAwB,EACxB,IAAiB,EACjB,IAAI,GAAG,KAAK;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;IAClF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IACzD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IAC5E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACvC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACtC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAmB,IAAa,EAAE,IAAiB,EAAE,IAAI,GAAG,KAAK;IACtF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAmB,KAAU,EAAE,IAAiB,EAAE,IAAI,GAAG,KAAK;IACrF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,YAAY;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;AACrF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const READ_ONLY_ERROR_MESSAGE = "This CLI is authenticated in read-only mode. Re-run `tw auth login` without --read-only to enable write operations.";
2
+ export declare function isMutatingMethod(methodPath: string): boolean;
3
+ export declare function ensureWriteAllowed(): Promise<void>;
4
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,wHACqF,CAAA;AA0BzH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKxD"}
@@ -0,0 +1,35 @@
1
+ import { getAuthMetadata } from './auth.js';
2
+ export const READ_ONLY_ERROR_MESSAGE = 'This CLI is authenticated in read-only mode. Re-run `tw auth login` without --read-only to enable write operations.';
3
+ /**
4
+ * Known read-only API method paths. Any method not in this set is assumed to be mutating.
5
+ * This is a safe-by-default approach: new API methods are blocked until explicitly allowed.
6
+ */
7
+ const KNOWN_SAFE_API_METHODS = new Set([
8
+ 'users.getSessionUser',
9
+ 'workspaces.getWorkspaces',
10
+ 'workspaceUsers.getWorkspaceUsers',
11
+ 'workspaceUsers.getUserById',
12
+ 'threads.getThread',
13
+ 'threads.getUnread',
14
+ 'comments.getComment',
15
+ 'comments.getComments',
16
+ 'channels.getChannel',
17
+ 'channels.getChannels',
18
+ 'conversations.getConversations',
19
+ 'conversations.getConversation',
20
+ 'conversations.getUnread',
21
+ 'conversationMessages.getMessage',
22
+ 'conversationMessages.getMessages',
23
+ 'inbox.getInbox',
24
+ 'batch',
25
+ ]);
26
+ export function isMutatingMethod(methodPath) {
27
+ return !KNOWN_SAFE_API_METHODS.has(methodPath);
28
+ }
29
+ export async function ensureWriteAllowed() {
30
+ const metadata = await getAuthMetadata();
31
+ if (metadata.authMode === 'read-only') {
32
+ throw new Error(READ_ONLY_ERROR_MESSAGE);
33
+ }
34
+ }
35
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,CAAC,MAAM,uBAAuB,GAChC,qHAAqH,CAAA;AAEzH;;;GAGG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACnC,sBAAsB;IACtB,0BAA0B;IAC1B,kCAAkC;IAClC,4BAA4B;IAC5B,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;IACrB,sBAAsB;IACtB,qBAAqB;IACrB,sBAAsB;IACtB,gCAAgC;IAChC,+BAA+B;IAC/B,yBAAyB;IACzB,iCAAiC;IACjC,kCAAkC;IAClC,gBAAgB;IAChB,OAAO;CACV,CAAC,CAAA;AAEF,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IAC/C,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACpC,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAA;IACxC,IAAI,QAAQ,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAC5C,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Generate a cryptographically secure random code verifier for PKCE.
3
+ * Returns a base64url-encoded string with 43-128 characters.
4
+ */
5
+ export declare function generateCodeVerifier(): string;
6
+ /**
7
+ * Generate a code challenge from a code verifier using SHA256 and base64url encoding.
8
+ * This is the S256 method as specified in RFC 7636.
9
+ */
10
+ export declare function generateCodeChallenge(verifier: string): string;
11
+ /**
12
+ * Generate a cryptographically secure random state parameter for CSRF protection.
13
+ * Returns a base64url-encoded string.
14
+ */
15
+ export declare function generateState(): string;
16
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC"}
@@ -0,0 +1,35 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ /**
3
+ * Generate a cryptographically secure random code verifier for PKCE.
4
+ * Returns a base64url-encoded string with 43-128 characters.
5
+ */
6
+ export function generateCodeVerifier() {
7
+ // Generate 32 random bytes (256 bits) which gives us 43 base64url characters
8
+ const buffer = randomBytes(32);
9
+ return base64urlEncode(buffer);
10
+ }
11
+ /**
12
+ * Generate a code challenge from a code verifier using SHA256 and base64url encoding.
13
+ * This is the S256 method as specified in RFC 7636.
14
+ */
15
+ export function generateCodeChallenge(verifier) {
16
+ const hash = createHash('sha256').update(verifier).digest();
17
+ return base64urlEncode(hash);
18
+ }
19
+ /**
20
+ * Generate a cryptographically secure random state parameter for CSRF protection.
21
+ * Returns a base64url-encoded string.
22
+ */
23
+ export function generateState() {
24
+ // Generate 16 random bytes (128 bits) for the state parameter
25
+ const buffer = randomBytes(16);
26
+ return base64urlEncode(buffer);
27
+ }
28
+ /**
29
+ * Base64url encode a buffer (RFC 4648 Section 5).
30
+ * This removes padding and uses URL-safe characters.
31
+ */
32
+ function base64urlEncode(buffer) {
33
+ return buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
34
+ }
35
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAErD;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAChC,6EAA6E;IAC7E,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9B,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;IAC3D,OAAO,eAAe,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IACzB,8DAA8D;IAC9D,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9B,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,MAAc;IACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC9F,CAAC"}
@@ -0,0 +1,29 @@
1
+ export type ProgressEvent = {
2
+ type: 'start' | 'api_call' | 'api_response' | 'complete' | 'error';
3
+ timestamp: string;
4
+ command?: string;
5
+ endpoint?: string;
6
+ cursor?: string | null;
7
+ count?: number;
8
+ has_more?: boolean;
9
+ next_cursor?: string | null;
10
+ error_code?: string;
11
+ message?: string;
12
+ };
13
+ export declare class ProgressTracker {
14
+ private enabled;
15
+ private outputStream;
16
+ constructor();
17
+ private checkAndInitialize;
18
+ isEnabled(): boolean;
19
+ emit(event: Omit<ProgressEvent, 'timestamp'>): void;
20
+ emitStart(command: string): void;
21
+ emitApiCall(endpoint: string, cursor?: string | null): void;
22
+ emitApiResponse(count: number, hasMore: boolean, nextCursor?: string | null): void;
23
+ emitComplete(): void;
24
+ emitError(errorCode?: string, message?: string): void;
25
+ close(): void;
26
+ }
27
+ export declare function getProgressTracker(): ProgressTracker;
28
+ export declare function resetProgressTracker(): void;
29
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IACxB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,OAAO,CAAA;IAClE,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,qBAAa,eAAe;IACxB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,YAAY,CAAsD;;IAM1E,OAAO,CAAC,kBAAkB;IA2C1B,SAAS,IAAI,OAAO;IAIpB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG,IAAI;IAcnD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIhC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI3D,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASlF,YAAY,IAAI,IAAI;IAIpB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAIrD,KAAK,IAAI,IAAI;CAOhB;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
@@ -0,0 +1,101 @@
1
+ import fs from 'node:fs';
2
+ export class ProgressTracker {
3
+ enabled = false;
4
+ outputStream = null;
5
+ constructor() {
6
+ this.checkAndInitialize();
7
+ }
8
+ checkAndInitialize() {
9
+ const args = process.argv;
10
+ // Find all --progress-jsonl flags and use the last one
11
+ const progressIndices = args
12
+ .map((arg, index) => ({ arg, index }))
13
+ .filter(({ arg }) => arg.startsWith('--progress-jsonl'));
14
+ if (progressIndices.length === 0) {
15
+ return;
16
+ }
17
+ this.enabled = true;
18
+ // Use the last occurrence
19
+ const { arg, index: progressIndex } = progressIndices[progressIndices.length - 1];
20
+ // Handle both --progress-jsonl and --progress-jsonl=path formats
21
+ let outputPath;
22
+ if (arg.includes('=')) {
23
+ // Format: --progress-jsonl=/path/to/file
24
+ outputPath = arg.split('=', 2)[1];
25
+ }
26
+ else if (progressIndex + 1 < args.length && !args[progressIndex + 1].startsWith('-')) {
27
+ // Format: --progress-jsonl /path/to/file
28
+ outputPath = args[progressIndex + 1];
29
+ }
30
+ if (outputPath) {
31
+ try {
32
+ this.outputStream = fs.createWriteStream(outputPath, { flags: 'a' });
33
+ }
34
+ catch (_error) {
35
+ // Fall back to stderr if file creation fails
36
+ console.error(`Warning: Could not create progress file ${outputPath}, falling back to stderr`);
37
+ this.outputStream = process.stderr;
38
+ }
39
+ }
40
+ else {
41
+ this.outputStream = process.stderr;
42
+ }
43
+ }
44
+ isEnabled() {
45
+ return this.enabled;
46
+ }
47
+ emit(event) {
48
+ if (!this.enabled || !this.outputStream) {
49
+ return;
50
+ }
51
+ const progressEvent = {
52
+ ...event,
53
+ timestamp: new Date().toISOString(),
54
+ };
55
+ const line = `${JSON.stringify(progressEvent)}\n`;
56
+ this.outputStream.write(line);
57
+ }
58
+ emitStart(command) {
59
+ this.emit({ type: 'start', command });
60
+ }
61
+ emitApiCall(endpoint, cursor) {
62
+ this.emit({ type: 'api_call', endpoint, cursor });
63
+ }
64
+ emitApiResponse(count, hasMore, nextCursor) {
65
+ this.emit({
66
+ type: 'api_response',
67
+ count,
68
+ has_more: hasMore,
69
+ next_cursor: nextCursor,
70
+ });
71
+ }
72
+ emitComplete() {
73
+ this.emit({ type: 'complete' });
74
+ }
75
+ emitError(errorCode, message) {
76
+ this.emit({ type: 'error', error_code: errorCode, message });
77
+ }
78
+ close() {
79
+ if (this.outputStream && this.outputStream !== process.stderr) {
80
+ ;
81
+ this.outputStream.close();
82
+ }
83
+ this.enabled = false;
84
+ this.outputStream = null;
85
+ }
86
+ }
87
+ // Global singleton instance
88
+ let progressTracker = null;
89
+ export function getProgressTracker() {
90
+ if (!progressTracker) {
91
+ progressTracker = new ProgressTracker();
92
+ }
93
+ return progressTracker;
94
+ }
95
+ export function resetProgressTracker() {
96
+ if (progressTracker) {
97
+ progressTracker.close();
98
+ }
99
+ progressTracker = null;
100
+ }
101
+ //# sourceMappingURL=progress.js.map