wicked-crew 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/roster-standing.d.ts +27 -1
- package/dist/api/roster-standing.d.ts.map +1 -1
- package/dist/api/roster-standing.js +126 -10
- package/dist/api/roster-standing.js.map +1 -1
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +28 -11
- package/dist/api/routes.js.map +1 -1
- package/dist/api/seat-agents.d.ts +135 -0
- package/dist/api/seat-agents.d.ts.map +1 -0
- package/dist/api/seat-agents.js +186 -0
- package/dist/api/seat-agents.js.map +1 -0
- package/dist/api/seat-health.d.ts +22 -0
- package/dist/api/seat-health.d.ts.map +1 -1
- package/dist/api/seat-health.js +53 -6
- package/dist/api/seat-health.js.map +1 -1
- package/dist/api/seat-probe.d.ts +11 -2
- package/dist/api/seat-probe.d.ts.map +1 -1
- package/dist/api/seat-probe.js +28 -9
- package/dist/api/seat-probe.js.map +1 -1
- package/dist/api/seat-scrub.d.ts +65 -0
- package/dist/api/seat-scrub.d.ts.map +1 -0
- package/dist/api/seat-scrub.js +193 -0
- package/dist/api/seat-scrub.js.map +1 -0
- package/dist/api/seat-standing.d.ts +3 -2
- package/dist/api/seat-standing.d.ts.map +1 -1
- package/dist/api/seat-standing.js +8 -7
- package/dist/api/seat-standing.js.map +1 -1
- package/dist/api/seat-version.d.ts +81 -0
- package/dist/api/seat-version.d.ts.map +1 -0
- package/dist/api/seat-version.js +174 -0
- package/dist/api/seat-version.js.map +1 -0
- package/dist/api/server.js +1 -1
- package/dist/core/adapter.d.ts +12 -0
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +25 -0
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/engine-roster.d.ts.map +1 -1
- package/dist/core/engine-roster.js +8 -0
- package/dist/core/engine-roster.js.map +1 -1
- package/dist/editors/registry.d.ts +2 -2
- package/dist/interactive/council-outcome.js +1 -1
- package/dist/standing-orders/parse.js +1 -1
- package/dist/studio/assets/index-C6DLorst.css +32 -0
- package/dist/studio/assets/index-CAhuFWeA.js +609 -0
- package/dist/studio/editors/wicked-page/editor.json +1 -1
- package/dist/studio/editors/wicked-page/index.html +1 -1
- package/dist/studio/index.html +2 -2
- package/dist/studio/testid-inventory.json +553 -144
- package/endpoint-manifest.json +6 -14
- package/package.json +2 -2
- package/dist/studio/assets/index-DlZl1q2Q.js +0 -593
- package/dist/studio/assets/index-eLCOoPWX.css +0 -32
package/dist/api/seat-probe.js
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
* one refresh in the background (deduplicated per seat, one probe process at a time host-wide
|
|
46
46
|
* for this daemon). A signed-in answer is kept for 5 minutes (so a live check costs at most one
|
|
47
47
|
* one-word request per seat per 5 minutes); a signed-out or unknown one for 30 s, so a seat signed
|
|
48
|
-
* in from the
|
|
48
|
+
* in from the Agents page turns green on the next poll or two. The cache is keyed by (seat, worker
|
|
49
49
|
* home): changing `worker_config_root` discards every answer at once. A launch awaits a missing or
|
|
50
50
|
* stale answer, bounded, before it routes ({@link SeatProbe.ensureFresh}).
|
|
51
51
|
*/
|
|
@@ -54,6 +54,7 @@ import { homedir, tmpdir } from 'node:os';
|
|
|
54
54
|
import { join } from 'node:path';
|
|
55
55
|
import { childEnvWithBootEstateDb } from '../core/governance-store.js';
|
|
56
56
|
import { isAuthRefusal } from './seat-health.js';
|
|
57
|
+
import { accountFromStatus, liveSummary, statusSummary } from './seat-scrub.js';
|
|
57
58
|
/** How long an answer is trusted before a background refresh (the stale answer is served meanwhile). */
|
|
58
59
|
export const PROBE_TTL_SIGNED_IN_MS = 5 * 60 * 1000;
|
|
59
60
|
export const PROBE_TTL_OTHER_MS = 30 * 1000;
|
|
@@ -179,7 +180,13 @@ export class SeatProbe {
|
|
|
179
180
|
void this.refresh(seatKey, workerRoot);
|
|
180
181
|
if (hit === undefined)
|
|
181
182
|
return undefined;
|
|
182
|
-
return {
|
|
183
|
+
return {
|
|
184
|
+
signedIn: hit.signedIn,
|
|
185
|
+
check: hit.check,
|
|
186
|
+
probedAt: hit.probedAt,
|
|
187
|
+
detail: hit.detail,
|
|
188
|
+
...(hit.account !== undefined ? { account: hit.account } : {}),
|
|
189
|
+
};
|
|
183
190
|
}
|
|
184
191
|
/**
|
|
185
192
|
* Before a launch routes: probe every probed seat whose answer is missing or stale and wait for
|
|
@@ -227,24 +234,36 @@ export class SeatProbe {
|
|
|
227
234
|
this.inflight.set(key, job);
|
|
228
235
|
return job;
|
|
229
236
|
}
|
|
237
|
+
/**
|
|
238
|
+
* A3b: probe AGAIN, after any probe already running for this seat has finished. A running probe
|
|
239
|
+
* may have started before the operator signed in, so its answer cannot be the fresh one.
|
|
240
|
+
*/
|
|
241
|
+
async refreshFresh(seatKey, workerRoot) {
|
|
242
|
+
const running = this.inflight.get(cacheKey(seatKey, workerRoot));
|
|
243
|
+
if (running !== undefined)
|
|
244
|
+
await running.catch(() => undefined);
|
|
245
|
+
return this.refresh(seatKey, workerRoot);
|
|
246
|
+
}
|
|
230
247
|
/** The status command, then — when it says signed in — the live check. */
|
|
231
248
|
async probeOnce(seatKey, status, verify) {
|
|
232
249
|
const out = await this.run(status.cmd, status.args, status.env, PROBE_TIMEOUT_MS);
|
|
233
250
|
const said = classifyProbe(seatKey, out);
|
|
234
|
-
|
|
251
|
+
// A8: only crew's own words for what the CLI said (`seat-scrub.ts`), never its prose.
|
|
252
|
+
const statusWords = excerpt(statusSummary(seatKey, out));
|
|
253
|
+
const account = said === true ? accountFromStatus(seatKey, out.stdout, out.stderr) : undefined;
|
|
235
254
|
if (said !== true || verify === null)
|
|
236
|
-
return this.reading(said, 'status', statusWords);
|
|
255
|
+
return this.reading(said, 'status', statusWords, account);
|
|
237
256
|
const live = await this.run(verify.cmd, verify.args, verify.env, VERIFY_TIMEOUT_MS);
|
|
238
257
|
const verdict = classifyVerify(live);
|
|
239
|
-
const liveWords = excerpt(live
|
|
258
|
+
const liveWords = excerpt(liveSummary(live));
|
|
240
259
|
if (verdict === false)
|
|
241
260
|
return this.reading(false, 'live', liveWords);
|
|
242
261
|
if (verdict === true)
|
|
243
|
-
return this.reading(true, 'live', statusWords);
|
|
244
|
-
return this.reading(true, 'status', `the live check could not tell (${liveWords}); status: ${statusWords}
|
|
262
|
+
return this.reading(true, 'live', statusWords, account);
|
|
263
|
+
return this.reading(true, 'status', `the live check could not tell (${liveWords}); status: ${statusWords}`, account);
|
|
245
264
|
}
|
|
246
|
-
reading(signedIn, check, detail) {
|
|
247
|
-
return { signedIn, check, probedAt: new Date(this.now()).toISOString(), detail };
|
|
265
|
+
reading(signedIn, check, detail, account) {
|
|
266
|
+
return { signedIn, check, probedAt: new Date(this.now()).toISOString(), detail, ...(account !== undefined ? { account } : {}) };
|
|
248
267
|
}
|
|
249
268
|
stale(hit) {
|
|
250
269
|
const ttl = hit.signedIn === true ? PROBE_TTL_SIGNED_IN_MS : PROBE_TTL_OTHER_MS;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-probe.js","sourceRoot":"","sources":["../../src/api/seat-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"seat-probe.js","sourceRoot":"","sources":["../../src/api/seat-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Account identifiers never reach the wire (DES-seats-page A8 and A2).
|
|
3
|
+
*
|
|
4
|
+
* A seat's own words ride `GET /roster` as `auth_evidence` and inside `login_note`, and those are
|
|
5
|
+
* the CLI's status output. Signed in, `claude auth status --json` prints the account (`email`,
|
|
6
|
+
* `orgId`, `orgName`) beside the fields the roster needs (`loggedIn`, `authMethod`). `codex login
|
|
7
|
+
* status` prints a masked key prefix ("Logged in using an API key - sk-proj-***"). This module is
|
|
8
|
+
* the one place that turns that output into something the roster may carry:
|
|
9
|
+
*
|
|
10
|
+
* - {@link scrubStatusOutput} reads a JSON status object for its ALLOWLISTED fields only, so an
|
|
11
|
+
* account field that a newer CLI adds is dropped too, and a field this module does not know is
|
|
12
|
+
* never carried;
|
|
13
|
+
* - {@link scrubEvidence} is the second guard for free text: email-like, UUID-like and key-shaped
|
|
14
|
+
* strings are masked, wherever they appear;
|
|
15
|
+
* - {@link accountFromStatus} reads the account KIND (and a provider-public plan name) from the
|
|
16
|
+
* raw output BEFORE the scrub. It never returns an identifier.
|
|
17
|
+
*
|
|
18
|
+
* The roster's evidence fields carry ONLY crew's own vocabulary (codex r2 on #996: no mask can know
|
|
19
|
+
* every shape an identifier takes in a CLI's prose): {@link statusSummary} for a status command,
|
|
20
|
+
* {@link liveSummary} for the live check, `refusalSummary` (seat-health.ts) for a seat's refusal.
|
|
21
|
+
* {@link scrubEvidence} stays as the second guard over all of them.
|
|
22
|
+
*
|
|
23
|
+
* Pure: no IO, no clock.
|
|
24
|
+
*/
|
|
25
|
+
/** Mask every account identifier in free text (the second guard; see the module doc). */
|
|
26
|
+
export declare function scrubEvidence(text: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* A CLI's status output reduced to what the roster may carry. JSON objects (claude) keep only the
|
|
29
|
+
* {@link STATUS_ALLOWLIST} fields, re-serialized compactly; anything else goes through
|
|
30
|
+
* {@link scrubEvidence}.
|
|
31
|
+
*/
|
|
32
|
+
export declare function scrubStatusOutput(text: string): string;
|
|
33
|
+
/** `RosterSeat.account.kind` (api-types 0.115.0). */
|
|
34
|
+
export type SeatAccountKind = 'subscription' | 'api_key' | 'free' | 'unknown';
|
|
35
|
+
export interface SeatAccount {
|
|
36
|
+
kind: SeatAccountKind;
|
|
37
|
+
/** A provider-public plan name ("Max", "Pro"), only from the fixed table below. */
|
|
38
|
+
plan?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The account kind a seat's auth-status output states, or `undefined` when it states none (the
|
|
42
|
+
* caller then says `unknown`). Read from the RAW output; returns no identifier.
|
|
43
|
+
*
|
|
44
|
+
* - claude (`auth status --json`): `authMethod: "claude.ai"` is a subscription (plan from
|
|
45
|
+
* `subscriptionType`), `"api_key"` an API key;
|
|
46
|
+
* - codex (`login status`): "Logged in using ChatGPT" is a subscription; an API key, an access
|
|
47
|
+
* token or a Bedrock key is `api_key`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function accountFromStatus(seatKey: string, stdout: string, stderr?: string): SeatAccount | undefined;
|
|
50
|
+
/** A probe process's outcome, as `seat-probe.ts` reports it (structural). */
|
|
51
|
+
export interface ProbeOutputLike {
|
|
52
|
+
code: number | null;
|
|
53
|
+
stdout: string;
|
|
54
|
+
stderr: string;
|
|
55
|
+
error?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A status command's answer, in crew's words only: claude's JSON reduced to its allowlisted
|
|
59
|
+
* fields (stdout alone — a stderr warning never turns the allowlist off; malformed JSON is
|
|
60
|
+
* withheld, never echoed), codex's known phrase, plus any refusal phrase stderr carried.
|
|
61
|
+
*/
|
|
62
|
+
export declare function statusSummary(seatKey: string, out: ProbeOutputLike): string;
|
|
63
|
+
/** The live check's answer, in crew's words only: the refusal phrase, a known blocker, or the exit. */
|
|
64
|
+
export declare function liveSummary(out: ProbeOutputLike): string;
|
|
65
|
+
//# sourceMappingURL=seat-scrub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-scrub.d.ts","sourceRoot":"","sources":["../../src/api/seat-scrub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAwBH,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBtD;AAED,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,WAAW,GAAG,SAAS,CAsBvG;AAED,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAgB3E;AAWD,uGAAuG;AACvG,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAOxD"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Account identifiers never reach the wire (DES-seats-page A8 and A2).
|
|
3
|
+
*
|
|
4
|
+
* A seat's own words ride `GET /roster` as `auth_evidence` and inside `login_note`, and those are
|
|
5
|
+
* the CLI's status output. Signed in, `claude auth status --json` prints the account (`email`,
|
|
6
|
+
* `orgId`, `orgName`) beside the fields the roster needs (`loggedIn`, `authMethod`). `codex login
|
|
7
|
+
* status` prints a masked key prefix ("Logged in using an API key - sk-proj-***"). This module is
|
|
8
|
+
* the one place that turns that output into something the roster may carry:
|
|
9
|
+
*
|
|
10
|
+
* - {@link scrubStatusOutput} reads a JSON status object for its ALLOWLISTED fields only, so an
|
|
11
|
+
* account field that a newer CLI adds is dropped too, and a field this module does not know is
|
|
12
|
+
* never carried;
|
|
13
|
+
* - {@link scrubEvidence} is the second guard for free text: email-like, UUID-like and key-shaped
|
|
14
|
+
* strings are masked, wherever they appear;
|
|
15
|
+
* - {@link accountFromStatus} reads the account KIND (and a provider-public plan name) from the
|
|
16
|
+
* raw output BEFORE the scrub. It never returns an identifier.
|
|
17
|
+
*
|
|
18
|
+
* The roster's evidence fields carry ONLY crew's own vocabulary (codex r2 on #996: no mask can know
|
|
19
|
+
* every shape an identifier takes in a CLI's prose): {@link statusSummary} for a status command,
|
|
20
|
+
* {@link liveSummary} for the live check, `refusalSummary` (seat-health.ts) for a seat's refusal.
|
|
21
|
+
* {@link scrubEvidence} stays as the second guard over all of them.
|
|
22
|
+
*
|
|
23
|
+
* Pure: no IO, no clock.
|
|
24
|
+
*/
|
|
25
|
+
import { refusalSummary } from './seat-health.js';
|
|
26
|
+
/** The fields of a JSON auth-status object the roster may carry. Everything else is dropped. */
|
|
27
|
+
const STATUS_ALLOWLIST = ['loggedIn', 'authMethod', 'apiProvider'];
|
|
28
|
+
const EMAIL_RE = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g;
|
|
29
|
+
const UUID_RE = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi;
|
|
30
|
+
/** A provider key prefix with whatever follows it (masked or not): `sk-…`, `sk-ant-…`, `ghp_…`,
|
|
31
|
+
* `gho_…`, `github_pat_…`, `xox?-…`, `AKIA…`. */
|
|
32
|
+
const KEY_PREFIX_RE = /\b(?:sk-[A-Za-z0-9_*.-]*|gh[pousr]_[A-Za-z0-9_*]*|github_pat_[A-Za-z0-9_*]*|xox[abprs]-[A-Za-z0-9*-]*|AKIA[A-Z0-9*]*)/g;
|
|
33
|
+
/** A long unbroken token (24+ chars of a key alphabet, holding a digit or a capital): an access
|
|
34
|
+
* token, a bearer, a hash. Version strings never reach this length without a separator, and a
|
|
35
|
+
* snake_case word (`read_only_requires_wrapped`) holds neither. */
|
|
36
|
+
const LONG_TOKEN_RE = /\b(?=[A-Za-z0-9_\-]*[0-9A-Z])[A-Za-z0-9_\-]{24,}\b/g;
|
|
37
|
+
/** `Bearer <token>` / `Basic <token>`: whatever follows the scheme. */
|
|
38
|
+
const AUTH_SCHEME_RE = /\b(Bearer|Basic|Token)\s+[^\s,;)}\]]+/gi;
|
|
39
|
+
/** `key: value` / `key=value` pairs whose key names an account identifier or a secret. The value is
|
|
40
|
+
* masked to the end of its clause — a quoted string, or everything up to `,` `;` `)` `}` `]` or the
|
|
41
|
+
* line's end — so a multi-word name ("organization: Acme Research Ltd") goes whole. */
|
|
42
|
+
const ACCOUNT_PAIR_RE = /("?(?:e-?mail|email_?address|account(?:_?id|_?uuid|_?name)?|org(?:ani[sz]ation)?(?:_?id|_?uuid|_?name)?|team(?:_?id|_?name)?|workspace(?:_?id|_?name)?|tenant(?:_?id)?|user(?:_?id|_?name)?|login|username|(?:access_?|refresh_?|id_?|session_?|auth_?)?token|api_?key|secret|password|passwd|credentials?|authorization|cookie)"?\s*[:=]\s*)("[^"]*"|[^,;)}\]\n]+)/gi;
|
|
43
|
+
/** Mask every account identifier in free text (the second guard; see the module doc). */
|
|
44
|
+
export function scrubEvidence(text) {
|
|
45
|
+
return text
|
|
46
|
+
.replace(ACCOUNT_PAIR_RE, (_m, key, value) => `${key}${value.startsWith('"') ? '"<redacted>"' : '<redacted>'}`)
|
|
47
|
+
.replace(AUTH_SCHEME_RE, (_m, scheme) => `${scheme} <redacted>`)
|
|
48
|
+
.replace(EMAIL_RE, '<email>')
|
|
49
|
+
.replace(UUID_RE, '<id>')
|
|
50
|
+
.replace(KEY_PREFIX_RE, '<key>')
|
|
51
|
+
.replace(LONG_TOKEN_RE, '<redacted>');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A CLI's status output reduced to what the roster may carry. JSON objects (claude) keep only the
|
|
55
|
+
* {@link STATUS_ALLOWLIST} fields, re-serialized compactly; anything else goes through
|
|
56
|
+
* {@link scrubEvidence}.
|
|
57
|
+
*/
|
|
58
|
+
export function scrubStatusOutput(text) {
|
|
59
|
+
const trimmed = text.trim();
|
|
60
|
+
if (trimmed.startsWith('{')) {
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(trimmed);
|
|
63
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
64
|
+
const kept = {};
|
|
65
|
+
for (const k of STATUS_ALLOWLIST) {
|
|
66
|
+
const v = parsed[k];
|
|
67
|
+
if (typeof v === 'boolean' || typeof v === 'number' || (typeof v === 'string' && v.length <= 40))
|
|
68
|
+
kept[k] = v;
|
|
69
|
+
}
|
|
70
|
+
return scrubEvidence(JSON.stringify(kept));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* not one JSON object: the text guard below */
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return scrubEvidence(text);
|
|
78
|
+
}
|
|
79
|
+
/** Provider-public plan names, by the status output's own token. Anything else is not carried. */
|
|
80
|
+
const CLAUDE_PLANS = Object.freeze({
|
|
81
|
+
max: 'Max',
|
|
82
|
+
pro: 'Pro',
|
|
83
|
+
team: 'Team',
|
|
84
|
+
enterprise: 'Enterprise',
|
|
85
|
+
});
|
|
86
|
+
/**
|
|
87
|
+
* The account kind a seat's auth-status output states, or `undefined` when it states none (the
|
|
88
|
+
* caller then says `unknown`). Read from the RAW output; returns no identifier.
|
|
89
|
+
*
|
|
90
|
+
* - claude (`auth status --json`): `authMethod: "claude.ai"` is a subscription (plan from
|
|
91
|
+
* `subscriptionType`), `"api_key"` an API key;
|
|
92
|
+
* - codex (`login status`): "Logged in using ChatGPT" is a subscription; an API key, an access
|
|
93
|
+
* token or a Bedrock key is `api_key`.
|
|
94
|
+
*/
|
|
95
|
+
export function accountFromStatus(seatKey, stdout, stderr = '') {
|
|
96
|
+
if (seatKey === 'claude') {
|
|
97
|
+
try {
|
|
98
|
+
const parsed = JSON.parse(stdout.trim());
|
|
99
|
+
if (parsed.loggedIn !== true)
|
|
100
|
+
return undefined;
|
|
101
|
+
if (parsed.authMethod === 'claude.ai') {
|
|
102
|
+
const plan = typeof parsed.subscriptionType === 'string' ? CLAUDE_PLANS[parsed.subscriptionType.toLowerCase()] : undefined;
|
|
103
|
+
return { kind: 'subscription', ...(plan !== undefined ? { plan } : {}) };
|
|
104
|
+
}
|
|
105
|
+
if (parsed.authMethod === 'api_key')
|
|
106
|
+
return { kind: 'api_key' };
|
|
107
|
+
return { kind: 'unknown' };
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (seatKey === 'codex') {
|
|
114
|
+
const said = `${stdout}\n${stderr}`;
|
|
115
|
+
if (/logged in using chatgpt/i.test(said))
|
|
116
|
+
return { kind: 'subscription' };
|
|
117
|
+
if (/logged in using (?:an api key|amazon bedrock|(?:a )?(?:personal )?access token)/i.test(said))
|
|
118
|
+
return { kind: 'api_key' };
|
|
119
|
+
if (/logged in using/i.test(said))
|
|
120
|
+
return { kind: 'unknown' };
|
|
121
|
+
}
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
/** Why a probe process did not answer, in crew's words. */
|
|
125
|
+
function processFailure(error) {
|
|
126
|
+
if (/ENOENT/.test(error))
|
|
127
|
+
return 'the CLI is not installed (ENOENT)';
|
|
128
|
+
if (/ETIMEDOUT|timed? ?out|SIGTERM|killed/i.test(error))
|
|
129
|
+
return 'timed out';
|
|
130
|
+
return 'the CLI did not run';
|
|
131
|
+
}
|
|
132
|
+
/** codex `login status` phrases (codex 0.16x), the only words carried from its output. */
|
|
133
|
+
const CODEX_STATUS_PHRASES = [
|
|
134
|
+
/Not logged in/i,
|
|
135
|
+
/Logged in using ChatGPT/i,
|
|
136
|
+
/Logged in using an API key/i,
|
|
137
|
+
/Logged in using Amazon Bedrock (?:API key|AWS access keys)/i,
|
|
138
|
+
/Logged in using (?:personal )?access token/i,
|
|
139
|
+
/Logged in using workload identity/i,
|
|
140
|
+
];
|
|
141
|
+
/**
|
|
142
|
+
* A status command's answer, in crew's words only: claude's JSON reduced to its allowlisted
|
|
143
|
+
* fields (stdout alone — a stderr warning never turns the allowlist off; malformed JSON is
|
|
144
|
+
* withheld, never echoed), codex's known phrase, plus any refusal phrase stderr carried.
|
|
145
|
+
*/
|
|
146
|
+
export function statusSummary(seatKey, out) {
|
|
147
|
+
if (out.error !== undefined || out.code === null)
|
|
148
|
+
return processFailure(out.error ?? '');
|
|
149
|
+
let main;
|
|
150
|
+
if (seatKey === 'claude') {
|
|
151
|
+
const stdout = out.stdout.trim();
|
|
152
|
+
main =
|
|
153
|
+
stdout.startsWith('{') && isJsonObject(stdout)
|
|
154
|
+
? scrubStatusOutput(stdout)
|
|
155
|
+
: (refusalSummary(out.stdout) ?? `exit ${out.code}: the status output is not JSON (withheld)`);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const said = `${out.stdout}\n${out.stderr}`;
|
|
159
|
+
const phrase = CODEX_STATUS_PHRASES.map((re) => re.exec(said)?.[0]).find((p) => p !== undefined);
|
|
160
|
+
main = phrase ?? `exit ${out.code}: the status output is withheld`;
|
|
161
|
+
}
|
|
162
|
+
const refused = refusalSummary(out.stderr);
|
|
163
|
+
return scrubEvidence(refused !== null && !main.toLowerCase().includes(refused.toLowerCase()) ? `${main}; ${refused}` : main);
|
|
164
|
+
}
|
|
165
|
+
/** What stops a live request, beyond a refusal for want of a credential (crew's words). */
|
|
166
|
+
const LIVE_BLOCKERS = [
|
|
167
|
+
[/usage limit/i, 'usage limit'],
|
|
168
|
+
[/rate[ -]?limit/i, 'rate limit'],
|
|
169
|
+
[/quota/i, 'quota'],
|
|
170
|
+
[/overloaded/i, 'overloaded'],
|
|
171
|
+
[/stream disconnected|ECONNRESET|ECONNREFUSED|ENOTFOUND|network/i, 'network'],
|
|
172
|
+
];
|
|
173
|
+
/** The live check's answer, in crew's words only: the refusal phrase, a known blocker, or the exit. */
|
|
174
|
+
export function liveSummary(out) {
|
|
175
|
+
if (out.error !== undefined || out.code === null)
|
|
176
|
+
return processFailure(out.error ?? '');
|
|
177
|
+
const said = `${out.stdout}\n${out.stderr}`;
|
|
178
|
+
const refused = refusalSummary(said);
|
|
179
|
+
if (refused !== null)
|
|
180
|
+
return scrubEvidence(refused);
|
|
181
|
+
const blocker = LIVE_BLOCKERS.find(([re]) => re.test(said))?.[1];
|
|
182
|
+
return blocker !== undefined ? `exit ${out.code}: ${blocker}` : `exit ${out.code}`;
|
|
183
|
+
}
|
|
184
|
+
function isJsonObject(text) {
|
|
185
|
+
try {
|
|
186
|
+
const v = JSON.parse(text);
|
|
187
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=seat-scrub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-scrub.js","sourceRoot":"","sources":["../../src/api/seat-scrub.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,11 +44,12 @@ import type { SeatProbeReading } from './seat-probe.js';
|
|
|
44
44
|
export declare function plainEvidence(detail: string): string | null;
|
|
45
45
|
/**
|
|
46
46
|
* `auth_evidence` with the operator's home directory written `~` (crew#771: screen shares and
|
|
47
|
-
* recordings).
|
|
47
|
+
* recordings). A command's display passes `$HOME` instead (`seat-agents.ts`): it expands inside the
|
|
48
|
+
* double quotes the engine puts around a seat's root, where `~` does not. Only the home as a whole path segment — `/home/al` never eats the start of
|
|
48
49
|
* `/home/alice` — and in every separator spelling: `/`, `\`, and the JSON-escaped `\\` a Windows
|
|
49
50
|
* home takes inside a CLI's JSON status (codex on #797). A root home (`/`) is left alone.
|
|
50
51
|
*/
|
|
51
|
-
export declare function homeless(detail: string, home?: string): string;
|
|
52
|
+
export declare function homeless(detail: string, home?: string, replacement?: string): string;
|
|
52
53
|
/** The seat's auth state, read for what it MEANS for the seat's usability. */
|
|
53
54
|
export type SeatAuth = 'signed_in' | 'signed_out' | 'not_required' | 'unknown';
|
|
54
55
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-standing.d.ts","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,KAAK,EAAC,eAAe,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAMtD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ3D;AAMD
|
|
1
|
+
{"version":3,"file":"seat-standing.d.ts","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,11 +59,12 @@ function escapeRegExp(s) {
|
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* `auth_evidence` with the operator's home directory written `~` (crew#771: screen shares and
|
|
62
|
-
* recordings).
|
|
62
|
+
* recordings). A command's display passes `$HOME` instead (`seat-agents.ts`): it expands inside the
|
|
63
|
+
* double quotes the engine puts around a seat's root, where `~` does not. Only the home as a whole path segment — `/home/al` never eats the start of
|
|
63
64
|
* `/home/alice` — and in every separator spelling: `/`, `\`, and the JSON-escaped `\\` a Windows
|
|
64
65
|
* home takes inside a CLI's JSON status (codex on #797). A root home (`/`) is left alone.
|
|
65
66
|
*/
|
|
66
|
-
export function homeless(detail, home = homedir()) {
|
|
67
|
+
export function homeless(detail, home = homedir(), replacement = '~') {
|
|
67
68
|
const trimmed = home.replace(/[\\/]+$/, '');
|
|
68
69
|
if (trimmed === '')
|
|
69
70
|
return detail;
|
|
@@ -71,7 +72,7 @@ export function homeless(detail, home = homedir()) {
|
|
|
71
72
|
const spellings = new Set([trimmed, trimmed.replace(/\\/g, '/'), back, back.replace(/\\/g, '\\\\')]);
|
|
72
73
|
let out = detail;
|
|
73
74
|
for (const h of [...spellings].sort((a, b) => b.length - a.length))
|
|
74
|
-
out = out.replace(new RegExp(`${escapeRegExp(h)}(?=$|[\\\\/\\s"'),;:])`, 'g'),
|
|
75
|
+
out = out.replace(new RegExp(`${escapeRegExp(h)}(?=$|[\\\\/\\s"'),;:])`, 'g'), () => replacement);
|
|
75
76
|
return out;
|
|
76
77
|
}
|
|
77
78
|
/**
|
|
@@ -154,10 +155,10 @@ export function seatStanding(seat, signedIn, authFailure = null, probeInput = un
|
|
|
154
155
|
...base,
|
|
155
156
|
council_eligible: false,
|
|
156
157
|
council_ineligible_reason: authFailure !== null
|
|
157
|
-
? `signed out — the seat itself reported no credential (${noCredentialCause(authFailure)}); sign it in from the
|
|
158
|
+
? `signed out — the seat itself reported no credential (${noCredentialCause(authFailure)}); sign it in from the Agents page`
|
|
158
159
|
: read.auth_source === 'probe'
|
|
159
|
-
? `signed out — the seat's own auth check says ${probeWords(read.auth_evidence)}; sign it in from the
|
|
160
|
-
: 'signed out — a council would bench this seat on its first ballot; sign it in from the
|
|
160
|
+
? `signed out — the seat's own auth check says ${probeWords(read.auth_evidence)}; sign it in from the Agents page`
|
|
161
|
+
: 'signed out — a council would bench this seat on its first ballot; sign it in from the Agents page',
|
|
161
162
|
};
|
|
162
163
|
}
|
|
163
164
|
// A seat the ENGINE benched in a recent run on its own refusal (`seatBenched`: out of quota, not
|
|
@@ -217,7 +218,7 @@ kind = 'pool') {
|
|
|
217
218
|
const reasons = [];
|
|
218
219
|
let source = 'scope';
|
|
219
220
|
if (!authUsable(auth)) {
|
|
220
|
-
reasons.push('signed out — it cannot take a turn until it is signed in from the
|
|
221
|
+
reasons.push('signed out — it cannot take a turn until it is signed in from the Agents page');
|
|
221
222
|
source = 'auth';
|
|
222
223
|
}
|
|
223
224
|
if (seat.enabled_for_council === false) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-standing.js","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,mFAAmF;AACnF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,kBAAkB,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,gGAAgG;IAChG,kGAAkG;IAClG,qGAAqG;IACrG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"seat-standing.js","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every seat's installed version (DES-seats-page A1): `RosterSeat.version`.
|
|
3
|
+
*
|
|
4
|
+
* `version_pin` (core#581, `diagnostics.ts`) exists only for a seat whose ACP config pins a build
|
|
5
|
+
* (opencode). Every other seat read "Not reported" on the Agents page, although the registry record
|
|
6
|
+
* already carries the argv that answers it (`version_probe`, e.g. `["claude", "--version"]`).
|
|
7
|
+
*
|
|
8
|
+
* The reading, per seat:
|
|
9
|
+
* - `installed`: the first non-empty line the seat's `version_probe` prints (stdout, then stderr),
|
|
10
|
+
* bounded and with the home directory written `~`; `null` when it did not answer;
|
|
11
|
+
* - `proven` / `status`: from the pin reading when the seat pins a build (`proven` = the pinned
|
|
12
|
+
* build; `status` = `proven` when the pin holds, else `unproven`), `no_pin` otherwise. A pinned
|
|
13
|
+
* seat whose pin has not been probed yet carries no `version` at all, never a guessed status;
|
|
14
|
+
* - `install_source`: how the binary on PATH was installed, read off its resolved path (no
|
|
15
|
+
* spawn): under `node_modules` = `npm`, under a Homebrew prefix = `brew`, else `other`; `null`
|
|
16
|
+
* when the binary is not on PATH. It lets the Agents page offer a real update command instead of
|
|
17
|
+
* guessing one. The path itself never reaches the wire.
|
|
18
|
+
*
|
|
19
|
+
* Cost: one bounded `--version` per seat per {@link SEAT_VERSION_TTL_MS}, in the background; the
|
|
20
|
+
* roster read never waits on it. A test-built server spawns nothing (no source under a runner).
|
|
21
|
+
*/
|
|
22
|
+
import type { SeatVersionPin } from './diagnostics.js';
|
|
23
|
+
/** How long a version reading is trusted before a background refresh. */
|
|
24
|
+
export declare const SEAT_VERSION_TTL_MS: number;
|
|
25
|
+
export type SeatInstallSource = 'npm' | 'brew' | 'other';
|
|
26
|
+
/** One seat's probed version (what the cache keeps). */
|
|
27
|
+
export interface SeatVersionReading {
|
|
28
|
+
cli: string;
|
|
29
|
+
installed: string | null;
|
|
30
|
+
checked_at: string;
|
|
31
|
+
install_source: SeatInstallSource | null;
|
|
32
|
+
}
|
|
33
|
+
/** `RosterSeat.version` (api-types 0.115.0). */
|
|
34
|
+
export interface SeatVersion {
|
|
35
|
+
installed: string | null;
|
|
36
|
+
proven: string | null;
|
|
37
|
+
status: 'proven' | 'unproven' | 'no_pin';
|
|
38
|
+
checked_at: string;
|
|
39
|
+
install_source: SeatInstallSource | null;
|
|
40
|
+
}
|
|
41
|
+
/** Runs one version probe; resolves to its combined output, or `null` when it did not answer. */
|
|
42
|
+
export type VersionExec = (cmd: string, args: string[]) => Promise<string | null>;
|
|
43
|
+
/** Resolves a binary name to its real path on PATH, or `null`. */
|
|
44
|
+
export type BinaryResolver = (binary: string) => string | null;
|
|
45
|
+
/** The binary's real path on PATH (`which` + realpath), or `null` when it is not there. */
|
|
46
|
+
export declare function resolveOnPath(binary: string, env?: NodeJS.ProcessEnv): string | null;
|
|
47
|
+
/** How a binary was installed, from its resolved path (see the module doc). */
|
|
48
|
+
export declare function installSourceOf(realPath: string | null): SeatInstallSource | null;
|
|
49
|
+
/** The first non-empty line of a probe's output, bounded and home-free; `null` for none. */
|
|
50
|
+
export declare function firstVersionLine(output: string | null): string | null;
|
|
51
|
+
/** Probe every seat's version (in parallel, each bounded). */
|
|
52
|
+
export declare function probeSeatVersions(roster: unknown[], exec?: VersionExec, resolve?: BinaryResolver, now?: () => number): Promise<SeatVersionReading[]>;
|
|
53
|
+
/** A TTL cache of {@link probeSeatVersions}: read synchronously, refreshed in the background. */
|
|
54
|
+
export declare class SeatVersionCache {
|
|
55
|
+
private readonly source;
|
|
56
|
+
private readonly ttlMs;
|
|
57
|
+
private readonly now;
|
|
58
|
+
private value;
|
|
59
|
+
private inFlight;
|
|
60
|
+
private failedAt;
|
|
61
|
+
constructor(source?: (() => Promise<SeatVersionReading[]>) | null, ttlMs?: number, now?: () => number);
|
|
62
|
+
private stale;
|
|
63
|
+
/** Probe now unless a probe is running; resolves when the answer is in. */
|
|
64
|
+
refresh(): Promise<void>;
|
|
65
|
+
/** The last reading for `cli`, without waiting; a stale or empty cache starts a refresh. */
|
|
66
|
+
read(cli: string): SeatVersionReading | undefined;
|
|
67
|
+
}
|
|
68
|
+
/** The daemon's source: the engine's production roster. `null` under a test runner (no spawns). */
|
|
69
|
+
export declare function defaultSeatVersionSource(): (() => Promise<SeatVersionReading[]>) | null;
|
|
70
|
+
/** The daemon's one version cache. */
|
|
71
|
+
export declare const seatVersions: SeatVersionCache;
|
|
72
|
+
/**
|
|
73
|
+
* `RosterSeat.version` from a seat's reading and its pin reading (see the module doc). `undefined`
|
|
74
|
+
* when there is no reading yet, or when the seat pins a build whose pin has not been probed.
|
|
75
|
+
*/
|
|
76
|
+
export declare function seatVersion(seat: {
|
|
77
|
+
acp?: {
|
|
78
|
+
verified_version?: unknown;
|
|
79
|
+
} | null;
|
|
80
|
+
}, reading: SeatVersionReading | undefined, pin: SeatVersionPin | undefined): SeatVersion | undefined;
|
|
81
|
+
//# sourceMappingURL=seat-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-version.d.ts","sourceRoot":"","sources":["../../src/api/seat-version.ts"],"names":[],"mappings":"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"}
|