@modelprofile.com/authswitch 6.4.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/authority-contract.d.ts +302 -6
- package/dist_ts/authority-contract.js +1 -1
- package/dist_ts/authority-runtime-contract.d.ts +15 -0
- package/dist_ts/authorityrehearsal.child.d.ts +1 -0
- package/dist_ts/authorityrehearsal.child.js +395 -0
- package/dist_ts/classes.accountlist.js +4 -3
- package/dist_ts/classes.authoritybackup.d.ts +134 -0
- package/dist_ts/classes.authoritybackup.js +769 -0
- package/dist_ts/classes.authoritybroker.d.ts +29 -6
- package/dist_ts/classes.authoritybroker.js +413 -122
- package/dist_ts/classes.authoritycli.d.ts +24 -0
- package/dist_ts/classes.authoritycli.js +675 -0
- package/dist_ts/classes.authorityclient.d.ts +34 -9
- package/dist_ts/classes.authorityclient.js +136 -38
- package/dist_ts/classes.authoritydaemon.d.ts +47 -0
- package/dist_ts/classes.authoritydaemon.js +705 -16
- package/dist_ts/classes.authoritydatabase.d.ts +182 -8
- package/dist_ts/classes.authoritydatabase.js +1188 -41
- package/dist_ts/classes.authoritymodels.d.ts +247 -1
- package/dist_ts/classes.authoritymodels.js +870 -6
- package/dist_ts/classes.authoritypreuse.d.ts +47 -0
- package/dist_ts/classes.authoritypreuse.js +278 -0
- package/dist_ts/classes.authorityregistry.d.ts +24 -0
- package/dist_ts/classes.authorityregistry.js +88 -0
- package/dist_ts/classes.authorityrehearsal.d.ts +127 -0
- package/dist_ts/classes.authorityrehearsal.js +632 -0
- package/dist_ts/classes.authorityusage.d.ts +160 -0
- package/dist_ts/classes.authorityusage.js +429 -0
- package/dist_ts/classes.claudeauthority.d.ts +66 -0
- package/dist_ts/classes.claudeauthority.js +532 -0
- package/dist_ts/classes.claudecodeharness.js +3 -2
- package/dist_ts/classes.claudecodelocks.d.ts +13 -0
- package/dist_ts/classes.claudecodelocks.js +75 -3
- package/dist_ts/classes.claudenative.d.ts +137 -0
- package/dist_ts/classes.claudenative.js +731 -0
- package/dist_ts/classes.claudestatus.d.ts +9 -0
- package/dist_ts/classes.claudestatus.js +26 -9
- package/dist_ts/classes.claudetokenrefresh.d.ts +15 -1
- package/dist_ts/classes.claudetokenrefresh.js +74 -21
- package/dist_ts/classes.codexharness.js +4 -2
- package/dist_ts/classes.codexmanaged.d.ts +91 -0
- package/dist_ts/classes.codexmanaged.js +404 -0
- package/dist_ts/classes.codexpreuse.d.ts +8 -0
- package/dist_ts/classes.codexpreuse.js +24 -6
- package/dist_ts/classes.fileharness.d.ts +2 -0
- package/dist_ts/classes.fileharness.js +6 -4
- package/dist_ts/classes.limits.js +12 -7
- package/dist_ts/classes.opencodeharness.js +2 -2
- package/dist_ts/claudehttp.d.ts +10 -0
- package/dist_ts/claudehttp.js +29 -3
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +8 -1
- package/dist_ts/interfaces.harness.d.ts +6 -0
- package/dist_ts/interfaces.list.d.ts +9 -3
- package/dist_ts/plugins.d.ts +7 -3
- package/dist_ts/plugins.js +9 -4
- package/dist_ts/ts_migration/0001_authority_meta.d.ts +3 -0
- package/dist_ts/ts_migration/0001_authority_meta.js +32 -0
- package/dist_ts/ts_migration/index.d.ts +3 -0
- package/dist_ts/ts_migration/index.js +6 -0
- package/package.json +12 -2
- package/readme.md +205 -13
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/authority-contract.ts +264 -9
- package/ts/authority-runtime-contract.ts +21 -1
- package/ts/authorityrehearsal.child.ts +330 -0
- package/ts/classes.accountlist.ts +3 -2
- package/ts/classes.authoritybackup.ts +780 -0
- package/ts/classes.authoritybroker.ts +410 -120
- package/ts/classes.authoritycli.ts +719 -0
- package/ts/classes.authorityclient.ts +164 -38
- package/ts/classes.authoritydaemon.ts +614 -17
- package/ts/classes.authoritydatabase.ts +1229 -44
- package/ts/classes.authoritymodels.ts +579 -4
- package/ts/classes.authoritypreuse.ts +297 -0
- package/ts/classes.authorityregistry.ts +118 -0
- package/ts/classes.authorityrehearsal.ts +625 -0
- package/ts/classes.authorityusage.ts +527 -0
- package/ts/classes.claudeauthority.ts +541 -0
- package/ts/classes.claudecodeharness.ts +2 -1
- package/ts/classes.claudecodelocks.ts +70 -1
- package/ts/classes.claudenative.ts +816 -0
- package/ts/classes.claudestatus.ts +38 -9
- package/ts/classes.claudetokenrefresh.ts +82 -19
- package/ts/classes.codexharness.ts +3 -1
- package/ts/classes.codexmanaged.ts +402 -0
- package/ts/classes.codexpreuse.ts +33 -5
- package/ts/classes.fileharness.ts +7 -3
- package/ts/classes.limits.ts +11 -6
- package/ts/classes.opencodeharness.ts +1 -1
- package/ts/claudehttp.ts +31 -2
- package/ts/index.ts +7 -0
- package/ts/interfaces.harness.ts +6 -0
- package/ts/interfaces.list.ts +9 -3
- package/ts/plugins.ts +9 -3
- package/ts/ts_migration/0001_authority_meta.ts +33 -0
- package/ts/ts_migration/index.ts +7 -0
|
@@ -0,0 +1,731 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { ClaudeCodeLockOutcomeUnknownError, ClaudeCodeLocks } from './classes.claudecodelocks.js';
|
|
3
|
+
import { claudeRequest } from './claudehttp.js';
|
|
4
|
+
import { writeSecretFileAtomically } from './helpers.js';
|
|
5
|
+
import { HarnessProcesses } from './classes.harnessprocesses.js';
|
|
6
|
+
/** The private file and lock contract verified for this Claude Code release. */
|
|
7
|
+
export const CLAUDE_NATIVE_HANDOFF_VERSION = '2.1.273';
|
|
8
|
+
const MAX_NATIVE_FILE_BYTES = 4 * 1024 * 1024;
|
|
9
|
+
const MAX_PROCESS_CONTEXT_BYTES = 1024 * 1024;
|
|
10
|
+
const PROFILE_TIMEOUT_MS = 10_000;
|
|
11
|
+
const ACCOUNT_CACHES = [
|
|
12
|
+
'additionalModelOptionsCache', 'additionalModelOptionsAnsweredAt', 'additionalModelCostsCache',
|
|
13
|
+
'modelAccessCache', 'orgModelDefaultCache', 'lastSeenOrgDefaultUpdatedAt', 'clientDataCache',
|
|
14
|
+
'clientDataCacheSlots', 'autoCompactWindowsCache', 'cachedUsageUtilization',
|
|
15
|
+
];
|
|
16
|
+
const CREDENTIAL_OVERRIDES = [
|
|
17
|
+
'CLAUDE_CODE_OAUTH_TOKEN', 'CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR', 'ANTHROPIC_API_KEY',
|
|
18
|
+
'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_PROFILE', 'CLAUDE_CODE_USE_BEDROCK',
|
|
19
|
+
'CLAUDE_CODE_USE_VERTEX', 'CLAUDE_CODE_USE_FOUNDRY', 'ANTHROPIC_BASE_URL',
|
|
20
|
+
'ANTHROPIC_FEDERATION_RULE_ID', 'ANTHROPIC_ORGANIZATION_ID',
|
|
21
|
+
'ANTHROPIC_IDENTITY_TOKEN_FILE', 'ANTHROPIC_IDENTITY_TOKEN', 'ANTHROPIC_WORKSPACE_ID',
|
|
22
|
+
'ANTHROPIC_UNIX_SOCKET', 'CLAUDE_CODE_REMOTE', 'CLAUDE_CODE_SIMPLE',
|
|
23
|
+
'CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST', 'CLAUDE_CODE_HOST_AUTH_ENV_VAR',
|
|
24
|
+
'CLAUDE_CODE_HOST_CREDS_FILE', 'CLAUDE_CODE_SESSION_ACCESS_TOKEN',
|
|
25
|
+
'CLAUDE_CODE_OAUTH_REFRESH_TOKEN', 'CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR',
|
|
26
|
+
'CLAUDE_CODE_USE_GATEWAY',
|
|
27
|
+
'CLAUDE_CODE_GATEWAY_TOKEN_FILE_DESCRIPTOR', 'CLAUDE_CODE_HFI_BEARER_TOKEN',
|
|
28
|
+
'CLAUDE_BG_AUTH_SNAPSHOT_PATH',
|
|
29
|
+
];
|
|
30
|
+
/** Refusal is distinct from a malformed login: Claude may use a different auth source. */
|
|
31
|
+
export class ClaudeNativeEffectiveAuthUnsupportedError extends Error {
|
|
32
|
+
reason;
|
|
33
|
+
code = 'unsupported_effective_auth';
|
|
34
|
+
constructor(reason) {
|
|
35
|
+
super(`Cannot prove that Claude Code ${CLAUDE_NATIVE_HANDOFF_VERSION} uses its native claude.ai login (${reason}).`);
|
|
36
|
+
this.reason = reason;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const hash = (value) => plugins.crypto.createHash('sha256').update(value).digest('hex');
|
|
40
|
+
const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
41
|
+
const text = (value) => typeof value === 'string' && value.length > 0;
|
|
42
|
+
const sameDigests = (left, right) => left.credentialDigest === right.credentialDigest && left.configDigest === right.configDigest;
|
|
43
|
+
const onlyDigests = (value) => ({
|
|
44
|
+
credentialDigest: value.credentialDigest, configDigest: value.configDigest,
|
|
45
|
+
});
|
|
46
|
+
const preparedWrites = new WeakMap();
|
|
47
|
+
const sameIdentity = (left, right) => left.accountUuid === right.accountUuid && left.organizationUuid === right.organizationUuid;
|
|
48
|
+
const pathEnvironment = ['HOME', 'XDG_CONFIG_HOME', 'ANTHROPIC_CONFIG_DIR', 'CLAUDE_CONFIG_DIR'];
|
|
49
|
+
const contextKeys = new Set([...CREDENTIAL_OVERRIDES, ...pathEnvironment]);
|
|
50
|
+
const readProcessContext = (file) => {
|
|
51
|
+
const descriptor = plugins.fs.openSync(file, plugins.fs.constants.O_RDONLY | plugins.fs.constants.O_NOFOLLOW | plugins.fs.constants.O_NONBLOCK);
|
|
52
|
+
try {
|
|
53
|
+
const buffer = Buffer.alloc(MAX_PROCESS_CONTEXT_BYTES + 1);
|
|
54
|
+
let length = 0;
|
|
55
|
+
while (length < buffer.length) {
|
|
56
|
+
const count = plugins.fs.readSync(descriptor, buffer, length, buffer.length - length, null);
|
|
57
|
+
if (count === 0)
|
|
58
|
+
break;
|
|
59
|
+
length += count;
|
|
60
|
+
}
|
|
61
|
+
if (length === buffer.length)
|
|
62
|
+
throw new Error('Claude process context is too large to verify.');
|
|
63
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(buffer.subarray(0, length));
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
plugins.fs.closeSync(descriptor);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const selectorEnvironment = (raw) => {
|
|
70
|
+
const selected = {};
|
|
71
|
+
for (const entry of raw.split('\0')) {
|
|
72
|
+
const separator = entry.indexOf('=');
|
|
73
|
+
if (separator < 1)
|
|
74
|
+
continue;
|
|
75
|
+
const key = entry.slice(0, separator);
|
|
76
|
+
if (!contextKeys.has(key))
|
|
77
|
+
continue;
|
|
78
|
+
if (Object.hasOwn(selected, key))
|
|
79
|
+
throw new Error('Claude process environment selector is ambiguous.');
|
|
80
|
+
// Presence is enough for credential selectors. Never retain their secret value.
|
|
81
|
+
selected[key] = pathEnvironment.includes(key)
|
|
82
|
+
? entry.slice(separator + 1) : entry.length > separator + 1 ? 'present' : '';
|
|
83
|
+
}
|
|
84
|
+
return selected;
|
|
85
|
+
};
|
|
86
|
+
const processViewPath = (absolutePath, processRoot) => {
|
|
87
|
+
if (!plugins.path.isAbsolute(absolutePath)
|
|
88
|
+
|| plugins.path.normalize(absolutePath) !== absolutePath) {
|
|
89
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
|
|
90
|
+
}
|
|
91
|
+
return processRoot ? plugins.path.join(processRoot, absolutePath.slice(1)) : absolutePath;
|
|
92
|
+
};
|
|
93
|
+
/** 2.1.273's `le` / `dse` / `H` selector in the installed bundle, offset 190076222. */
|
|
94
|
+
const assertNoKnownNativeLoginOverride = (env, processRoot) => {
|
|
95
|
+
for (const key of CREDENTIAL_OVERRIDES) {
|
|
96
|
+
if (env[key])
|
|
97
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
|
|
98
|
+
}
|
|
99
|
+
const configDir = env.ANTHROPIC_CONFIG_DIR?.trim()
|
|
100
|
+
|| (env.XDG_CONFIG_HOME?.trim()
|
|
101
|
+
? plugins.path.join(env.XDG_CONFIG_HOME.trim(), 'anthropic')
|
|
102
|
+
: env.HOME?.trim() ? plugins.path.join(env.HOME.trim(), '.config', 'anthropic') : null);
|
|
103
|
+
if (configDir === null)
|
|
104
|
+
return;
|
|
105
|
+
if (!plugins.path.isAbsolute(configDir) || plugins.path.normalize(configDir) !== configDir) {
|
|
106
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('profile_unreadable');
|
|
107
|
+
}
|
|
108
|
+
let selected = 'default';
|
|
109
|
+
try {
|
|
110
|
+
selected = readNativeRaw(processViewPath(plugins.path.join(configDir, 'active_config'), processRoot))?.trim() || 'default';
|
|
111
|
+
// The vendor's profile resolver otherwise forms `configs/${selected}.json` directly.
|
|
112
|
+
if (!/^[A-Za-z0-9._-]+$/.test(selected) || selected === '.' || selected === '..') {
|
|
113
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('profile_unreadable');
|
|
114
|
+
}
|
|
115
|
+
plugins.fs.lstatSync(processViewPath(plugins.path.join(configDir, 'configs', `${selected}.json`), processRoot));
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (error instanceof ClaudeNativeEffectiveAuthUnsupportedError)
|
|
119
|
+
throw error;
|
|
120
|
+
if (error.code === 'ENOENT')
|
|
121
|
+
return;
|
|
122
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('profile_unreadable');
|
|
123
|
+
}
|
|
124
|
+
// Even an implicit user_oauth profile is refused: its credential source is outside this journal.
|
|
125
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('profile');
|
|
126
|
+
};
|
|
127
|
+
const assertNativeHome = (env, configDir) => {
|
|
128
|
+
const selected = env.CLAUDE_CONFIG_DIR?.trim()
|
|
129
|
+
|| (env.HOME?.trim() ? plugins.path.join(env.HOME.trim(), '.claude') : null);
|
|
130
|
+
if (!selected || !plugins.path.isAbsolute(selected) || plugins.path.normalize(selected) !== configDir) {
|
|
131
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const selectedNativeConfigParent = (env) => env.CLAUDE_CONFIG_DIR?.trim() || env.HOME?.trim() || null;
|
|
135
|
+
const assertSettingsSelectNative = (file) => {
|
|
136
|
+
let raw;
|
|
137
|
+
try {
|
|
138
|
+
raw = readNativeRaw(file);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
142
|
+
}
|
|
143
|
+
if (raw === null)
|
|
144
|
+
return;
|
|
145
|
+
let settings;
|
|
146
|
+
try {
|
|
147
|
+
settings = document(raw);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
151
|
+
}
|
|
152
|
+
if (text(settings.apiKeyHelper) || settings.forceLoginMethod || settings.forceLoginGatewayUrl) {
|
|
153
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
154
|
+
}
|
|
155
|
+
if (settings.env !== undefined) {
|
|
156
|
+
if (!isRecord(settings.env))
|
|
157
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
158
|
+
for (const key of contextKeys) {
|
|
159
|
+
if (settings.env[key])
|
|
160
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const assertNoManagedAuthSource = (root) => {
|
|
165
|
+
try {
|
|
166
|
+
plugins.fs.lstatSync(plugins.path.join(root, 'managed-settings.json'));
|
|
167
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (error instanceof ClaudeNativeEffectiveAuthUnsupportedError)
|
|
171
|
+
throw error;
|
|
172
|
+
if (error.code !== 'ENOENT') {
|
|
173
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
if (plugins.fs.readdirSync(plugins.path.join(root, 'managed-settings.d'))
|
|
178
|
+
.some(name => !name.startsWith('.') && name.endsWith('.json'))) {
|
|
179
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
if (error instanceof ClaudeNativeEffectiveAuthUnsupportedError)
|
|
184
|
+
throw error;
|
|
185
|
+
if (error.code !== 'ENOENT') {
|
|
186
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const assertProjectSettingsSelectNative = (cwd, processRoot) => {
|
|
191
|
+
for (let directory = cwd;; directory = plugins.path.dirname(directory)) {
|
|
192
|
+
for (const name of ['settings.json', 'settings.local.json']) {
|
|
193
|
+
assertSettingsSelectNative(processViewPath(plugins.path.join(directory, '.claude', name), processRoot));
|
|
194
|
+
}
|
|
195
|
+
if (plugins.path.dirname(directory) === directory)
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
/** Read native files without following a replacement symlink or accepting an unbounded/partial file. */
|
|
200
|
+
const readNativeBytes = (file) => {
|
|
201
|
+
let descriptor;
|
|
202
|
+
try {
|
|
203
|
+
descriptor = plugins.fs.openSync(file, plugins.fs.constants.O_RDONLY | plugins.fs.constants.O_NONBLOCK | plugins.fs.constants.O_NOFOLLOW);
|
|
204
|
+
const stat = plugins.fs.fstatSync(descriptor);
|
|
205
|
+
if (!stat.isFile() || stat.size > MAX_NATIVE_FILE_BYTES || stat.uid !== process.getuid?.()) {
|
|
206
|
+
throw new Error('Native Claude credential file is not a bounded owner-only regular file.');
|
|
207
|
+
}
|
|
208
|
+
const buffer = Buffer.alloc(MAX_NATIVE_FILE_BYTES + 1);
|
|
209
|
+
let length = 0;
|
|
210
|
+
while (length < buffer.length) {
|
|
211
|
+
const count = plugins.fs.readSync(descriptor, buffer, length, buffer.length - length, null);
|
|
212
|
+
if (count === 0)
|
|
213
|
+
break;
|
|
214
|
+
length += count;
|
|
215
|
+
}
|
|
216
|
+
if (length === buffer.length)
|
|
217
|
+
throw new Error('Native Claude credential file exceeds the supported size.');
|
|
218
|
+
// Keep the original bytes: TextDecoder accepts a BOM but strips it from text.
|
|
219
|
+
const bytes = buffer.subarray(0, length);
|
|
220
|
+
new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
221
|
+
return bytes;
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
if (error.code === 'ENOENT')
|
|
225
|
+
return null;
|
|
226
|
+
throw new Error('Native Claude credential file is unreadable or changed; no new credential was written.');
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
if (descriptor !== undefined)
|
|
230
|
+
plugins.fs.closeSync(descriptor);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
const decodeNativeRaw = (bytes) => bytes === null ? null
|
|
234
|
+
: new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
235
|
+
const readNativeRaw = (file) => decodeNativeRaw(readNativeBytes(file));
|
|
236
|
+
const document = (raw) => {
|
|
237
|
+
if (raw === null)
|
|
238
|
+
return {};
|
|
239
|
+
try {
|
|
240
|
+
const value = JSON.parse(typeof raw === 'string' ? raw : decodeNativeRaw(raw));
|
|
241
|
+
if (isRecord(value))
|
|
242
|
+
return value;
|
|
243
|
+
}
|
|
244
|
+
catch { /* Report one fixed, secret-free error. */ }
|
|
245
|
+
throw new Error('Native Claude credential file is incomplete or malformed.');
|
|
246
|
+
};
|
|
247
|
+
const validatedLogin = (credential, config) => {
|
|
248
|
+
if (text(config.primaryApiKey)) {
|
|
249
|
+
// 2.1.273 `qh` / `lge` reads this /login-managed API key before subscriber OAuth.
|
|
250
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
|
|
251
|
+
}
|
|
252
|
+
const oauthValue = credential.claudeAiOauth;
|
|
253
|
+
const accountValue = config.oauthAccount;
|
|
254
|
+
if (oauthValue === undefined && accountValue === undefined)
|
|
255
|
+
return { login: null, identity: null };
|
|
256
|
+
if (!isRecord(oauthValue) || !isRecord(accountValue)
|
|
257
|
+
|| !text(oauthValue.accessToken) || !text(oauthValue.refreshToken)
|
|
258
|
+
|| typeof oauthValue.expiresAt !== 'number' || !Number.isFinite(oauthValue.expiresAt)
|
|
259
|
+
|| !Array.isArray(oauthValue.scopes) || !oauthValue.scopes.every(scope => typeof scope === 'string')
|
|
260
|
+
|| !text(accountValue.accountUuid) || !text(accountValue.organizationUuid)) {
|
|
261
|
+
throw new Error('Native Claude login or account metadata is incomplete.');
|
|
262
|
+
}
|
|
263
|
+
// `Sc` / `CO` and the full native subscription gate in 2.1.273 require these fields.
|
|
264
|
+
if (!oauthValue.scopes.includes('user:inference')
|
|
265
|
+
|| (oauthValue.subscriptionType !== 'pro' && oauthValue.subscriptionType !== 'max')) {
|
|
266
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('subscription');
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
login: { claudeAiOauth: structuredClone(oauthValue), oauthAccount: structuredClone(accountValue) },
|
|
270
|
+
identity: { accountUuid: accountValue.accountUuid, organizationUuid: accountValue.organizationUuid },
|
|
271
|
+
};
|
|
272
|
+
};
|
|
273
|
+
const readPair = (credentialFile, configFile) => ({ credentialRaw: readNativeBytes(credentialFile), configRaw: readNativeBytes(configFile) });
|
|
274
|
+
const sameRaw = (left, right) => left === null ? right === null : right !== null && left.equals(right);
|
|
275
|
+
const samePair = (left, right) => sameRaw(left.credentialRaw, right.credentialRaw) && sameRaw(left.configRaw, right.configRaw);
|
|
276
|
+
const digests = (pair) => ({
|
|
277
|
+
credentialDigest: pair.credentialRaw === null ? null : hash(pair.credentialRaw),
|
|
278
|
+
configDigest: pair.configRaw === null ? null : hash(pair.configRaw),
|
|
279
|
+
});
|
|
280
|
+
const directoryIdentity = (directory) => {
|
|
281
|
+
const stat = plugins.fs.statSync(directory, { bigint: true });
|
|
282
|
+
if (!stat.isDirectory())
|
|
283
|
+
throw new Error('Claude native home is not a directory.');
|
|
284
|
+
return { device: stat.dev, inode: stat.ino };
|
|
285
|
+
};
|
|
286
|
+
const sameDirectory = (left, right) => left.device === right.device && left.inode === right.inode;
|
|
287
|
+
const processHasExited = (pid) => {
|
|
288
|
+
try {
|
|
289
|
+
process.kill(pid, 0);
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
return error.code === 'ESRCH';
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
/** Default probe is conservative: every same-user Claude executable must prove the pinned release. */
|
|
297
|
+
class ClaudeNativeVersionProbe {
|
|
298
|
+
executable;
|
|
299
|
+
constructor(executable) {
|
|
300
|
+
this.executable = executable;
|
|
301
|
+
}
|
|
302
|
+
installedVersion() {
|
|
303
|
+
try {
|
|
304
|
+
const output = plugins.childProcess.execFileSync(this.executable, ['--version'], {
|
|
305
|
+
encoding: 'utf8', timeout: 5_000, maxBuffer: 1024, windowsHide: true,
|
|
306
|
+
}).trim();
|
|
307
|
+
const matched = /^(\d+\.\d+\.\d+) \(Claude Code\)$/.exec(output);
|
|
308
|
+
return matched?.[1] ?? 'unknown';
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return 'unknown';
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
runningContexts() {
|
|
315
|
+
const contexts = [];
|
|
316
|
+
// Keep candidates from every mount namespace: a bind mount can expose the same inode.
|
|
317
|
+
const candidates = new HarnessProcesses('claude').list();
|
|
318
|
+
for (const running of candidates) {
|
|
319
|
+
let version = null;
|
|
320
|
+
let env = null;
|
|
321
|
+
let cwd = null;
|
|
322
|
+
let hasSettingsOverride = null;
|
|
323
|
+
let nativeHomeIdentity = null;
|
|
324
|
+
let configParentIdentity = null;
|
|
325
|
+
let mountNamespace = null;
|
|
326
|
+
let processRoot = null;
|
|
327
|
+
try {
|
|
328
|
+
const executable = plugins.fs.readlinkSync(`/proc/${running.pid}/exe`);
|
|
329
|
+
version = /(?:\/claude\/versions\/|\/remote\/ccd-cli\/)(\d+\.\d+\.\d+)$/.exec(executable)?.[1] ?? null;
|
|
330
|
+
mountNamespace = plugins.fs.readlinkSync(`/proc/${running.pid}/ns/mnt`);
|
|
331
|
+
env = selectorEnvironment(readProcessContext(`/proc/${running.pid}/environ`));
|
|
332
|
+
cwd = plugins.fs.readlinkSync(`/proc/${running.pid}/cwd`);
|
|
333
|
+
processRoot = `/proc/${running.pid}/root`;
|
|
334
|
+
if (!plugins.path.isAbsolute(cwd) || !sameDirectory(directoryIdentity(`/proc/${running.pid}/cwd`), directoryIdentity(processViewPath(cwd, processRoot)))) {
|
|
335
|
+
throw new Error('Claude process working directory cannot be resolved in its mount namespace.');
|
|
336
|
+
}
|
|
337
|
+
const selectedHome = env.CLAUDE_CONFIG_DIR?.trim()
|
|
338
|
+
|| (env.HOME?.trim() ? plugins.path.join(env.HOME.trim(), '.claude') : null);
|
|
339
|
+
if (!selectedHome)
|
|
340
|
+
throw new Error('Claude process native home is unknown.');
|
|
341
|
+
if (plugins.path.isAbsolute(selectedHome)
|
|
342
|
+
&& plugins.path.normalize(selectedHome) !== selectedHome) {
|
|
343
|
+
throw new Error('Claude process native home path is ambiguous.');
|
|
344
|
+
}
|
|
345
|
+
const processHome = plugins.path.isAbsolute(selectedHome)
|
|
346
|
+
? processViewPath(selectedHome, processRoot)
|
|
347
|
+
// Preserve the proc magic symlink before `..` is resolved by the target's VFS.
|
|
348
|
+
: `/proc/${running.pid}/cwd/${selectedHome}`;
|
|
349
|
+
nativeHomeIdentity = directoryIdentity(processHome);
|
|
350
|
+
const selectedConfigParent = selectedNativeConfigParent(env);
|
|
351
|
+
if (!selectedConfigParent)
|
|
352
|
+
throw new Error('Claude process config parent is unknown.');
|
|
353
|
+
const processConfigParent = plugins.path.isAbsolute(selectedConfigParent)
|
|
354
|
+
? processViewPath(selectedConfigParent, processRoot)
|
|
355
|
+
: `/proc/${running.pid}/cwd/${selectedConfigParent}`;
|
|
356
|
+
configParentIdentity = directoryIdentity(processConfigParent);
|
|
357
|
+
const argv = readProcessContext(`/proc/${running.pid}/cmdline`).split('\0').filter(Boolean);
|
|
358
|
+
hasSettingsOverride = argv.some(arg => ['--settings', '--managed-settings', '--setting-sources', '--bare'].some(flag => arg === flag || arg.startsWith(`${flag}=`)));
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
// A vanished process no longer owns a grant; an unreadable live candidate is ambiguous.
|
|
362
|
+
if (processHasExited(running.pid))
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
contexts.push({ version, env, cwd, hasSettingsOverride, nativeHomeIdentity,
|
|
366
|
+
configParentIdentity, mountNamespace, processRoot });
|
|
367
|
+
}
|
|
368
|
+
return contexts;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/** Explicitly limited to Claude Code's installed 2.1.273 Linux native-file contract. */
|
|
372
|
+
export class ClaudeNativeAdapter {
|
|
373
|
+
options;
|
|
374
|
+
credentialFile;
|
|
375
|
+
locks;
|
|
376
|
+
versionProbe;
|
|
377
|
+
fetcher;
|
|
378
|
+
env;
|
|
379
|
+
settingsFiles;
|
|
380
|
+
platform;
|
|
381
|
+
constructor(options) {
|
|
382
|
+
this.options = options;
|
|
383
|
+
if (!plugins.path.isAbsolute(options.configDir) || !plugins.path.isAbsolute(options.configFile)
|
|
384
|
+
|| plugins.path.normalize(options.configDir) !== options.configDir
|
|
385
|
+
|| plugins.path.normalize(options.configFile) !== options.configFile) {
|
|
386
|
+
throw new Error('Native Claude paths must be normalized absolute paths.');
|
|
387
|
+
}
|
|
388
|
+
if (![plugins.path.join(options.configDir, '.claude.json'),
|
|
389
|
+
plugins.path.join(plugins.os.homedir(), '.claude.json')].includes(options.configFile)) {
|
|
390
|
+
throw new Error('Native Claude account metadata must use its vendor config file.');
|
|
391
|
+
}
|
|
392
|
+
this.credentialFile = plugins.path.join(options.configDir, '.credentials.json');
|
|
393
|
+
this.locks = new ClaudeCodeLocks(options.configDir, options.configFile, { timeoutMs: options.lockTimeoutMs });
|
|
394
|
+
this.versionProbe = options.versionProbe ?? new ClaudeNativeVersionProbe(options.executable ?? 'claude');
|
|
395
|
+
this.fetcher = options.fetch ?? globalThis.fetch;
|
|
396
|
+
this.env = options.env ?? process.env;
|
|
397
|
+
this.settingsFiles = options.settingsFiles ?? [plugins.path.join(options.configDir, 'settings.json'),
|
|
398
|
+
plugins.path.join(process.cwd(), '.claude/settings.json'),
|
|
399
|
+
plugins.path.join(process.cwd(), '.claude/settings.local.json')];
|
|
400
|
+
this.platform = options.platform ?? process.platform;
|
|
401
|
+
}
|
|
402
|
+
assertSupported() {
|
|
403
|
+
if (this.platform !== 'linux')
|
|
404
|
+
throw new Error('Native Claude handoff requires the verified Linux file backend.');
|
|
405
|
+
const home = plugins.fs.lstatSync(this.options.configDir);
|
|
406
|
+
if (!home.isDirectory() || home.isSymbolicLink() || home.uid !== process.getuid?.()
|
|
407
|
+
|| plugins.fs.realpathSync(this.options.configDir) !== this.options.configDir) {
|
|
408
|
+
throw new Error('Native Claude home must be a real directory owned by this user.');
|
|
409
|
+
}
|
|
410
|
+
const configParent = plugins.path.dirname(this.options.configFile);
|
|
411
|
+
const parent = plugins.fs.lstatSync(configParent);
|
|
412
|
+
if (!parent.isDirectory() || parent.isSymbolicLink() || parent.uid !== process.getuid?.()
|
|
413
|
+
|| plugins.fs.realpathSync(configParent) !== configParent) {
|
|
414
|
+
throw new Error('Native Claude account metadata parent must be a real directory owned by this user.');
|
|
415
|
+
}
|
|
416
|
+
assertNoKnownNativeLoginOverride(this.env);
|
|
417
|
+
assertNativeHome(this.env, this.options.configDir);
|
|
418
|
+
const daemonConfigParent = selectedNativeConfigParent(this.env);
|
|
419
|
+
if (!daemonConfigParent || !plugins.path.isAbsolute(daemonConfigParent)
|
|
420
|
+
|| plugins.path.join(daemonConfigParent, '.claude.json') !== this.options.configFile) {
|
|
421
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
|
|
422
|
+
}
|
|
423
|
+
assertNoManagedAuthSource(this.options.managedSettingsDirectory ?? '/etc/claude-code');
|
|
424
|
+
for (const file of this.settingsFiles) {
|
|
425
|
+
assertSettingsSelectNative(file);
|
|
426
|
+
}
|
|
427
|
+
if (this.versionProbe.installedVersion() !== CLAUDE_NATIVE_HANDOFF_VERSION) {
|
|
428
|
+
throw new Error(`Native Claude handoff requires Claude Code ${CLAUDE_NATIVE_HANDOFF_VERSION} for every active session.`);
|
|
429
|
+
}
|
|
430
|
+
let runningSessions = 0;
|
|
431
|
+
const nativeHomeIdentity = directoryIdentity(this.options.configDir);
|
|
432
|
+
const configParentIdentity = directoryIdentity(configParent);
|
|
433
|
+
for (const running of this.versionProbe.runningContexts()) {
|
|
434
|
+
if (!running.nativeHomeIdentity) {
|
|
435
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
|
|
436
|
+
}
|
|
437
|
+
if (!sameDirectory(running.nativeHomeIdentity, nativeHomeIdentity))
|
|
438
|
+
continue;
|
|
439
|
+
if (!running.configParentIdentity
|
|
440
|
+
|| !sameDirectory(running.configParentIdentity, configParentIdentity)) {
|
|
441
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
|
|
442
|
+
}
|
|
443
|
+
if (running.version !== CLAUDE_NATIVE_HANDOFF_VERSION) {
|
|
444
|
+
throw new Error(`Native Claude handoff requires Claude Code ${CLAUDE_NATIVE_HANDOFF_VERSION} for every active session.`);
|
|
445
|
+
}
|
|
446
|
+
if (!running.env || !running.cwd || running.hasSettingsOverride === null
|
|
447
|
+
|| !running.mountNamespace || !running.processRoot) {
|
|
448
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
|
|
449
|
+
}
|
|
450
|
+
if (running.hasSettingsOverride)
|
|
451
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
|
|
452
|
+
assertNoKnownNativeLoginOverride(running.env, running.processRoot);
|
|
453
|
+
assertNoManagedAuthSource(processViewPath(this.options.managedSettingsDirectory ?? '/etc/claude-code', running.processRoot));
|
|
454
|
+
assertProjectSettingsSelectNative(running.cwd, running.processRoot);
|
|
455
|
+
runningSessions++;
|
|
456
|
+
}
|
|
457
|
+
return runningSessions;
|
|
458
|
+
}
|
|
459
|
+
/** The caller keeps its SmartData journal and both ownership transactions inside this callback. */
|
|
460
|
+
async withExclusiveHome(action) {
|
|
461
|
+
this.assertSupported();
|
|
462
|
+
return this.locks.holdAsync(async (lease) => {
|
|
463
|
+
this.assertSupported();
|
|
464
|
+
const session = new ClaudeNativeLockedSession(this.credentialFile, this.options.configFile, this.fetcher, lease, () => this.assertSupported());
|
|
465
|
+
const firstSnapshot = session.readStable();
|
|
466
|
+
const result = await action(session);
|
|
467
|
+
try {
|
|
468
|
+
lease.assertHeld();
|
|
469
|
+
const afterRunningSessions = this.assertSupported();
|
|
470
|
+
if (firstSnapshot.runningEffectiveAuth === 'no_scoped_sessions' && afterRunningSessions > 0) {
|
|
471
|
+
throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
catch {
|
|
475
|
+
// The caller may already have committed a journal or changed one native file.
|
|
476
|
+
throw new ClaudeCodeLockOutcomeUnknownError(true);
|
|
477
|
+
}
|
|
478
|
+
return result;
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
class ClaudeNativeLockedSession {
|
|
483
|
+
credentialFile;
|
|
484
|
+
configFile;
|
|
485
|
+
fetcher;
|
|
486
|
+
lease;
|
|
487
|
+
assertSupported;
|
|
488
|
+
constructor(credentialFile, configFile, fetcher, lease, assertSupported) {
|
|
489
|
+
this.credentialFile = credentialFile;
|
|
490
|
+
this.configFile = configFile;
|
|
491
|
+
this.fetcher = fetcher;
|
|
492
|
+
this.lease = lease;
|
|
493
|
+
this.assertSupported = assertSupported;
|
|
494
|
+
}
|
|
495
|
+
observation() {
|
|
496
|
+
try {
|
|
497
|
+
return digests(readPair(this.credentialFile, this.configFile));
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
return null;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
readStable() {
|
|
504
|
+
this.lease.assertHeld();
|
|
505
|
+
const runningSessions = this.assertSupported();
|
|
506
|
+
let lastError;
|
|
507
|
+
for (let attempt = 0; attempt < 5; attempt++) {
|
|
508
|
+
try {
|
|
509
|
+
const before = readPair(this.credentialFile, this.configFile);
|
|
510
|
+
const credential = document(before.credentialRaw);
|
|
511
|
+
const config = document(before.configRaw);
|
|
512
|
+
const observed = validatedLogin(credential, config);
|
|
513
|
+
const after = readPair(this.credentialFile, this.configFile);
|
|
514
|
+
if (samePair(before, after)) {
|
|
515
|
+
this.lease.assertHeld();
|
|
516
|
+
return { ...digests(after), ...observed,
|
|
517
|
+
runningEffectiveAuth: runningSessions === 0 ? 'no_scoped_sessions' : 'unsupported_effective_auth' };
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
catch (error) {
|
|
521
|
+
if (error instanceof ClaudeCodeLockOutcomeUnknownError)
|
|
522
|
+
throw error;
|
|
523
|
+
lastError = error;
|
|
524
|
+
}
|
|
525
|
+
if (attempt < 4) {
|
|
526
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
if (lastError instanceof ClaudeNativeEffectiveAuthUnsupportedError)
|
|
530
|
+
throw lastError;
|
|
531
|
+
throw new Error(lastError instanceof Error ? lastError.message
|
|
532
|
+
: 'Native Claude files changed while being read; no credential was written.');
|
|
533
|
+
}
|
|
534
|
+
async verifyProfileIdentity(snapshot, expected) {
|
|
535
|
+
this.lease.assertHeld();
|
|
536
|
+
this.assertSupported();
|
|
537
|
+
const token = snapshot.login?.claudeAiOauth.accessToken;
|
|
538
|
+
if (!text(token) || !snapshot.identity || !sameIdentity(snapshot.identity, expected)) {
|
|
539
|
+
throw new Error('Native Claude login identity differs from the selected account.');
|
|
540
|
+
}
|
|
541
|
+
const response = await claudeRequest(this.fetcher, {
|
|
542
|
+
url: 'https://api.anthropic.com/api/oauth/profile', method: 'GET',
|
|
543
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', 'Cache-Control': 'no-cache' },
|
|
544
|
+
subject: 'Claude account', timeoutMs: PROFILE_TIMEOUT_MS, now: Date.now,
|
|
545
|
+
});
|
|
546
|
+
this.lease.assertHeld();
|
|
547
|
+
const current = this.observation();
|
|
548
|
+
if (!current || !sameDigests(current, snapshot)) {
|
|
549
|
+
throw new Error('Native Claude login changed during provider identity verification.');
|
|
550
|
+
}
|
|
551
|
+
if (response.status !== 200 || !isRecord(response.body)
|
|
552
|
+
|| !isRecord(response.body.account) || !isRecord(response.body.organization)
|
|
553
|
+
|| response.body.account.uuid !== expected.accountUuid
|
|
554
|
+
|| response.body.organization.uuid !== expected.organizationUuid) {
|
|
555
|
+
throw new Error('Claude account profile did not verify the selected immutable identity.');
|
|
556
|
+
}
|
|
557
|
+
return { ...expected, accessTokenDigest: hash(token) };
|
|
558
|
+
}
|
|
559
|
+
async prepareWrite(input) {
|
|
560
|
+
this.lease.assertHeld();
|
|
561
|
+
this.assertSupported();
|
|
562
|
+
let before;
|
|
563
|
+
try {
|
|
564
|
+
before = this.readStable();
|
|
565
|
+
}
|
|
566
|
+
catch {
|
|
567
|
+
return { kind: 'not_written', reason: 'source_unreadable', observed: this.observation() };
|
|
568
|
+
}
|
|
569
|
+
if (!sameDigests(before, input.expected)) {
|
|
570
|
+
return { kind: 'not_written', reason: 'source_changed', observed: onlyDigests(before) };
|
|
571
|
+
}
|
|
572
|
+
if (input.expectedSourceIdentity === null ? before.identity !== null
|
|
573
|
+
: before.identity === null || !sameIdentity(before.identity, input.expectedSourceIdentity)) {
|
|
574
|
+
return { kind: 'not_written', reason: 'source_identity_mismatch', observed: onlyDigests(before) };
|
|
575
|
+
}
|
|
576
|
+
let target;
|
|
577
|
+
try {
|
|
578
|
+
target = validatedLogin({ claudeAiOauth: input.targetLogin.claudeAiOauth }, { oauthAccount: input.targetLogin.oauthAccount });
|
|
579
|
+
}
|
|
580
|
+
catch {
|
|
581
|
+
return { kind: 'not_written', reason: 'target_unverified', observed: onlyDigests(before) };
|
|
582
|
+
}
|
|
583
|
+
if (!target.login || !target.identity || !sameIdentity(target.identity, input.expectedIdentity)) {
|
|
584
|
+
return { kind: 'not_written', reason: 'target_unverified', observed: onlyDigests(before) };
|
|
585
|
+
}
|
|
586
|
+
let profile;
|
|
587
|
+
try {
|
|
588
|
+
profile = await this.verifyProfileIdentity({ ...before, ...target }, input.expectedIdentity);
|
|
589
|
+
}
|
|
590
|
+
catch {
|
|
591
|
+
this.lease.assertHeld();
|
|
592
|
+
this.assertSupported();
|
|
593
|
+
const observed = this.observation();
|
|
594
|
+
if (!observed)
|
|
595
|
+
return { kind: 'not_written', reason: 'source_unreadable', observed: null };
|
|
596
|
+
if (!sameDigests(observed, input.expected)) {
|
|
597
|
+
return { kind: 'not_written', reason: 'source_changed', observed };
|
|
598
|
+
}
|
|
599
|
+
return { kind: 'not_written', reason: 'target_unverified', observed: onlyDigests(before) };
|
|
600
|
+
}
|
|
601
|
+
const current = this.observation();
|
|
602
|
+
if (!current || !sameDigests(current, input.expected)) {
|
|
603
|
+
return { kind: 'not_written', reason: 'source_changed', observed: current };
|
|
604
|
+
}
|
|
605
|
+
this.lease.assertHeld();
|
|
606
|
+
this.assertSupported();
|
|
607
|
+
let original;
|
|
608
|
+
try {
|
|
609
|
+
original = readPair(this.credentialFile, this.configFile);
|
|
610
|
+
}
|
|
611
|
+
catch {
|
|
612
|
+
return { kind: 'not_written', reason: 'source_unreadable', observed: this.observation() };
|
|
613
|
+
}
|
|
614
|
+
if (!sameDigests(digests(original), input.expected)) {
|
|
615
|
+
return { kind: 'not_written', reason: 'source_changed', observed: digests(original) };
|
|
616
|
+
}
|
|
617
|
+
const credential = document(original.credentialRaw);
|
|
618
|
+
const config = document(original.configRaw);
|
|
619
|
+
const nextCredential = { ...credential, claudeAiOauth: target.login.claudeAiOauth };
|
|
620
|
+
const nextConfig = { ...config, oauthAccount: target.login.oauthAccount };
|
|
621
|
+
for (const key of ACCOUNT_CACHES)
|
|
622
|
+
delete nextConfig[key];
|
|
623
|
+
const credentialRaw = JSON.stringify(nextCredential, null, 2) + '\n';
|
|
624
|
+
const configRaw = JSON.stringify(nextConfig, null, 2) + '\n';
|
|
625
|
+
if (Buffer.byteLength(credentialRaw) > MAX_NATIVE_FILE_BYTES
|
|
626
|
+
|| Buffer.byteLength(configRaw) > MAX_NATIVE_FILE_BYTES) {
|
|
627
|
+
return { kind: 'not_written', reason: 'target_oversized', observed: onlyDigests(before) };
|
|
628
|
+
}
|
|
629
|
+
const plan = Object.freeze({
|
|
630
|
+
before: Object.freeze(onlyDigests(input.expected)),
|
|
631
|
+
after: Object.freeze(digests({ credentialRaw: Buffer.from(credentialRaw), configRaw: Buffer.from(configRaw) })),
|
|
632
|
+
sourceIdentity: input.expectedSourceIdentity === null ? null : Object.freeze({ ...input.expectedSourceIdentity }),
|
|
633
|
+
targetIdentity: Object.freeze({ ...input.expectedIdentity }),
|
|
634
|
+
profile: Object.freeze({ ...profile }),
|
|
635
|
+
});
|
|
636
|
+
preparedWrites.set(plan, { session: this, credentialRaw, configRaw,
|
|
637
|
+
originalConfigRaw: original.configRaw, targetAccessToken: String(target.login.claudeAiOauth.accessToken) });
|
|
638
|
+
return { kind: 'prepared', plan };
|
|
639
|
+
}
|
|
640
|
+
exportPreparedSource(plan) {
|
|
641
|
+
this.lease.assertHeld();
|
|
642
|
+
this.assertSupported();
|
|
643
|
+
const prepared = preparedWrites.get(plan);
|
|
644
|
+
if (!prepared || prepared.session !== this)
|
|
645
|
+
throw new Error('Claude native write plan is not held by this lease.');
|
|
646
|
+
const stable = this.readStable();
|
|
647
|
+
if (!sameDigests(stable, plan.before)
|
|
648
|
+
|| (plan.sourceIdentity === null ? stable.identity !== null
|
|
649
|
+
: stable.identity === null || !sameIdentity(stable.identity, plan.sourceIdentity))) {
|
|
650
|
+
throw new Error('Claude native source changed before backup export.');
|
|
651
|
+
}
|
|
652
|
+
const original = readPair(this.credentialFile, this.configFile);
|
|
653
|
+
if (!sameDigests(digests(original), plan.before)
|
|
654
|
+
|| !sameRaw(original.configRaw, prepared.originalConfigRaw)) {
|
|
655
|
+
throw new Error('Claude native source changed before backup export.');
|
|
656
|
+
}
|
|
657
|
+
this.lease.assertHeld();
|
|
658
|
+
this.assertSupported();
|
|
659
|
+
return { before: Object.freeze({ ...plan.before }),
|
|
660
|
+
credentialBytes: original.credentialRaw === null ? null : Buffer.from(original.credentialRaw),
|
|
661
|
+
configBytes: original.configRaw === null ? null : Buffer.from(original.configRaw) };
|
|
662
|
+
}
|
|
663
|
+
writePreparedIfCurrent(plan) {
|
|
664
|
+
this.lease.assertHeld();
|
|
665
|
+
this.assertSupported();
|
|
666
|
+
const prepared = preparedWrites.get(plan);
|
|
667
|
+
if (!prepared || prepared.session !== this)
|
|
668
|
+
throw new Error('Claude native write plan is not held by this lease.');
|
|
669
|
+
preparedWrites.delete(plan);
|
|
670
|
+
let before;
|
|
671
|
+
try {
|
|
672
|
+
before = this.readStable();
|
|
673
|
+
}
|
|
674
|
+
catch {
|
|
675
|
+
return { kind: 'not_written', reason: 'source_unreadable', observed: this.observation() };
|
|
676
|
+
}
|
|
677
|
+
if (!sameDigests(before, plan.before)) {
|
|
678
|
+
return { kind: 'not_written', reason: 'source_changed', observed: onlyDigests(before) };
|
|
679
|
+
}
|
|
680
|
+
if (plan.sourceIdentity === null ? before.identity !== null
|
|
681
|
+
: before.identity === null || !sameIdentity(before.identity, plan.sourceIdentity)) {
|
|
682
|
+
return { kind: 'not_written', reason: 'source_identity_mismatch', observed: onlyDigests(before) };
|
|
683
|
+
}
|
|
684
|
+
let original;
|
|
685
|
+
try {
|
|
686
|
+
original = readPair(this.credentialFile, this.configFile);
|
|
687
|
+
}
|
|
688
|
+
catch {
|
|
689
|
+
return { kind: 'not_written', reason: 'source_unreadable', observed: this.observation() };
|
|
690
|
+
}
|
|
691
|
+
if (!sameDigests(digests(original), plan.before)
|
|
692
|
+
|| !sameRaw(original.configRaw, prepared.originalConfigRaw)) {
|
|
693
|
+
return { kind: 'not_written', reason: 'source_changed', observed: digests(original) };
|
|
694
|
+
}
|
|
695
|
+
// The first write is the uncertainty boundary; no automatic rollback can prove ownership after it.
|
|
696
|
+
try {
|
|
697
|
+
this.lease.assertHeld();
|
|
698
|
+
writeSecretFileAtomically(this.credentialFile, prepared.credentialRaw);
|
|
699
|
+
this.lease.assertHeld();
|
|
700
|
+
const middle = readPair(this.credentialFile, this.configFile);
|
|
701
|
+
if (!sameRaw(middle.credentialRaw, Buffer.from(prepared.credentialRaw))
|
|
702
|
+
|| !sameRaw(middle.configRaw, original.configRaw)) {
|
|
703
|
+
return { kind: 'uncertain', reason: 'native_write_or_readback_failed', observed: digests(middle) };
|
|
704
|
+
}
|
|
705
|
+
writeSecretFileAtomically(this.configFile, prepared.configRaw);
|
|
706
|
+
this.lease.assertHeld();
|
|
707
|
+
const after = readPair(this.credentialFile, this.configFile);
|
|
708
|
+
if (!sameRaw(after.credentialRaw, Buffer.from(prepared.credentialRaw))
|
|
709
|
+
|| !sameRaw(after.configRaw, Buffer.from(prepared.configRaw))
|
|
710
|
+
|| !sameDigests(digests(after), plan.after)) {
|
|
711
|
+
return { kind: 'uncertain', reason: 'native_write_or_readback_failed', observed: digests(after) };
|
|
712
|
+
}
|
|
713
|
+
const snapshot = this.readStable();
|
|
714
|
+
if (!snapshot.login || !snapshot.identity || !sameIdentity(snapshot.identity, plan.targetIdentity)
|
|
715
|
+
|| !sameDigests(snapshot, plan.after)
|
|
716
|
+
|| snapshot.login.claudeAiOauth.accessToken !== prepared.targetAccessToken
|
|
717
|
+
|| plan.profile.accessTokenDigest !== hash(String(snapshot.login.claudeAiOauth.accessToken))) {
|
|
718
|
+
return { kind: 'uncertain', reason: 'native_write_or_readback_failed', observed: onlyDigests(snapshot) };
|
|
719
|
+
}
|
|
720
|
+
return { kind: 'written', snapshot, profile: plan.profile };
|
|
721
|
+
}
|
|
722
|
+
catch {
|
|
723
|
+
return { kind: 'uncertain', reason: 'native_write_or_readback_failed', observed: this.observation() };
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
async writeIfCurrent(input) {
|
|
727
|
+
const prepared = await this.prepareWrite(input);
|
|
728
|
+
return prepared.kind === 'prepared' ? this.writePreparedIfCurrent(prepared.plan) : prepared;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGF1ZGVuYXRpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNsYXVkZW5hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsZUFBZSxFQUM5QixNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLFNBQVMsQ0FBQztBQUN2RCxNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM5QyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxNQUFNLGNBQWMsR0FBRztJQUNyQiw2QkFBNkIsRUFBRSxrQ0FBa0MsRUFBRSwyQkFBMkI7SUFDOUYsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsNkJBQTZCLEVBQUUsaUJBQWlCO0lBQzVGLHNCQUFzQixFQUFFLHlCQUF5QixFQUFFLHdCQUF3QjtDQUNuRSxDQUFDO0FBQ1gsTUFBTSxvQkFBb0IsR0FBRztJQUMzQix5QkFBeUIsRUFBRSx5Q0FBeUMsRUFBRSxtQkFBbUI7SUFDekYsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCO0lBQ3RFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLG9CQUFvQjtJQUN6RSw4QkFBOEIsRUFBRSwyQkFBMkI7SUFDM0QsK0JBQStCLEVBQUUsMEJBQTBCLEVBQUUsd0JBQXdCO0lBQ3JGLHVCQUF1QixF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
|