@modelprofile.com/authswitch 8.2.0 → 9.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 +18 -1
- package/dist_ts/authority-contract.js +3 -2
- package/dist_ts/authority-paths.d.ts +37 -0
- package/dist_ts/authority-paths.js +46 -0
- package/dist_ts/authority-runtime-contract.d.ts +11 -1
- package/dist_ts/classes.authoritybroker.d.ts +9 -0
- package/dist_ts/classes.authoritybroker.js +70 -10
- package/dist_ts/classes.authorityclient.js +20 -1
- package/dist_ts/classes.authoritydaemon.d.ts +14 -3
- package/dist_ts/classes.authoritydaemon.js +33 -2
- package/dist_ts/classes.authoritydatabase.js +11 -2
- package/dist_ts/classes.authorityimport.d.ts +16 -4
- package/dist_ts/classes.authorityimport.js +74 -23
- package/dist_ts/classes.authoritypreuse.js +8 -3
- package/dist_ts/classes.authorityservice.d.ts +10 -11
- package/dist_ts/classes.authorityservice.js +14 -23
- package/dist_ts/classes.cli.d.ts +10 -2
- package/dist_ts/classes.cli.js +12 -4
- package/dist_ts/classes.codexmanaged.d.ts +8 -0
- package/dist_ts/classes.codexmanaged.js +19 -12
- package/dist_ts/classes.legacyfence.d.ts +53 -0
- package/dist_ts/classes.legacyfence.js +189 -0
- package/dist_ts/classes.operations.d.ts +15 -3
- package/dist_ts/classes.operations.js +22 -4
- package/dist_ts/classes.service.d.ts +21 -2
- package/dist_ts/classes.service.js +35 -8
- package/dist_ts/classes.tui.d.ts +2 -1
- package/dist_ts/classes.tui.js +3 -2
- package/dist_ts/ts_migration/legacysources/authswitchstores.js +5 -2
- package/package.json +7 -7
- package/readme.md +129 -17
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/authority-contract.ts +20 -1
- package/ts/authority-paths.ts +69 -0
- package/ts/authority-runtime-contract.ts +11 -1
- package/ts/classes.authoritybroker.ts +68 -10
- package/ts/classes.authorityclient.ts +16 -0
- package/ts/classes.authoritydaemon.ts +45 -4
- package/ts/classes.authoritydatabase.ts +10 -1
- package/ts/classes.authorityimport.ts +101 -24
- package/ts/classes.authoritypreuse.ts +7 -1
- package/ts/classes.authorityservice.ts +15 -30
- package/ts/classes.cli.ts +14 -3
- package/ts/classes.codexmanaged.ts +18 -7
- package/ts/classes.legacyfence.ts +219 -0
- package/ts/classes.operations.ts +22 -3
- package/ts/classes.service.ts +45 -8
- package/ts/classes.tui.ts +3 -1
- package/ts/ts_migration/legacysources/authswitchstores.ts +4 -1
|
@@ -189,7 +189,10 @@ export const readAuthSwitchStores = (locations) => {
|
|
|
189
189
|
catch (error) {
|
|
190
190
|
if (error.code === 'ENOENT')
|
|
191
191
|
return { sources, problems };
|
|
192
|
-
|
|
192
|
+
// The store is named by what it is, never by where it is: this report goes to a CLI and to a backend,
|
|
193
|
+
// and the location of a credential store is not something either of them may be told. Everything
|
|
194
|
+
// below names an entry inside the store instead, which is what the owner needs to find it.
|
|
195
|
+
return { sources, problems: ['the authswitch store could not be listed'] };
|
|
193
196
|
}
|
|
194
197
|
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
195
198
|
const path = plugins.path.join(locations.authSwitchHome, entry.name);
|
|
@@ -241,4 +244,4 @@ export const readAuthSwitchStores = (locations) => {
|
|
|
241
244
|
}
|
|
242
245
|
return { sources, problems };
|
|
243
246
|
};
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aHN3aXRjaHN0b3Jlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3RzX21pZ3JhdGlvbi9sZWdhY3lzb3VyY2VzL2F1dGhzd2l0Y2hzdG9yZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFDOUYsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFFbkQsTUFBTSxhQUFhLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7R0FVRztBQUVILE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDckMsMEZBQTBGO0FBQzFGLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNoRCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztBQUUzQyxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxLQUFtQyxFQUNILEVBQUU7SUFDbEUsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLE9BQU87UUFDTCxFQUFFLEVBQUUsY0FBYyxDQUFDLGtCQUFrQixFQUFFLGNBQWMsQ0FBQztRQUN0RCxVQUFVLEVBQUUsa0JBQWtCO1FBQzlCLElBQUk7UUFDSixjQUFjO1FBQ2QsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQztLQUN4QyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYseUdBQXlHO0FBQ3pHLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFZLEVBQXVCLEVBQUU7SUFDL0QsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBQzlC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
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aHN3aXRjaHN0b3Jlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3RzX21pZ3JhdGlvbi9sZWdhY3lzb3VyY2VzL2F1dGhzd2l0Y2hzdG9yZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFDOUYsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFFbkQsTUFBTSxhQUFhLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7R0FVRztBQUVILE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDckMsMEZBQTBGO0FBQzFGLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNoRCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztBQUUzQyxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxLQUFtQyxFQUNILEVBQUU7SUFDbEUsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLE9BQU87UUFDTCxFQUFFLEVBQUUsY0FBYyxDQUFDLGtCQUFrQixFQUFFLGNBQWMsQ0FBQztRQUN0RCxVQUFVLEVBQUUsa0JBQWtCO1FBQzlCLElBQUk7UUFDSixjQUFjO1FBQ2QsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQztLQUN4QyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYseUdBQXlHO0FBQ3pHLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFZLEVBQXVCLEVBQUU7SUFDL0QsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBQzlC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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modelprofile.com/authswitch",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Manage Codex, OpenCode and Claude Code accounts with guided switching and live usage status",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -53,10 +53,10 @@
|
|
|
53
53
|
"authswitch": "./cli.js"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@git.zone/tsbuild": "^
|
|
57
|
-
"@git.zone/tsrun": "^
|
|
58
|
-
"@git.zone/tstest": "^6.
|
|
59
|
-
"@types/node": "26.
|
|
56
|
+
"@git.zone/tsbuild": "^5.0.0",
|
|
57
|
+
"@git.zone/tsrun": "^3.0.0",
|
|
58
|
+
"@git.zone/tstest": "^6.2.1",
|
|
59
|
+
"@types/node": "26.6.1",
|
|
60
60
|
"@types/ws": "8.18.1",
|
|
61
61
|
"esbuild": "^0.28.2",
|
|
62
62
|
"ws": "8.21.2"
|
|
@@ -68,9 +68,9 @@
|
|
|
68
68
|
"@lossless.org/nosqldb": "10.3.0",
|
|
69
69
|
"@modelprofile.com/flexharness-models": "^8.0.0",
|
|
70
70
|
"@modelprofile.com/flexharness-providers": "^8.0.0",
|
|
71
|
-
"@modelprofile.com/mcp-crossharness": "5.
|
|
71
|
+
"@modelprofile.com/mcp-crossharness": "5.5.0",
|
|
72
72
|
"@push.rocks/smartconsole": "^1.3.0",
|
|
73
|
-
"@push.rocks/smartdaemon": "2.7.
|
|
73
|
+
"@push.rocks/smartdaemon": "2.7.2",
|
|
74
74
|
"@push.rocks/smartsecret": "1.8.0",
|
|
75
75
|
"@types/proper-lockfile": "^4.1.4",
|
|
76
76
|
"proper-lockfile": "^4.1.2"
|
package/readme.md
CHANGED
|
@@ -32,7 +32,11 @@ bindings, durable device-operation receipts, Codex enrollment records, and nativ
|
|
|
32
32
|
owns OpenAI device login, targeted reauthentication, and proactive refresh for grants
|
|
33
33
|
added through this API. Management snapshots expose separate account and login rows,
|
|
34
34
|
including each login's purpose, owner, health, problem and available actions; neither
|
|
35
|
-
snapshots nor events contain credentials.
|
|
35
|
+
snapshots nor events contain credentials. A login that a native tool refreshes also names
|
|
36
|
+
that tool -- `ownerTool` is `claude_code`, `codex` or `opencode`, and `null` exactly when no
|
|
37
|
+
native tool holds it, because the authority refreshes it or nothing does. The authority
|
|
38
|
+
names it rather than leaving a consumer to derive it from the purpose, which would be wrong
|
|
39
|
+
as soon as two purposes share a tool or one tool gains a second purpose.
|
|
36
40
|
|
|
37
41
|
```ts
|
|
38
42
|
import { randomUUID } from 'node:crypto';
|
|
@@ -51,11 +55,14 @@ const receipt = await client.getOperation(operation.id);
|
|
|
51
55
|
Browser code can import the credential-free DTOs from
|
|
52
56
|
`@modelprofile.com/authswitch/authority-contract`. The backend-only binding, access and release
|
|
53
57
|
requests are named by `@modelprofile.com/authswitch/authority-runtime-contract`, and the one-time
|
|
54
|
-
import's own DTOs by `@modelprofile.com/authswitch/authority-import-contract`;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
import's own DTOs by `@modelprofile.com/authswitch/authority-import-contract`; those capabilities must
|
|
59
|
+
never reach a browser. Two of the three runtime requests are served on the runtime socket -- resolving
|
|
60
|
+
access and releasing a binding -- while `authswitch.authority.bind` is served on the **management** socket
|
|
61
|
+
by design: minting a capability is the act that authorizes a runtime, so only a trusted management caller
|
|
62
|
+
may perform it, and a container that is given the runtime directory can use a binding it was handed but can
|
|
63
|
+
never create one. A backend binds an account to a runtime incarnation by exact account ID, login ID and
|
|
64
|
+
purpose, and keeps the returned capability private. Targeted reauthentication likewise requires the
|
|
65
|
+
exact login; an account's presentation default never selects a grant for either action. Completed and
|
|
59
66
|
interrupted operations remain discoverable through `getOperation()` and paged
|
|
60
67
|
`listOperations()`. A completed receipt and its account/grant change commit together, so
|
|
61
68
|
the receipt resolves a lost response or an event that arrives first. Add and reauthentication
|
|
@@ -91,9 +98,26 @@ instruction for an owner.
|
|
|
91
98
|
that marker: it answers `{ code, instruction }` for a refusal and `null` for a fault. The code is the
|
|
92
99
|
closed `TAuthSwitchRefusalCode` set, which is what a client branches on without reading the text:
|
|
93
100
|
`authority_closing`, `not_found`, `account_changed`, `account_busy`, `login_unavailable`,
|
|
94
|
-
`native_owner_holds_login`, `claude_home_unregistered`, `claude_handoff_pending`,
|
|
95
|
-
`claude_receipt_missing` and `import_refusal
|
|
96
|
-
|
|
101
|
+
`binding_unauthorized`, `native_owner_holds_login`, `claude_home_unregistered`, `claude_handoff_pending`,
|
|
102
|
+
`claude_receipt_missing` and `import_refusal`, plus the two the legacy commands answer with on this side of
|
|
103
|
+
the socket, `authority_holds_login` and `authority_unavailable` (see "The legacy fence" below). The
|
|
104
|
+
instruction is authored for the owner and contains no path, credential or digest; only an importer refusal
|
|
105
|
+
may name the process the owner has to stop. The set is producer-owned: a consumer branches on the codes it
|
|
106
|
+
knows and keeps a default branch, which is what lets the authority name a new one without breaking it.
|
|
107
|
+
|
|
108
|
+
The runtime's own answers are named the same way. `authswitch.authority.bind` refuses `login_unavailable`
|
|
109
|
+
when the authority does not hold the login itself, and `authswitch.authority.resolveAccess` refuses
|
|
110
|
+
`binding_unauthorized` for a capability that authorizes nothing -- missing, wrong, or superseded while the
|
|
111
|
+
credential was being resolved. Those are one answer on purpose: an absent binding and a wrong capability are
|
|
112
|
+
compared against the same zero hash, so nothing distinguishes them, and the repair is the same either way --
|
|
113
|
+
bind again. A binding whose account has since been reauthorized reads `login_unavailable` instead, because
|
|
114
|
+
binding again cannot help until that account holds a login again. A device sign-in or preuse operation this
|
|
115
|
+
authority does not hold reads `not_found`, from whichever route met it. Two things stay unmarked faults on
|
|
116
|
+
purpose. What the shared managed-access loop refuses is one: it serves a bound runtime and the
|
|
117
|
+
credential-free usage reader alike, and those two repair differently. Binding an *account* this authority
|
|
118
|
+
does not hold at all is the other: the storage layer throws `Account is not available for this runtime.`,
|
|
119
|
+
which a socket caller reads as `Internal server error`, because naming it is a decision about which layer
|
|
120
|
+
authors owner instructions rather than a wording fix.
|
|
97
121
|
|
|
98
122
|
The import routes keep the marker they published in 8.1.0, `authswitch_import_refusal`, and
|
|
99
123
|
`isAuthSwitchImportRefusal` from `@modelprofile.com/authswitch/authority-import-contract` is the same
|
|
@@ -259,7 +283,13 @@ native harness process or Codex's app-server is running, and an app-server it ca
|
|
|
259
283
|
An adopt whose refresh fails, or whose answer is lost, is never retried: the source is quarantined, its grant
|
|
260
284
|
is left needing re-authentication, and the command says so. A projection fails differently, because nothing
|
|
261
285
|
rotating was ever sent for it: a native store that could not be proven live stays a pending native owner and
|
|
262
|
-
is imported by submitting the same source again once its own tool has refreshed it.
|
|
286
|
+
is imported by submitting the same source again once its own tool has refreshed it. That refresh rewrites the
|
|
287
|
+
file, so the retry carries the digest the inventory prints afterwards: a row waiting for its native owner
|
|
288
|
+
follows its own tool's bytes, and nothing else does. What it never follows is another login. A row names the
|
|
289
|
+
account and the grant it was approved for, and a source that now holds a different account's login is refused
|
|
290
|
+
with that stated -- before the account is registered, because the provider read that proves a projection asks
|
|
291
|
+
about the identity the new bytes themselves carry and would prove the wrong login perfectly well. Neither
|
|
292
|
+
that refusal nor "already imported" ever clears: no route forgets a row or re-points it at another account.
|
|
263
293
|
|
|
264
294
|
`import status` reads the migration ledger, the grants and the handoffs -- never the host -- and reports, per
|
|
265
295
|
source, where it stands, which owner refreshes its login now, and what to do next: nothing, submit the same
|
|
@@ -273,6 +303,17 @@ An import deletes nothing: retiring the legacy files is a separate, later step.
|
|
|
273
303
|
deliberately not backed up, so losing it costs one device sign-in per account -- and the remote-control
|
|
274
304
|
enrollments and runtime bindings with it.
|
|
275
305
|
|
|
306
|
+
**Where a daemon reads those stores is stated by whoever builds it, never defaulted.** The legacy stores are
|
|
307
|
+
this user's real credentials, and every location they are found at comes from the environment, so
|
|
308
|
+
`AuthSwitchAuthorityDaemon` takes a required `legacyImport`: either the locations to read (an `env` and an
|
|
309
|
+
absolute `homeDirectory`, plus the provider operations that import uses) or `'none'`, which builds a daemon
|
|
310
|
+
with no account import at all and answers `import inventory`, `import status` and `import submit` with the
|
|
311
|
+
`import_refusal` code -- a decided refusal of the closed set, never an empty inventory and never a fault, so
|
|
312
|
+
a caller reads it exactly as it reads every other import refusal. A construction that names neither -- no
|
|
313
|
+
locations and no `'none'` -- is refused before the daemon exists, rather than reading whichever host happened
|
|
314
|
+
to start it. The per-user daemon this package installs -- `authswitch authority daemon`, the service unit's
|
|
315
|
+
own entry point -- is the one place that takes those locations from this host.
|
|
316
|
+
|
|
276
317
|
`AuthSwitchClient.getUsage(accountId, loginId)` reads OpenAI managed limits or a Claude
|
|
277
318
|
host login's profile and usage through the management socket. The tagged, credential-free
|
|
278
319
|
reading preserves Claude's labelled five-hour, weekly and model windows, plan provenance,
|
|
@@ -298,7 +339,7 @@ generated prose and credentials are absent from persistence and management respo
|
|
|
298
339
|
removal and targeted reauthentication refuse while that account has an active preuse request.
|
|
299
340
|
|
|
300
341
|
A trusted in-process daemon host can call `AuthSwitchAuthorityDaemon.startManagedCodex()`
|
|
301
|
-
for a bound account and workspace. It owns a private Codex 0.
|
|
342
|
+
for a bound account and workspace. It owns a private Codex 0.157.0 app-server, passes only
|
|
302
343
|
the authority's current access token through Codex's external-token login, answers its
|
|
303
344
|
unauthorized callback through the authority, and revokes the binding on stop. The returned
|
|
304
345
|
runtime exposes an interactive `codex --remote unix://…` launch descriptor and native
|
|
@@ -314,15 +355,27 @@ gone; an uncertain launch remains blocked. Callers must explicitly stop owned pr
|
|
|
314
355
|
after their work finishes. Once reauthentication starts, it holds new admissions until the
|
|
315
356
|
device operation settles. Only the private socket directory is removed on close. Codex's
|
|
316
357
|
credential store remains ephemeral and does not read or write `auth.json` in that home.
|
|
358
|
+
Codex binds the app-server socket in its own per-user directory,
|
|
359
|
+
`<realpath /tmp>/codex-daemon-<euid>`, and publishes the private socket path as a link to it.
|
|
360
|
+
The daemon checks that publication with `@modelprofile.com/mcp-crossharness`'s
|
|
361
|
+
`observeCodexUnixSocket` and connects only when the link is exactly Codex's own, in a
|
|
362
|
+
directory other users cannot rewrite, and the socket behind it is the user's own in a 0700
|
|
363
|
+
directory of the user's; anything else fails the start with that package's error. Codex keeps a
|
|
364
|
+
zero-byte startup lock in that directory for each socket path it has served; the file is
|
|
365
|
+
Codex's own and authswitch does not remove it.
|
|
366
|
+
Managed Codex runs only the verified Codex release: a `codex` that reports any other
|
|
367
|
+
version is refused before it starts, so an automatic Codex update stops new managed
|
|
368
|
+
sessions until authswitch has verified that release.
|
|
317
369
|
Managed-Codex process ownership observation is qualified on Linux and reads exact argument
|
|
318
370
|
boundaries from `/proc`; on other hosts doctor reports the process observation as unknown,
|
|
319
371
|
and authority actions that require survivor proof refuse instead of guessing.
|
|
320
|
-
Codex 0.
|
|
372
|
+
Codex 0.157.0 does not persist an unused thread created by `thread/start`; resume applies
|
|
321
373
|
after Codex has committed a rollout. The existing CLI has not yet been moved to this path.
|
|
322
374
|
|
|
323
375
|
This SDK is additive at this stage. The commands documented below still use the existing
|
|
324
|
-
credential stores
|
|
325
|
-
|
|
376
|
+
credential stores, except that the legacy fence below refuses them a login the authority
|
|
377
|
+
holds. The authority daemon does not import those stores automatically, replace their
|
|
378
|
+
active native sessions, or take over their refresh grants. An active
|
|
326
379
|
Codex/OpenCode native grant remains pending until its owner is idle and an explicit
|
|
327
380
|
handoff verifies the latest native source. Claude Code's own native credential files
|
|
328
381
|
remain vendor-owned; a container setup-token grant is a separate grant under the same
|
|
@@ -353,6 +406,62 @@ restore system could have written.
|
|
|
353
406
|
The store is deliberately not backed up: its refresh grants are sealed to this host's TPM,
|
|
354
407
|
so a lost store is recovered by one device re-login per account.
|
|
355
408
|
|
|
409
|
+
### The legacy fence
|
|
410
|
+
|
|
411
|
+
Once the authority has taken a saved copy over, the legacy `save` and `switch` must not write it again: an
|
|
412
|
+
adopted copy's refresh token was rotated away by the import, and activating it would hand a tool a dead
|
|
413
|
+
login. `runAuthSwitchMutation` -- the one path the command line, the guide, `watch` and the hosted
|
|
414
|
+
`AuthSwitchService` all take -- asks first, and decides in three branches.
|
|
415
|
+
|
|
416
|
+
- **The authority answers**: it is asked for this record's ledger row through `import status` on the
|
|
417
|
+
management socket, keyed by the same source id the importer uses (a hash of the saved copy's path). A
|
|
418
|
+
`verified` or `complete` row refuses with `authority_holds_login`; any other row, or none, lets the command
|
|
419
|
+
run. An authority that answers decides, whether or not its service unit is installed.
|
|
420
|
+
- **Nothing answers within four seconds -- no socket, a silent one, or no `XDG_RUNTIME_DIR` -- and the
|
|
421
|
+
authority's service unit is installed**: the command refuses with `authority_unavailable` and the
|
|
422
|
+
instruction to run `authswitch authority service start`. Unknown is never treated as idle.
|
|
423
|
+
- **Nothing answers and no unit is installed**: the legacy commands behave exactly as before. This is every
|
|
424
|
+
host before the cutover.
|
|
425
|
+
|
|
426
|
+
What tells the second branch from the third is durable, never the socket: the runtime directory is tmpfs,
|
|
427
|
+
so after a reboot the socket is absent until the user service starts -- exactly when a fence keyed on it
|
|
428
|
+
would open. The evidence is the unit `authswitch authority service install` writes,
|
|
429
|
+
`$XDG_DATA_HOME/systemd/user/authswitch-authority.service` (default
|
|
430
|
+
`~/.local/share/systemd/user/authswitch-authority.service`), read through smartdaemon's
|
|
431
|
+
`SystemdUnitFile.inspect()`. The installer and the fence derive that directory from one rule,
|
|
432
|
+
`$XDG_DATA_HOME` or else the home directory; the installer takes both from its own process and its account's
|
|
433
|
+
home, the fence from the locations its caller states. The two agree unless `$HOME` is overridden while
|
|
434
|
+
`XDG_DATA_HOME` is unset, and then every store the fence guards lies under that overridden home too. The fence
|
|
435
|
+
writes nothing and keeps no record of its own.
|
|
436
|
+
|
|
437
|
+
The check works without a login session. Reading the unit needs only its directory, so a cron job or a plain
|
|
438
|
+
ssh command with no `XDG_RUNTIME_DIR` is decided by the unit exactly like a desktop session: no unit, the
|
|
439
|
+
legacy commands run; the unit installed, they refuse with `authority_unavailable`. The stated
|
|
440
|
+
`XDG_RUNTIME_DIR` names only the socket to ask; an absent one is never replaced by this process's own. The
|
|
441
|
+
answer depends on the unit directory derived from the stated `XDG_DATA_HOME` or home, and on nothing else:
|
|
442
|
+
a malformed `XDG_RUNTIME_DIR` or `XDG_CONFIG_HOME` never refuses the command, and neither does a malformed
|
|
443
|
+
process `XDG_DATA_HOME` when the caller states other locations. A unit that cannot be inspected -- a file the
|
|
444
|
+
installer would not have written, a directory another user can write -- refuses rather than being read as
|
|
445
|
+
absent, and so does a stated `XDG_DATA_HOME` that names no usable unit directory, because the reader can
|
|
446
|
+
then tell an installed authority from none no better. On a platform without systemd no unit can be
|
|
447
|
+
installed.
|
|
448
|
+
|
|
449
|
+
The unit says an authority exists, not which stores it imports from, so while an installed authority is
|
|
450
|
+
stopped the legacy save and switch refuse for every saved copy of every store, until it runs again. A
|
|
451
|
+
record the importer could never have read -- an account id that names no saved-copy file -- is never asked
|
|
452
|
+
about.
|
|
453
|
+
|
|
454
|
+
`drop` / `rm` and the `remove` mutation are deliberately not fenced: they delete the user's own saved copy
|
|
455
|
+
and write no credential. A projected source is never fenced either -- its native store stays with its own
|
|
456
|
+
tool. The command line takes this host's locations only when it composes its own harnesses, and with
|
|
457
|
+
injected harnesses is fenced only by locations its caller states; `AuthSwitchOperations`,
|
|
458
|
+
`runAuthSwitchMutation` and an `AuthSwitchService` given its harnesses take the locations as a required
|
|
459
|
+
argument (`authSwitchHostLegacyFence()` names this host's, `'none'` states that a
|
|
460
|
+
caller owns no authority), so no library path reads a host it was not given. `AuthSwitchOperations` and the
|
|
461
|
+
hosted service ask the fence before their AGL coordinator as well, so a refused mutation never has its host
|
|
462
|
+
stop the runtimes it would restart. The hosted service reports a fence refusal as the operation's problem, in
|
|
463
|
+
the instruction's own words.
|
|
464
|
+
|
|
356
465
|
## Usage
|
|
357
466
|
|
|
358
467
|
Run `authswitch`, `authswitch -i`, or `authswitch --interactive` for an interactive guide. Use the arrow keys and
|
|
@@ -515,9 +624,12 @@ login. `activateCredential(providerId, credential)` preserves and verifies the
|
|
|
515
624
|
outgoing native login before activation; the caller retains ownership of the
|
|
516
625
|
incoming credential's durable storage. Both are backend APIs, never wire payloads.
|
|
517
626
|
|
|
518
|
-
`AuthSwitchOperations` is shared by the command, guide and TUI
|
|
519
|
-
coordinator
|
|
520
|
-
|
|
627
|
+
`AuthSwitchOperations` is shared by the command, guide and TUI, and is built
|
|
628
|
+
with a coordinator (or `undefined`) and the legacy fence locations described in
|
|
629
|
+
"The legacy fence". A host that injects its own harnesses into `AuthSwitchService`
|
|
630
|
+
states that fence as the third argument. The coordinator receives only the
|
|
631
|
+
harness, operation, account ID, consent to wait, and a credential-location
|
|
632
|
+
fingerprint. AGL owns private-controller discovery;
|
|
521
633
|
authswitch uses `agl authswitch --request <json>` without an AGL package dependency.
|
|
522
634
|
A failed or ambiguous transport never falls through to a second local mutation.
|
|
523
635
|
AGL and the CLI must use matching credential locations and compatible versions.
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/authority-contract.ts
CHANGED
|
@@ -15,6 +15,12 @@ export type TAuthSwitchRefusalCode =
|
|
|
15
15
|
| 'account_changed'
|
|
16
16
|
| 'account_busy'
|
|
17
17
|
| 'login_unavailable'
|
|
18
|
+
/** A runtime capability that is missing, wrong or superseded: deliberately one answer, and one repair. */
|
|
19
|
+
| 'binding_unauthorized'
|
|
20
|
+
/** The authority holds this login, so the legacy path that used to move it no longer may. */
|
|
21
|
+
| 'authority_holds_login'
|
|
22
|
+
/** An authority is installed on this host and is not answering, so nothing may assume it holds nothing. */
|
|
23
|
+
| 'authority_unavailable'
|
|
18
24
|
| 'native_owner_holds_login'
|
|
19
25
|
| 'claude_home_unregistered'
|
|
20
26
|
| 'claude_handoff_pending'
|
|
@@ -42,8 +48,9 @@ export interface IAuthSwitchRefusal {
|
|
|
42
48
|
|
|
43
49
|
const refusalCodes: ReadonlySet<string> = new Set<TAuthSwitchRefusalCode>([
|
|
44
50
|
'authority_closing', 'not_found', 'account_changed', 'account_busy',
|
|
45
|
-
'login_unavailable', 'native_owner_holds_login', 'claude_home_unregistered',
|
|
51
|
+
'login_unavailable', 'binding_unauthorized', 'native_owner_holds_login', 'claude_home_unregistered',
|
|
46
52
|
'claude_handoff_pending', 'claude_receipt_missing', 'import_refusal',
|
|
53
|
+
'authority_holds_login', 'authority_unavailable',
|
|
47
54
|
]);
|
|
48
55
|
|
|
49
56
|
const isRefusalCode = (value: unknown): value is TAuthSwitchRefusalCode =>
|
|
@@ -110,6 +117,16 @@ export interface IAuthSwitchAccount {
|
|
|
110
117
|
statusObservedAt: string;
|
|
111
118
|
}
|
|
112
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Which tool refreshes a natively owned login, named rather than inferred.
|
|
122
|
+
*
|
|
123
|
+
* `owner` says that a native tool holds the login; this says which one, so a consumer presents "Claude Code"
|
|
124
|
+
* or "Codex" without deriving it from `purpose` -- a derivation that would be wrong the moment two purposes
|
|
125
|
+
* share a tool, and that belongs to the side that decides ownership in the first place. It is `null` exactly
|
|
126
|
+
* when no native tool refreshes the login: the authority does, or nothing does.
|
|
127
|
+
*/
|
|
128
|
+
export type TAuthSwitchLoginOwnerTool = 'claude_code' | 'codex' | 'opencode';
|
|
129
|
+
|
|
113
130
|
/** One independently owned login. Native ownership does not imply observed health. */
|
|
114
131
|
export interface IAuthSwitchLogin {
|
|
115
132
|
id: string;
|
|
@@ -117,6 +134,8 @@ export interface IAuthSwitchLogin {
|
|
|
117
134
|
providerId: string;
|
|
118
135
|
purpose: TAuthSwitchLoginPurpose;
|
|
119
136
|
owner: 'daemon' | 'claude_native' | 'legacy_native' | 'none';
|
|
137
|
+
/** The native tool that refreshes this login, or null when the authority or nobody does. */
|
|
138
|
+
ownerTool: TAuthSwitchLoginOwnerTool | null;
|
|
120
139
|
health: TAuthSwitchLoginHealth;
|
|
121
140
|
problem: 'none' | 'provider_unavailable' | 'exchange_uncertain' | 'provider_rejected' | 'native_owner';
|
|
122
141
|
grantGeneration: number;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Where this user's authority lives: its sockets, its store and the service unit that runs it.
|
|
5
|
+
*
|
|
6
|
+
* These rules sit in a leaf module because two sides read them. `AuthSwitchAuthorityService` installs and
|
|
7
|
+
* runs the daemon there, and the legacy fence (`./classes.legacyfence`) asks the same socket and looks for
|
|
8
|
+
* the same unit -- without importing the daemon, whose module graph reaches back to the legacy operations
|
|
9
|
+
* the fence guards.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export interface IAuthSwitchAuthorityPaths {
|
|
13
|
+
runtimeDirectory: string;
|
|
14
|
+
dataDirectory: string;
|
|
15
|
+
databaseSocketPath: string;
|
|
16
|
+
authoritySocketPath: string;
|
|
17
|
+
runtimeSocketPath: string;
|
|
18
|
+
runtimeSocketDirectory: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** The authority's sockets. */
|
|
22
|
+
export type TAuthSwitchAuthoritySocketPaths = Omit<IAuthSwitchAuthorityPaths, 'dataDirectory'>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The sockets under one runtime directory, derived from it alone.
|
|
26
|
+
*
|
|
27
|
+
* The legacy fence asks the socket a caller states and must not depend on anything this process holds --
|
|
28
|
+
* its home or its `XDG_DATA_HOME`, which only the store's directory needs.
|
|
29
|
+
*/
|
|
30
|
+
export const authSwitchAuthoritySocketPaths = (
|
|
31
|
+
runtimeDirectory: string | undefined): TAuthSwitchAuthoritySocketPaths => {
|
|
32
|
+
if (!runtimeDirectory || !plugins.path.isAbsolute(runtimeDirectory)) {
|
|
33
|
+
throw new Error('A private XDG_RUNTIME_DIR is required for authswitch authority.');
|
|
34
|
+
}
|
|
35
|
+
const socketDirectory = plugins.path.join(runtimeDirectory, 'authswitch');
|
|
36
|
+
const runtimeSocketDirectory = plugins.path.join(socketDirectory, 'runtime');
|
|
37
|
+
return {
|
|
38
|
+
runtimeDirectory,
|
|
39
|
+
databaseSocketPath: plugins.path.join(socketDirectory, 'internal', 'db.sock'),
|
|
40
|
+
authoritySocketPath: plugins.path.join(socketDirectory, 'management', 'authority.sock'),
|
|
41
|
+
runtimeSocketPath: plugins.path.join(runtimeSocketDirectory, 'runtime.sock'),
|
|
42
|
+
runtimeSocketDirectory,
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/** Canonical per-user paths. An explicit runtime directory is also usable by a trusted container host. */
|
|
47
|
+
export const resolveAuthSwitchAuthorityPaths = (runtimeDirectory = process.env.XDG_RUNTIME_DIR): IAuthSwitchAuthorityPaths => {
|
|
48
|
+
const sockets = authSwitchAuthoritySocketPaths(runtimeDirectory);
|
|
49
|
+
const home = plugins.os.userInfo().homedir;
|
|
50
|
+
const dataHome = process.env.XDG_DATA_HOME || plugins.path.join(home, '.local/share');
|
|
51
|
+
if (!plugins.path.isAbsolute(dataHome)) throw new Error('XDG_DATA_HOME must be an absolute path.');
|
|
52
|
+
return { ...sockets, dataDirectory: plugins.path.join(dataHome, 'authswitch', 'authority') };
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/** The user service `authswitch authority service install` writes. */
|
|
56
|
+
export const authSwitchAuthorityUnitName = 'authswitch-authority.service';
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The directory that unit is installed into, from a stated environment and home directory.
|
|
60
|
+
*
|
|
61
|
+
* It is the rule smartdaemon applies to a user unit when it is given no directory --
|
|
62
|
+
* `$XDG_DATA_HOME/systemd/user`, default `~/.local/share/systemd/user` -- stated here so the installer passes
|
|
63
|
+
* it explicitly and the fence derives it from the locations its caller states rather than from this process.
|
|
64
|
+
*/
|
|
65
|
+
export const authSwitchAuthorityUnitDirectory = (env: NodeJS.ProcessEnv, homeDirectory: string): string => {
|
|
66
|
+
const dataHome = env.XDG_DATA_HOME || plugins.path.join(homeDirectory, '.local/share');
|
|
67
|
+
if (!plugins.path.isAbsolute(dataHome)) throw new Error('XDG_DATA_HOME must be an absolute path.');
|
|
68
|
+
return plugins.path.join(dataHome, 'systemd/user');
|
|
69
|
+
};
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import type { ITypedRequest } from '@api.global/typedrequest-interfaces';
|
|
2
2
|
import type { IAuthSwitchBinding } from './authority-contract.js';
|
|
3
3
|
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Backend-only binding operation, served on the MANAGEMENT socket. Not a misplacement -- the rule.
|
|
6
|
+
*
|
|
7
|
+
* The other two requests in this file are answered on the runtime socket, whose directory a container may
|
|
8
|
+
* be given. This one is not, because it mints the capability those two spend: minting is the act that
|
|
9
|
+
* authorizes a runtime, so it belongs to a caller already trusted with account management. A container
|
|
10
|
+
* holding the runtime directory can therefore use the binding it was handed, and can never create one --
|
|
11
|
+
* not for itself, and not for another account.
|
|
12
|
+
*
|
|
13
|
+
* The capability must never enter a browser-facing response.
|
|
14
|
+
*/
|
|
5
15
|
export interface IReq_AuthSwitchBindAccount extends ITypedRequest {
|
|
6
16
|
method: 'authswitch.authority.bind';
|
|
7
17
|
request: {
|