@eddyskywalker/dsh-chatgpt-subscription 0.9.9 → 0.10.1

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 (54) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +80 -2
  3. package/lib/client.js +1596 -207
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +4834 -1019
  6. package/lib/types/client/ProviderHubSection.d.ts.map +1 -1
  7. package/lib/types/client/claude/locales.d.ts +2 -2
  8. package/lib/types/client/command-code/locales.d.ts +2 -2
  9. package/lib/types/client/index.d.ts +2 -0
  10. package/lib/types/client/index.d.ts.map +1 -1
  11. package/lib/types/client/kimi-code/locales.d.ts +2 -2
  12. package/lib/types/client/minimax-code/MinimaxCodeComposerQuota.d.ts +27 -0
  13. package/lib/types/client/minimax-code/MinimaxCodeComposerQuota.d.ts.map +1 -0
  14. package/lib/types/client/minimax-code/MinimaxCodeSection.d.ts +49 -0
  15. package/lib/types/client/minimax-code/MinimaxCodeSection.d.ts.map +1 -0
  16. package/lib/types/client/minimax-code/api.d.ts +5 -0
  17. package/lib/types/client/minimax-code/api.d.ts.map +1 -0
  18. package/lib/types/client/minimax-code/locales.d.ts +341 -0
  19. package/lib/types/client/minimax-code/locales.d.ts.map +1 -0
  20. package/lib/types/client/minimax-code/styles.d.ts +12 -0
  21. package/lib/types/client/minimax-code/styles.d.ts.map +1 -0
  22. package/lib/types/client/styles.d.ts +19 -0
  23. package/lib/types/client/styles.d.ts.map +1 -1
  24. package/lib/types/compat.d.ts +1 -0
  25. package/lib/types/compat.d.ts.map +1 -1
  26. package/lib/types/host/agent-preset.d.ts.map +1 -1
  27. package/lib/types/host/claude/mapper.d.ts +11 -2
  28. package/lib/types/host/claude/mapper.d.ts.map +1 -1
  29. package/lib/types/host/minimax-code/account-pool.d.ts +219 -0
  30. package/lib/types/host/minimax-code/account-pool.d.ts.map +1 -0
  31. package/lib/types/host/minimax-code/adapter.d.ts +168 -0
  32. package/lib/types/host/minimax-code/adapter.d.ts.map +1 -0
  33. package/lib/types/host/minimax-code/client.d.ts +184 -0
  34. package/lib/types/host/minimax-code/client.d.ts.map +1 -0
  35. package/lib/types/host/minimax-code/mapper.d.ts +143 -0
  36. package/lib/types/host/minimax-code/mapper.d.ts.map +1 -0
  37. package/lib/types/host/minimax-code/model-catalog.d.ts +146 -0
  38. package/lib/types/host/minimax-code/model-catalog.d.ts.map +1 -0
  39. package/lib/types/host/minimax-code/oauth.d.ts +204 -0
  40. package/lib/types/host/minimax-code/oauth.d.ts.map +1 -0
  41. package/lib/types/host/minimax-code/routes.d.ts +79 -0
  42. package/lib/types/host/minimax-code/routes.d.ts.map +1 -0
  43. package/lib/types/host/minimax-code/token-store.d.ts +238 -0
  44. package/lib/types/host/minimax-code/token-store.d.ts.map +1 -0
  45. package/lib/types/host/minimax-code/types.d.ts +206 -0
  46. package/lib/types/host/minimax-code/types.d.ts.map +1 -0
  47. package/lib/types/host/subagent-model-authorization.d.ts +7 -0
  48. package/lib/types/host/subagent-model-authorization.d.ts.map +1 -1
  49. package/lib/types/index.d.ts +10 -0
  50. package/lib/types/index.d.ts.map +1 -1
  51. package/lib/types/shared/minimax-code-contracts.d.ts +166 -0
  52. package/lib/types/shared/minimax-code-contracts.d.ts.map +1 -0
  53. package/package.json +1 -1
  54. package/presets/dispatch/agent.cordis.yml +13 -1
@@ -0,0 +1,204 @@
1
+ /**
2
+ * OAuth for the MiniMax Code subscription.
3
+ *
4
+ * The flow is RFC 8628 device authorization with PKCE(S256) against a public
5
+ * client (`mcode-public`, no secret) — the shape the desktop app uses, and the
6
+ * only one that fits a plugin with no browser callback to receive.
7
+ *
8
+ * Measured facts that shape this file (brief section 2.5):
9
+ *
10
+ * - device authorization: POST `account.minimax.cn/oauth2/device/code`
11
+ * - token (device grant AND refresh): POST `account.minimax.cn/oauth2/token`
12
+ * - revocation: POST `account.minimax.cn/oauth2/revoke`
13
+ * - every call is `application/x-www-form-urlencoded` with `Accept: application/json`
14
+ * - the device grant carries `code_challenge`/`code_challenge_method=S256` and the
15
+ * poll carries the matching `code_verifier`
16
+ * - the refresh carries `grant_type=refresh_token`, `refresh_token`, `client_id`,
17
+ * `scope` and `audience`
18
+ *
19
+ * The refresh policy is the one the brief fixes at section 2.6: read the stored
20
+ * credential first and use it while it is valid, refresh only when it is not (or
21
+ * when the service has just rejected it), write the rotation back atomically, and
22
+ * never let a failed refresh damage the file MiniMax Code itself depends on.
23
+ */
24
+ import type { MinimaxCodeAccount, MinimaxCodeRegion, MinimaxCodeWebLogin } from '../../shared/minimax-code-contracts.ts';
25
+ import { accountHost } from './types.ts';
26
+ import { type MinimaxCodeCredentialStore, type MinimaxCodeCredentials } from './token-store.ts';
27
+ /** Raised when the stored credential was rejected and a new sign-in is required. */
28
+ export declare class MinimaxCodeUnauthorizedError extends Error {
29
+ constructor(message: string);
30
+ }
31
+ /** Raised when a transient failure outlived its retry budget. */
32
+ export declare class MinimaxCodeRetryableError extends Error {
33
+ constructor(message: string, cause?: unknown);
34
+ }
35
+ /** Raised when the user denied the device authorization request. */
36
+ export declare class MinimaxCodeAccessDeniedError extends Error {
37
+ constructor(message: string);
38
+ }
39
+ /**
40
+ * One PKCE pair (RFC 7636).
41
+ *
42
+ * The verifier is a fresh random string per authorization; the challenge is its
43
+ * SHA-256 digest, both base64url encoded with no padding, which is what S256
44
+ * means on the wire.
45
+ */
46
+ export declare function createPkcePair(): {
47
+ verifier: string;
48
+ challenge: string;
49
+ };
50
+ /** Parsed device authorization response. */
51
+ export interface DeviceAuthorization {
52
+ userCode: string;
53
+ deviceCode: string;
54
+ verificationUri: string;
55
+ verificationUriComplete: string;
56
+ expiresIn: number;
57
+ interval: number;
58
+ /** PKCE verifier the matching poll must present. */
59
+ codeVerifier: string;
60
+ /** Region the authorization was requested in; decides every later host. */
61
+ region: MinimaxCodeRegion;
62
+ }
63
+ /**
64
+ * Start a device authorization (RFC 8628 section 3.1).
65
+ *
66
+ * A public client sends its `client_id`, the scope and audience it wants, and the
67
+ * PKCE challenge — no secret, which is the whole point of the device profile.
68
+ */
69
+ export declare function requestDeviceAuthorization(options?: {
70
+ fetchFn?: typeof fetch;
71
+ signal?: AbortSignal;
72
+ region?: MinimaxCodeRegion;
73
+ }): Promise<DeviceAuthorization>;
74
+ /** One token response, in the shape the store persists. */
75
+ export interface MinimaxToken {
76
+ accessToken: string;
77
+ refreshToken: string;
78
+ tokenType: string;
79
+ expiresInSec: number;
80
+ expiresAtMs: number;
81
+ scope: string;
82
+ }
83
+ /** Outcome of one device-token poll. */
84
+ export type DevicePollOutcome = {
85
+ kind: 'success';
86
+ token: MinimaxToken;
87
+ } | {
88
+ kind: 'pending';
89
+ slowDown: boolean;
90
+ } | {
91
+ kind: 'expired';
92
+ };
93
+ /**
94
+ * Poll the token endpoint once for one device code (RFC 8628 section 3.4).
95
+ *
96
+ * A 5xx is a transport-class failure rather than a verdict on the device code, so
97
+ * it is raised for the caller's retry loop instead of being read as "still
98
+ * pending" — treating it as pending would spin against a broken endpoint until the
99
+ * device code expired.
100
+ */
101
+ export declare function pollDeviceToken(authorization: Pick<DeviceAuthorization, 'deviceCode' | 'codeVerifier' | 'region'>, options?: {
102
+ fetchFn?: typeof fetch;
103
+ signal?: AbortSignal;
104
+ }): Promise<DevicePollOutcome>;
105
+ /**
106
+ * Refresh an access token, with a bounded retry.
107
+ *
108
+ * Only a transient status or a transport failure is retried. A 400/401/403, or an
109
+ * `invalid_grant` body, is a verdict that the refresh token is dead and stops
110
+ * immediately: retrying it can never succeed, and every attempt is a request the
111
+ * subscription pays for.
112
+ */
113
+ export declare function refreshAccessToken(refreshToken: string, options: {
114
+ fetchFn?: typeof fetch;
115
+ signal?: AbortSignal;
116
+ region: MinimaxCodeRegion;
117
+ }): Promise<MinimaxToken>;
118
+ /**
119
+ * Revoke one token at the service.
120
+ *
121
+ * Best effort by design: a revocation that cannot reach the service must not stop
122
+ * a local sign-out, because the credential is already gone from this machine.
123
+ */
124
+ export declare function revokeToken(token: string, options: {
125
+ fetchFn?: typeof fetch;
126
+ signal?: AbortSignal;
127
+ region: MinimaxCodeRegion;
128
+ }): Promise<boolean>;
129
+ /** Start a device-code sign-in and hand the card what it must display. */
130
+ export declare function beginWebLogin(options?: {
131
+ fetchFn?: typeof fetch;
132
+ region?: MinimaxCodeRegion;
133
+ signal?: AbortSignal;
134
+ }): Promise<MinimaxCodeWebLogin>;
135
+ /** The public projection of one live sign-in, for the status route. */
136
+ export declare function getWebLogin(loginId: string): MinimaxCodeWebLogin | null;
137
+ /** Cancel one sign-in, dropping the session so a later poll cannot resume it. */
138
+ export declare function cancelWebLogin(loginId: string): boolean;
139
+ /** Forget every session; used by the test seam and by a full sign-out. */
140
+ export declare function resetWebLogins(): void;
141
+ /** Build the account projection one credential yields. */
142
+ export declare function accountFromCredentials(credentials: {
143
+ loginEpoch: string;
144
+ generation: number;
145
+ expiresAtMs: number;
146
+ region: MinimaxCodeRegion;
147
+ }): MinimaxCodeAccount;
148
+ export { accountHost };
149
+ /** Whether the given refresh token was rejected recently. */
150
+ export declare function isRefreshTokenRejected(refreshToken: string): boolean;
151
+ /** Test seam: forget every remembered rejection. */
152
+ export declare function resetRefreshRejections(): void;
153
+ export interface EnsureTokenOptions {
154
+ fetchFn?: typeof fetch;
155
+ signal?: AbortSignal;
156
+ /** Refresh even when the stored token is not near expiry (used after a 401). */
157
+ force?: boolean;
158
+ }
159
+ /**
160
+ * Return a usable access token, refreshing and writing back only when needed.
161
+ *
162
+ * This is the whole of the contention discipline in one function:
163
+ *
164
+ * 1. read the stored credential and use it as-is while it is valid — the
165
+ * common case, and the one that never touches the file or the network;
166
+ * 2. refresh only when it is not (or when `force` reports a 401 the service has
167
+ * already issued);
168
+ * 3. share one rotation between concurrent callers, so a burst of tool calls at
169
+ * expiry cannot each try to rotate the same refresh token;
170
+ * 4. write the result back through the store's atomic replacement, and remember a
171
+ * rejected token so the next caller is told to sign in instead of retrying.
172
+ */
173
+ export declare function ensureAccessToken(store: MinimaxCodeCredentialStore, options?: EnsureTokenOptions): Promise<MinimaxCodeCredentials>;
174
+ /**
175
+ * Poll one live sign-in once and, on success, persist what it produced.
176
+ *
177
+ * The persisted credential is plugin-owned: a device-code sign-in started here
178
+ * has no record in the desktop app's `auth.json` (its record key embeds a hash
179
+ * this plugin cannot reproduce), so writing a fabricated entry there would leave
180
+ * the app with an entry it never reads.
181
+ */
182
+ export declare function pollWebLogin(store: MinimaxCodeCredentialStore, loginId: string, options?: {
183
+ fetchFn?: typeof fetch;
184
+ signal?: AbortSignal;
185
+ /**
186
+ * Called with the credential a completed sign-in produced, after it has been
187
+ * persisted.
188
+ *
189
+ * The single-credential store cannot express a second account, so without this
190
+ * a sign-in started from the card would never join the pool: the pool would
191
+ * keep serving its existing accounts, and the user's new sign-in would exist
192
+ * only as the mirror file. The pool installs this hook and adds the credential
193
+ * as its own account.
194
+ *
195
+ * A failure here must not fail the sign-in: the credential is already durable,
196
+ * and the pool is a routing convenience on top of it. The caller receives the
197
+ * authenticated verdict either way.
198
+ */
199
+ onSave?: (credentials: MinimaxCodeCredentials) => Promise<void>;
200
+ }): Promise<{
201
+ status: 'pending' | 'authenticated' | 'expired' | 'denied';
202
+ account?: MinimaxCodeAccount;
203
+ }>;
204
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../../src/host/minimax-code/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Web routes for the MiniMax Code line.
3
+ *
4
+ * The six routes below are the frozen contract the client half consumes (brief
5
+ * section 3). Their paths, request bodies and verdicts are therefore not free:
6
+ * this file implements them as specified rather than as this line might prefer.
7
+ *
8
+ * Response envelope: every route answers \`{ ok: true, value: <payload> }\`, which is
9
+ * what the sibling lines in this package use. The three routes whose contract names
10
+ * a top-level key as well (\`/login/start\` -> \`login\`, \`/login/poll\` -> \`status\` and
11
+ * \`account\`, \`/test\` -> \`ok\`/\`model\`/\`error\`) carry that key at the top level too,
12
+ * so a client written against either reading resolves. \`/test\` is the one route
13
+ * where the envelope's \`ok\` cannot double as the payload's: its contract defines
14
+ * \`ok\` as the probe verdict, so the envelope there is the verdict itself and the
15
+ * duplicate lives under \`value\`.
16
+ *
17
+ * Mounting: the routes are registered under BOTH the contract prefix and the
18
+ * sibling-line convention, because the two disagree in this repository and the
19
+ * client half must not be able to miss them for that reason alone.
20
+ *
21
+ * \`/models\` and \`/settings\` are the model-settings half every sibling line has and
22
+ * this one shipped without. They are two names for one route because the sibling
23
+ * cards disagree about which to call: kimi-code and claude call it \`/models\`,
24
+ * workbuddy and command-code call it \`/settings\`. Serving both costs one string
25
+ * comparison and removes a client-side special case.
26
+ */
27
+ import type { Context } from '@deepseek-ai/cordis';
28
+ import { MINIMAX_CODE_PROVIDER_ID, type MinimaxCodeWebStatus } from '../../shared/minimax-code-contracts.ts';
29
+ import { type MinimaxCodeAccountPool } from './account-pool.ts';
30
+ import { MinimaxCodeCredentialStore, MinimaxCodeModelSettingsStore, type MinimaxCodeModelSettings, type MinimaxCodePreferenceStore, type MinimaxCodeSettingsPatch } from './token-store.ts';
31
+ import { ensureAccessToken, getWebLogin } from './oauth.ts';
32
+ /** The sub-path one request addresses, whichever prefix it arrived under. */
33
+ export declare function subPathOf(requestUrl: string): string;
34
+ /**
35
+ * The stored selection, however this deployment persists it.
36
+ *
37
+ * The routes accept either shape so a composition that still has the register
38
+ * settings seam and one that only has the file both work: the caller passes
39
+ * whichever it wired, and nothing in this file needs to know which it got. The
40
+ * patch type is the store's own, deliberately, so a field added to the settings
41
+ * document cannot become one this route accepts but the stores silently drop.
42
+ */
43
+ export interface MinimaxCodeSettingsSource {
44
+ /** Current selection: a value on the register seam, a read on the file store. */
45
+ status(): Promise<MinimaxCodeModelSettings> | MinimaxCodeModelSettings;
46
+ update(patch: MinimaxCodeSettingsPatch): Promise<MinimaxCodeModelSettings>;
47
+ }
48
+ export interface MinimaxCodeStatusOptions {
49
+ fetchFn?: typeof fetch;
50
+ /** Whether this plugin currently owns the provider route; re-read on every status. */
51
+ serving?: boolean | (() => boolean);
52
+ /** Diagnostic when another plugin owns the provider route; re-read on every status. */
53
+ conflict?: string | null | (() => string | null);
54
+ /**
55
+ * Where the model selection lives.
56
+ *
57
+ * Omitted, the routes read the default settings file, which is what a caller
58
+ * that only wants the connection half of the card gets. The plugin entry
59
+ * supplies the same store the adapter was built with, so the card and the
60
+ * request path can never read two different selections.
61
+ */
62
+ settings?: MinimaxCodeSettingsSource;
63
+ /**
64
+ * The account pool, when this process installed one.
65
+ *
66
+ * Omitting it is a supported posture: the line then behaves as the
67
+ * single-credential route it was before the pool existed, and the status
68
+ * reports `poolInstalled: false` so the card can say so rather than render an
69
+ * empty account list that looks like a bug.
70
+ */
71
+ accountPool?: MinimaxCodeAccountPool;
72
+ }
73
+ /** Everything the settings card renders. */
74
+ export declare function getMinimaxCodeWebStatus(store: MinimaxCodeCredentialStore, options?: MinimaxCodeStatusOptions, settingsSource?: MinimaxCodeSettingsSource): Promise<MinimaxCodeWebStatus>;
75
+ export declare function registerMinimaxCodeRoutes(ctx: Context, store?: MinimaxCodeCredentialStore, options?: MinimaxCodeStatusOptions, modelSettings?: MinimaxCodeModelSettingsStore, preferences?: MinimaxCodePreferenceStore): () => void;
76
+ /** Test seam: forget which sign-in the status route reports. */
77
+ export declare function resetLatestLogin(): void;
78
+ export { MINIMAX_CODE_PROVIDER_ID, getWebLogin, ensureAccessToken };
79
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/host/minimax-code/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EACL,wBAAwB,EAMxB,KAAK,oBAAoB,EAC1B,MAAM,wCAAwC,CAAA;AAG/C,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAE7B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC9B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAIL,iBAAiB,EACjB,WAAW,EAKZ,MAAM,YAAY,CAAA;AAqDnB,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,yBAAyB;IACxC,iFAAiF;IACjF,MAAM,IAAI,OAAO,CAAC,wBAAwB,CAAC,GAAG,wBAAwB,CAAA;IACtE,MAAM,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;CAC3E;AAuBD,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACtB,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAA;IACnC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAA;IAChD;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,yBAAyB,CAAA;IACpC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC;AAOD,4CAA4C;AAC5C,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,0BAA0B,EACjC,OAAO,GAAE,wBAA6B,EACtC,cAAc,CAAC,EAAE,yBAAyB,GACzC,OAAO,CAAC,oBAAoB,CAAC,CA8D/B;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,EACZ,KAAK,GAAE,0BAA6D,EACpE,OAAO,GAAE,wBAA6B,EACtC,aAAa,GAAE,6BAAmE,EAClF,WAAW,CAAC,EAAE,0BAA0B,GACvC,MAAM,IAAI,CAyOZ;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Credential storage for the MiniMax Code line.
3
+ *
4
+ * Unlike every other line in this package, this one does not own its credential
5
+ * format: MiniMax Code itself keeps the signed-in session in
6
+ * `~/.minimax/auth/<buildEnv>/<region>/mcode-public/auth.json`, and the whole
7
+ * point of reusing it is that a user who is already signed in to the desktop app
8
+ * does not sign in again here.
9
+ *
10
+ * That sharing is the design constraint:
11
+ *
12
+ * 1. READ-ONLY FIRST. Every call reads the file and uses the stored token when it
13
+ * is still valid; the plugin never rotates a credential it does not have to.
14
+ * 2. WRITE-BACK IS ATOMIC. A rotated token replaces the file through a temporary
15
+ * file plus `rename`, so a failed or interrupted refresh leaves the previous
16
+ * `auth.json` byte-for-byte intact — the requirement the brief states at
17
+ * section 2.6.4.
18
+ * 3. NO LOCK IS TAKEN. MiniMax Code holds `auth.lock` while it refreshes, and a
19
+ * second process must not create, delete or wait on that file: doing so could
20
+ * break the app's own refresh. Atomic replacement is what makes lock-free
21
+ * sharing safe instead — a reader sees either the whole old file or the whole
22
+ * new one, never a half-written one, and the record's key is preserved so the
23
+ * app finds its own entry where it left it.
24
+ * 4. THE SHAPE IS PRESERVED. `schemaVersion` and every other record in
25
+ * `records` survive a write untouched; only the `mcode-public` record and the
26
+ * matching `auth-state.json` fields change.
27
+ *
28
+ * A credential this plugin obtained itself (device-code login with no native file
29
+ * present) is kept in the plugin's own store under `$DSH_HOME/storages`, so the
30
+ * two provenances never overwrite each other.
31
+ */
32
+ import { type ContextWindowOverridePatch } from '../common/context-window-overrides.ts';
33
+ import type { MinimaxCodeReasoningEffort, MinimaxCodeRegion } from '../../shared/minimax-code-contracts.ts';
34
+ /** Where the credential and the token came from. */
35
+ export type MinimaxCodeCredentialSource = 'minimax-native' | 'file';
36
+ /**
37
+ * One MiniMax Code subscription credential.
38
+ *
39
+ * Field names follow `auth.json` exactly; nothing is renamed on the way in or
40
+ * out, so a round trip cannot lose a field the desktop app depends on.
41
+ */
42
+ export interface MinimaxCodeCredentials {
43
+ /** Bearer access token for the agent API. Host-only; never sent to a browser. */
44
+ accessToken: string;
45
+ /** Rotating refresh token. Host-only. */
46
+ refreshToken: string;
47
+ /** Always "Bearer" in the measured file; kept verbatim. */
48
+ tokenType: string;
49
+ /** Public client the record belongs to. */
50
+ clientId: string;
51
+ /** Scopes the token was issued for. */
52
+ scopes: string[];
53
+ /** Audience the token was issued for. */
54
+ audience: string;
55
+ /** Unix milliseconds the access token stops being valid. */
56
+ expiresAtMs: number;
57
+ /** Rotations the credential has been through; incremented on every refresh. */
58
+ generation: number;
59
+ /** Identity of the sign-in that produced the credential. */
60
+ loginEpoch: string;
61
+ /** Build environment segment of the path the credential lives under. */
62
+ buildEnv: string;
63
+ /** Region the credential was issued in. */
64
+ region: MinimaxCodeRegion;
65
+ /** Record key inside `auth.json`, preserved verbatim so a write lands in place. */
66
+ recordKey: string | null;
67
+ /** Whether this credential is the desktop app's file or the plugin's own. */
68
+ source: MinimaxCodeCredentialSource;
69
+ /** Unix milliseconds this plugin read or wrote the credential. */
70
+ seenAt?: number;
71
+ }
72
+ /** The MiniMax home directory: the desktop app's data root. */
73
+ export declare function minimaxHomeDir(env?: NodeJS.ProcessEnv): string;
74
+ /** Directory holding one region's auth files. */
75
+ export declare function authDirFor(region: MinimaxCodeRegion, buildEnv?: string): string;
76
+ /** Path of the desktop app's credential file for one region. */
77
+ export declare function authJsonPath(region: MinimaxCodeRegion, buildEnv?: string): string;
78
+ /** Path of the desktop app's non-secret state file for one region. */
79
+ export declare function authStateJsonPath(region: MinimaxCodeRegion, buildEnv?: string): string;
80
+ /** Path of the plugin's own credential file, used when no native file exists. */
81
+ export declare function pluginCredentialPath(): string;
82
+ /**
83
+ * Validate and normalize one stored credential.
84
+ *
85
+ * A payload that is missing a token or an expiry is rejected rather than
86
+ * defaulted: a credential with an invented expiry would be presented to the
87
+ * service as valid when it is not, which is exactly the failure the refresh path
88
+ * exists to prevent.
89
+ */
90
+ export declare function parseMinimaxCodeCredentials(value: unknown, fallback: {
91
+ region: MinimaxCodeRegion;
92
+ buildEnv?: string;
93
+ recordKey?: string | null;
94
+ source?: MinimaxCodeCredentialSource;
95
+ }): MinimaxCodeCredentials;
96
+ /** Whether a credential is valid for long enough to use as-is. */
97
+ export declare function credentialIsFresh(credentials: MinimaxCodeCredentials, now?: number): boolean;
98
+ /**
99
+ * The credential store for this line.
100
+ *
101
+ * `read()` prefers the desktop app's file and falls back to the plugin's own, so
102
+ * a user who signed in through either path is served. `write()` returns the
103
+ * credential to the file it came from, which is what keeps the two provenances
104
+ * from clobbering each other.
105
+ */
106
+ export declare class MinimaxCodeCredentialStore {
107
+ private readonly region;
108
+ constructor(region?: MinimaxCodeRegion);
109
+ /** Path of the file the next read or write targets. */
110
+ path(): string;
111
+ private readNative;
112
+ private readPluginFile;
113
+ read(): Promise<MinimaxCodeCredentials | null>;
114
+ /**
115
+ * The credential in force plus where it came from, in one pass.
116
+ *
117
+ * A status response needs all three facts, and each of the targeted accessors
118
+ * re-reads and re-parses the native document (a file read plus a JSON parse per
119
+ * region probed). Reading once here keeps one /status call from doing that work
120
+ * three times, which matters because the settings card polls this route.
121
+ */
122
+ readWithProvenance(): Promise<{
123
+ credentials: MinimaxCodeCredentials | null;
124
+ source: MinimaxCodeCredentialSource;
125
+ path: string;
126
+ }>;
127
+ /** Which file the credential currently in force lives in. */
128
+ activeSource(): Promise<MinimaxCodeCredentialSource>;
129
+ /**
130
+ * Persist a credential back where it came from.
131
+ *
132
+ * A native credential is written into the existing record, preserving the
133
+ * document's `schemaVersion` and every other record; a plugin credential is
134
+ * written to the plugin's own file. Either way the write is atomic.
135
+ */
136
+ write(credentials: MinimaxCodeCredentials): Promise<void>;
137
+ /**
138
+ * Forget the credential this plugin owns.
139
+ *
140
+ * The desktop app's `auth.json` is deliberately left alone: it is not this
141
+ * plugin's to delete, and removing it would sign the user out of MiniMax Code
142
+ * itself. A credential this store is only *reading* from the app therefore
143
+ * remains in force after a sign-out, which the status route reports so the
144
+ * user is not told a session ended when it did not.
145
+ */
146
+ delete(): Promise<void>;
147
+ }
148
+ /** Namespace the model selection is registered under on a register-capable harness. */
149
+ export declare const MINIMAX_CODE_PREFERENCES_NAMESPACE = "dsh-minimax-code";
150
+ /**
151
+ * The model-selection half of this line's settings.
152
+ *
153
+ * The catalog (`MINIMAX_CODE_MODELS`) is deliberately not stored here. A shipped
154
+ * catalog changes with the code, so persisting a copy of it would leave a user
155
+ * whose file is a release behind reading a model list the build no longer serves;
156
+ * only the user's own choices live in this document.
157
+ */
158
+ export interface MinimaxCodeModelSettings {
159
+ /** Line-wide switch. Absent means enabled: this line shipped enabled. */
160
+ enabled?: boolean;
161
+ /** Catalog ids DSH offers in the conversation model picker. */
162
+ enabledModelIds: string[];
163
+ /** Per-model context window, replacing the catalog's own number. */
164
+ contextWindowOverrides: Record<string, number>;
165
+ /** Level used when a conversation picks none; null means the model's own. */
166
+ defaultReasoningEffort: MinimaxCodeReasoningEffort | null;
167
+ }
168
+ /**
169
+ * One settings patch.
170
+ *
171
+ * `contextWindowOverrides` is a patch rather than the whole map because `null`
172
+ * has to survive as a value: it is the settings card's "restore the catalog
173
+ * default" and deletes exactly one key. A full replacement could not express
174
+ * that without the caller first reading the document it wants to edit.
175
+ */
176
+ export interface MinimaxCodeSettingsPatch {
177
+ enabled?: boolean;
178
+ enabledModelIds?: string[];
179
+ contextWindowOverrides?: ContextWindowOverridePatch;
180
+ defaultReasoningEffort?: MinimaxCodeReasoningEffort | null;
181
+ }
182
+ /**
183
+ * The seam the routes and the adapter share.
184
+ *
185
+ * `status()` is synchronous on purpose: it is read on every model-picker query
186
+ * and on every settings-card poll, and both callers only need a snapshot. A
187
+ * promise-shaped reader here would make each of them await a file read on a hot
188
+ * path for a value that changes at human speed.
189
+ */
190
+ export interface MinimaxCodePreferenceStore {
191
+ status(): MinimaxCodeModelSettings;
192
+ update(patch: MinimaxCodeSettingsPatch): Promise<MinimaxCodeModelSettings>;
193
+ }
194
+ /** Path of the settings file used when no settings service is present. */
195
+ export declare function modelSettingsPath(): string;
196
+ /**
197
+ * Apply one patch to one settings document.
198
+ *
199
+ * The merge lives outside both stores because the register-backed store has to
200
+ * normalize the scope's value through the same rules the file store applies; two
201
+ * copies of this logic is how the two storage paths drift apart the first time
202
+ * one of them learns a new field.
203
+ */
204
+ export declare function mergeMinimaxCodeSettings(current: MinimaxCodeModelSettings, patch: MinimaxCodeSettingsPatch): MinimaxCodeModelSettings;
205
+ /**
206
+ * The settings file beside the credentials.
207
+ *
208
+ * This is what a harness without the register seam (0.1.7, and a headless host)
209
+ * reads back on boot, so it is the store that has to survive a crash: the write
210
+ * is a temporary sibling plus `rename`, and the document just written is read
211
+ * back and compared before the write is reported as done. Without the read-back
212
+ * a partial write, or a filesystem that dropped the rename, would report a
213
+ * selection the next boot does not agree with — the card would show a model
214
+ * grid the adapter never applies.
215
+ */
216
+ export declare class MinimaxCodeModelSettingsStore {
217
+ private readonly filePath;
218
+ constructor(filePath?: string);
219
+ path(): string;
220
+ read(): Promise<MinimaxCodeModelSettings>;
221
+ write(settings: MinimaxCodeModelSettings): Promise<void>;
222
+ /**
223
+ * Read-modify-write under the same per-path lock the credential writes use.
224
+ *
225
+ * Without it two patches landing together each read the same document and the
226
+ * second write silently discards the first — a lost model selection, with no
227
+ * error anywhere. The lock is shared with the credential paths because it is
228
+ * keyed by resolved path, and the two never name the same file.
229
+ */
230
+ updateSettings(patch: MinimaxCodeSettingsPatch): Promise<MinimaxCodeModelSettings>;
231
+ }
232
+ /**
233
+ * Bind the model selection to the DSH settings document when the harness still
234
+ * offers one, and to the JSON file beside it otherwise: a harness without the
235
+ * register seam (0.1.7, and a headless host) reads that file back on boot.
236
+ */
237
+ export declare function registerMinimaxCodePreferenceStore(settings?: unknown, fallbackStore?: MinimaxCodeModelSettingsStore): MinimaxCodePreferenceStore;
238
+ //# sourceMappingURL=token-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../../../src/host/minimax-code/token-store.ts"],"names":[],"mappings":"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"}