@doist/twist-cli 1.0.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 (110) hide show
  1. package/README.md +76 -0
  2. package/dist/__tests__/auth.test.d.ts +2 -0
  3. package/dist/__tests__/auth.test.d.ts.map +1 -0
  4. package/dist/__tests__/auth.test.js +300 -0
  5. package/dist/__tests__/auth.test.js.map +1 -0
  6. package/dist/__tests__/lib/dates.test.d.ts +2 -0
  7. package/dist/__tests__/lib/dates.test.d.ts.map +1 -0
  8. package/dist/__tests__/lib/dates.test.js +58 -0
  9. package/dist/__tests__/lib/dates.test.js.map +1 -0
  10. package/dist/__tests__/lib/refs.test.d.ts +2 -0
  11. package/dist/__tests__/lib/refs.test.d.ts.map +1 -0
  12. package/dist/__tests__/lib/refs.test.js +121 -0
  13. package/dist/__tests__/lib/refs.test.js.map +1 -0
  14. package/dist/__tests__/spinner.test.d.ts +2 -0
  15. package/dist/__tests__/spinner.test.d.ts.map +1 -0
  16. package/dist/__tests__/spinner.test.js +153 -0
  17. package/dist/__tests__/spinner.test.js.map +1 -0
  18. package/dist/commands/auth.d.ts +3 -0
  19. package/dist/commands/auth.d.ts.map +1 -0
  20. package/dist/commands/auth.js +93 -0
  21. package/dist/commands/auth.js.map +1 -0
  22. package/dist/commands/channel.d.ts +3 -0
  23. package/dist/commands/channel.d.ts.map +1 -0
  24. package/dist/commands/channel.js +49 -0
  25. package/dist/commands/channel.js.map +1 -0
  26. package/dist/commands/inbox.d.ts +3 -0
  27. package/dist/commands/inbox.d.ts.map +1 -0
  28. package/dist/commands/inbox.js +121 -0
  29. package/dist/commands/inbox.js.map +1 -0
  30. package/dist/commands/msg.d.ts +3 -0
  31. package/dist/commands/msg.d.ts.map +1 -0
  32. package/dist/commands/msg.js +205 -0
  33. package/dist/commands/msg.js.map +1 -0
  34. package/dist/commands/react.d.ts +3 -0
  35. package/dist/commands/react.d.ts.map +1 -0
  36. package/dist/commands/react.js +100 -0
  37. package/dist/commands/react.js.map +1 -0
  38. package/dist/commands/search.d.ts +3 -0
  39. package/dist/commands/search.d.ts.map +1 -0
  40. package/dist/commands/search.js +134 -0
  41. package/dist/commands/search.js.map +1 -0
  42. package/dist/commands/thread.d.ts +3 -0
  43. package/dist/commands/thread.d.ts.map +1 -0
  44. package/dist/commands/thread.js +219 -0
  45. package/dist/commands/thread.js.map +1 -0
  46. package/dist/commands/user.d.ts +3 -0
  47. package/dist/commands/user.d.ts.map +1 -0
  48. package/dist/commands/user.js +67 -0
  49. package/dist/commands/user.js.map +1 -0
  50. package/dist/commands/workspace.d.ts +3 -0
  51. package/dist/commands/workspace.d.ts.map +1 -0
  52. package/dist/commands/workspace.js +48 -0
  53. package/dist/commands/workspace.js.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +36 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/lib/api.d.ts +10 -0
  59. package/dist/lib/api.d.ts.map +1 -0
  60. package/dist/lib/api.js +143 -0
  61. package/dist/lib/api.js.map +1 -0
  62. package/dist/lib/auth.d.ts +4 -0
  63. package/dist/lib/auth.d.ts.map +1 -0
  64. package/dist/lib/auth.js +40 -0
  65. package/dist/lib/auth.js.map +1 -0
  66. package/dist/lib/config.d.ts +9 -0
  67. package/dist/lib/config.d.ts.map +1 -0
  68. package/dist/lib/config.js +26 -0
  69. package/dist/lib/config.js.map +1 -0
  70. package/dist/lib/dates.d.ts +3 -0
  71. package/dist/lib/dates.d.ts.map +1 -0
  72. package/dist/lib/dates.js +44 -0
  73. package/dist/lib/dates.js.map +1 -0
  74. package/dist/lib/input.d.ts +3 -0
  75. package/dist/lib/input.d.ts.map +1 -0
  76. package/dist/lib/input.js +52 -0
  77. package/dist/lib/input.js.map +1 -0
  78. package/dist/lib/markdown.d.ts +2 -0
  79. package/dist/lib/markdown.d.ts.map +1 -0
  80. package/dist/lib/markdown.js +12 -0
  81. package/dist/lib/markdown.js.map +1 -0
  82. package/dist/lib/oauth-server.d.ts +13 -0
  83. package/dist/lib/oauth-server.d.ts.map +1 -0
  84. package/dist/lib/oauth-server.js +168 -0
  85. package/dist/lib/oauth-server.js.map +1 -0
  86. package/dist/lib/oauth.d.ts +28 -0
  87. package/dist/lib/oauth.d.ts.map +1 -0
  88. package/dist/lib/oauth.js +125 -0
  89. package/dist/lib/oauth.js.map +1 -0
  90. package/dist/lib/output.d.ts +22 -0
  91. package/dist/lib/output.d.ts.map +1 -0
  92. package/dist/lib/output.js +104 -0
  93. package/dist/lib/output.js.map +1 -0
  94. package/dist/lib/pkce.d.ts +16 -0
  95. package/dist/lib/pkce.d.ts.map +1 -0
  96. package/dist/lib/pkce.js +35 -0
  97. package/dist/lib/pkce.js.map +1 -0
  98. package/dist/lib/refs.d.ts +29 -0
  99. package/dist/lib/refs.d.ts.map +1 -0
  100. package/dist/lib/refs.js +168 -0
  101. package/dist/lib/refs.js.map +1 -0
  102. package/dist/lib/search-api.d.ts +25 -0
  103. package/dist/lib/search-api.d.ts.map +1 -0
  104. package/dist/lib/search-api.js +85 -0
  105. package/dist/lib/search-api.js.map +1 -0
  106. package/dist/lib/spinner.d.ts +20 -0
  107. package/dist/lib/spinner.d.ts.map +1 -0
  108. package/dist/lib/spinner.js +70 -0
  109. package/dist/lib/spinner.js.map +1 -0
  110. package/package.json +71 -0
@@ -0,0 +1,153 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { LoadingSpinner, withSpinner } from '../lib/spinner.js';
3
+ // Mock yocto-spinner
4
+ const mockSpinnerInstance = {
5
+ start: vi.fn().mockReturnThis(),
6
+ success: vi.fn(),
7
+ error: vi.fn(),
8
+ stop: vi.fn(),
9
+ };
10
+ vi.mock('yocto-spinner', () => ({
11
+ default: vi.fn(() => mockSpinnerInstance),
12
+ }));
13
+ // Mock chalk to avoid colors in tests
14
+ vi.mock('chalk', () => ({
15
+ default: {
16
+ green: vi.fn((text) => text),
17
+ yellow: vi.fn((text) => text),
18
+ blue: vi.fn((text) => text),
19
+ red: vi.fn((text) => text),
20
+ gray: vi.fn((text) => text),
21
+ cyan: vi.fn((text) => text),
22
+ magenta: vi.fn((text) => text),
23
+ },
24
+ }));
25
+ describe('withSpinner', () => {
26
+ beforeEach(() => {
27
+ vi.clearAllMocks();
28
+ // Reset environment variables
29
+ delete process.env.TW_SPINNER;
30
+ delete process.env.CI;
31
+ // Mock TTY as true by default
32
+ Object.defineProperty(process.stdout, 'isTTY', {
33
+ value: true,
34
+ configurable: true,
35
+ });
36
+ // Clear process.argv
37
+ process.argv = ['node', 'tw'];
38
+ });
39
+ afterEach(() => {
40
+ vi.clearAllMocks();
41
+ });
42
+ it('should handle successful operations', async () => {
43
+ const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
44
+ expect(result).toBe('success');
45
+ expect(mockSpinnerInstance.start).toHaveBeenCalled();
46
+ expect(mockSpinnerInstance.stop).toHaveBeenCalled();
47
+ expect(mockSpinnerInstance.error).not.toHaveBeenCalled();
48
+ });
49
+ it('should handle failed operations', async () => {
50
+ await expect(withSpinner({ text: 'Testing...', color: 'blue' }, async () => {
51
+ throw new Error('test error');
52
+ })).rejects.toThrow('test error');
53
+ expect(mockSpinnerInstance.start).toHaveBeenCalled();
54
+ expect(mockSpinnerInstance.error).toHaveBeenCalled();
55
+ expect(mockSpinnerInstance.stop).not.toHaveBeenCalled();
56
+ });
57
+ it('should not show spinner when noSpinner option is true', async () => {
58
+ const result = await withSpinner({ text: 'Testing...', color: 'blue', noSpinner: true }, async () => 'success');
59
+ expect(result).toBe('success');
60
+ expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
61
+ });
62
+ it('should not show spinner when TW_SPINNER=false', async () => {
63
+ process.env.TW_SPINNER = 'false';
64
+ const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
65
+ expect(result).toBe('success');
66
+ expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
67
+ });
68
+ it('should not show spinner in CI environment', async () => {
69
+ process.env.CI = 'true';
70
+ const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
71
+ expect(result).toBe('success');
72
+ expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
73
+ });
74
+ it('should not show spinner when not in TTY', async () => {
75
+ Object.defineProperty(process.stdout, 'isTTY', {
76
+ value: false,
77
+ configurable: true,
78
+ });
79
+ const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
80
+ expect(result).toBe('success');
81
+ expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
82
+ });
83
+ it('should not show spinner with --json flag', async () => {
84
+ process.argv = ['node', 'tw', 'auth', 'status', '--json'];
85
+ const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
86
+ expect(result).toBe('success');
87
+ expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
88
+ });
89
+ it('should not show spinner with --ndjson flag', async () => {
90
+ process.argv = ['node', 'tw', 'auth', 'status', '--ndjson'];
91
+ const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
92
+ expect(result).toBe('success');
93
+ expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
94
+ });
95
+ it('should not show spinner with --no-spinner flag', async () => {
96
+ process.argv = ['node', 'tw', 'auth', 'status', '--no-spinner'];
97
+ const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
98
+ expect(result).toBe('success');
99
+ expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
100
+ });
101
+ });
102
+ describe('LoadingSpinner', () => {
103
+ beforeEach(() => {
104
+ vi.clearAllMocks();
105
+ // Reset environment variables
106
+ delete process.env.TW_SPINNER;
107
+ delete process.env.CI;
108
+ // Mock TTY as true by default
109
+ Object.defineProperty(process.stdout, 'isTTY', {
110
+ value: true,
111
+ configurable: true,
112
+ });
113
+ // Clear process.argv
114
+ process.argv = ['node', 'tw'];
115
+ });
116
+ afterEach(() => {
117
+ vi.clearAllMocks();
118
+ });
119
+ it('should start and stop spinner', () => {
120
+ const spinner = new LoadingSpinner();
121
+ spinner.start({ text: 'Testing...', color: 'blue' });
122
+ expect(mockSpinnerInstance.start).toHaveBeenCalled();
123
+ spinner.stop();
124
+ expect(mockSpinnerInstance.stop).toHaveBeenCalled();
125
+ });
126
+ it('should show success message', () => {
127
+ const spinner = new LoadingSpinner();
128
+ spinner.start({ text: 'Testing...', color: 'blue' });
129
+ spinner.succeed('Operation completed');
130
+ expect(mockSpinnerInstance.success).toHaveBeenCalledWith('✓ Operation completed');
131
+ });
132
+ it('should show failure message', () => {
133
+ const spinner = new LoadingSpinner();
134
+ spinner.start({ text: 'Testing...', color: 'blue' });
135
+ spinner.fail('Operation failed');
136
+ expect(mockSpinnerInstance.error).toHaveBeenCalledWith('✗ Operation failed');
137
+ });
138
+ it('should handle multiple calls to stop gracefully', () => {
139
+ const spinner = new LoadingSpinner();
140
+ spinner.start({ text: 'Testing...', color: 'blue' });
141
+ spinner.stop();
142
+ spinner.stop(); // Should not throw
143
+ expect(mockSpinnerInstance.stop).toHaveBeenCalledTimes(1);
144
+ });
145
+ it('should handle succeed/fail without starting', () => {
146
+ const spinner = new LoadingSpinner();
147
+ spinner.succeed('Test'); // Should not throw
148
+ spinner.fail('Test'); // Should not throw
149
+ expect(mockSpinnerInstance.success).not.toHaveBeenCalled();
150
+ expect(mockSpinnerInstance.error).not.toHaveBeenCalled();
151
+ });
152
+ });
153
+ //# sourceMappingURL=spinner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.test.js","sourceRoot":"","sources":["../../src/__tests__/spinner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAuthCommand(program: Command): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgGnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc1D"}
@@ -0,0 +1,93 @@
1
+ import chalk from 'chalk';
2
+ import open from 'open';
3
+ import { getSessionUser } from '../lib/api.js';
4
+ import { clearApiToken, saveApiToken } from '../lib/auth.js';
5
+ import { getConfigPath } from '../lib/config.js';
6
+ import { buildAuthorizationUrl, exchangeCodeForToken, registerDynamicClient } from '../lib/oauth.js';
7
+ import { startCallbackServer } from '../lib/oauth-server.js';
8
+ import { generateCodeChallenge, generateCodeVerifier, generateState } from '../lib/pkce.js';
9
+ async function loginWithOAuth() {
10
+ console.log(chalk.blue('Starting OAuth authentication...'));
11
+ try {
12
+ // Register dynamic client
13
+ console.log(chalk.dim('Registering OAuth client...'));
14
+ const client = await registerDynamicClient();
15
+ // Generate PKCE parameters
16
+ const codeVerifier = generateCodeVerifier();
17
+ const codeChallenge = generateCodeChallenge(codeVerifier);
18
+ const state = generateState();
19
+ // Start callback server
20
+ console.log(chalk.dim('Starting local callback server...'));
21
+ let cleanup;
22
+ try {
23
+ // Open browser in background after a delay
24
+ setTimeout(async () => {
25
+ try {
26
+ const authUrl = buildAuthorizationUrl(client.client_id, codeChallenge, state);
27
+ console.log(chalk.dim('Opening browser for authorization...'));
28
+ console.log(chalk.dim(`If the browser doesn't open, visit: ${authUrl}`));
29
+ await open(authUrl);
30
+ }
31
+ catch {
32
+ // Browser opening failure is not critical - user can use the URL manually
33
+ }
34
+ }, 1000);
35
+ // Wait for callback - this gives us both code and cleanup
36
+ const result = await startCallbackServer(state);
37
+ cleanup = result.cleanup;
38
+ console.log(chalk.dim('Exchanging authorization code for token...'));
39
+ const accessToken = await exchangeCodeForToken(result.code, codeVerifier, client);
40
+ // Save token using existing logic
41
+ await saveApiToken(accessToken);
42
+ console.log(chalk.green('✓'), 'OAuth authentication successful!');
43
+ console.log(chalk.dim(`Token saved to ${getConfigPath()}`));
44
+ }
45
+ finally {
46
+ // Always cleanup the server
47
+ if (cleanup) {
48
+ cleanup();
49
+ }
50
+ }
51
+ }
52
+ catch (error) {
53
+ console.log(chalk.red('✗'), 'OAuth authentication failed');
54
+ console.log(chalk.dim(error instanceof Error ? error.message : 'Unknown error'));
55
+ console.log(chalk.dim('You can try manual authentication with `tw auth token <token>`'));
56
+ }
57
+ }
58
+ async function loginWithToken(token) {
59
+ // Save token to config
60
+ await saveApiToken(token.trim());
61
+ console.log(chalk.green('✓'), 'API token saved successfully!');
62
+ console.log(chalk.dim(`Token saved to ${getConfigPath()}`));
63
+ }
64
+ async function showStatus() {
65
+ try {
66
+ // Try to get session user to verify the token works
67
+ const user = await getSessionUser();
68
+ console.log(chalk.green('✓'), 'Authenticated');
69
+ console.log(` Email: ${user.email}`);
70
+ console.log(` Name: ${user.name}`);
71
+ }
72
+ catch {
73
+ console.log(chalk.yellow('Not authenticated'));
74
+ console.log(chalk.dim('Run `tw auth login` for OAuth or `tw auth token <token>` for manual authentication'));
75
+ }
76
+ }
77
+ async function logout() {
78
+ await clearApiToken();
79
+ console.log(chalk.green('✓'), 'Logged out');
80
+ console.log(chalk.dim(`Token removed from ${getConfigPath()}`));
81
+ }
82
+ export function registerAuthCommand(program) {
83
+ const auth = program.command('auth').description('Manage authentication');
84
+ auth.command('login')
85
+ .description('Authenticate using OAuth (opens browser)')
86
+ .action(loginWithOAuth);
87
+ auth.command('token <token>')
88
+ .description('Save API token to config file (manual method)')
89
+ .action(loginWithToken);
90
+ auth.command('status').description('Show current authentication status').action(showStatus);
91
+ auth.command('logout').description('Remove saved authentication token').action(logout);
92
+ }
93
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerChannelCommand(program: Command): void;
3
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuDnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS7D"}
@@ -0,0 +1,49 @@
1
+ import { getCurrentWorkspaceId, getTwistClient } from '../lib/api.js';
2
+ import { colors, formatJson, formatNdjson } from '../lib/output.js';
3
+ import { resolveWorkspaceRef } from '../lib/refs.js';
4
+ async function listChannels(workspaceRef, options) {
5
+ let workspaceId;
6
+ if (workspaceRef) {
7
+ const workspace = await resolveWorkspaceRef(workspaceRef);
8
+ workspaceId = workspace.id;
9
+ }
10
+ else if (options.workspace) {
11
+ const workspace = await resolveWorkspaceRef(options.workspace);
12
+ workspaceId = workspace.id;
13
+ }
14
+ else {
15
+ workspaceId = await getCurrentWorkspaceId();
16
+ }
17
+ const client = await getTwistClient();
18
+ const channels = await client.channels.getChannels({ workspaceId });
19
+ if (channels.length === 0) {
20
+ console.log('No channels found.');
21
+ return;
22
+ }
23
+ if (options.json) {
24
+ console.log(formatJson(channels, 'channel', options.full));
25
+ return;
26
+ }
27
+ if (options.ndjson) {
28
+ console.log(formatNdjson(channels, 'channel', options.full));
29
+ return;
30
+ }
31
+ for (const ch of channels) {
32
+ const id = colors.timestamp(`id:${ch.id}`);
33
+ const name = colors.channel(ch.name);
34
+ const archived = ch.archived ? colors.timestamp(' (archived)') : '';
35
+ const visibility = ch.public ? '' : colors.timestamp(' [private]');
36
+ console.log(`${id} ${name}${visibility}${archived}`);
37
+ }
38
+ }
39
+ export function registerChannelCommand(program) {
40
+ program
41
+ .command('channels [workspace-ref]')
42
+ .description('List channels in a workspace')
43
+ .option('--workspace <ref>', 'Workspace ID or name')
44
+ .option('--json', 'Output as JSON')
45
+ .option('--ndjson', 'Output as newline-delimited JSON')
46
+ .option('--full', 'Include all fields in JSON output')
47
+ .action(listChannels);
48
+ }
49
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AASpD,KAAK,UAAU,YAAY,CACvB,YAAgC,EAChC,OAAwB;IAExB,IAAI,WAAmB,CAAA;IAEvB,IAAI,YAAY,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAA;QACzD,WAAW,GAAG,SAAS,CAAC,EAAE,CAAA;IAC9B,CAAC;SAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC9D,WAAW,GAAG,SAAS,CAAC,EAAE,CAAA;IAC9B,CAAC;SAAM,CAAC;QACJ,WAAW,GAAG,MAAM,qBAAqB,EAAE,CAAA;IAC/C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;IAEnE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QACjC,OAAM;IACV,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QAC1D,OAAM;IACV,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5D,OAAM;IACV,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,UAAU,GAAG,QAAQ,EAAE,CAAC,CAAA;IACzD,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACnD,OAAO;SACF,OAAO,CAAC,0BAA0B,CAAC;SACnC,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,MAAM,CAAC,YAAY,CAAC,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerInboxCommand(program: Command): void;
3
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA+InC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc3D"}
@@ -0,0 +1,121 @@
1
+ import { getFullTwistURL } from '@doist/twist-sdk';
2
+ import chalk from 'chalk';
3
+ import { getCurrentWorkspaceId, getTwistClient } from '../lib/api.js';
4
+ import { formatRelativeDate } from '../lib/dates.js';
5
+ import { colors, formatJson, formatNdjson } from '../lib/output.js';
6
+ import { resolveWorkspaceRef } from '../lib/refs.js';
7
+ async function showInbox(workspaceRef, options) {
8
+ let workspaceId;
9
+ if (workspaceRef) {
10
+ const workspace = await resolveWorkspaceRef(workspaceRef);
11
+ workspaceId = workspace.id;
12
+ }
13
+ else if (options.workspace) {
14
+ const workspace = await resolveWorkspaceRef(options.workspace);
15
+ workspaceId = workspace.id;
16
+ }
17
+ else {
18
+ workspaceId = await getCurrentWorkspaceId();
19
+ }
20
+ const client = await getTwistClient();
21
+ const limit = options.limit ? parseInt(options.limit, 10) : 50;
22
+ const [threads, unreadData] = await client.batch(client.inbox.getInbox({
23
+ workspaceId,
24
+ since: options.since ? new Date(options.since) : undefined,
25
+ until: options.until ? new Date(options.until) : undefined,
26
+ limit,
27
+ }, { batch: true }), client.threads.getUnread(workspaceId, { batch: true }));
28
+ const unreadThreadIds = new Set(unreadData.data.map((u) => u.threadId));
29
+ let inboxThreads = threads.data.map((t) => ({
30
+ ...t,
31
+ isUnread: unreadThreadIds.has(t.id),
32
+ }));
33
+ if (options.unread) {
34
+ inboxThreads = inboxThreads.filter((t) => t.isUnread);
35
+ }
36
+ if (inboxThreads.length === 0) {
37
+ console.log('No threads in inbox.');
38
+ return;
39
+ }
40
+ const channelIds = [...new Set(inboxThreads.map((t) => t.channelId))];
41
+ const channelCalls = channelIds.map((id) => client.channels.getChannel(id, { batch: true }));
42
+ const channelResponses = await client.batch(...channelCalls);
43
+ const channelMap = new Map(channelResponses.map((r) => [r.data.id, r.data.name]));
44
+ if (options.channel) {
45
+ const filter = options.channel.toLowerCase();
46
+ const matchingChannelIds = new Set([...channelMap.entries()]
47
+ .filter(([, name]) => name.toLowerCase().includes(filter))
48
+ .map(([id]) => id));
49
+ inboxThreads = inboxThreads.filter((t) => matchingChannelIds.has(t.channelId));
50
+ if (inboxThreads.length === 0) {
51
+ console.log(`No threads in channels matching "${options.channel}".`);
52
+ return;
53
+ }
54
+ }
55
+ // Group by channel, unreads first within each channel, then sort by date (newest first)
56
+ const groupedByChannel = new Map();
57
+ for (const thread of inboxThreads) {
58
+ const group = groupedByChannel.get(thread.channelId) || [];
59
+ group.push(thread);
60
+ groupedByChannel.set(thread.channelId, group);
61
+ }
62
+ const sortByDate = (a, b) => new Date(b.posted).getTime() - new Date(a.posted).getTime();
63
+ const sortedChannelGroups = [];
64
+ for (const [, threads] of groupedByChannel) {
65
+ const unreads = threads.filter((t) => t.isUnread).sort(sortByDate);
66
+ const reads = threads.filter((t) => !t.isUnread).sort(sortByDate);
67
+ sortedChannelGroups.push(...unreads, ...reads);
68
+ }
69
+ if (options.json) {
70
+ const output = sortedChannelGroups.map((t) => ({
71
+ ...t,
72
+ channelName: channelMap.get(t.channelId),
73
+ url: getFullTwistURL({ workspaceId, channelId: t.channelId, threadId: t.id }),
74
+ }));
75
+ console.log(formatJson(output, 'thread', options.full));
76
+ return;
77
+ }
78
+ if (options.ndjson) {
79
+ const output = sortedChannelGroups.map((t) => ({
80
+ ...t,
81
+ channelName: channelMap.get(t.channelId),
82
+ url: getFullTwistURL({ workspaceId, channelId: t.channelId, threadId: t.id }),
83
+ }));
84
+ console.log(formatNdjson(output, 'thread', options.full));
85
+ return;
86
+ }
87
+ let currentChannelId = null;
88
+ for (const thread of sortedChannelGroups) {
89
+ if (thread.channelId !== currentChannelId) {
90
+ const channelName = channelMap.get(thread.channelId) || `ch:${thread.channelId}`;
91
+ if (currentChannelId !== null)
92
+ console.log('');
93
+ console.log(chalk.bold.blue(`[${channelName}]`));
94
+ console.log('');
95
+ currentChannelId = thread.channelId;
96
+ }
97
+ const title = thread.isUnread ? chalk.bold(thread.title) : thread.title;
98
+ const time = colors.timestamp(formatRelativeDate(thread.posted));
99
+ const unreadBadge = thread.isUnread ? chalk.blue(' *') : '';
100
+ console.log(` ${title}${unreadBadge}`);
101
+ console.log(` ${time} ${colors.timestamp(`id:${thread.id}`)}`);
102
+ console.log(` ${colors.url(getFullTwistURL({ workspaceId, channelId: thread.channelId, threadId: thread.id }))}`);
103
+ console.log('');
104
+ }
105
+ }
106
+ export function registerInboxCommand(program) {
107
+ program
108
+ .command('inbox [workspace-ref]')
109
+ .description('Show inbox threads')
110
+ .option('--workspace <ref>', 'Workspace ID or name')
111
+ .option('--channel <filter>', 'Filter by channel name (fuzzy match)')
112
+ .option('--unread', 'Only show unread threads')
113
+ .option('--since <date>', 'Filter by date (ISO format)')
114
+ .option('--until <date>', 'Filter by date')
115
+ .option('--limit <n>', 'Max items (default: 50)')
116
+ .option('--json', 'Output as JSON')
117
+ .option('--ndjson', 'Output as newline-delimited JSON')
118
+ .option('--full', 'Include all fields in JSON output')
119
+ .action(showInbox);
120
+ }
121
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerMsgCommand(program: Command): void;
3
+ //# sourceMappingURL=msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msg.d.ts","sourceRoot":"","sources":["../../src/commands/msg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA4PnC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+BzD"}