@doist/twist-cli 2.21.1 → 2.21.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/__mocks__/chalk.d.ts +3 -0
- package/dist/__mocks__/chalk.d.ts.map +1 -0
- package/dist/__mocks__/chalk.js +8 -0
- package/dist/__mocks__/chalk.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +155 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/away.d.ts +3 -0
- package/dist/commands/away.d.ts.map +1 -0
- package/dist/commands/away.js +120 -0
- package/dist/commands/away.js.map +1 -0
- package/dist/commands/changelog.d.ts +8 -0
- package/dist/commands/changelog.d.ts.map +1 -0
- package/dist/commands/changelog.js +113 -0
- package/dist/commands/changelog.js.map +1 -0
- package/dist/commands/channel.d.ts +3 -0
- package/dist/commands/channel.d.ts.map +1 -0
- package/dist/commands/channel.js +53 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/comment.d.ts +3 -0
- package/dist/commands/comment.d.ts.map +1 -0
- package/dist/commands/comment.js +99 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +121 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/conversation.d.ts +3 -0
- package/dist/commands/conversation.d.ts.map +1 -0
- package/dist/commands/conversation.js +458 -0
- package/dist/commands/conversation.js.map +1 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +127 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/msg.d.ts +3 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +103 -0
- package/dist/commands/msg.js.map +1 -0
- package/dist/commands/react.d.ts +3 -0
- package/dist/commands/react.d.ts.map +1 -0
- package/dist/commands/react.js +102 -0
- package/dist/commands/react.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +160 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +119 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/thread/create.d.ts +7 -0
- package/dist/commands/thread/create.d.ts.map +1 -0
- package/dist/commands/thread/create.js +45 -0
- package/dist/commands/thread/create.js.map +1 -0
- package/dist/commands/thread/helpers.d.ts +10 -0
- package/dist/commands/thread/helpers.d.ts.map +1 -0
- package/dist/commands/thread/helpers.js +27 -0
- package/dist/commands/thread/helpers.js.map +1 -0
- package/dist/commands/thread/mutate.d.ts +5 -0
- package/dist/commands/thread/mutate.d.ts.map +1 -0
- package/dist/commands/thread/mutate.js +21 -0
- package/dist/commands/thread/mutate.js.map +1 -0
- package/dist/commands/thread/mute.d.ts +8 -0
- package/dist/commands/thread/mute.d.ts.map +1 -0
- package/dist/commands/thread/mute.js +58 -0
- package/dist/commands/thread/mute.js.map +1 -0
- package/dist/commands/thread/reply.d.ts +9 -0
- package/dist/commands/thread/reply.d.ts.map +1 -0
- package/dist/commands/thread/reply.js +68 -0
- package/dist/commands/thread/reply.js.map +1 -0
- package/dist/commands/thread/view.d.ts +9 -0
- package/dist/commands/thread/view.d.ts.map +1 -0
- package/dist/commands/thread/view.js +175 -0
- package/dist/commands/thread/view.js.map +1 -0
- package/dist/commands/thread.d.ts +3 -0
- package/dist/commands/thread.d.ts.map +1 -0
- package/dist/commands/thread.js +70 -0
- package/dist/commands/thread.js.map +1 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +91 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/user.d.ts +3 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +67 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/view.d.ts +3 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +63 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +48 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +20 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +229 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +21 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +189 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/completion.d.ts +31 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +173 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/config.d.ts +13 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +26 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dates.d.ts +3 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +44 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/input.d.ts +3 -0
- package/dist/lib/input.d.ts.map +1 -0
- package/dist/lib/input.js +52 -0
- package/dist/lib/input.js.map +1 -0
- package/dist/lib/markdown.d.ts +2 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +16 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/oauth-server.d.ts +13 -0
- package/dist/lib/oauth-server.d.ts.map +1 -0
- package/dist/lib/oauth-server.js +824 -0
- package/dist/lib/oauth-server.js.map +1 -0
- package/dist/lib/oauth.d.ts +31 -0
- package/dist/lib/oauth.d.ts.map +1 -0
- package/dist/lib/oauth.js +140 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/options.d.ts +17 -0
- package/dist/lib/options.d.ts.map +1 -0
- package/dist/lib/options.js +2 -0
- package/dist/lib/options.js.map +1 -0
- package/dist/lib/output.d.ts +25 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +128 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/permissions.d.ts +4 -0
- package/dist/lib/permissions.d.ts.map +1 -0
- package/dist/lib/permissions.js +35 -0
- package/dist/lib/permissions.js.map +1 -0
- package/dist/lib/pkce.d.ts +16 -0
- package/dist/lib/pkce.d.ts.map +1 -0
- package/dist/lib/pkce.js +35 -0
- package/dist/lib/pkce.js.map +1 -0
- package/dist/lib/progress.d.ts +29 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +101 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/lib/public-channels.d.ts +5 -0
- package/dist/lib/public-channels.d.ts.map +1 -0
- package/dist/lib/public-channels.js +35 -0
- package/dist/lib/public-channels.js.map +1 -0
- package/dist/lib/refs.d.ts +37 -0
- package/dist/lib/refs.d.ts.map +1 -0
- package/dist/lib/refs.js +219 -0
- package/dist/lib/refs.js.map +1 -0
- package/dist/lib/search-api.d.ts +25 -0
- package/dist/lib/search-api.d.ts.map +1 -0
- package/dist/lib/search-api.js +85 -0
- package/dist/lib/search-api.js.map +1 -0
- package/dist/lib/secure-store.d.ts +11 -0
- package/dist/lib/secure-store.d.ts.map +1 -0
- package/dist/lib/secure-store.js +57 -0
- package/dist/lib/secure-store.js.map +1 -0
- package/dist/lib/skills/content.d.ts +5 -0
- package/dist/lib/skills/content.d.ts.map +1 -0
- package/dist/lib/skills/content.js +286 -0
- package/dist/lib/skills/content.js.map +1 -0
- package/dist/lib/skills/create-installer.d.ts +9 -0
- package/dist/lib/skills/create-installer.d.ts.map +1 -0
- package/dist/lib/skills/create-installer.js +60 -0
- package/dist/lib/skills/create-installer.js.map +1 -0
- package/dist/lib/skills/index.d.ts +7 -0
- package/dist/lib/skills/index.d.ts.map +1 -0
- package/dist/lib/skills/index.js +54 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/types.d.ts +30 -0
- package/dist/lib/skills/types.d.ts.map +1 -0
- package/dist/lib/skills/types.js +2 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/lib/skills/update-installed.d.ts +9 -0
- package/dist/lib/skills/update-installed.d.ts.map +1 -0
- package/dist/lib/skills/update-installed.js +20 -0
- package/dist/lib/skills/update-installed.js.map +1 -0
- package/dist/lib/spinner.d.ts +24 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +126 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/postinstall.d.ts +2 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +3 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +3 -2
|
@@ -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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|
package/dist/lib/pkce.js
ADDED
|
@@ -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
|