@doist/twist-cli 2.23.1 → 2.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/commands/auth/status.d.ts.map +1 -1
- package/dist/commands/auth/status.js +28 -24
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/auth/token.d.ts.map +1 -1
- package/dist/commands/auth/token.js +4 -7
- package/dist/commands/auth/token.js.map +1 -1
- package/dist/commands/away/helpers.d.ts.map +1 -1
- package/dist/commands/away/helpers.js +2 -4
- package/dist/commands/away/helpers.js.map +1 -1
- package/dist/commands/away/set.d.ts.map +1 -1
- package/dist/commands/away/set.js +2 -2
- package/dist/commands/away/set.js.map +1 -1
- package/dist/commands/changelog.d.ts.map +1 -1
- package/dist/commands/changelog.js +3 -6
- package/dist/commands/changelog.js.map +1 -1
- package/dist/commands/channel.d.ts.map +1 -1
- package/dist/commands/channel.js +3 -2
- package/dist/commands/channel.js.map +1 -1
- package/dist/commands/comment/update.d.ts.map +1 -1
- package/dist/commands/comment/update.js +2 -3
- package/dist/commands/comment/update.js.map +1 -1
- package/dist/commands/completion/install.d.ts.map +1 -1
- package/dist/commands/completion/install.js +2 -3
- package/dist/commands/completion/install.js.map +1 -1
- package/dist/commands/conversation/helpers.d.ts.map +1 -1
- package/dist/commands/conversation/helpers.js +4 -3
- package/dist/commands/conversation/helpers.js.map +1 -1
- package/dist/commands/conversation/reply.d.ts.map +1 -1
- package/dist/commands/conversation/reply.js +2 -3
- package/dist/commands/conversation/reply.js.map +1 -1
- package/dist/commands/conversation/unread.d.ts.map +1 -1
- package/dist/commands/conversation/unread.js +4 -2
- package/dist/commands/conversation/unread.js.map +1 -1
- package/dist/commands/conversation/with.d.ts.map +1 -1
- package/dist/commands/conversation/with.js +36 -41
- package/dist/commands/conversation/with.js.map +1 -1
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +5 -3
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/msg/update.d.ts.map +1 -1
- package/dist/commands/msg/update.js +2 -3
- package/dist/commands/msg/update.js.map +1 -1
- package/dist/commands/react.d.ts.map +1 -1
- package/dist/commands/react.js +3 -4
- package/dist/commands/react.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +18 -31
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/skill/install.d.ts.map +1 -1
- package/dist/commands/skill/install.js +8 -13
- package/dist/commands/skill/install.js.map +1 -1
- package/dist/commands/skill/uninstall.d.ts.map +1 -1
- package/dist/commands/skill/uninstall.js +7 -11
- package/dist/commands/skill/uninstall.js.map +1 -1
- package/dist/commands/skill/update.d.ts.map +1 -1
- package/dist/commands/skill/update.js +9 -14
- package/dist/commands/skill/update.js.map +1 -1
- package/dist/commands/thread/create.d.ts.map +1 -1
- package/dist/commands/thread/create.js +2 -3
- package/dist/commands/thread/create.js.map +1 -1
- package/dist/commands/thread/delete.d.ts.map +1 -1
- package/dist/commands/thread/delete.js +3 -6
- package/dist/commands/thread/delete.js.map +1 -1
- package/dist/commands/thread/helpers.d.ts.map +1 -1
- package/dist/commands/thread/helpers.js +2 -1
- package/dist/commands/thread/helpers.js.map +1 -1
- package/dist/commands/thread/mute.d.ts.map +1 -1
- package/dist/commands/thread/mute.js +2 -2
- package/dist/commands/thread/mute.js.map +1 -1
- package/dist/commands/thread/reply.d.ts.map +1 -1
- package/dist/commands/thread/reply.js +3 -6
- package/dist/commands/thread/reply.js.map +1 -1
- package/dist/commands/update/action.d.ts.map +1 -1
- package/dist/commands/update/action.js +13 -20
- package/dist/commands/update/action.js.map +1 -1
- package/dist/commands/update/switch.d.ts.map +1 -1
- package/dist/commands/update/switch.js +3 -6
- package/dist/commands/update/switch.js.map +1 -1
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +2 -1
- package/dist/commands/user.js.map +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +3 -2
- package/dist/commands/view.js.map +1 -1
- package/dist/index.js +19 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +3 -2
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/auth.d.ts +4 -0
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +10 -3
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/errors.d.ts +14 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +13 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/global-args.d.ts +38 -0
- package/dist/lib/global-args.d.ts.map +1 -0
- package/dist/lib/global-args.js +100 -0
- package/dist/lib/global-args.js.map +1 -0
- package/dist/lib/input.d.ts +0 -1
- package/dist/lib/input.d.ts.map +1 -1
- package/dist/lib/input.js +1 -8
- package/dist/lib/input.js.map +1 -1
- package/dist/lib/oauth.d.ts.map +1 -1
- package/dist/lib/oauth.js +14 -9
- package/dist/lib/oauth.js.map +1 -1
- package/dist/lib/output.d.ts +4 -1
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +23 -5
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/permissions.d.ts.map +1 -1
- package/dist/lib/permissions.js +2 -1
- package/dist/lib/permissions.js.map +1 -1
- package/dist/lib/progress.d.ts.map +1 -1
- package/dist/lib/progress.js +3 -18
- package/dist/lib/progress.js.map +1 -1
- package/dist/lib/public-channels.d.ts +0 -1
- package/dist/lib/public-channels.d.ts.map +1 -1
- package/dist/lib/public-channels.js +5 -8
- package/dist/lib/public-channels.js.map +1 -1
- package/dist/lib/refs.d.ts.map +1 -1
- package/dist/lib/refs.js +15 -18
- package/dist/lib/refs.js.map +1 -1
- package/dist/lib/search-api.d.ts.map +1 -1
- package/dist/lib/search-api.js +2 -1
- package/dist/lib/search-api.js.map +1 -1
- package/dist/lib/skills/create-installer.d.ts.map +1 -1
- package/dist/lib/skills/create-installer.js +5 -4
- package/dist/lib/skills/create-installer.js.map +1 -1
- package/dist/lib/spinner.d.ts.map +1 -1
- package/dist/lib/spinner.js +1 -22
- package/dist/lib/spinner.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized, type-safe parsing of global CLI flags.
|
|
3
|
+
*
|
|
4
|
+
* Replaces scattered `process.argv.includes()` checks with a single parse
|
|
5
|
+
* that correctly handles `--flag=value` variants and avoids false-positives
|
|
6
|
+
* from option values.
|
|
7
|
+
*
|
|
8
|
+
* The result is lazily cached on first access — safe to call before or after
|
|
9
|
+
* Commander's `parseAsync()` since it reads `process.argv` directly.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Parse well-known global flags from an argv array.
|
|
13
|
+
*
|
|
14
|
+
* Pure function — pass an explicit array for testing, or omit to use
|
|
15
|
+
* `process.argv`.
|
|
16
|
+
*/
|
|
17
|
+
export function parseGlobalArgs(argv) {
|
|
18
|
+
const args = argv ?? process.argv;
|
|
19
|
+
const has = (flag) => args.includes(flag) || args.some((arg) => arg.startsWith(`${flag}=`));
|
|
20
|
+
// Parse --progress-jsonl with optional path value.
|
|
21
|
+
// Supports: --progress-jsonl, --progress-jsonl=path, --progress-jsonl path
|
|
22
|
+
// "Last one wins" when specified multiple times.
|
|
23
|
+
const progressIndices = args
|
|
24
|
+
.map((arg, index) => ({ arg, index }))
|
|
25
|
+
.filter(({ arg }) => arg === '--progress-jsonl' || arg.startsWith('--progress-jsonl='));
|
|
26
|
+
let progressJsonlPath;
|
|
27
|
+
if (progressIndices.length > 0) {
|
|
28
|
+
const { arg, index } = progressIndices[progressIndices.length - 1];
|
|
29
|
+
if (arg.includes('=')) {
|
|
30
|
+
progressJsonlPath = arg.slice(arg.indexOf('=') + 1);
|
|
31
|
+
}
|
|
32
|
+
else if (index + 1 < args.length && !args[index + 1].startsWith('-')) {
|
|
33
|
+
progressJsonlPath = args[index + 1];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
json: has('--json'),
|
|
38
|
+
ndjson: has('--ndjson'),
|
|
39
|
+
noSpinner: has('--no-spinner'),
|
|
40
|
+
progressJsonl: progressIndices.length > 0,
|
|
41
|
+
progressJsonlPath,
|
|
42
|
+
includePrivateChannels: has('--include-private-channels'),
|
|
43
|
+
accessible: has('--accessible'),
|
|
44
|
+
nonInteractive: has('--non-interactive'),
|
|
45
|
+
interactive: has('--interactive'),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Cached singleton
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
let cached = null;
|
|
52
|
+
function getGlobalArgs() {
|
|
53
|
+
if (!cached) {
|
|
54
|
+
cached = parseGlobalArgs();
|
|
55
|
+
}
|
|
56
|
+
return cached;
|
|
57
|
+
}
|
|
58
|
+
/** Clear the cached parse result. Call in test teardown. */
|
|
59
|
+
export function resetGlobalArgs() {
|
|
60
|
+
cached = null;
|
|
61
|
+
}
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Query functions — drop-in replacements for the old process.argv checks
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
export function isJsonMode() {
|
|
66
|
+
return getGlobalArgs().json;
|
|
67
|
+
}
|
|
68
|
+
export function isAccessible() {
|
|
69
|
+
return process.env.TW_ACCESSIBLE === '1' || getGlobalArgs().accessible;
|
|
70
|
+
}
|
|
71
|
+
export function isNonInteractive() {
|
|
72
|
+
const args = getGlobalArgs();
|
|
73
|
+
if (args.interactive)
|
|
74
|
+
return false;
|
|
75
|
+
if (args.nonInteractive)
|
|
76
|
+
return true;
|
|
77
|
+
return !process.stdin.isTTY;
|
|
78
|
+
}
|
|
79
|
+
export function includePrivateChannels() {
|
|
80
|
+
const envVal = process.env.TWIST_INCLUDE_PRIVATE_CHANNELS;
|
|
81
|
+
if (envVal === '1' || envVal === 'true') {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
return getGlobalArgs().includePrivateChannels;
|
|
85
|
+
}
|
|
86
|
+
export function shouldDisableSpinner() {
|
|
87
|
+
if (process.env.TW_SPINNER === 'false')
|
|
88
|
+
return true;
|
|
89
|
+
if (process.env.CI)
|
|
90
|
+
return true;
|
|
91
|
+
const args = getGlobalArgs();
|
|
92
|
+
return args.json || args.ndjson || args.noSpinner || args.progressJsonl || args.nonInteractive;
|
|
93
|
+
}
|
|
94
|
+
export function isProgressJsonlEnabled() {
|
|
95
|
+
return getGlobalArgs().progressJsonl;
|
|
96
|
+
}
|
|
97
|
+
export function getProgressJsonlPath() {
|
|
98
|
+
return getGlobalArgs().progressJsonlPath;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=global-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-args.js","sourceRoot":"","sources":["../../src/lib/global-args.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/input.d.ts
CHANGED
package/dist/lib/input.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/lib/input.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/lib/input.ts"],"names":[],"mappings":"AAQA,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2CxD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoCzD"}
|
package/dist/lib/input.js
CHANGED
|
@@ -2,14 +2,7 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import { readFile, unlink, writeFile } from 'node:fs/promises';
|
|
3
3
|
import { tmpdir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
|
|
6
|
-
const args = process.argv;
|
|
7
|
-
if (args.includes('--interactive'))
|
|
8
|
-
return false;
|
|
9
|
-
if (args.includes('--non-interactive'))
|
|
10
|
-
return true;
|
|
11
|
-
return !process.stdin.isTTY;
|
|
12
|
-
}
|
|
5
|
+
import { isNonInteractive } from './global-args.js';
|
|
13
6
|
const STDIN_TIMEOUT_MS = 100;
|
|
14
7
|
export async function readStdin() {
|
|
15
8
|
if (process.stdin.isTTY) {
|
package/dist/lib/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/lib/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/lib/input.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/oauth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,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,CAmDlE;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,CAoDjB"}
|
package/dist/lib/oauth.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OAuth flow coordination for Twist API authentication
|
|
3
3
|
*/
|
|
4
|
+
import { CliError } from './errors.js';
|
|
4
5
|
// OAuth configuration for Twist (using well-known endpoints with dynamic client registration)
|
|
5
6
|
export const AUTHORIZATION_URL = 'https://twist.com/oauth/authorize';
|
|
6
7
|
export const TOKEN_URL = 'https://twist.com/oauth/access_token';
|
|
@@ -60,11 +61,11 @@ export async function registerDynamicClient() {
|
|
|
60
61
|
});
|
|
61
62
|
if (!response.ok) {
|
|
62
63
|
const errorText = await response.text();
|
|
63
|
-
throw new
|
|
64
|
+
throw new CliError('AUTH_FAILED', `Client registration failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
64
65
|
}
|
|
65
66
|
const result = await response.json();
|
|
66
67
|
if (!result.client_id || !result.client_secret) {
|
|
67
|
-
throw new
|
|
68
|
+
throw new CliError('AUTH_FAILED', 'Invalid client registration response: missing client_id or client_secret');
|
|
68
69
|
}
|
|
69
70
|
return {
|
|
70
71
|
client_id: result.client_id,
|
|
@@ -72,10 +73,12 @@ export async function registerDynamicClient() {
|
|
|
72
73
|
};
|
|
73
74
|
}
|
|
74
75
|
catch (error) {
|
|
76
|
+
if (error instanceof CliError)
|
|
77
|
+
throw error;
|
|
75
78
|
if (error instanceof Error) {
|
|
76
|
-
throw new
|
|
79
|
+
throw new CliError('AUTH_FAILED', `Failed to register OAuth client: ${error.message}`);
|
|
77
80
|
}
|
|
78
|
-
throw new
|
|
81
|
+
throw new CliError('AUTH_FAILED', 'Failed to register OAuth client: Unknown error');
|
|
79
82
|
}
|
|
80
83
|
}
|
|
81
84
|
/**
|
|
@@ -119,22 +122,24 @@ export async function exchangeCodeForToken(code, codeVerifier, client) {
|
|
|
119
122
|
});
|
|
120
123
|
if (!response.ok) {
|
|
121
124
|
const errorText = await response.text();
|
|
122
|
-
throw new
|
|
125
|
+
throw new CliError('AUTH_FAILED', `Token exchange failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
123
126
|
}
|
|
124
127
|
const data = await response.json();
|
|
125
128
|
if (data.error) {
|
|
126
|
-
throw new
|
|
129
|
+
throw new CliError('AUTH_FAILED', `OAuth error: ${data.error} - ${data.error_description || 'Unknown error'}`);
|
|
127
130
|
}
|
|
128
131
|
if (!data.access_token) {
|
|
129
|
-
throw new
|
|
132
|
+
throw new CliError('AUTH_FAILED', 'No access token received from OAuth server');
|
|
130
133
|
}
|
|
131
134
|
return data.access_token;
|
|
132
135
|
}
|
|
133
136
|
catch (error) {
|
|
137
|
+
if (error instanceof CliError)
|
|
138
|
+
throw error;
|
|
134
139
|
if (error instanceof Error) {
|
|
135
|
-
throw new
|
|
140
|
+
throw new CliError('AUTH_FAILED', `Failed to exchange code for token: ${error.message}`);
|
|
136
141
|
}
|
|
137
|
-
throw new
|
|
142
|
+
throw new CliError('AUTH_FAILED', 'Failed to exchange code for token: Unknown error');
|
|
138
143
|
}
|
|
139
144
|
}
|
|
140
145
|
//# sourceMappingURL=oauth.js.map
|
package/dist/lib/oauth.js.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/output.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CliError } from './errors.js';
|
|
1
2
|
export declare const colors: {
|
|
2
3
|
author: import("chalk").ChalkInstance;
|
|
3
4
|
timestamp: import("chalk").ChalkInstance;
|
|
@@ -17,9 +18,11 @@ export interface PaginatedOutput<T> {
|
|
|
17
18
|
}
|
|
18
19
|
export declare function formatPaginatedJson<T extends object>(data: PaginatedOutput<T>, type?: EntityType, full?: boolean): string;
|
|
19
20
|
export declare function formatPaginatedNdjson<T extends object>(data: PaginatedOutput<T>, type?: EntityType, full?: boolean): string;
|
|
21
|
+
export declare function formatError(error: CliError): string;
|
|
20
22
|
export declare function formatError(message: string): string;
|
|
23
|
+
export declare function formatErrorJson(error: CliError): string;
|
|
24
|
+
export declare function formatErrorJson(code: string, message: string, hints?: string[]): string;
|
|
21
25
|
export declare function printError(message: string): void;
|
|
22
26
|
export declare function printJson<T extends object>(data: T | T[], type?: EntityType, full?: boolean): void;
|
|
23
27
|
export declare function printNdjson<T extends object>(items: T[], type?: EntityType, full?: boolean): void;
|
|
24
|
-
export declare function isAccessible(): boolean;
|
|
25
28
|
//# sourceMappingURL=output.d.ts.map
|
package/dist/lib/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,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,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAA;AACpD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;AAmBpD,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAA;AACxD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;AAcxF,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"}
|
package/dist/lib/output.js
CHANGED
|
@@ -110,8 +110,29 @@ export function formatPaginatedNdjson(data, type, full = false) {
|
|
|
110
110
|
}
|
|
111
111
|
return lines.join('\n');
|
|
112
112
|
}
|
|
113
|
-
export function formatError(
|
|
114
|
-
|
|
113
|
+
export function formatError(messageOrError) {
|
|
114
|
+
if (typeof messageOrError === 'string') {
|
|
115
|
+
return colors.error(messageOrError);
|
|
116
|
+
}
|
|
117
|
+
const color = messageOrError.type === 'info' ? chalk.yellow : chalk.red;
|
|
118
|
+
const lines = messageOrError.type === 'info'
|
|
119
|
+
? [messageOrError.message]
|
|
120
|
+
: [`Error: ${messageOrError.code}`, messageOrError.message];
|
|
121
|
+
if (messageOrError.hints && messageOrError.hints.length > 0) {
|
|
122
|
+
lines.push('');
|
|
123
|
+
for (const hint of messageOrError.hints) {
|
|
124
|
+
lines.push(` - ${hint}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return color(lines.join('\n'));
|
|
128
|
+
}
|
|
129
|
+
export function formatErrorJson(codeOrError, message, hints) {
|
|
130
|
+
if (typeof codeOrError === 'string') {
|
|
131
|
+
return JSON.stringify({ error: { code: codeOrError, message, hints } });
|
|
132
|
+
}
|
|
133
|
+
return JSON.stringify({
|
|
134
|
+
error: { code: codeOrError.code, message: codeOrError.message, hints: codeOrError.hints },
|
|
135
|
+
});
|
|
115
136
|
}
|
|
116
137
|
export function printError(message) {
|
|
117
138
|
console.error(formatError(message));
|
|
@@ -122,7 +143,4 @@ export function printJson(data, type, full = false) {
|
|
|
122
143
|
export function printNdjson(items, type, full = false) {
|
|
123
144
|
console.log(formatNdjson(items, type, full));
|
|
124
145
|
}
|
|
125
|
-
export function isAccessible() {
|
|
126
|
-
return process.env.TW_ACCESSIBLE === '1' || process.argv.includes('--accessible');
|
|
127
|
-
}
|
|
128
146
|
//# sourceMappingURL=output.js.map
|
package/dist/lib/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,wHACqF,CAAA;AA0BzH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKxD"}
|
package/dist/lib/permissions.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getAuthMetadata } from './auth.js';
|
|
2
|
+
import { CliError } from './errors.js';
|
|
2
3
|
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
|
/**
|
|
4
5
|
* Known read-only API method paths. Any method not in this set is assumed to be mutating.
|
|
@@ -29,7 +30,7 @@ export function isMutatingMethod(methodPath) {
|
|
|
29
30
|
export async function ensureWriteAllowed() {
|
|
30
31
|
const metadata = await getAuthMetadata();
|
|
31
32
|
if (metadata.authMode === 'read-only') {
|
|
32
|
-
throw new
|
|
33
|
+
throw new CliError('READ_ONLY', READ_ONLY_ERROR_MESSAGE);
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,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,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAA;IAC5D,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAGA,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;IAwB1B,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"}
|
package/dist/lib/progress.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
+
import { getProgressJsonlPath, isProgressJsonlEnabled } from './global-args.js';
|
|
2
3
|
export class ProgressTracker {
|
|
3
4
|
enabled = false;
|
|
4
5
|
outputStream = null;
|
|
@@ -6,27 +7,11 @@ export class ProgressTracker {
|
|
|
6
7
|
this.checkAndInitialize();
|
|
7
8
|
}
|
|
8
9
|
checkAndInitialize() {
|
|
9
|
-
|
|
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) {
|
|
10
|
+
if (!isProgressJsonlEnabled()) {
|
|
15
11
|
return;
|
|
16
12
|
}
|
|
17
13
|
this.enabled = true;
|
|
18
|
-
|
|
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
|
-
}
|
|
14
|
+
const outputPath = getProgressJsonlPath();
|
|
30
15
|
if (outputPath) {
|
|
31
16
|
try {
|
|
32
17
|
this.outputStream = fs.createWriteStream(outputPath, { flags: 'a' });
|
package/dist/lib/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export declare function includePrivateChannels(): boolean;
|
|
2
1
|
export declare function getPublicChannelIds(workspaceId: number): Promise<Set<number>>;
|
|
3
2
|
export declare function clearPublicChannelCache(): void;
|
|
4
3
|
export declare function assertChannelIsPublic(channelId: number, workspaceId: number): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-channels.d.ts","sourceRoot":"","sources":["../../src/lib/public-channels.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"public-channels.d.ts","sourceRoot":"","sources":["../../src/lib/public-channels.ts"],"names":[],"mappings":"AAMA,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAYnF;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjG"}
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { getTwistClient } from './api.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if (envVal === '1' || envVal === 'true') {
|
|
5
|
-
return true;
|
|
6
|
-
}
|
|
7
|
-
return process.argv.includes('--include-private-channels');
|
|
8
|
-
}
|
|
2
|
+
import { CliError } from './errors.js';
|
|
3
|
+
import { includePrivateChannels } from './global-args.js';
|
|
9
4
|
const publicChannelCache = new Map();
|
|
10
5
|
export async function getPublicChannelIds(workspaceId) {
|
|
11
6
|
const cached = publicChannelCache.get(workspaceId);
|
|
@@ -29,7 +24,9 @@ export async function assertChannelIsPublic(channelId, workspaceId) {
|
|
|
29
24
|
return;
|
|
30
25
|
const publicIds = await getPublicChannelIds(workspaceId);
|
|
31
26
|
if (!publicIds.has(channelId)) {
|
|
32
|
-
throw new
|
|
27
|
+
throw new CliError('NOT_FOUND', 'This thread belongs to a private channel.', [
|
|
28
|
+
'Use --include-private-channels to access it',
|
|
29
|
+
]);
|
|
33
30
|
}
|
|
34
31
|
}
|
|
35
32
|
//# sourceMappingURL=public-channels.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-channels.js","sourceRoot":"","sources":["../../src/lib/public-channels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"public-channels.js","sourceRoot":"","sources":["../../src/lib/public-channels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAClD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;IACnE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACxB,IAAI,EAAE,CAAC,MAAM;YAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC;IACD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAC9C,OAAO,SAAS,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACnC,kBAAkB,CAAC,KAAK,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB,EAAE,WAAmB;IAC9E,IAAI,sBAAsB,EAAE;QAAE,OAAM;IACpC,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAA;IACxD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,2CAA2C,EAAE;YACzE,6CAA6C;SAChD,CAAC,CAAA;IACN,CAAC;AACL,CAAC"}
|
package/dist/lib/refs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/lib/refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/lib/refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAQjD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAInD;AAED,MAAM,WAAW,cAAc;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA8ChE;AAED,wBAAgB,QAAQ,CACpB,GAAG,EAAE,MAAM,GAET;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmBnC;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA2CzE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAenD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAepD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAepD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAezD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAepD;AAED,MAAM,MAAM,aAAa,GAAG;IACxB,UAAU,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAA;IAC7D,GAAG,EAAE,MAAM,CAAA;CACd,CAAA;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUlE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAetD;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmC1F"}
|
package/dist/lib/refs.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { fetchWorkspaces } from './api.js';
|
|
2
|
+
import { CliError } from './errors.js';
|
|
2
3
|
function normalizeRef(ref) {
|
|
3
4
|
return ref.trim();
|
|
4
5
|
}
|
|
@@ -9,7 +10,7 @@ export function extractId(ref) {
|
|
|
9
10
|
const normalized = normalizeRef(ref);
|
|
10
11
|
const idStr = isIdRef(normalized) ? normalized.slice(3).trim() : normalized;
|
|
11
12
|
if (!/^\d+$/.test(idStr)) {
|
|
12
|
-
throw new
|
|
13
|
+
throw new CliError('INVALID_ID', `Invalid ID: ${ref}`);
|
|
13
14
|
}
|
|
14
15
|
return Number(idStr);
|
|
15
16
|
}
|
|
@@ -81,14 +82,14 @@ export async function resolveWorkspaceRef(ref) {
|
|
|
81
82
|
if (parsed.type === 'id') {
|
|
82
83
|
const workspace = workspaces.find((w) => w.id === parsed.id);
|
|
83
84
|
if (!workspace) {
|
|
84
|
-
throw new
|
|
85
|
+
throw new CliError('WORKSPACE_NOT_FOUND', `Workspace with ID ${parsed.id} not found`);
|
|
85
86
|
}
|
|
86
87
|
return workspace;
|
|
87
88
|
}
|
|
88
89
|
if (parsed.type === 'url' && parsed.parsed.workspaceId) {
|
|
89
90
|
const workspace = workspaces.find((w) => w.id === parsed.parsed.workspaceId);
|
|
90
91
|
if (!workspace) {
|
|
91
|
-
throw new
|
|
92
|
+
throw new CliError('WORKSPACE_NOT_FOUND', `Workspace with ID ${parsed.parsed.workspaceId} not found`);
|
|
92
93
|
}
|
|
93
94
|
return workspace;
|
|
94
95
|
}
|
|
@@ -105,10 +106,10 @@ export async function resolveWorkspaceRef(ref) {
|
|
|
105
106
|
.slice(0, 5)
|
|
106
107
|
.map((w) => `"${w.name}" (id:${w.id})`)
|
|
107
108
|
.join(', ');
|
|
108
|
-
throw new
|
|
109
|
+
throw new CliError('AMBIGUOUS_WORKSPACE', `Multiple workspaces match "${ref}": ${matches}`);
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
|
-
throw new
|
|
112
|
+
throw new CliError('WORKSPACE_NOT_FOUND', `Workspace "${ref}" not found`);
|
|
112
113
|
}
|
|
113
114
|
export function resolveThreadId(ref) {
|
|
114
115
|
const parsed = parseRef(ref);
|
|
@@ -118,7 +119,7 @@ export function resolveThreadId(ref) {
|
|
|
118
119
|
if (parsed.type === 'url' && parsed.parsed.threadId) {
|
|
119
120
|
return parsed.parsed.threadId;
|
|
120
121
|
}
|
|
121
|
-
throw new
|
|
122
|
+
throw new CliError('INVALID_REF', `Invalid thread reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
122
123
|
}
|
|
123
124
|
export function resolveChannelId(ref) {
|
|
124
125
|
const parsed = parseRef(ref);
|
|
@@ -128,7 +129,7 @@ export function resolveChannelId(ref) {
|
|
|
128
129
|
if (parsed.type === 'url' && parsed.parsed.channelId) {
|
|
129
130
|
return parsed.parsed.channelId;
|
|
130
131
|
}
|
|
131
|
-
throw new
|
|
132
|
+
throw new CliError('INVALID_REF', `Invalid channel reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
132
133
|
}
|
|
133
134
|
export function resolveCommentId(ref) {
|
|
134
135
|
const parsed = parseRef(ref);
|
|
@@ -138,7 +139,7 @@ export function resolveCommentId(ref) {
|
|
|
138
139
|
if (parsed.type === 'url' && parsed.parsed.commentId) {
|
|
139
140
|
return parsed.parsed.commentId;
|
|
140
141
|
}
|
|
141
|
-
throw new
|
|
142
|
+
throw new CliError('INVALID_REF', `Invalid comment reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
142
143
|
}
|
|
143
144
|
export function resolveConversationId(ref) {
|
|
144
145
|
const parsed = parseRef(ref);
|
|
@@ -148,7 +149,7 @@ export function resolveConversationId(ref) {
|
|
|
148
149
|
if (parsed.type === 'url' && parsed.parsed.conversationId) {
|
|
149
150
|
return parsed.parsed.conversationId;
|
|
150
151
|
}
|
|
151
|
-
throw new
|
|
152
|
+
throw new CliError('INVALID_REF', `Invalid conversation reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
152
153
|
}
|
|
153
154
|
export function resolveMessageId(ref) {
|
|
154
155
|
const parsed = parseRef(ref);
|
|
@@ -158,7 +159,7 @@ export function resolveMessageId(ref) {
|
|
|
158
159
|
if (parsed.type === 'url' && parsed.parsed.messageId) {
|
|
159
160
|
return parsed.parsed.messageId;
|
|
160
161
|
}
|
|
161
|
-
throw new
|
|
162
|
+
throw new CliError('INVALID_REF', `Invalid message reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
162
163
|
}
|
|
163
164
|
export function classifyTwistUrl(url) {
|
|
164
165
|
const parsed = parseTwistUrl(url);
|
|
@@ -178,17 +179,13 @@ export function parseUserIdRefs(refs) {
|
|
|
178
179
|
return refs.split(',').map((userRef) => {
|
|
179
180
|
const trimmed = userRef.trim();
|
|
180
181
|
if (!trimmed) {
|
|
181
|
-
|
|
182
|
-
process.exit(1);
|
|
183
|
-
return 0;
|
|
182
|
+
throw new CliError('INVALID_REF', 'Invalid user reference list: found empty value');
|
|
184
183
|
}
|
|
185
184
|
try {
|
|
186
185
|
return extractId(trimmed);
|
|
187
186
|
}
|
|
188
187
|
catch {
|
|
189
|
-
|
|
190
|
-
process.exit(1);
|
|
191
|
-
return 0;
|
|
188
|
+
throw new CliError('INVALID_REF', `Invalid user reference: ${trimmed}. Use 123 or id:123`);
|
|
192
189
|
}
|
|
193
190
|
});
|
|
194
191
|
}
|
|
@@ -206,11 +203,11 @@ export async function resolveUserRefs(refs, workspaceId) {
|
|
|
206
203
|
const query = ref.toLowerCase();
|
|
207
204
|
const matches = users.filter((u) => u.name.toLowerCase().includes(query) || u.email?.toLowerCase().includes(query));
|
|
208
205
|
if (matches.length === 0) {
|
|
209
|
-
throw new
|
|
206
|
+
throw new CliError('USER_NOT_FOUND', `No user found matching "${ref}"`);
|
|
210
207
|
}
|
|
211
208
|
if (matches.length > 1) {
|
|
212
209
|
const list = matches.map((u) => ` ${u.id} ${u.name} <${u.email ?? ''}>`).join('\n');
|
|
213
|
-
throw new
|
|
210
|
+
throw new CliError('AMBIGUOUS_USER', `Multiple users match "${ref}":\n${list}\n\nUse numeric ID to specify.`);
|
|
214
211
|
}
|
|
215
212
|
ids.push(matches[0].id);
|
|
216
213
|
}
|