@modelprofile.com/authswitch 2.2.0 → 3.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/accounts.d.ts +18 -1
- package/dist_ts/accounts.js +55 -1
- package/dist_ts/classes.accountlist.d.ts +4 -0
- package/dist_ts/classes.accountlist.js +20 -13
- package/dist_ts/classes.claudecodeharness.d.ts +4 -4
- package/dist_ts/classes.claudecodeharness.js +5 -5
- package/dist_ts/classes.cli.d.ts +17 -0
- package/dist_ts/classes.cli.js +128 -16
- package/dist_ts/classes.credentialstore.d.ts +20 -7
- package/dist_ts/classes.credentialstore.js +36 -23
- package/dist_ts/classes.fileharness.d.ts +23 -3
- package/dist_ts/classes.fileharness.js +102 -16
- package/dist_ts/classes.harnessprocesses.d.ts +62 -0
- package/dist_ts/classes.harnessprocesses.js +198 -0
- package/dist_ts/classes.limits.d.ts +24 -0
- package/dist_ts/classes.limits.js +200 -0
- package/dist_ts/classes.opencodeharness.d.ts +4 -5
- package/dist_ts/classes.opencodeharness.js +5 -5
- package/dist_ts/classes.operations.d.ts +9 -1
- package/dist_ts/classes.operations.js +4 -2
- package/dist_ts/classes.tui.js +48 -3
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +2 -1
- package/dist_ts/interfaces.harness.d.ts +61 -0
- package/dist_ts/interfaces.list.d.ts +67 -1
- package/package.json +2 -2
- package/readme.md +155 -19
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/accounts.ts +50 -1
- package/ts/classes.accountlist.ts +24 -11
- package/ts/classes.claudecodeharness.ts +7 -6
- package/ts/classes.cli.ts +105 -16
- package/ts/classes.credentialstore.ts +41 -18
- package/ts/classes.fileharness.ts +80 -16
- package/ts/classes.harnessprocesses.ts +225 -0
- package/ts/classes.limits.ts +209 -0
- package/ts/classes.opencodeharness.ts +7 -7
- package/ts/classes.operations.ts +10 -1
- package/ts/classes.tui.ts +34 -3
- package/ts/index.ts +1 -0
- package/ts/interfaces.harness.ts +62 -0
- package/ts/interfaces.list.ts +72 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CredentialStore } from './classes.credentialstore.js';
|
|
1
|
+
import { credentialHash, CredentialStore } from './classes.credentialstore.js';
|
|
2
2
|
import { pauseSynchronously } from './helpers.js';
|
|
3
3
|
import { plainText } from './formatting.js';
|
|
4
4
|
/** Shared verified preservation for harnesses with independently replaceable credential slots. */
|
|
@@ -61,7 +61,86 @@ export class FileHarness {
|
|
|
61
61
|
if (accounts.some(other => other.id !== account.id && other.label === account.label))
|
|
62
62
|
account.details.push(`Account ID: ${account.id}`);
|
|
63
63
|
}
|
|
64
|
-
return { accounts, saveUnavailableReason: snapshot.unavailable };
|
|
64
|
+
return { accounts, saveUnavailableReason: snapshot.unavailable, credentialDrift: snapshot.unavailable ? [] : this.credentialDrift(snapshot) };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Credential slots that no longer hold the account the last switch wrote.
|
|
68
|
+
*
|
|
69
|
+
* A running harness refreshes its login on its own schedule and writes the result to the same
|
|
70
|
+
* file, so a switch performed underneath one can be undone minutes later without any error. The
|
|
71
|
+
* recorded hash detects that the file changed at all; comparing the account distinguishes the
|
|
72
|
+
* benign case -- the switched-in account rotating its own token -- from the previous login coming
|
|
73
|
+
* back. Detection is advisory and never turns a read into a failure.
|
|
74
|
+
*/
|
|
75
|
+
credentialDrift(snapshotArg) {
|
|
76
|
+
let records;
|
|
77
|
+
try {
|
|
78
|
+
records = this.store.switchRecords();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
const drift = [];
|
|
84
|
+
for (const record of records) {
|
|
85
|
+
try {
|
|
86
|
+
const active = snapshotArg.accounts.find(account => account.slotId === record.slotId);
|
|
87
|
+
if (active && credentialHash(JSON.stringify(active.credential)) === record.credentialHash)
|
|
88
|
+
continue;
|
|
89
|
+
const currentAccountId = active ? this.store.id(active.slotId, active.identity) : null;
|
|
90
|
+
if (currentAccountId !== null && currentAccountId === record.accountId)
|
|
91
|
+
continue;
|
|
92
|
+
drift.push({
|
|
93
|
+
slotId: record.slotId, expectedAccountId: record.accountId, expectedLabel: this.savedLabel(record.accountId),
|
|
94
|
+
currentAccountId, currentLabel: active?.label ?? null,
|
|
95
|
+
currentIsSaved: currentAccountId !== null && this.savedLabel(currentAccountId) !== null,
|
|
96
|
+
switchedAt: record.switchedAt,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch { /* One unreadable record must not hide the rest of the state. */ }
|
|
100
|
+
}
|
|
101
|
+
return drift;
|
|
102
|
+
}
|
|
103
|
+
savedLabel(accountIdArg) {
|
|
104
|
+
try {
|
|
105
|
+
return this.store.read(accountIdArg).label;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Instances that keep a replaced or cleared login in memory until they are restarted. */
|
|
112
|
+
runningCaveat(kindArg) {
|
|
113
|
+
let count;
|
|
114
|
+
try {
|
|
115
|
+
count = this.processes.list().length;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [`Could not check for running ${this.label} processes. If any are running, restart them: an unrestarted instance can write its previous login back.`];
|
|
119
|
+
}
|
|
120
|
+
if (!count)
|
|
121
|
+
return [];
|
|
122
|
+
return [`${count} ${this.label} process(es) are still running. They keep the previous login in memory until they are restarted, and a token refresh by one of them can `
|
|
123
|
+
+ `${kindArg === 'replaced' ? 'overwrite the credential file with the previous account' : 'write the cleared login back into the credential file'}. `
|
|
124
|
+
+ `Restart them, then check authswitch ${this.id} active.`];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Record what the credential file holds now, so a later overwrite is detectable.
|
|
128
|
+
*
|
|
129
|
+
* The hash is taken from the file after the write, not from the incoming credential, so it is
|
|
130
|
+
* exactly what a later read computes. A recording failure never invalidates a completed switch.
|
|
131
|
+
*/
|
|
132
|
+
recordActivation(slotIdArg, accountIdArg) {
|
|
133
|
+
try {
|
|
134
|
+
const active = this.snapshot().accounts.find(account => account.slotId === slotIdArg);
|
|
135
|
+
if (!active || this.store.id(active.slotId, active.identity) !== accountIdArg) {
|
|
136
|
+
return [`The credential file does not hold the expected account after this operation; check authswitch ${this.id} active.`];
|
|
137
|
+
}
|
|
138
|
+
this.store.recordSwitch({ slotId: slotIdArg, accountId: accountIdArg, credentialHash: credentialHash(JSON.stringify(active.credential)) });
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return [`The login was written, but this switch could not be recorded for later credential checks.`];
|
|
143
|
+
}
|
|
65
144
|
}
|
|
66
145
|
readCredential(id) {
|
|
67
146
|
const active = this.snapshot().accounts.find(account => this.store.id(account.slotId, account.identity) === id);
|
|
@@ -74,7 +153,6 @@ export class FileHarness {
|
|
|
74
153
|
/** Backend-only login handoff. Preserve the outgoing credential before replacing its slot. */
|
|
75
154
|
activateCredential(slotId, credential) {
|
|
76
155
|
return this.outcome(() => {
|
|
77
|
-
this.beforeMutation();
|
|
78
156
|
const target = this.inspect(credential, slotId);
|
|
79
157
|
const snapshot = this.snapshot();
|
|
80
158
|
if (snapshot.unavailable)
|
|
@@ -83,7 +161,8 @@ export class FileHarness {
|
|
|
83
161
|
if (previous)
|
|
84
162
|
this.store.save(previous);
|
|
85
163
|
this.apply(slotId, previous, target);
|
|
86
|
-
return `Activated ${plainText(target.label)} (${plainText(slotId)})
|
|
164
|
+
return [`Activated ${plainText(target.label)} (${plainText(slotId)}).`,
|
|
165
|
+
...this.recordActivation(slotId, this.store.id(slotId, target.identity)), ...this.runningCaveat('replaced')];
|
|
87
166
|
});
|
|
88
167
|
}
|
|
89
168
|
resolveAccount(reference) {
|
|
@@ -95,7 +174,7 @@ export class FileHarness {
|
|
|
95
174
|
}
|
|
96
175
|
outcome(action) {
|
|
97
176
|
try {
|
|
98
|
-
return this.store.locked(() => ({ lines:
|
|
177
|
+
return this.store.locked(() => { const lines = action(); return { lines: Array.isArray(lines) ? lines : [lines], problems: [] }; });
|
|
99
178
|
}
|
|
100
179
|
catch (error) {
|
|
101
180
|
return { lines: [], problems: [error instanceof Error ? error.message : 'Credential operation failed.'] };
|
|
@@ -103,9 +182,6 @@ export class FileHarness {
|
|
|
103
182
|
}
|
|
104
183
|
saveCurrent(options) {
|
|
105
184
|
return this.outcome(() => {
|
|
106
|
-
// Keeping the login in place only reads the native files, so a running harness is no reason to refuse.
|
|
107
|
-
if (!options.keepActive)
|
|
108
|
-
this.beforeMutation();
|
|
109
185
|
const snapshot = this.stableSnapshot();
|
|
110
186
|
if (snapshot.unavailable)
|
|
111
187
|
throw new Error(snapshot.unavailable);
|
|
@@ -114,14 +190,21 @@ export class FileHarness {
|
|
|
114
190
|
throw new Error(matches.length ? 'Several logins are active. Select the account or provider to save.' : 'No matching active login to save.');
|
|
115
191
|
const active = matches[0];
|
|
116
192
|
this.store.save(active);
|
|
117
|
-
if (
|
|
118
|
-
|
|
119
|
-
|
|
193
|
+
if (options.keepActive)
|
|
194
|
+
return `Saved ${plainText(active.label)} (${plainText(active.slotId)}); login remains in place.`;
|
|
195
|
+
this.apply(active.slotId, active, undefined);
|
|
196
|
+
const cleared = [];
|
|
197
|
+
try {
|
|
198
|
+
this.store.clearSwitch(active.slotId);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
cleared.push('The login was cleared, but its switch record could not be removed.');
|
|
202
|
+
}
|
|
203
|
+
return [`Saved ${plainText(active.label)} (${plainText(active.slotId)}). Start ${this.label} to log in again.`, ...cleared, ...this.runningCaveat('cleared')];
|
|
120
204
|
});
|
|
121
205
|
}
|
|
122
206
|
switchAccount(id) {
|
|
123
207
|
return this.outcome(() => {
|
|
124
|
-
this.beforeMutation();
|
|
125
208
|
const target = this.saved(this.store.read(id));
|
|
126
209
|
const snapshot = this.snapshot();
|
|
127
210
|
if (snapshot.unavailable)
|
|
@@ -130,10 +213,13 @@ export class FileHarness {
|
|
|
130
213
|
// Refresh the outgoing stash even when this account was already saved.
|
|
131
214
|
if (previous)
|
|
132
215
|
this.store.save(previous);
|
|
133
|
-
|
|
134
|
-
|
|
216
|
+
// Re-running a switch for the active account re-arms drift detection against its newest bytes.
|
|
217
|
+
if (previous?.identity === target.identity) {
|
|
218
|
+
return [`${plainText(target.label)} is already active; its latest credential is saved.`, ...this.recordActivation(target.slotId, id)];
|
|
219
|
+
}
|
|
135
220
|
this.apply(target.slotId, previous, target);
|
|
136
|
-
return `Activated ${plainText(target.label)} (${plainText(target.slotId)}). Start ${this.label} to use it
|
|
221
|
+
return [`Activated ${plainText(target.label)} (${plainText(target.slotId)}). Start ${this.label} to use it.`,
|
|
222
|
+
...this.recordActivation(target.slotId, id), ...this.runningCaveat('replaced')];
|
|
137
223
|
});
|
|
138
224
|
}
|
|
139
225
|
removeAccount(id) {
|
|
@@ -149,4 +235,4 @@ export class FileHarness {
|
|
|
149
235
|
}
|
|
150
236
|
}
|
|
151
237
|
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5maWxlaGFybmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZmlsZWhhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBMEIsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBYTVDLGtHQUFrRztBQUNsRyxNQUFNLE9BQWdCLFdBQVc7SUFJZixnQkFBZ0IsR0FBRyxtREFBbUQsQ0FBQztJQVd2Rjs7Ozs7Ozs7O09BU0c7SUFDSyxjQUFjO1FBQ3BCLElBQUksT0FBZ0IsQ0FBQztRQUNyQixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDN0MsSUFBSSxPQUFPO2dCQUFFLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsS0FBSyxNQUFNO29CQUFFLE9BQU8sUUFBUSxDQUFDO2dCQUNyRSxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ3RCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLE9BQU87WUFBRSxNQUFNLE9BQU8sQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssNEdBQTRHLENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQXdCO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0QsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQ2xILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDTSxTQUFTO1FBQ2QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQThCLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDNUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQixPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLGFBQWEsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0SyxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUMsQ0FBQzs7Z0JBQ3JFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsYUFBYSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEssQ0FBQztRQUNELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFJLENBQUM7UUFDRCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBQ1MsY0FBYyxDQUFDLEVBQVU7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoSCxPQUFPLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELHVGQUF1RjtJQUNoRixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsVUFBbUM7UUFDekUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFDRCw4RkFBOEY7SUFDdkYsa0JBQWtCLENBQUMsTUFBYyxFQUFFLFVBQW1DO1FBQzNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxJQUFJLFFBQVEsQ0FBQyxXQUFXO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQztZQUM5RSxJQUFJLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sYUFBYSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNNLGNBQWMsQ0FBQyxTQUFpQjtRQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsQ0FBQyxXQUFXLEVBQUU7ZUFDdkgsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNyRixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25JLE9BQU8sT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDckosQ0FBQztJQUNPLE9BQU8sQ0FBQyxNQUFvQjtRQUNsQyxJQUFJLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQzlFLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUM7UUFBQyxDQUFDO0lBQzlILENBQUM7SUFDTSxXQUFXLENBQUMsT0FBb0Q7UUFDckUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUN2Qix1R0FBdUc7WUFDdkcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO2dCQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkMsSUFBSSxRQUFRLENBQUMsV0FBVztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ3ZLLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN0RSxPQUFPLFNBQVMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxLQUFLLG1CQUFtQixFQUFFLENBQUM7UUFDeEssQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ00sYUFBYSxDQUFDLEVBQVU7UUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxJQUFJLFFBQVEsQ0FBQyxXQUFXO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckYsdUVBQXVFO1lBQ3ZFLElBQUksUUFBUTtnQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxJQUFJLFFBQVEsRUFBRSxRQUFRLEtBQUssTUFBTSxDQUFDLFFBQVE7Z0JBQUUsT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxDQUFDO1lBQ25JLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUMsT0FBTyxhQUFhLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxhQUFhLENBQUM7UUFDOUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ00sYUFBYSxDQUFDLEVBQVU7UUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLDJCQUEyQixTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNMLENBQUM7SUFDTSxRQUFRO1FBQ2IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxxQkFBcUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDalMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLGdHQUFnRyxDQUFDLEVBQUUsQ0FBQztRQUFDLENBQUM7SUFDakosQ0FBQztDQUNGIn0=
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5maWxlaGFybmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZmlsZWhhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQThDLE1BQU0sOEJBQThCLENBQUM7QUFDM0gsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWE1QyxrR0FBa0c7QUFDbEcsTUFBTSxPQUFnQixXQUFXO0lBSWYsZ0JBQWdCLEdBQUcsbURBQW1ELENBQUM7SUFXdkY7Ozs7Ozs7OztPQVNHO0lBQ0ssY0FBYztRQUNwQixJQUFJLE9BQWdCLENBQUM7UUFDckIsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzdDLElBQUksT0FBTztnQkFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssTUFBTTtvQkFBRSxPQUFPLFFBQVEsQ0FBQztnQkFDckUsT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUN0QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxPQUFPO1lBQUUsTUFBTSxPQUFPLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxH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
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { IHarnessProcess, IHarnessProcessControl, IHarnessStopOutcome } from './interfaces.harness.js';
|
|
2
|
+
export type THarnessBinary = 'opencode' | 'claude';
|
|
3
|
+
/** A raw same-user process row. The enumerator never filters; identity matching belongs here. */
|
|
4
|
+
export interface IEnumeratedProcess {
|
|
5
|
+
pid: number;
|
|
6
|
+
parentPid: number | null;
|
|
7
|
+
/** Executable name as the platform reports it. Truncated by the platform on Linux. */
|
|
8
|
+
command: string;
|
|
9
|
+
/** argv[0] as the process reports it; a native installer may run a version-named file. */
|
|
10
|
+
executable: string;
|
|
11
|
+
commandLine: string;
|
|
12
|
+
startedAt: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface IHarnessProcessesOptions {
|
|
15
|
+
/** Same-user process table. Injected by tests and by hosts that own their own inspection. */
|
|
16
|
+
enumerate?: () => IEnumeratedProcess[];
|
|
17
|
+
/** Signal delivery, restricted by this class to pids it enumerated itself. */
|
|
18
|
+
signal?: (pidArg: number, signalArg: 'SIGTERM' | 'SIGKILL') => void;
|
|
19
|
+
/** Liveness probe for a pid that was signalled. */
|
|
20
|
+
alive?: (pidArg: number) => boolean;
|
|
21
|
+
sleep?: (millisecondsArg: number) => Promise<void>;
|
|
22
|
+
/** Default bounded wait for a graceful stop. Callers may shorten it per operation. */
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
platform?: NodeJS.Platform;
|
|
25
|
+
/** This command's own pid, for the ancestor chain that must never be signalled. */
|
|
26
|
+
selfPid?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Running instances of one harness binary, and a bounded, consent-driven way to stop them.
|
|
30
|
+
*
|
|
31
|
+
* Every signal target is a pid this class enumerated for the current user in this operation, and
|
|
32
|
+
* the ancestors of the running command are never signalled: stopping the session that invoked
|
|
33
|
+
* authswitch would kill the switch itself. `SIGKILL` is only ever sent after an explicit force
|
|
34
|
+
* request, and only to a pid re-verified against a fresh listing, so a recycled pid cannot inherit
|
|
35
|
+
* a kill meant for the process that already exited.
|
|
36
|
+
*/
|
|
37
|
+
export declare class HarnessProcesses implements IHarnessProcessControl {
|
|
38
|
+
readonly binary: THarnessBinary;
|
|
39
|
+
private readonly enumerate;
|
|
40
|
+
private readonly signal;
|
|
41
|
+
private readonly alive;
|
|
42
|
+
private readonly sleep;
|
|
43
|
+
private readonly platform;
|
|
44
|
+
private readonly selfPid;
|
|
45
|
+
private readonly defaultTimeout;
|
|
46
|
+
constructor(binary: THarnessBinary, optionsArg?: IHarnessProcessesOptions);
|
|
47
|
+
/** Windows' process list carries no owner, so an enumerated pid cannot be proven to be ours. */
|
|
48
|
+
get stopUnavailableReason(): string | null;
|
|
49
|
+
list(): IHarnessProcess[];
|
|
50
|
+
/** The chain from this command up to init, which owns the terminal this command is running in. */
|
|
51
|
+
private ancestorPids;
|
|
52
|
+
stop(processesArg: readonly IHarnessProcess[], optionsArg?: {
|
|
53
|
+
force?: boolean;
|
|
54
|
+
timeoutMs?: number;
|
|
55
|
+
}): Promise<IHarnessStopOutcome>;
|
|
56
|
+
private deliver;
|
|
57
|
+
private awaitExit;
|
|
58
|
+
}
|
|
59
|
+
/** Plain-text description of the instances found, for a terminal, a TUI log or a confirmation. */
|
|
60
|
+
export declare const describeHarnessProcesses: (labelArg: string, processesArg: readonly IHarnessProcess[]) => string[];
|
|
61
|
+
/** Plain-text report of what a stop achieved, including every instance that survived it. */
|
|
62
|
+
export declare const describeStopOutcome: (labelArg: string, outcomeArg: IHarnessStopOutcome) => string[];
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { plainText } from './formatting.js';
|
|
3
|
+
/**
|
|
4
|
+
* How a harness binary is recognised in a process table.
|
|
5
|
+
*
|
|
6
|
+
* `comm` is not enough. Claude Code's native installer runs the CLI from a file named after its
|
|
7
|
+
* version (`~/.local/share/claude/versions/2.1.273`) and its remote agent from
|
|
8
|
+
* `~/.claude/remote/ccd-cli/<version>`, so the kernel reports a version number as the command name
|
|
9
|
+
* while argv[0] carries the real identity. Matching argv[0] and its install path finds the
|
|
10
|
+
* processes that actually hold a login; matching only `comm` finds the launcher and misses every
|
|
11
|
+
* session. Verified against Claude Code 2.1.260-2.1.273 and OpenCode 1.18.15 on Linux.
|
|
12
|
+
*/
|
|
13
|
+
const executablePatterns = {
|
|
14
|
+
claude: [/(?:^|[/\\])claude(?:\.exe)?$/i, /[/\\]claude[/\\]versions[/\\][^/\\]+$/, /[/\\]\.claude[/\\]remote[/\\]ccd-cli[/\\][^/\\]+$/],
|
|
15
|
+
opencode: [/(?:^|[/\\])opencode(?:\.exe)?$/i],
|
|
16
|
+
};
|
|
17
|
+
const MAX_COMMAND_LINE = 200;
|
|
18
|
+
const POSIX_FIELDS = 'pid=,ppid=,uid=,lstart=,comm=,args=';
|
|
19
|
+
/** A bounded read of the current user's process table. Never a pattern-based kill list. */
|
|
20
|
+
const enumeratePosix = () => {
|
|
21
|
+
const uid = process.getuid();
|
|
22
|
+
const output = plugins.childProcess.execFileSync('ps', ['-u', String(uid), '-o', POSIX_FIELDS], {
|
|
23
|
+
encoding: 'utf8', timeout: 5000, maxBuffer: 4 * 1024 * 1024, env: { ...process.env, LC_ALL: 'C' }, windowsHide: true,
|
|
24
|
+
});
|
|
25
|
+
const processes = [];
|
|
26
|
+
for (const line of output.split('\n')) {
|
|
27
|
+
// pid ppid uid, then the five fixed tokens of lstart, then comm and the full argument vector.
|
|
28
|
+
const parts = line.trim().split(/\s+/);
|
|
29
|
+
if (parts.length < 9)
|
|
30
|
+
continue;
|
|
31
|
+
const [pid, parentPid, owner] = parts.slice(0, 3).map(Number);
|
|
32
|
+
if (!Number.isInteger(pid) || pid <= 0 || owner !== uid)
|
|
33
|
+
continue;
|
|
34
|
+
const started = Date.parse(parts.slice(3, 8).join(' '));
|
|
35
|
+
const args = parts.slice(9);
|
|
36
|
+
processes.push({
|
|
37
|
+
pid, parentPid: Number.isInteger(parentPid) ? parentPid : null, command: parts[8],
|
|
38
|
+
executable: args[0] ?? parts[8], commandLine: (args.length ? args.join(' ') : parts[8]).slice(0, MAX_COMMAND_LINE),
|
|
39
|
+
startedAt: Number.isFinite(started) ? new Date(started).toISOString() : null,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return processes;
|
|
43
|
+
};
|
|
44
|
+
/** Windows reports an image name and a pid, with no owner, parent or start time in this view. */
|
|
45
|
+
const enumerateWindows = () => {
|
|
46
|
+
const output = plugins.childProcess.execFileSync('tasklist', ['/FO', 'CSV', '/NH'], {
|
|
47
|
+
encoding: 'utf8', timeout: 5000, maxBuffer: 4 * 1024 * 1024, windowsHide: true,
|
|
48
|
+
});
|
|
49
|
+
const processes = [];
|
|
50
|
+
for (const line of output.split('\n')) {
|
|
51
|
+
const columns = line.trim().replace(/^"/, '').replace(/"$/, '').split('","');
|
|
52
|
+
const pid = Number(columns[1]);
|
|
53
|
+
if (columns.length < 2 || !Number.isInteger(pid) || pid <= 0)
|
|
54
|
+
continue;
|
|
55
|
+
processes.push({ pid, parentPid: null, command: columns[0], executable: columns[0], commandLine: columns[0], startedAt: null });
|
|
56
|
+
}
|
|
57
|
+
return processes;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Running instances of one harness binary, and a bounded, consent-driven way to stop them.
|
|
61
|
+
*
|
|
62
|
+
* Every signal target is a pid this class enumerated for the current user in this operation, and
|
|
63
|
+
* the ancestors of the running command are never signalled: stopping the session that invoked
|
|
64
|
+
* authswitch would kill the switch itself. `SIGKILL` is only ever sent after an explicit force
|
|
65
|
+
* request, and only to a pid re-verified against a fresh listing, so a recycled pid cannot inherit
|
|
66
|
+
* a kill meant for the process that already exited.
|
|
67
|
+
*/
|
|
68
|
+
export class HarnessProcesses {
|
|
69
|
+
binary;
|
|
70
|
+
enumerate;
|
|
71
|
+
signal;
|
|
72
|
+
alive;
|
|
73
|
+
sleep;
|
|
74
|
+
platform;
|
|
75
|
+
selfPid;
|
|
76
|
+
defaultTimeout;
|
|
77
|
+
constructor(binary, optionsArg = {}) {
|
|
78
|
+
this.binary = binary;
|
|
79
|
+
this.platform = optionsArg.platform ?? process.platform;
|
|
80
|
+
this.enumerate = optionsArg.enumerate ?? (this.platform === 'win32' ? enumerateWindows : enumeratePosix);
|
|
81
|
+
this.signal = optionsArg.signal ?? ((pid, signal) => { process.kill(pid, signal); });
|
|
82
|
+
this.alive = optionsArg.alive ?? (pid => {
|
|
83
|
+
try {
|
|
84
|
+
process.kill(pid, 0);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
// EPERM means the process exists but is not ours; it is then never a stop target either.
|
|
88
|
+
catch (error) {
|
|
89
|
+
return error.code === 'EPERM';
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
this.sleep = optionsArg.sleep ?? (milliseconds => new Promise(resolve => { setTimeout(resolve, milliseconds); }));
|
|
93
|
+
this.selfPid = optionsArg.selfPid ?? process.pid;
|
|
94
|
+
this.defaultTimeout = optionsArg.timeoutMs ?? 10_000;
|
|
95
|
+
}
|
|
96
|
+
/** Windows' process list carries no owner, so an enumerated pid cannot be proven to be ours. */
|
|
97
|
+
get stopUnavailableReason() {
|
|
98
|
+
return this.platform === 'win32'
|
|
99
|
+
? 'On Windows authswitch lists running instances but does not stop them: the process list does not identify their owner. Close them yourself.'
|
|
100
|
+
: null;
|
|
101
|
+
}
|
|
102
|
+
list() {
|
|
103
|
+
const table = this.enumerate();
|
|
104
|
+
const ancestors = this.ancestorPids(table);
|
|
105
|
+
const patterns = executablePatterns[this.binary];
|
|
106
|
+
return table
|
|
107
|
+
.filter(item => patterns.some(pattern => pattern.test(item.executable) || pattern.test(item.command)))
|
|
108
|
+
.filter(item => item.pid !== this.selfPid)
|
|
109
|
+
.map(item => ({
|
|
110
|
+
pid: item.pid, command: plugins.path.basename(item.command), commandLine: plainText(item.commandLine),
|
|
111
|
+
startedAt: item.startedAt, isAncestor: ancestors.has(item.pid),
|
|
112
|
+
}))
|
|
113
|
+
.sort((left, right) => left.pid - right.pid);
|
|
114
|
+
}
|
|
115
|
+
/** The chain from this command up to init, which owns the terminal this command is running in. */
|
|
116
|
+
ancestorPids(tableArg) {
|
|
117
|
+
const parents = new Map(tableArg.map(item => [item.pid, item.parentPid]));
|
|
118
|
+
const ancestors = new Set();
|
|
119
|
+
let current = parents.get(this.selfPid) ?? (this.selfPid === process.pid ? process.ppid : null);
|
|
120
|
+
// The table is finite and each step moves to a distinct pid, so the walk terminates.
|
|
121
|
+
while (current !== null && current !== undefined && current > 1 && !ancestors.has(current)) {
|
|
122
|
+
ancestors.add(current);
|
|
123
|
+
current = parents.get(current) ?? null;
|
|
124
|
+
}
|
|
125
|
+
return ancestors;
|
|
126
|
+
}
|
|
127
|
+
async stop(processesArg, optionsArg = {}) {
|
|
128
|
+
const force = optionsArg.force === true;
|
|
129
|
+
const timeout = Math.max(0, Math.min(optionsArg.timeoutMs ?? this.defaultTimeout, 120_000));
|
|
130
|
+
if (this.stopUnavailableReason)
|
|
131
|
+
return { stopped: [], survivors: [...processesArg], forced: [] };
|
|
132
|
+
const listed = new Map(this.list().map(item => [item.pid, item]));
|
|
133
|
+
// Only a pid enumerated in this operation, still present, still not an ancestor, is a target.
|
|
134
|
+
const targets = processesArg.filter(item => {
|
|
135
|
+
const current = listed.get(item.pid);
|
|
136
|
+
return current !== undefined && !current.isAncestor && current.startedAt === item.startedAt;
|
|
137
|
+
});
|
|
138
|
+
// Anything the caller passed that is not a valid target is reported, never signalled.
|
|
139
|
+
const skipped = processesArg.filter(item => !targets.includes(item) && this.alive(item.pid));
|
|
140
|
+
let remaining = this.deliver(targets, 'SIGTERM');
|
|
141
|
+
remaining = await this.awaitExit(remaining, timeout);
|
|
142
|
+
const forced = [];
|
|
143
|
+
if (force && remaining.length) {
|
|
144
|
+
// Re-verify against a fresh listing: a pid that exited may already belong to another process.
|
|
145
|
+
const fresh = new Map(this.list().map(item => [item.pid, item]));
|
|
146
|
+
const verified = remaining.filter(item => fresh.get(item.pid)?.startedAt === item.startedAt && !fresh.get(item.pid).isAncestor);
|
|
147
|
+
forced.push(...verified);
|
|
148
|
+
remaining = [...this.deliver(verified, 'SIGKILL'), ...remaining.filter(item => !verified.includes(item))];
|
|
149
|
+
remaining = await this.awaitExit(remaining, Math.min(timeout, 2000));
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
stopped: processesArg.filter(item => !remaining.includes(item) && !skipped.includes(item)),
|
|
153
|
+
survivors: [...remaining, ...skipped],
|
|
154
|
+
forced,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
deliver(targetsArg, signalArg) {
|
|
158
|
+
const remaining = [];
|
|
159
|
+
for (const target of targetsArg) {
|
|
160
|
+
try {
|
|
161
|
+
this.signal(target.pid, signalArg);
|
|
162
|
+
remaining.push(target);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
// ESRCH is the process we wanted gone; anything else stays reported as still running.
|
|
166
|
+
if (error.code !== 'ESRCH')
|
|
167
|
+
remaining.push(target);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return remaining;
|
|
171
|
+
}
|
|
172
|
+
async awaitExit(processesArg, timeoutArg) {
|
|
173
|
+
let remaining = processesArg.filter(item => this.alive(item.pid));
|
|
174
|
+
const deadline = Date.now() + timeoutArg;
|
|
175
|
+
while (remaining.length && Date.now() < deadline) {
|
|
176
|
+
await this.sleep(Math.min(250, Math.max(1, deadline - Date.now())));
|
|
177
|
+
remaining = remaining.filter(item => this.alive(item.pid));
|
|
178
|
+
}
|
|
179
|
+
return remaining;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const started = (processArg) => processArg.startedAt === null ? 'start time unavailable' : `started ${processArg.startedAt.replace('T', ' ').slice(0, 16)} UTC`;
|
|
183
|
+
/** Plain-text description of the instances found, for a terminal, a TUI log or a confirmation. */
|
|
184
|
+
export const describeHarnessProcesses = (labelArg, processesArg) => [
|
|
185
|
+
`${processesArg.length} ${plainText(labelArg)} process(es) are running:`,
|
|
186
|
+
...processesArg.map(item => ` pid ${item.pid} ${started(item)} ${item.commandLine}`
|
|
187
|
+
+ (item.isAncestor ? ' [runs this command; it is never stopped from inside itself]' : '')),
|
|
188
|
+
];
|
|
189
|
+
/** Plain-text report of what a stop achieved, including every instance that survived it. */
|
|
190
|
+
export const describeStopOutcome = (labelArg, outcomeArg) => {
|
|
191
|
+
const lines = [];
|
|
192
|
+
if (outcomeArg.stopped.length)
|
|
193
|
+
lines.push(`Stopped ${outcomeArg.stopped.length} ${plainText(labelArg)} process(es)${outcomeArg.forced.length ? `, ${outcomeArg.forced.length} of them with SIGKILL` : ''}.`);
|
|
194
|
+
for (const survivor of outcomeArg.survivors)
|
|
195
|
+
lines.push(`pid ${survivor.pid} did not exit and is still running: ${survivor.commandLine}`);
|
|
196
|
+
return lines;
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYXJuZXNzcHJvY2Vzc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5oYXJuZXNzcHJvY2Vzc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQThCNUM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBcUM7SUFDM0QsTUFBTSxFQUFFLENBQUMsK0JBQStCLEVBQUUsdUNBQXVDLEVBQUUsbURBQW1ELENBQUM7SUFDdkksUUFBUSxFQUFFLENBQUMsaUNBQWlDLENBQUM7Q0FDOUMsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzdCLE1BQU0sWUFBWSxHQUFHLHFDQUFxQyxDQUFDO0FBRTNELDJGQUEyRjtBQUMzRixNQUFNLGNBQWMsR0FBRyxHQUF5QixFQUFFO0lBQ2hELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFPLEVBQUUsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRTtRQUM5RixRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUk7S0FDckgsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLEdBQXlCLEVBQUUsQ0FBQztJQUMzQyxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMs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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type { IAccountList, IAccountLimits, IActiveAccounts } from './interfaces.list.js';
|
|
3
|
+
/**
|
|
4
|
+
* One row per account and limit type, projected from the account list.
|
|
5
|
+
*
|
|
6
|
+
* Nothing here talks to a provider: the list is already the read-only, per-account-isolated lookup,
|
|
7
|
+
* so a single failing account costs its own rows a number and nothing else.
|
|
8
|
+
*/
|
|
9
|
+
export declare const accountLimits: (listArg: IAccountList) => IAccountLimits;
|
|
10
|
+
/**
|
|
11
|
+
* One row per active credential slot.
|
|
12
|
+
*
|
|
13
|
+
* A harness with no active login still gets a row: "nothing is active here" is an answer, and
|
|
14
|
+
* silently dropping the provider would read as "this provider does not exist".
|
|
15
|
+
*/
|
|
16
|
+
export declare const activeAccounts: (listArg: IAccountList) => IActiveAccounts;
|
|
17
|
+
/** Condensed presentation for `authswitch limits` and `authswitch active`. */
|
|
18
|
+
export declare class CondensedRenderer {
|
|
19
|
+
private readonly out;
|
|
20
|
+
constructor(out: plugins.smartconsole.SmartConsole);
|
|
21
|
+
private notes;
|
|
22
|
+
renderLimits(limitsArg: IAccountLimits): Promise<void>;
|
|
23
|
+
renderActive(activeArg: IActiveAccounts): Promise<void>;
|
|
24
|
+
}
|