@agentteams/cli 0.1.95 → 0.1.97
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/.eslintcache +1 -1
- package/README.md +103 -1
- package/dist/auth/credentialStore.d.ts +70 -10
- package/dist/auth/credentialStore.d.ts.map +1 -1
- package/dist/auth/credentialStore.js +207 -20
- package/dist/auth/credentialStore.js.map +1 -1
- package/dist/auth/deviceAuthClient.d.ts +63 -0
- package/dist/auth/deviceAuthClient.d.ts.map +1 -0
- package/dist/auth/deviceAuthClient.js +131 -0
- package/dist/auth/deviceAuthClient.js.map +1 -0
- package/dist/auth/fileCredentialStore.d.ts +172 -0
- package/dist/auth/fileCredentialStore.d.ts.map +1 -0
- package/dist/auth/fileCredentialStore.js +445 -0
- package/dist/auth/fileCredentialStore.js.map +1 -0
- package/dist/auth/personalTokenClient.d.ts +51 -1
- package/dist/auth/personalTokenClient.d.ts.map +1 -1
- package/dist/auth/personalTokenClient.js +135 -4
- package/dist/auth/personalTokenClient.js.map +1 -1
- package/dist/auth/personalTokenStore.d.ts +1 -1
- package/dist/auth/personalTokenStore.d.ts.map +1 -1
- package/dist/auth/personalTokenStore.js +7 -2
- package/dist/auth/personalTokenStore.js.map +1 -1
- package/dist/auth/refreshLock.d.ts +5 -2
- package/dist/auth/refreshLock.d.ts.map +1 -1
- package/dist/auth/refreshLock.js +8 -4
- package/dist/auth/refreshLock.js.map +1 -1
- package/dist/auth/slotHash.d.ts +15 -0
- package/dist/auth/slotHash.d.ts.map +1 -0
- package/dist/auth/slotHash.js +18 -0
- package/dist/auth/slotHash.js.map +1 -0
- package/dist/commands/auth.d.ts +75 -2
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +150 -4
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +82 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/context.d.ts +1 -1
- package/dist/mcp-registration/index.js +3 -3
- package/dist/mcp-registration/index.js.map +1 -1
- package/dist/mcp-registration/serverSpec.d.ts +1 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/authFormat.d.ts.map +1 -1
- package/dist/utils/authFormat.js +47 -11
- package/dist/utils/authFormat.js.map +1 -1
- package/dist/utils/config.d.ts +19 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +57 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/initOutput.d.ts.map +1 -1
- package/dist/utils/initOutput.js +14 -3
- package/dist/utils/initOutput.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,7 +28,109 @@ The `init` command:
|
|
|
28
28
|
- Saves the convention template to `.agentteams/convention.md`
|
|
29
29
|
- Syncs convention files into `.agentteams/<category>/*.md`
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
### Choosing a login method
|
|
32
|
+
|
|
33
|
+
The browser callback is always the default. Nothing is auto-detected — you pick a
|
|
34
|
+
method by what you type.
|
|
35
|
+
|
|
36
|
+
| Situation | What to run | How it authenticates |
|
|
37
|
+
| ------------------------------------------------------------ | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
38
|
+
| Local machine with a browser (default) | `agentteams init` / `agentteams auth login` | The browser calls back to a temporary port on **this** machine |
|
|
39
|
+
| Remote or headless shell (SSH, container, WSL, no `DISPLAY`) | `agentteams init --device-auth` / `agentteams auth login --device-auth` | A short code you approve in a browser on **any other** device — no local port |
|
|
40
|
+
| CI and unattended automation | `AGENTTEAMS_API_KEY`, or a project service token | No human approval step at all |
|
|
41
|
+
|
|
42
|
+
> The default path opens a local port and waits for the browser to call back. Over
|
|
43
|
+
> SSH the browser runs on your laptop, so the callback reaches your laptop's
|
|
44
|
+
> `localhost` and never the remote shell — that is the case `--device-auth` exists
|
|
45
|
+
> for. Device authorization is **not** a CI mechanism: it always requires a person
|
|
46
|
+
> to approve the request.
|
|
47
|
+
|
|
48
|
+
#### `--device-auth`
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Log in only
|
|
52
|
+
agentteams auth login --device-auth
|
|
53
|
+
|
|
54
|
+
# Initialize a project (team/project/agent are chosen on the approval screen)
|
|
55
|
+
agentteams init --device-auth
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The terminal prints a verification URL and an 8-character code. Open the URL on any
|
|
59
|
+
device, sign in, check that the code on screen matches the one in your terminal, and
|
|
60
|
+
approve. The CLI stores the login and continues.
|
|
61
|
+
|
|
62
|
+
To avoid typing the flag on every command on a remote machine, declare it once for
|
|
63
|
+
that machine:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Persist it in ~/.agentteams/config.json (never in a project config)
|
|
67
|
+
agentteams auth login --device-auth --set-default
|
|
68
|
+
|
|
69
|
+
# Or per shell / per service unit
|
|
70
|
+
export AGENTTEAMS_DEVICE_AUTH=1
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`agentteams auth status` reports whether this machine defaults to device
|
|
74
|
+
authorization. To turn it back off, remove `"deviceAuth"` from
|
|
75
|
+
`~/.agentteams/config.json` and unset `AGENTTEAMS_DEVICE_AUTH`.
|
|
76
|
+
|
|
77
|
+
#### Where the login is stored
|
|
78
|
+
|
|
79
|
+
The personal login is a refresh token, and it has to survive the command that
|
|
80
|
+
created it — otherwise the next command is signed out again.
|
|
81
|
+
|
|
82
|
+
The CLI always prefers the OS credential store: macOS Keychain, Windows Credential
|
|
83
|
+
Manager, or libsecret (Secret Service) on Linux. When that store cannot keep the
|
|
84
|
+
token, the CLI falls back to a **permission-protected file** under
|
|
85
|
+
`~/.agentteams/credentials`, one file per API server:
|
|
86
|
+
|
|
87
|
+
- POSIX: directory `0700`, file `0600`, and the CLI refuses to read or write the
|
|
88
|
+
file if it is a symlink, is owned by another user, or is reachable by group or
|
|
89
|
+
other.
|
|
90
|
+
- Windows: `icacls` removes inheritance and grants only the current account. If
|
|
91
|
+
that cannot be applied or verified, the file backend is **not** used at all.
|
|
92
|
+
|
|
93
|
+
The fallback is triggered by the OS store failing, not by which platform you are
|
|
94
|
+
on, because the three platforms fail at different moments. On Linux the failure is
|
|
95
|
+
visible up front; on macOS and Windows the availability check passes and only the
|
|
96
|
+
write fails, which is why an SSH login there used to be revoked _after_ you had
|
|
97
|
+
already approved it on another device.
|
|
98
|
+
|
|
99
|
+
A protected file is weaker than an OS keyring: it is not encrypted, so anyone who
|
|
100
|
+
can read your files or gain root on that machine can read the token.
|
|
101
|
+
`agentteams auth status` always names the backend that actually holds the token and
|
|
102
|
+
repeats that warning. To forbid the fallback — the login then fails before asking
|
|
103
|
+
you to approve anything, exactly as it did before:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
export AGENTTEAMS_DISABLE_FILE_CREDENTIALS=1
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
This applies to `init --device-auth` and `auth login --device-auth` on Linux, macOS
|
|
110
|
+
and Windows alike, including machines you only ever reach over SSH.
|
|
111
|
+
|
|
112
|
+
The variable stops the CLI **writing** a credential file. A file written before you
|
|
113
|
+
set it stays readable and removable, so `agentteams auth logout` can still revoke
|
|
114
|
+
that token and delete it — otherwise setting the variable would strand a live login
|
|
115
|
+
on disk with no command left that could reach it.
|
|
116
|
+
|
|
117
|
+
`auth status` names the reason the OS store was skipped when this process is the one
|
|
118
|
+
that discovered it — always on Linux, where the failure shows up before the login.
|
|
119
|
+
On macOS and Windows the failure is only visible at the moment of a write, so a
|
|
120
|
+
later `auth status` reports the backend without repeating why; re-run the login (or
|
|
121
|
+
`auth logout` and back in) to see the OS store's own error again.
|
|
122
|
+
|
|
123
|
+
#### Troubleshooting
|
|
124
|
+
|
|
125
|
+
| Message | Cause | What to do |
|
|
126
|
+
| -------------------------------------------------------------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
127
|
+
| `OAuth callback timed out after 60 seconds.` | The default flow was used from a shell the browser cannot call back to | Re-run with `--device-auth` |
|
|
128
|
+
| `does not support device authorization` | The server is an older AgentTeams API | Re-run **without** `--device-auth`, or upgrade the server |
|
|
129
|
+
| `device authorization turned off because the server has no APP_URL` | Server configuration | Ask the operator to set `APP_URL`; use the default flow meanwhile |
|
|
130
|
+
| `The device code expired before it was approved` | The code is valid for 15 minutes | Run the command again for a new code |
|
|
131
|
+
| `The sign-in request was denied in the browser` | Deny was clicked | Run the command again if that was a mistake |
|
|
132
|
+
| `Cannot start device authorization: ... credential store` | Neither the OS credential store nor the file fallback can keep a login | Read the reason in brackets — it names both halves. Unset `AGENTTEAMS_DISABLE_FILE_CREDENTIALS` if you set it, or fix the OS store (install/unlock libsecret, unlock the macOS login keychain, sign in interactively on Windows) |
|
|
133
|
+
| `Store: protected file (~/.agentteams/credentials)` in `auth status` | The OS credential store was unavailable, so the file fallback is in use | Nothing is broken. Fix the OS store if you want the stronger backend; on Linux the message after it names the reason, on macOS and Windows only the run that first fell back can show it |
|
|
32
134
|
|
|
33
135
|
### Service URLs (Defaults and Overrides)
|
|
34
136
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Credential storage for the CLI: the OS store when it works, a protected file
|
|
3
|
+
* when it does not.
|
|
3
4
|
*
|
|
4
5
|
* The CLI ships as a plain npm package, so a native addon (keytar and friends)
|
|
5
6
|
* would add a build toolchain requirement to every install. Instead each
|
|
@@ -9,15 +10,28 @@
|
|
|
9
10
|
* Windows `powershell` (Windows.Security.Credentials.PasswordVault)
|
|
10
11
|
* Linux `secret-tool` (libsecret / Secret Service)
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* Any of them can be unusable in a remote session, and the three fail at
|
|
14
|
+
* different moments — Linux at the probe, macOS and Windows only once a write is
|
|
15
|
+
* attempted. That is why the fallback in {@link createFileCredentialStore} is
|
|
16
|
+
* triggered by **an OS backend failing**, never by the platform or by looking for
|
|
17
|
+
* SSH environment variables: the platform does not predict the failure, and the
|
|
18
|
+
* user-visible damage (a login approved on another device and then revoked) is
|
|
19
|
+
* identical in all three cases.
|
|
20
|
+
*
|
|
21
|
+
* The OS store always wins where it works, and a value that had to go to a file
|
|
22
|
+
* is promoted back into it only after a verified write. Setting
|
|
23
|
+
* `AGENTTEAMS_DISABLE_FILE_CREDENTIALS` restores the previous behaviour for new
|
|
24
|
+
* logins, in which an unusable OS store means the secret lives in this process
|
|
25
|
+
* only. That older behaviour still mirrors
|
|
26
|
+
* `desktop/src/main/localAgent/credentialStore.ts`, which declines to write when
|
|
27
|
+
* `safeStorage` is unavailable. The opt-out never hides a file this CLI already
|
|
28
|
+
* wrote — reading and removing one stay possible, so `logout` can still revoke it.
|
|
17
29
|
*/
|
|
18
30
|
/** One keychain "service" groups every CLI credential under a single name. */
|
|
19
31
|
export declare const CREDENTIAL_SERVICE = "agentteams-cli";
|
|
20
|
-
export type CredentialBackendId = 'macos-keychain' | 'windows-credential-manager' | 'libsecret'
|
|
32
|
+
export type CredentialBackendId = 'macos-keychain' | 'windows-credential-manager' | 'libsecret'
|
|
33
|
+
/** Permission-protected file under `~/.agentteams/credentials`. */
|
|
34
|
+
| 'protected-file' | 'none';
|
|
21
35
|
/**
|
|
22
36
|
* Why the store can (or cannot) persist.
|
|
23
37
|
*
|
|
@@ -32,7 +46,16 @@ export interface CredentialStoreStatus {
|
|
|
32
46
|
/** false → nothing is ever written to disk; the secret lives in this process only. */
|
|
33
47
|
persisted: boolean;
|
|
34
48
|
reason: CredentialStoreReason;
|
|
35
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Why this backend, in the user's words. Masked before it is set, so it never
|
|
51
|
+
* carries a secret.
|
|
52
|
+
*
|
|
53
|
+
* Two things end up here: the error from a write the OS store rejected, and —
|
|
54
|
+
* when `backend` is `protected-file` — why the OS store was not used at all.
|
|
55
|
+
* The second is the only place a user can learn that their `secret-tool` is
|
|
56
|
+
* installed but cannot be started, which is otherwise indistinguishable from
|
|
57
|
+
* not having installed it.
|
|
58
|
+
*/
|
|
36
59
|
detail?: string;
|
|
37
60
|
}
|
|
38
61
|
export interface CredentialSaveOutcome {
|
|
@@ -85,7 +108,12 @@ export interface CredentialReadOptions {
|
|
|
85
108
|
fresh?: boolean;
|
|
86
109
|
}
|
|
87
110
|
export interface CredentialStore {
|
|
88
|
-
|
|
111
|
+
/**
|
|
112
|
+
* @param account - Report where *this* slot's credential actually lives.
|
|
113
|
+
* Omitted, the answer is the store-wide "can anything be persisted here",
|
|
114
|
+
* which is what a login preflight needs before there is a slot to ask about.
|
|
115
|
+
*/
|
|
116
|
+
status(account?: string): CredentialStoreStatus;
|
|
89
117
|
read(account: string, options?: CredentialReadOptions): string | null;
|
|
90
118
|
save(account: string, secret: string): CredentialSaveOutcome;
|
|
91
119
|
remove(account: string): void;
|
|
@@ -94,10 +122,24 @@ export interface CreateCredentialStoreOptions {
|
|
|
94
122
|
runner?: CommandRunner;
|
|
95
123
|
platform?: NodeJS.Platform;
|
|
96
124
|
service?: string;
|
|
125
|
+
/** Home directory the file fallback lives under. Defaults to `os.homedir()`. */
|
|
126
|
+
homeDir?: string;
|
|
127
|
+
/** Consulted for `AGENTTEAMS_DISABLE_FILE_CREDENTIALS` and the Windows account name. */
|
|
128
|
+
env?: NodeJS.ProcessEnv;
|
|
97
129
|
}
|
|
98
130
|
export declare function isMissingItemStatus(backend: CredentialBackendId, status: number | null): boolean;
|
|
99
131
|
export declare function resolveBackendId(platform: NodeJS.Platform): CredentialBackendId;
|
|
100
|
-
/**
|
|
132
|
+
/**
|
|
133
|
+
* Cheap "can this backend be driven at all" call. Exit code 0 means yes.
|
|
134
|
+
*
|
|
135
|
+
* Deliberately not a durability test. None of the three probes can prove a write
|
|
136
|
+
* would land: `security list-keychains` says nothing about whether the login
|
|
137
|
+
* keychain is unlocked, the PowerShell probe never touches the vault, and
|
|
138
|
+
* `secret-tool --version` says nothing about a Secret Service being on the bus.
|
|
139
|
+
* That is by design — the write itself, verified by reading the value back in
|
|
140
|
+
* {@link createCredentialStore}, is what decides persistence, and a probe that
|
|
141
|
+
* tried to be authoritative would have to write a secret to find out.
|
|
142
|
+
*/
|
|
101
143
|
export declare function buildProbeCommand(backend: CredentialBackendId): CredentialCommand | null;
|
|
102
144
|
export declare function buildReadCommand(backend: CredentialBackendId, service: string, account: string): CredentialCommand | null;
|
|
103
145
|
export declare function buildSaveCommand(backend: CredentialBackendId, service: string, account: string, secret: string): CredentialCommand | null;
|
|
@@ -110,6 +152,24 @@ export declare function buildRemoveCommand(backend: CredentialBackendId, service
|
|
|
110
152
|
* before text reaches a log or an error message.
|
|
111
153
|
*/
|
|
112
154
|
export declare function maskSecret(text: string, secret: string): string;
|
|
155
|
+
/**
|
|
156
|
+
* Join the OS-side and file-side reasons a save had nowhere to go.
|
|
157
|
+
*
|
|
158
|
+
* Neither one alone is the answer once both backends are out: the OS reason is
|
|
159
|
+
* what the user already suspects, and the file reason is the one thing that
|
|
160
|
+
* explains why the fallback this CLI advertises did not stand in.
|
|
161
|
+
*/
|
|
162
|
+
export declare function combineDetails(osDetail?: string, fileDetail?: string): string | undefined;
|
|
163
|
+
/**
|
|
164
|
+
* Turn a failed probe into advice.
|
|
165
|
+
*
|
|
166
|
+
* "No usable OS credential store" sent Linux users to `apt install
|
|
167
|
+
* libsecret-tools` even when it was already installed, because a tool that is
|
|
168
|
+
* present but exits non-zero looked exactly like a tool that is absent. The two
|
|
169
|
+
* need different next steps, and only the exit status tells them apart:
|
|
170
|
+
* `status: null` is "could not be spawned", anything else is "ran and refused".
|
|
171
|
+
*/
|
|
172
|
+
export declare function describeProbeFailure(command: CredentialCommand, result: CommandResult): string;
|
|
113
173
|
export declare function createCredentialStore(options?: CreateCredentialStoreOptions): CredentialStore;
|
|
114
174
|
/** Process-wide store. Tests build their own through {@link createCredentialStore}. */
|
|
115
175
|
export declare function getCredentialStore(): CredentialStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentialStore.d.ts","sourceRoot":"","sources":["../../src/auth/credentialStore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"credentialStore.d.ts","sourceRoot":"","sources":["../../src/auth/credentialStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAUH,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAEnD,MAAM,MAAM,mBAAmB,GAC3B,gBAAgB,GAChB,4BAA4B,GAC5B,WAAW;AACb,mEAAmE;GACjE,gBAAgB,GAChB,MAAM,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,YAAY,GAAG,sBAAsB,GAAG,cAAc,CAAC;AAElG,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,sFAAsF;IACtF,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,qBAAqB,CAAC;IAC9B;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,iBAAiB,KAAK,aAAa,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CAAC;IACtE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,qBAAqB,CAAC;IAC7D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAwCD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAMhG;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,mBAAmB,CAW/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,iBAAiB,GAAG,IAAI,CAWxF;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,iBAAiB,GAAG,IAAI,CAe1B;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,iBAAiB,GAAG,IAAI,CA4B1B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,iBAAiB,GAAG,IAAI,CAc1B;AAoBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAO9F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,eAAe,CA4TjG;AAID,uFAAuF;AACvF,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED,qDAAqD;AACrD,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Credential storage for the CLI: the OS store when it works, a protected file
|
|
3
|
+
* when it does not.
|
|
3
4
|
*
|
|
4
5
|
* The CLI ships as a plain npm package, so a native addon (keytar and friends)
|
|
5
6
|
* would add a build toolchain requirement to every install. Instead each
|
|
@@ -9,13 +10,25 @@
|
|
|
9
10
|
* Windows `powershell` (Windows.Security.Credentials.PasswordVault)
|
|
10
11
|
* Linux `secret-tool` (libsecret / Secret Service)
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* Any of them can be unusable in a remote session, and the three fail at
|
|
14
|
+
* different moments — Linux at the probe, macOS and Windows only once a write is
|
|
15
|
+
* attempted. That is why the fallback in {@link createFileCredentialStore} is
|
|
16
|
+
* triggered by **an OS backend failing**, never by the platform or by looking for
|
|
17
|
+
* SSH environment variables: the platform does not predict the failure, and the
|
|
18
|
+
* user-visible damage (a login approved on another device and then revoked) is
|
|
19
|
+
* identical in all three cases.
|
|
20
|
+
*
|
|
21
|
+
* The OS store always wins where it works, and a value that had to go to a file
|
|
22
|
+
* is promoted back into it only after a verified write. Setting
|
|
23
|
+
* `AGENTTEAMS_DISABLE_FILE_CREDENTIALS` restores the previous behaviour for new
|
|
24
|
+
* logins, in which an unusable OS store means the secret lives in this process
|
|
25
|
+
* only. That older behaviour still mirrors
|
|
26
|
+
* `desktop/src/main/localAgent/credentialStore.ts`, which declines to write when
|
|
27
|
+
* `safeStorage` is unavailable. The opt-out never hides a file this CLI already
|
|
28
|
+
* wrote — reading and removing one stay possible, so `logout` can still revoke it.
|
|
17
29
|
*/
|
|
18
30
|
import { spawnSync } from 'node:child_process';
|
|
31
|
+
import { FILE_CREDENTIAL_BACKEND, createFileCredentialStore, isFileCredentialFallbackDisabled, } from './fileCredentialStore.js';
|
|
19
32
|
/** One keychain "service" groups every CLI credential under a single name. */
|
|
20
33
|
export const CREDENTIAL_SERVICE = 'agentteams-cli';
|
|
21
34
|
const WINDOWS_SERVICE_ENV = 'AGENTTEAMS_CREDENTIAL_SERVICE';
|
|
@@ -74,7 +87,17 @@ export function resolveBackendId(platform) {
|
|
|
74
87
|
return 'none';
|
|
75
88
|
}
|
|
76
89
|
}
|
|
77
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* Cheap "can this backend be driven at all" call. Exit code 0 means yes.
|
|
92
|
+
*
|
|
93
|
+
* Deliberately not a durability test. None of the three probes can prove a write
|
|
94
|
+
* would land: `security list-keychains` says nothing about whether the login
|
|
95
|
+
* keychain is unlocked, the PowerShell probe never touches the vault, and
|
|
96
|
+
* `secret-tool --version` says nothing about a Secret Service being on the bus.
|
|
97
|
+
* That is by design — the write itself, verified by reading the value back in
|
|
98
|
+
* {@link createCredentialStore}, is what decides persistence, and a probe that
|
|
99
|
+
* tried to be authoritative would have to write a secret to find out.
|
|
100
|
+
*/
|
|
78
101
|
export function buildProbeCommand(backend) {
|
|
79
102
|
switch (backend) {
|
|
80
103
|
case 'macos-keychain':
|
|
@@ -166,11 +189,82 @@ export function maskSecret(text, secret) {
|
|
|
166
189
|
return text;
|
|
167
190
|
return text.split(secret).join('***');
|
|
168
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Join the OS-side and file-side reasons a save had nowhere to go.
|
|
194
|
+
*
|
|
195
|
+
* Neither one alone is the answer once both backends are out: the OS reason is
|
|
196
|
+
* what the user already suspects, and the file reason is the one thing that
|
|
197
|
+
* explains why the fallback this CLI advertises did not stand in.
|
|
198
|
+
*/
|
|
199
|
+
export function combineDetails(osDetail, fileDetail) {
|
|
200
|
+
if (!osDetail)
|
|
201
|
+
return fileDetail;
|
|
202
|
+
if (!fileDetail)
|
|
203
|
+
return osDetail;
|
|
204
|
+
return `${osDetail}; the protected-file fallback also failed: ${fileDetail}`;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Turn a failed probe into advice.
|
|
208
|
+
*
|
|
209
|
+
* "No usable OS credential store" sent Linux users to `apt install
|
|
210
|
+
* libsecret-tools` even when it was already installed, because a tool that is
|
|
211
|
+
* present but exits non-zero looked exactly like a tool that is absent. The two
|
|
212
|
+
* need different next steps, and only the exit status tells them apart:
|
|
213
|
+
* `status: null` is "could not be spawned", anything else is "ran and refused".
|
|
214
|
+
*/
|
|
215
|
+
export function describeProbeFailure(command, result) {
|
|
216
|
+
if (result.status === null) {
|
|
217
|
+
return `${command.command} could not be started on this machine`;
|
|
218
|
+
}
|
|
219
|
+
const stderr = result.stderr.trim().split(/\r?\n/)[0] ?? '';
|
|
220
|
+
const suffix = stderr ? `: ${stderr}` : '';
|
|
221
|
+
return `${command.command} exited with status ${result.status} during the availability check${suffix}`;
|
|
222
|
+
}
|
|
169
223
|
export function createCredentialStore(options = {}) {
|
|
170
224
|
const runner = options.runner ?? defaultRunner;
|
|
171
225
|
const platform = options.platform ?? process.platform;
|
|
172
226
|
const service = options.service ?? CREDENTIAL_SERVICE;
|
|
227
|
+
const env = options.env ?? process.env;
|
|
173
228
|
const backend = resolveBackendId(platform);
|
|
229
|
+
/**
|
|
230
|
+
* The fallback.
|
|
231
|
+
*
|
|
232
|
+
* Always constructed, even under the opt-out: building it is free — nothing is
|
|
233
|
+
* created on disk until something asks whether it is usable, and nothing asks
|
|
234
|
+
* while the OS backend is working.
|
|
235
|
+
*/
|
|
236
|
+
const fileStore = createFileCredentialStore({
|
|
237
|
+
platform,
|
|
238
|
+
runner,
|
|
239
|
+
env,
|
|
240
|
+
...(options.homeDir === undefined ? {} : { homeDir: options.homeDir }),
|
|
241
|
+
});
|
|
242
|
+
/**
|
|
243
|
+
* Whether a *new* secret may go to a file.
|
|
244
|
+
*
|
|
245
|
+
* The opt-out stops here and goes no further. Making it hide the store
|
|
246
|
+
* outright would mean a machine that had already fallen back could no longer
|
|
247
|
+
* see its own credential file: `logout` would report nothing to revoke and
|
|
248
|
+
* delete nothing, leaving a live refresh token on disk that the CLI can never
|
|
249
|
+
* reach again — and reads would quietly fall through to whatever older value
|
|
250
|
+
* the OS store still had.
|
|
251
|
+
*/
|
|
252
|
+
const fileWritesAllowed = !isFileCredentialFallbackDisabled(env);
|
|
253
|
+
/**
|
|
254
|
+
* Whether this slot's authoritative copy is the file one.
|
|
255
|
+
*
|
|
256
|
+
* Cheap on the healthy path (one `lstat` that finds nothing) and, critically,
|
|
257
|
+
* decided by what is actually on disk rather than by which backend answered
|
|
258
|
+
* first. A file copy only exists because an OS write failed, so it is by
|
|
259
|
+
* construction at least as new as anything the OS store still holds — and
|
|
260
|
+
* presenting the older one would be refresh-token reuse, which the server
|
|
261
|
+
* answers by revoking the whole family.
|
|
262
|
+
*
|
|
263
|
+
* The directory check is the non-creating one: the file's own protection is
|
|
264
|
+
* verified on every read anyway, and a directory question that answered "no"
|
|
265
|
+
* here would send the caller to the OS store's stale copy instead of failing.
|
|
266
|
+
*/
|
|
267
|
+
const fileHolds = (account) => fileStore.has(account) && fileStore.check({ create: false }).ok;
|
|
174
268
|
/**
|
|
175
269
|
* Session-only fallback, and a read cache on top of a working backend.
|
|
176
270
|
* A one-shot command barely benefits, but `agentteams mcp` runs for hours and
|
|
@@ -185,6 +279,8 @@ export function createCredentialStore(options = {}) {
|
|
|
185
279
|
*/
|
|
186
280
|
const memoryOnlyAccounts = new Set();
|
|
187
281
|
let availability = null;
|
|
282
|
+
/** Why the probe said no, kept so the fallback can explain itself. */
|
|
283
|
+
let probeFailureDetail = null;
|
|
188
284
|
/**
|
|
189
285
|
* Set once a write is rejected by a backend that passed the probe. From then
|
|
190
286
|
* on `status()` tells the truth — "this store looks present but will not keep
|
|
@@ -201,10 +297,13 @@ export function createCredentialStore(options = {}) {
|
|
|
201
297
|
}
|
|
202
298
|
// A backend that cannot even be probed is treated as absent rather than as
|
|
203
299
|
// an error: the caller's job is to fall back, not to fail the command.
|
|
204
|
-
|
|
300
|
+
const result = runner(probe);
|
|
301
|
+
availability = result.status === 0;
|
|
302
|
+
probeFailureDetail = availability ? null : describeProbeFailure(probe, result);
|
|
205
303
|
return availability;
|
|
206
304
|
};
|
|
207
|
-
|
|
305
|
+
/** What the OS backend alone would report — the contract before the fallback. */
|
|
306
|
+
const osStatus = () => {
|
|
208
307
|
if (backend === 'none') {
|
|
209
308
|
return { backend, persisted: false, reason: 'UNSUPPORTED_PLATFORM' };
|
|
210
309
|
}
|
|
@@ -212,7 +311,49 @@ export function createCredentialStore(options = {}) {
|
|
|
212
311
|
return { backend, persisted: false, reason: 'WRITE_FAILED', detail: writeFailureDetail };
|
|
213
312
|
}
|
|
214
313
|
const available = isAvailable();
|
|
215
|
-
|
|
314
|
+
if (available)
|
|
315
|
+
return { backend, persisted: true, reason: 'OK' };
|
|
316
|
+
return {
|
|
317
|
+
backend,
|
|
318
|
+
persisted: false,
|
|
319
|
+
reason: 'NO_BACKEND',
|
|
320
|
+
...(probeFailureDetail === null ? {} : { detail: probeFailureDetail }),
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
const fileStatus = (osReason) => ({
|
|
324
|
+
backend: FILE_CREDENTIAL_BACKEND,
|
|
325
|
+
persisted: true,
|
|
326
|
+
reason: 'OK',
|
|
327
|
+
// Carrying the OS-side reason forward is what lets `auth status` say *why*
|
|
328
|
+
// the weaker backend is in play instead of leaving it looking like a choice —
|
|
329
|
+
// but only while this process holds that reason. It comes from the probe or
|
|
330
|
+
// from a rejected write, both process-local, so a later `auth status` on
|
|
331
|
+
// macOS or Windows (where the probe passes) reports the backend with no
|
|
332
|
+
// reason attached. Linux, whose probe fails outright, always has one.
|
|
333
|
+
...(osReason.detail === undefined ? {} : { detail: osReason.detail }),
|
|
334
|
+
});
|
|
335
|
+
const status = (account) => {
|
|
336
|
+
const os = osStatus();
|
|
337
|
+
// A slot whose copy is in a file is in a file, even on a machine whose OS
|
|
338
|
+
// store works again — and even under the opt-out, which forbids new writes
|
|
339
|
+
// rather than disowning what is already there. Reporting the keychain here
|
|
340
|
+
// would describe a token that is not there.
|
|
341
|
+
if (account !== undefined && fileHolds(account))
|
|
342
|
+
return fileStatus(os);
|
|
343
|
+
if (os.reason === 'OK')
|
|
344
|
+
return os;
|
|
345
|
+
if (!fileWritesAllowed)
|
|
346
|
+
return os;
|
|
347
|
+
// Read-only: `status` is asked by `auth status` and by the login preflight,
|
|
348
|
+
// neither of which may leave a credential directory behind.
|
|
349
|
+
const fileReady = fileStore.check({ create: false });
|
|
350
|
+
if (fileReady.ok)
|
|
351
|
+
return fileStatus(os);
|
|
352
|
+
// Both backends are out, so both reasons matter: the caller is about to tell
|
|
353
|
+
// the user why a login cannot be saved, and the file-side half is the only
|
|
354
|
+
// half that is new.
|
|
355
|
+
const detail = combineDetails(os.detail, fileReady.detail);
|
|
356
|
+
return detail === undefined ? os : { ...os, detail };
|
|
216
357
|
};
|
|
217
358
|
/**
|
|
218
359
|
* The backend's own answer, with no memory cache in front of it.
|
|
@@ -223,7 +364,7 @@ export function createCredentialStore(options = {}) {
|
|
|
223
364
|
* claim there is nothing to revoke while a valid refresh token sits in the
|
|
224
365
|
* store.
|
|
225
366
|
*/
|
|
226
|
-
const
|
|
367
|
+
const readFromOsBackend = (account) => {
|
|
227
368
|
if (!isAvailable())
|
|
228
369
|
return { kind: 'error', detail: 'the credential store is not available' };
|
|
229
370
|
const command = buildReadCommand(backend, service, account);
|
|
@@ -240,6 +381,19 @@ export function createCredentialStore(options = {}) {
|
|
|
240
381
|
const secret = result.stdout.replace(/\r?\n$/, '');
|
|
241
382
|
return secret.length === 0 ? { kind: 'missing' } : { kind: 'found', secret };
|
|
242
383
|
};
|
|
384
|
+
/**
|
|
385
|
+
* Whichever backend actually holds this slot.
|
|
386
|
+
*
|
|
387
|
+
* No fall-through from a file error to the OS store. A file that exists but
|
|
388
|
+
* cannot be trusted means the authoritative copy is unreadable, and answering
|
|
389
|
+
* with the OS store's older value would present a superseded refresh token —
|
|
390
|
+
* reuse, which the server punishes by revoking the whole family.
|
|
391
|
+
*/
|
|
392
|
+
const readFromBackend = (account) => {
|
|
393
|
+
if (fileHolds(account))
|
|
394
|
+
return fileStore.read(account);
|
|
395
|
+
return readFromOsBackend(account);
|
|
396
|
+
};
|
|
243
397
|
return {
|
|
244
398
|
status,
|
|
245
399
|
read(account, options) {
|
|
@@ -248,7 +402,7 @@ export function createCredentialStore(options = {}) {
|
|
|
248
402
|
// authoritative copy for this account. Where a write could not be
|
|
249
403
|
// persisted, memory is the only copy there is and consulting the backend
|
|
250
404
|
// would throw the live credential away.
|
|
251
|
-
const reread = options?.fresh === true && isAvailable() && !memoryOnlyAccounts.has(account);
|
|
405
|
+
const reread = options?.fresh === true && (fileHolds(account) || isAvailable()) && !memoryOnlyAccounts.has(account);
|
|
252
406
|
if (cached !== undefined && !reread)
|
|
253
407
|
return cached;
|
|
254
408
|
const outcome = readFromBackend(account);
|
|
@@ -273,21 +427,45 @@ export function createCredentialStore(options = {}) {
|
|
|
273
427
|
memoryOnlyAccounts.add(account);
|
|
274
428
|
return detail === undefined ? { persisted: false, reason } : { persisted: false, reason, detail };
|
|
275
429
|
};
|
|
430
|
+
/**
|
|
431
|
+
* Last resort before giving up on persistence.
|
|
432
|
+
*
|
|
433
|
+
* Only ever reached once the OS backend has already failed, so it can never
|
|
434
|
+
* demote a machine whose keychain works.
|
|
435
|
+
*/
|
|
436
|
+
const saveToFile = (reason, detail) => {
|
|
437
|
+
if (!fileWritesAllowed)
|
|
438
|
+
return markMemoryOnly(reason, detail);
|
|
439
|
+
// Both halves are carried, never one instead of the other: the OS-side
|
|
440
|
+
// reason alone reads as "your keychain is locked" on a machine where the
|
|
441
|
+
// real blocker is a read-only home directory the fallback could not use.
|
|
442
|
+
const ready = fileStore.check();
|
|
443
|
+
if (!ready.ok)
|
|
444
|
+
return markMemoryOnly(reason, combineDetails(detail, ready.detail));
|
|
445
|
+
const written = fileStore.save(account, secret);
|
|
446
|
+
if (written.ok) {
|
|
447
|
+
memoryOnlyAccounts.delete(account);
|
|
448
|
+
return { persisted: true, reason: 'OK' };
|
|
449
|
+
}
|
|
450
|
+
return markMemoryOnly(reason, combineDetails(detail, written.detail));
|
|
451
|
+
};
|
|
276
452
|
if (!isAvailable()) {
|
|
277
|
-
return
|
|
453
|
+
return saveToFile(backend === 'none' ? 'UNSUPPORTED_PLATFORM' : 'NO_BACKEND', probeFailureDetail ?? undefined);
|
|
278
454
|
}
|
|
279
455
|
const command = buildSaveCommand(backend, service, account, secret);
|
|
280
456
|
if (!command) {
|
|
281
|
-
return
|
|
457
|
+
return saveToFile('NO_BACKEND');
|
|
282
458
|
}
|
|
283
459
|
const result = runner(command);
|
|
284
460
|
if (result.status !== 0) {
|
|
285
461
|
// Never thrown: the caller's contract is "you may not get persistence",
|
|
286
462
|
// and a rejected write is just another way of not getting it. Throwing
|
|
287
|
-
// here would kill the documented
|
|
288
|
-
//
|
|
463
|
+
// here would kill the documented fallback at the exact moment it is
|
|
464
|
+
// needed — and on macOS and Windows this is the *only* point at which the
|
|
465
|
+
// failure is detectable, since both probes pass in a session that cannot
|
|
466
|
+
// write.
|
|
289
467
|
writeFailureDetail = maskSecret(`${result.stderr}`.trim(), secret) || 'the credential store rejected the write';
|
|
290
|
-
return
|
|
468
|
+
return saveToFile('WRITE_FAILED', writeFailureDetail);
|
|
291
469
|
}
|
|
292
470
|
// A zero exit is not proof the value landed. A backend tool that collects
|
|
293
471
|
// the secret interactively can store something else entirely and still
|
|
@@ -299,21 +477,30 @@ export function createCredentialStore(options = {}) {
|
|
|
299
477
|
// A read that fails is not evidence either way, so it is not treated as a
|
|
300
478
|
// mismatch: doing so would revoke a token that did store, on nothing more
|
|
301
479
|
// than a locked keychain.
|
|
302
|
-
const stored =
|
|
480
|
+
const stored = readFromOsBackend(account);
|
|
303
481
|
if (stored.kind === 'error') {
|
|
304
482
|
writeFailureDetail = `the write could not be verified: ${stored.detail}`;
|
|
305
|
-
return
|
|
483
|
+
return saveToFile('WRITE_FAILED', writeFailureDetail);
|
|
306
484
|
}
|
|
307
485
|
if (stored.kind === 'missing' || stored.secret !== secret) {
|
|
308
486
|
writeFailureDetail = 'the credential store did not keep the value that was written';
|
|
309
|
-
return
|
|
487
|
+
return saveToFile('WRITE_FAILED', writeFailureDetail);
|
|
310
488
|
}
|
|
489
|
+
// The OS store has the value and has proved it by handing it back — and
|
|
490
|
+
// only now is the file copy redundant. Dropping it any earlier (on a zero
|
|
491
|
+
// exit, say) would delete the one usable copy of a token whose OS write
|
|
492
|
+
// silently stored nothing.
|
|
493
|
+
fileStore.remove(account);
|
|
311
494
|
writeFailureDetail = null;
|
|
312
495
|
memoryOnlyAccounts.delete(account);
|
|
313
496
|
return { persisted: true, reason: 'OK' };
|
|
314
497
|
},
|
|
315
498
|
remove(account) {
|
|
316
499
|
memory.delete(account);
|
|
500
|
+
// Both copies, unconditionally — including under the opt-out, which stops
|
|
501
|
+
// new writes and not this: a logout that cleared only the backend it
|
|
502
|
+
// happens to prefer today would leave a live refresh token behind.
|
|
503
|
+
fileStore.remove(account);
|
|
317
504
|
if (!isAvailable())
|
|
318
505
|
return;
|
|
319
506
|
const command = buildRemoveCommand(backend, service, account);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentialStore.js","sourceRoot":"","sources":["../../src/auth/credentialStore.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"credentialStore.js","sourceRoot":"","sources":["../../src/auth/credentialStore.ts"],"names":[],"mappings":"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"}
|