@doist/comms-cli 1.4.0 → 1.6.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 (72) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +5 -3
  3. package/dist/commands/auth/helpers.d.ts +2 -0
  4. package/dist/commands/auth/helpers.d.ts.map +1 -1
  5. package/dist/commands/auth/helpers.js +52 -0
  6. package/dist/commands/auth/helpers.js.map +1 -1
  7. package/dist/commands/auth/login.d.ts.map +1 -1
  8. package/dist/commands/auth/login.js +13 -4
  9. package/dist/commands/auth/login.js.map +1 -1
  10. package/dist/commands/auth/status.d.ts +5 -8
  11. package/dist/commands/auth/status.d.ts.map +1 -1
  12. package/dist/commands/auth/status.js +28 -22
  13. package/dist/commands/auth/status.js.map +1 -1
  14. package/dist/commands/config/view.d.ts.map +1 -1
  15. package/dist/commands/config/view.js +7 -1
  16. package/dist/commands/config/view.js.map +1 -1
  17. package/dist/commands/doctor.js +2 -2
  18. package/dist/commands/doctor.js.map +1 -1
  19. package/dist/commands/thread/index.d.ts.map +1 -1
  20. package/dist/commands/thread/index.js +19 -0
  21. package/dist/commands/thread/index.js.map +1 -1
  22. package/dist/commands/thread/read.d.ts +4 -0
  23. package/dist/commands/thread/read.d.ts.map +1 -0
  24. package/dist/commands/thread/read.js +109 -0
  25. package/dist/commands/thread/read.js.map +1 -0
  26. package/dist/commands/view.d.ts.map +1 -1
  27. package/dist/commands/view.js +2 -7
  28. package/dist/commands/view.js.map +1 -1
  29. package/dist/lib/api.d.ts +4 -1
  30. package/dist/lib/api.d.ts.map +1 -1
  31. package/dist/lib/api.js +13 -6
  32. package/dist/lib/api.js.map +1 -1
  33. package/dist/lib/auth-pages.d.ts.map +1 -1
  34. package/dist/lib/auth-pages.js +173 -302
  35. package/dist/lib/auth-pages.js.map +1 -1
  36. package/dist/lib/auth-provider.d.ts +41 -18
  37. package/dist/lib/auth-provider.d.ts.map +1 -1
  38. package/dist/lib/auth-provider.js +368 -81
  39. package/dist/lib/auth-provider.js.map +1 -1
  40. package/dist/lib/auth.d.ts +12 -1
  41. package/dist/lib/auth.d.ts.map +1 -1
  42. package/dist/lib/auth.js +41 -10
  43. package/dist/lib/auth.js.map +1 -1
  44. package/dist/lib/comms-account.d.ts +6 -0
  45. package/dist/lib/comms-account.d.ts.map +1 -1
  46. package/dist/lib/comms-account.js +6 -0
  47. package/dist/lib/comms-account.js.map +1 -1
  48. package/dist/lib/config.d.ts +14 -0
  49. package/dist/lib/config.d.ts.map +1 -1
  50. package/dist/lib/config.js +76 -0
  51. package/dist/lib/config.js.map +1 -1
  52. package/dist/lib/errors.d.ts +1 -1
  53. package/dist/lib/errors.d.ts.map +1 -1
  54. package/dist/lib/errors.js.map +1 -1
  55. package/dist/lib/input.d.ts +1 -0
  56. package/dist/lib/input.d.ts.map +1 -1
  57. package/dist/lib/input.js +27 -0
  58. package/dist/lib/input.js.map +1 -1
  59. package/dist/lib/refs.d.ts +2 -0
  60. package/dist/lib/refs.d.ts.map +1 -1
  61. package/dist/lib/refs.js +62 -26
  62. package/dist/lib/refs.js.map +1 -1
  63. package/dist/lib/search-api.d.ts.map +1 -1
  64. package/dist/lib/search-api.js +8 -4
  65. package/dist/lib/search-api.js.map +1 -1
  66. package/dist/lib/skills/content.d.ts +1 -1
  67. package/dist/lib/skills/content.d.ts.map +1 -1
  68. package/dist/lib/skills/content.js +16 -3
  69. package/dist/lib/skills/content.js.map +1 -1
  70. package/dist/lib/user-records.js +27 -0
  71. package/dist/lib/user-records.js.map +1 -1
  72. package/package.json +3 -3
@@ -1,17 +1,17 @@
1
1
  import { type AccountRef, type AuthAccount, type AuthProvider, type KeyringTokenStore } from '@doist/cli-core/auth';
2
2
  import { type AuthMode } from './config.js';
3
- export declare const AUTHORIZATION_URL = "https://comms.todoist.com/oauth/authorize";
4
- export declare const TOKEN_URL = "https://comms.todoist.com/oauth/access_token";
5
- export declare const REGISTRATION_URL = "https://comms.todoist.com/oauth/register";
6
- export declare const READ_WRITE_SCOPES: string[];
7
3
  export declare const READ_ONLY_SCOPES: string[];
4
+ export declare const READ_WRITE_SCOPES: string[];
5
+ export declare const FULL_ACCESS_SCOPES: string[];
8
6
  /**
9
- * The scope set a login is granted, as a pure function of `--read-only`. Single
10
- * source of truth shared by `attachCommsLoginCommand`'s `resolveScopes` (what we
11
- * request at authorize) and the provider's `validate` (what we record on the
12
- * account), so the two can't drift.
7
+ * Single source of truth shared by `attachCommsLoginCommand`'s `resolveScopes`
8
+ * (what we request at authorize) and the provider's token-response fallback
9
+ * (what we record on the account), so the two can't drift.
13
10
  */
14
- export declare function getScopes(readOnly: boolean): string[];
11
+ export declare function getScopes({ readOnly, fullAccess, }: {
12
+ readOnly: boolean;
13
+ fullAccess?: boolean;
14
+ }): string[];
15
15
  /**
16
16
  * Narrow account shape: only fields that round-trip through the local token
17
17
  * store. `id` is the stringified numeric Comms user id (so cli-core's
@@ -24,6 +24,9 @@ export type CommsAccount = AuthAccount & {
24
24
  label: string;
25
25
  authMode: AuthMode;
26
26
  authScope: string;
27
+ oauthClientId?: string;
28
+ authBaseUrl?: string;
29
+ authResource?: string;
27
30
  };
28
31
  export type CommsTokenStore = KeyringTokenStore<CommsAccount>;
29
32
  /**
@@ -36,18 +39,38 @@ export type CommsTokenStore = KeyringTokenStore<CommsAccount>;
36
39
  export declare const MANUAL_TOKEN_ACCOUNT: CommsAccount;
37
40
  /** True when `account` is the identity-less snapshot produced by `tdc auth token`. */
38
41
  export declare function isManualTokenAccount(account: Pick<CommsAccount, 'id' | 'label'>): boolean;
42
+ export type CommsOAuthConfig = {
43
+ authBaseUrl: string;
44
+ authorizationUrl: string;
45
+ tokenUrl: string;
46
+ registrationUrl: string;
47
+ resource: string;
48
+ };
39
49
  /**
40
- * Comms's OAuth flow uses RFC 7591 Dynamic Client Registration: each login
41
- * mints a fresh `client_id` / `client_secret`, then runs the standard PKCE
42
- * authorize + token exchange. cli-core's `createDcrProvider` drives all of that
43
- * via `oauth4webapi`; the only comms-specific piece is `validate`, which probes
44
- * `getSessionUser` and records the auth mode/scope the login was granted.
50
+ * Todoist is the OAuth authorization server; Comms is the protected resource.
51
+ * The CLI registers as a public DCR client (PKCE, no client secret) and pins
52
+ * tokens to the Comms resource via the RFC 8707 `resource` indicator. The
53
+ * registration / authorize / token-exchange / refresh mechanics all live in
54
+ * cli-core's `createDcrProvider`; the Comms-specific behaviour is:
45
55
  *
46
- * `authMode` / `authScope` are derived from `handshake.readOnly` (folded in by
47
- * `runOAuthFlow`) rather than threaded through `authorize`, because the scope
48
- * set is itself a pure function of `readOnly` (see `resolveScopes` in login.ts).
56
+ * - endpoint + resource resolution from `COMMS_BASE_URL` / `COMMS_AS_URL`
57
+ * (see `getCommsOAuthResource` / `getTodoistAuthBaseUrl`),
58
+ * - caching the registered `client_id` in config (`loadClient` / `saveClient`),
59
+ * - recording the server-granted scope on the account (the `exchangeCode`
60
+ * wrapper stashes it on the handshake for `validate`; `refreshToken`
61
+ * refreshes it), and
62
+ * - `validate`: probe `getSessionUser`, derive `authMode` from the granted
63
+ * scope, and build the `CommsAccount`.
64
+ */
65
+ export declare function createCommsAuthProvider(fetchImpl?: typeof fetch): AuthProvider<CommsAccount>;
66
+ /**
67
+ * The handshake `refreshAccessToken` forwards to the provider's
68
+ * `refreshToken`. cli-core doesn't persist the DCR handshake, so we
69
+ * reconstruct it from the stored account: `clientId` (read by cli-core's
70
+ * refresh grant), the resource / auth base URL (read by the endpoint
71
+ * resolvers), and the identity fields (read by `buildRefreshAccount`).
49
72
  */
50
- export declare function createCommsAuthProvider(): AuthProvider<CommsAccount>;
73
+ export declare function getCommsOAuthRefreshHandshake(account: CommsAccount): Record<string, unknown>;
51
74
  /**
52
75
  * Accepts `42`, `id:42`, and case-insensitive labels — `parseRef` normalises
53
76
  * the numeric forms. Broader than cli-core's default strict-equality matcher.
@@ -1 +1 @@
1
- {"version":3,"file":"auth-provider.d.ts","sourceRoot":"","sources":["../../src/lib/auth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EAGjB,KAAK,iBAAiB,EACzB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EAAE,KAAK,QAAQ,EAA4B,MAAM,aAAa,CAAA;AAKrE,eAAO,MAAM,iBAAiB,8CAA8C,CAAA;AAC5E,eAAO,MAAM,SAAS,iDAAiD,CAAA;AACvE,eAAO,MAAM,gBAAgB,6CAA6C,CAAA;AAK1E,eAAO,MAAM,iBAAiB,UAsB7B,CAAA;AAED,eAAO,MAAM,gBAAgB,UAY5B,CAAA;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAErD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAA;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAKlC,CAAA;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,OAAO,CAEzF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,IAAI,YAAY,CAAC,YAAY,CAAC,CAwCpE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAUjF;AAmBD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACpC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,UAAU,GAChB,OAAO,CAAC,YAAY,CAAC,CAcvB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CA4CvD;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,KAAK,GAAG,cAAc,GAAG,aAAa,CAAC,CAM5F"}
1
+ {"version":3,"file":"auth-provider.d.ts","sourceRoot":"","sources":["../../src/lib/auth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EAMjB,KAAK,iBAAiB,EAKzB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EACH,KAAK,QAAQ,EAKhB,MAAM,aAAa,CAAA;AAUpB,eAAO,MAAM,gBAAgB,UAM5B,CAAA;AAaD,eAAO,MAAM,iBAAiB,UAAiD,CAAA;AAE/E,eAAO,MAAM,kBAAkB,UAAsD,CAAA;AAOrF;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACtB,QAAQ,EACR,UAAkB,GACrB,EAAE;IACC,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,MAAM,EAAE,CAGX;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAA;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAKlC,CAAA;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,OAAO,CAEzF;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CACnC,SAAS,GAAE,OAAO,KAAa,GAChC,YAAY,CAAC,YAAY,CAAC,CAgD5B;AAmED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB5F;AAuPD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAUjF;AAmBD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACpC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,UAAU,GAChB,OAAO,CAAC,YAAY,CAAC,CAcvB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAmDvD;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,KAAK,GAAG,cAAc,GAAG,aAAa,CAAC,CAM5F"}
@@ -1,60 +1,44 @@
1
1
  import { createDcrProvider, createKeyringTokenStore, } from '@doist/cli-core/auth';
2
2
  import { createWrappedCommsClient } from './api.js';
3
3
  import { SECURE_STORE_SERVICE } from './auth-constants.js';
4
- import { toCommsAccount } from './comms-account.js';
5
- import { getConfig, getConfigPath } from './config.js';
4
+ import { makeCommsAccount, toCommsAccount } from './comms-account.js';
5
+ import { getConfig, getConfigPath, updateConfig, } from './config.js';
6
6
  import { CliError } from './errors.js';
7
7
  import { parseRef } from './refs.js';
8
8
  import { createCommsUserRecordStore, getDefaultUserRecord } from './user-records.js';
9
- export const AUTHORIZATION_URL = 'https://comms.todoist.com/oauth/authorize';
10
- export const TOKEN_URL = 'https://comms.todoist.com/oauth/access_token';
11
- export const REGISTRATION_URL = 'https://comms.todoist.com/oauth/register';
12
- const LOGO_URI = 'https://raw.githubusercontent.com/Doist/comms-cli/d65c447ff453eb36af585044c2f5f2f602bcdb34/icons/comms-cli.png';
13
- export const READ_WRITE_SCOPES = [
14
- 'user:read',
15
- 'user:write',
16
- 'workspaces:read',
17
- 'channels:read',
18
- 'channels:write',
19
- 'channels:remove',
20
- 'threads:read',
21
- 'threads:write',
22
- 'comments:read',
23
- 'comments:write',
24
- 'messages:read',
25
- 'messages:write',
26
- 'reactions:read',
27
- 'reactions:write',
28
- 'groups:read',
29
- 'groups:write',
30
- 'groups:remove',
31
- 'search:read',
32
- 'notifications:read',
33
- 'attachments:read',
34
- 'attachments:write',
35
- ];
9
+ const DEFAULT_TODOIST_AUTH_BASE_URL = 'https://todoist.com';
10
+ const DEFAULT_COMMS_OAUTH_RESOURCE = 'https://comms.todoist.com';
11
+ const LOGO_URI = 'https://raw.githubusercontent.com/doist/comms-cli/main/icons/comms-cli.png';
36
12
  export const READ_ONLY_SCOPES = [
37
13
  'user:read',
38
14
  'workspaces:read',
39
- 'channels:read',
40
- 'threads:read',
41
- 'comments:read',
42
- 'messages:read',
43
- 'reactions:read',
44
- 'groups:read',
45
- 'search:read',
46
- 'notifications:read',
47
- 'attachments:read',
15
+ 'comms:channels:read',
16
+ 'comms:content:read',
17
+ 'comms:messages:read',
48
18
  ];
19
+ const DEFAULT_WRITE_SCOPES = ['comms:content:write', 'comms:messages:write'];
20
+ const FULL_ACCESS_EXTRA_SCOPES = [
21
+ 'user:write',
22
+ 'workspaces:write',
23
+ 'comms:channels:write',
24
+ 'comms:channels:delete',
25
+ 'comms:content:delete',
26
+ 'comms:messages:delete',
27
+ ];
28
+ export const READ_WRITE_SCOPES = [...READ_ONLY_SCOPES, ...DEFAULT_WRITE_SCOPES];
29
+ export const FULL_ACCESS_SCOPES = [...READ_WRITE_SCOPES, ...FULL_ACCESS_EXTRA_SCOPES];
49
30
  const AUTH_HINTS = ['Try again: tdc auth login', 'Or set COMMS_API_TOKEN environment variable'];
31
+ const WRITE_SCOPES = new Set([...DEFAULT_WRITE_SCOPES, ...FULL_ACCESS_EXTRA_SCOPES]);
32
+ const MAX_CACHED_OAUTH_CLIENTS = 25;
50
33
  /**
51
- * The scope set a login is granted, as a pure function of `--read-only`. Single
52
- * source of truth shared by `attachCommsLoginCommand`'s `resolveScopes` (what we
53
- * request at authorize) and the provider's `validate` (what we record on the
54
- * account), so the two can't drift.
34
+ * Single source of truth shared by `attachCommsLoginCommand`'s `resolveScopes`
35
+ * (what we request at authorize) and the provider's token-response fallback
36
+ * (what we record on the account), so the two can't drift.
55
37
  */
56
- export function getScopes(readOnly) {
57
- return readOnly ? READ_ONLY_SCOPES : READ_WRITE_SCOPES;
38
+ export function getScopes({ readOnly, fullAccess = false, }) {
39
+ if (readOnly)
40
+ return READ_ONLY_SCOPES;
41
+ return fullAccess ? FULL_ACCESS_SCOPES : READ_WRITE_SCOPES;
58
42
  }
59
43
  /**
60
44
  * Sentinel for the `{ id: '', label: '' }` snapshot that `tdc auth token`
@@ -74,53 +58,353 @@ export function isManualTokenAccount(account) {
74
58
  return !account.id || !account.label;
75
59
  }
76
60
  /**
77
- * Comms's OAuth flow uses RFC 7591 Dynamic Client Registration: each login
78
- * mints a fresh `client_id` / `client_secret`, then runs the standard PKCE
79
- * authorize + token exchange. cli-core's `createDcrProvider` drives all of that
80
- * via `oauth4webapi`; the only comms-specific piece is `validate`, which probes
81
- * `getSessionUser` and records the auth mode/scope the login was granted.
61
+ * Todoist is the OAuth authorization server; Comms is the protected resource.
62
+ * The CLI registers as a public DCR client (PKCE, no client secret) and pins
63
+ * tokens to the Comms resource via the RFC 8707 `resource` indicator. The
64
+ * registration / authorize / token-exchange / refresh mechanics all live in
65
+ * cli-core's `createDcrProvider`; the Comms-specific behaviour is:
82
66
  *
83
- * `authMode` / `authScope` are derived from `handshake.readOnly` (folded in by
84
- * `runOAuthFlow`) rather than threaded through `authorize`, because the scope
85
- * set is itself a pure function of `readOnly` (see `resolveScopes` in login.ts).
67
+ * - endpoint + resource resolution from `COMMS_BASE_URL` / `COMMS_AS_URL`
68
+ * (see `getCommsOAuthResource` / `getTodoistAuthBaseUrl`),
69
+ * - caching the registered `client_id` in config (`loadClient` / `saveClient`),
70
+ * - recording the server-granted scope on the account (the `exchangeCode`
71
+ * wrapper stashes it on the handshake for `validate`; `refreshToken`
72
+ * refreshes it), and
73
+ * - `validate`: probe `getSessionUser`, derive `authMode` from the granted
74
+ * scope, and build the `CommsAccount`.
86
75
  */
87
- export function createCommsAuthProvider() {
88
- return createDcrProvider({
89
- registrationUrl: REGISTRATION_URL,
90
- authorizeUrl: AUTHORIZATION_URL,
91
- tokenUrl: TOKEN_URL,
76
+ export function createCommsAuthProvider(fetchImpl = fetch) {
77
+ const base = createDcrProvider({
78
+ registrationUrl: ({ handshake }) => getOAuthConfigForHandshake(handshake).registrationUrl,
79
+ authorizeUrl: ({ handshake }) => getOAuthConfigForHandshake(handshake).authorizationUrl,
80
+ tokenUrl: ({ handshake }) => getOAuthConfigForHandshake(handshake).tokenUrl,
81
+ resource: ({ handshake }) => getOAuthConfigForHandshake(handshake).resource,
92
82
  clientMetadata: {
93
83
  clientName: 'Comms CLI',
94
84
  clientUri: 'https://github.com/doist/comms-cli',
95
85
  logoUri: LOGO_URI,
96
- applicationType: 'native',
97
- // Comms client_ids can contain `_`. oauth4webapi's
98
- // `client_secret_basic` form-url-encodes the Basic credential per
99
- // RFC 6749 §2.3.1 (`_` → `%5F`), and the token endpoint doesn't
100
- // url-decode it, so the lookup fails with "client_id not found".
101
- // `client_secret_post` sends the credential in the body via
102
- // URLSearchParams, which preserves `_`, sidestepping the mismatch.
103
- tokenEndpointAuthMethod: 'client_secret_post',
86
+ tokenEndpointAuthMethod: 'none',
87
+ grantTypes: ['authorization_code', 'refresh_token'],
88
+ responseTypes: ['code'],
89
+ // DCR scope is the upper bound this public client may request.
90
+ // Per-login authorize scopes are still narrowed by `resolveScopes`;
91
+ // keeping registration broad lets one cached client serve read-only,
92
+ // default, and full-access logins.
93
+ extra: { scope: FULL_ACCESS_SCOPES.join(' ') },
104
94
  },
95
+ loadClient: loadCachedClient,
96
+ saveClient: saveCachedClient,
97
+ validate: validateCommsToken,
105
98
  errorHints: AUTH_HINTS,
106
- async validate({ token, handshake }) {
107
- // `runOAuthFlow` folds a boolean `readOnly` into the handshake.
108
- // Fail closed on a missing/malformed value rather than letting
109
- // `Boolean(undefined)` silently grant read-write (which would relax
110
- // the local write guard).
111
- const readOnly = handshake.readOnly;
112
- if (typeof readOnly !== 'boolean') {
113
- throw new CliError('AUTH_FAILED', 'Internal: auth handshake missing the readOnly flag.', AUTH_HINTS);
114
- }
115
- const client = createWrappedCommsClient(token);
116
- const user = await client.users.getSessionUser();
117
- return toCommsAccount(user, {
118
- authMode: readOnly ? 'read-only' : 'read-write',
119
- authScope: getScopes(readOnly).join(' '),
120
- });
99
+ fetchImpl,
100
+ });
101
+ return {
102
+ ...base,
103
+ async exchangeCode(input) {
104
+ const exchange = await base.exchangeCode(input);
105
+ // cli-core threads this same handshake object into `validateToken`
106
+ // next, so stash the server-granted scope (so `validate` records the
107
+ // authoritative scope) and the token-response diagnostics (so a
108
+ // Comms rejection can explain what Todoist actually issued).
109
+ if (exchange.scope)
110
+ input.handshake.grantedScope = exchange.scope;
111
+ input.handshake.tokenDiagnostics = describeTokenResponse(exchange);
112
+ return exchange;
113
+ },
114
+ async refreshToken(input) {
115
+ const exchange = await base.refreshToken(input);
116
+ const grantedScope = exchange.scope ?? optionalHandshakeString(input.handshake, 'authScope');
117
+ const account = grantedScope
118
+ ? buildRefreshAccount(input.handshake, grantedScope)
119
+ : undefined;
120
+ return account ? { ...exchange, account } : exchange;
121
121
  },
122
+ };
123
+ }
124
+ /**
125
+ * Probe `getSessionUser` to confirm the token works, then build a
126
+ * `CommsAccount`. Granted scope comes from the server (stashed on the
127
+ * handshake by `exchangeCode`); it falls back to the requested scope set when
128
+ * the token endpoint didn't echo one.
129
+ */
130
+ async function validateCommsToken({ token, handshake }) {
131
+ const readOnly = requireHandshakeReadOnly(handshake);
132
+ const grantedScope = optionalHandshakeString(handshake, 'grantedScope') ??
133
+ getScopes({ readOnly, fullAccess: isFullAccessHandshake(handshake) }).join(' ');
134
+ const authMode = getAuthModeForGrantedScope(grantedScope);
135
+ const config = getOAuthConfigForHandshake(handshake);
136
+ const client = createWrappedCommsClient(token, { baseUrl: config.resource });
137
+ let user;
138
+ try {
139
+ user = await client.users.getSessionUser();
140
+ }
141
+ catch (error) {
142
+ if (hasErrorCode(error, 'FORBIDDEN')) {
143
+ const diagnostics = Array.isArray(handshake.tokenDiagnostics)
144
+ ? handshake.tokenDiagnostics
145
+ : [];
146
+ throw new CliError('AUTH_FAILED', 'Comms rejected the OAuth token during validation.', [
147
+ ...diagnostics,
148
+ 'Check Comms logs for Todoist OAuth introspection: active, aud, exp, scope, user_id/sub',
149
+ ]);
150
+ }
151
+ throw error;
152
+ }
153
+ return toCommsAccount(user, {
154
+ authMode,
155
+ authScope: normalizeScopeString(grantedScope),
156
+ oauthClientId: requireHandshakeString(handshake, 'clientId', 'AUTH_FAILED'),
157
+ authBaseUrl: config.authBaseUrl,
158
+ authResource: config.resource,
159
+ });
160
+ }
161
+ /**
162
+ * Rebuild the rotated `CommsAccount` after a refresh so the stored
163
+ * `authScope` / `authMode` track the (possibly changed) granted scope. Returns
164
+ * `undefined` when the refresh handshake lacks the identity fields, leaving the
165
+ * previously-stored account in place.
166
+ */
167
+ function buildRefreshAccount(handshake, grantedScope) {
168
+ const id = optionalHandshakeString(handshake, 'accountId');
169
+ const label = optionalHandshakeString(handshake, 'accountLabel');
170
+ const clientId = optionalHandshakeString(handshake, 'clientId');
171
+ if (!id || !label || !clientId)
172
+ return undefined;
173
+ const config = getOAuthConfigForHandshake(handshake);
174
+ return makeCommsAccount({
175
+ id,
176
+ label,
177
+ authMode: getAuthModeForGrantedScope(grantedScope),
178
+ authScope: normalizeScopeString(grantedScope),
179
+ oauthClientId: clientId,
180
+ authBaseUrl: config.authBaseUrl,
181
+ authResource: config.resource,
122
182
  });
123
183
  }
184
+ /**
185
+ * The handshake `refreshAccessToken` forwards to the provider's
186
+ * `refreshToken`. cli-core doesn't persist the DCR handshake, so we
187
+ * reconstruct it from the stored account: `clientId` (read by cli-core's
188
+ * refresh grant), the resource / auth base URL (read by the endpoint
189
+ * resolvers), and the identity fields (read by `buildRefreshAccount`).
190
+ */
191
+ export function getCommsOAuthRefreshHandshake(account) {
192
+ if (!account.oauthClientId || !account.authBaseUrl || !account.authResource) {
193
+ throw new CliError('NO_TOKEN', 'Stored OAuth token cannot be refreshed because its client metadata is missing.', ['Run: tdc auth login']);
194
+ }
195
+ return {
196
+ clientId: account.oauthClientId,
197
+ accountId: account.id,
198
+ accountLabel: account.label,
199
+ authScope: account.authScope,
200
+ authBaseUrl: account.authBaseUrl,
201
+ resource: account.authResource,
202
+ };
203
+ }
204
+ /** Endpoint + resource config derived from the environment (login path). */
205
+ function getCommsOAuthConfig() {
206
+ const resource = getCommsOAuthResource();
207
+ return buildCommsOAuthConfig(getTodoistAuthBaseUrl(resource), resource);
208
+ }
209
+ /**
210
+ * Endpoint + resource config for a provider hook. Prefers values carried on
211
+ * the handshake (the refresh path reconstructs them from the stored account)
212
+ * and falls back to the environment (the login path, where the handshake
213
+ * doesn't carry them).
214
+ */
215
+ function getOAuthConfigForHandshake(handshake) {
216
+ const resource = optionalHandshakeString(handshake, 'resource') ?? getCommsOAuthResource();
217
+ const authBaseUrl = optionalHandshakeString(handshake, 'authBaseUrl') ?? getTodoistAuthBaseUrl(resource);
218
+ return buildCommsOAuthConfig(authBaseUrl, resource);
219
+ }
220
+ function buildCommsOAuthConfig(authBaseUrl, resource) {
221
+ return {
222
+ authBaseUrl,
223
+ authorizationUrl: `${authBaseUrl}/oauth/authorize`,
224
+ tokenUrl: `${authBaseUrl}/oauth/access_token`,
225
+ registrationUrl: `${authBaseUrl}/oauth/register`,
226
+ resource,
227
+ };
228
+ }
229
+ /**
230
+ * `loadClient` hook: reuse a registered `client_id` cached in config for the
231
+ * current auth server + resource + redirect URI. Keying on `redirectUri` is
232
+ * required — the registration is bound to its `redirect_uris` and the callback
233
+ * port can change between logins.
234
+ */
235
+ async function loadCachedClient(input) {
236
+ const config = getCommsOAuthConfig();
237
+ const { oauthClients } = await getConfig();
238
+ const cached = (Array.isArray(oauthClients) ? oauthClients : [])
239
+ .filter(isStoredOAuthClient)
240
+ .find((client) => client.authBaseUrl === config.authBaseUrl &&
241
+ client.authResource === config.resource &&
242
+ client.redirectUri === input.redirectUri);
243
+ return cached ? { clientId: cached.clientId } : undefined;
244
+ }
245
+ /** `saveClient` hook: persist a freshly registered public client for reuse. */
246
+ async function saveCachedClient(client, input) {
247
+ const config = getCommsOAuthConfig();
248
+ const entry = {
249
+ clientId: client.clientId,
250
+ authBaseUrl: config.authBaseUrl,
251
+ authResource: config.resource,
252
+ redirectUri: input.redirectUri,
253
+ };
254
+ const stored = await getConfig();
255
+ const existing = (Array.isArray(stored.oauthClients) ? stored.oauthClients : [])
256
+ .filter(isStoredOAuthClient)
257
+ .filter((other) => other.authBaseUrl !== entry.authBaseUrl ||
258
+ other.authResource !== entry.authResource ||
259
+ other.redirectUri !== entry.redirectUri);
260
+ await updateConfig({
261
+ oauthClients: [...existing, entry].slice(-MAX_CACHED_OAUTH_CLIENTS),
262
+ });
263
+ }
264
+ function isStoredOAuthClient(value) {
265
+ if (!value || typeof value !== 'object' || Array.isArray(value))
266
+ return false;
267
+ const record = value;
268
+ return (typeof record.clientId === 'string' &&
269
+ typeof record.authBaseUrl === 'string' &&
270
+ typeof record.authResource === 'string' &&
271
+ typeof record.redirectUri === 'string');
272
+ }
273
+ function getCommsOAuthResource() {
274
+ const override = process.env.COMMS_BASE_URL;
275
+ if (!override)
276
+ return DEFAULT_COMMS_OAUTH_RESOURCE;
277
+ let url;
278
+ try {
279
+ url = new URL(override);
280
+ }
281
+ catch {
282
+ throw new CliError('INVALID_URL', `COMMS_BASE_URL is not a valid URL: ${override}`, [
283
+ 'Use a URL like https://comms.todoist.com',
284
+ 'Or unset COMMS_BASE_URL before running OAuth login',
285
+ ]);
286
+ }
287
+ if (url.protocol !== 'https:') {
288
+ throw new CliError('INVALID_URL', 'Todoist OAuth requires an HTTPS Comms resource.', [
289
+ 'Use https://comms.todoist.com, https://comms.staging.todoist.com, or https://comms.local.todoist.com',
290
+ ]);
291
+ }
292
+ const origin = url.origin;
293
+ const host = url.hostname.toLowerCase();
294
+ if (host === 'comms.todoist.com' ||
295
+ host === 'comms.staging.todoist.com' ||
296
+ host === 'comms.local.todoist.com') {
297
+ return origin;
298
+ }
299
+ throw new CliError('INVALID_URL', `Unsupported Comms OAuth resource: ${origin}`, [
300
+ 'Use COMMS_API_TOKEN for custom Comms hosts',
301
+ 'Supported OAuth hosts: comms.todoist.com, comms.staging.todoist.com, comms.local.todoist.com',
302
+ ]);
303
+ }
304
+ function getTodoistAuthBaseUrl(resource) {
305
+ const override = process.env.COMMS_AS_URL;
306
+ if (override)
307
+ return normalizeAuthBaseUrlOverride(override);
308
+ const host = new URL(resource).hostname.toLowerCase();
309
+ if (host === 'comms.staging.todoist.com')
310
+ return 'https://staging.todoist.com';
311
+ if (host === 'comms.local.todoist.com')
312
+ return 'https://local.todoist.com';
313
+ return DEFAULT_TODOIST_AUTH_BASE_URL;
314
+ }
315
+ function normalizeAuthBaseUrlOverride(raw) {
316
+ let url;
317
+ try {
318
+ url = new URL(raw);
319
+ }
320
+ catch {
321
+ throw new CliError('INVALID_URL', `COMMS_AS_URL is not a valid URL: ${raw}`, [
322
+ 'Use a URL like https://todoist.com',
323
+ ]);
324
+ }
325
+ if (url.protocol !== 'https:') {
326
+ throw new CliError('INVALID_URL', 'COMMS_AS_URL must use HTTPS.', [
327
+ 'Use a URL like https://todoist.com',
328
+ ]);
329
+ }
330
+ const host = url.hostname.toLowerCase();
331
+ if (host !== 'todoist.com' && !host.endsWith('.todoist.com')) {
332
+ throw new CliError('INVALID_URL', 'COMMS_AS_URL must point to a Todoist host.', [
333
+ 'Use a URL like https://todoist.com or https://staging.todoist.com',
334
+ ]);
335
+ }
336
+ return url.origin;
337
+ }
338
+ function requireHandshakeString(handshake, key, code = 'AUTH_TOKEN_EXCHANGE_FAILED') {
339
+ const value = handshake[key];
340
+ if (typeof value !== 'string' || value.length === 0) {
341
+ throw new CliError(code, `Internal: OAuth handshake missing ${key}.`, [
342
+ 'Try again: tdc auth login',
343
+ ]);
344
+ }
345
+ return value;
346
+ }
347
+ function optionalHandshakeString(handshake, key) {
348
+ const value = handshake[key];
349
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
350
+ }
351
+ function requireHandshakeReadOnly(handshake) {
352
+ if (typeof handshake.readOnly !== 'boolean') {
353
+ throw new CliError('AUTH_FAILED', 'Internal: auth handshake missing the readOnly flag.', AUTH_HINTS);
354
+ }
355
+ return handshake.readOnly;
356
+ }
357
+ /** Read the `--full-access` flag from the runtime flags folded onto the handshake. */
358
+ function isFullAccessHandshake(handshake) {
359
+ const flags = handshake.flags;
360
+ return (typeof flags === 'object' &&
361
+ flags !== null &&
362
+ flags.fullAccess === true);
363
+ }
364
+ function hasErrorCode(error, code) {
365
+ return (typeof error === 'object' &&
366
+ error !== null &&
367
+ 'code' in error &&
368
+ typeof error.code === 'string' &&
369
+ error.code === code);
370
+ }
371
+ /**
372
+ * Operator-facing hints describing what Todoist's token endpoint actually
373
+ * issued — surfaced only when Comms later rejects the token during `validate`.
374
+ * Reconstructed from the `ExchangeResult` (cli-core's DCR exchange surfaces the
375
+ * access token, refresh-token presence, and granted scope).
376
+ */
377
+ function describeTokenResponse(exchange) {
378
+ const hints = [
379
+ `Todoist token response: refresh_token=${exchange.refreshToken ? 'yes' : 'no'}`,
380
+ `Todoist token response access_token: ${describeAccessTokenShape(exchange.accessToken)}`,
381
+ ];
382
+ if (exchange.scope)
383
+ hints.push(`Todoist token response scope: ${exchange.scope}`);
384
+ if (!exchange.refreshToken) {
385
+ hints.push('Todoist issued a non-refresh access token; Comms intentionally rejects tokens without expiring introspection.');
386
+ }
387
+ return hints;
388
+ }
389
+ function describeAccessTokenShape(accessToken) {
390
+ const shape = /^[0-9a-f]{40}$/.test(accessToken) ? 'raw-hex-40' : 'other';
391
+ return `shape=${shape}, length=${accessToken.length}`;
392
+ }
393
+ function getAuthModeForGrantedScope(scope) {
394
+ return splitScopeString(scope).some((scopeCode) => WRITE_SCOPES.has(scopeCode))
395
+ ? 'read-write'
396
+ : 'read-only';
397
+ }
398
+ function normalizeScopeString(scope) {
399
+ return splitScopeString(scope).join(' ');
400
+ }
401
+ function splitScopeString(scope) {
402
+ return scope
403
+ .replaceAll(',', ' ')
404
+ .split(/\s+/)
405
+ .map((part) => part.trim())
406
+ .filter(Boolean);
407
+ }
124
408
  /**
125
409
  * Accepts `42`, `id:42`, and case-insensitive labels — `parseRef` normalises
126
410
  * the numeric forms. Broader than cli-core's default strict-equality matcher.
@@ -215,6 +499,9 @@ export function createCommsTokenStore() {
215
499
  async set(account, token) {
216
500
  return inner.set(account, token);
217
501
  },
502
+ async setBundle(account, bundle, options) {
503
+ return inner.setBundle(account, bundle, options);
504
+ },
218
505
  async clear(ref) {
219
506
  return inner.clear(ref);
220
507
  },
@@ -236,7 +523,7 @@ export async function getActiveTokenSource() {
236
523
  return 'env';
237
524
  const config = await getConfig();
238
525
  const record = getDefaultUserRecord(config);
239
- if (record?.fallbackToken)
526
+ if (record?.fallbackToken || record?.fallbackRefreshToken)
240
527
  return 'config-file';
241
528
  return 'secure-store';
242
529
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth-provider.js","sourceRoot":"","sources":["../../src/lib/auth-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-provider.js","sourceRoot":"","sources":["../../src/lib/auth-provider.ts"],"names":[],"mappings":"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"}