wicked-crew-api-types 0.130.0 → 0.131.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.
Files changed (2) hide show
  1. package/index.d.ts +37 -10
  2. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -1231,21 +1231,45 @@ export interface RosterSeat {
1231
1231
  [k: string]: unknown;
1232
1232
  }
1233
1233
 
1234
- /** `RosterSeat.version` (api-types 0.115.0). */
1235
- export interface SeatVersion {
1234
+ /** Why a pinned seat reads `unproven` (api-types 0.131.0, crew#1004): `no_answer` — the pin's own
1235
+ * `--version` check got no answer, so nothing confirms the build (it was not shown to differ);
1236
+ * `different_build` — the check answered naming a build other than the pinned one (`observed`);
1237
+ * `invalid_answer` — the check answered, but in a shape it cannot confirm (its first line is not
1238
+ * the pinned build byte for byte) and without naming another build. A build is named by its id
1239
+ * alone, pre-release and build suffixes included (`1.18.31`, `1.17.18-rc.1`), only as a whole
1240
+ * token (`1.18.31.4` names none), never by the presentation around it: `opencode (1.17.18)`, a
1241
+ * colour-coded `1.17.18` and `v1.17.18,` name only the pinned build; `1.17.18-beta` names another. */
1242
+ export type SeatVersionUnprovenWhy = 'no_answer' | 'different_build' | 'invalid_answer';
1243
+
1244
+ /**
1245
+ * `RosterSeat.version` (api-types 0.115.0; `why` and `observed` 0.131.0). `status`: `proven` — the
1246
+ * pin's check answered with the pinned build; `unproven` — it did not, and governance fails closed,
1247
+ * with `why` saying which case and, on `different_build`, `observed` naming the build the check
1248
+ * saw; `no_pin` — the seat pins no build.
1249
+ *
1250
+ * `status` comes from the pin's check alone (it mirrors the engine's spawn-time check), never from
1251
+ * `installed`. The two are separate snapshots: the seat's own `--version` reading (`installed`,
1252
+ * `checked_at`) and the pin's check are cached apart, each with its own TTL, so for up to one TTL
1253
+ * after an upgrade `installed` may still read the pinned build while `why` is already
1254
+ * `different_build`. The build the check saw is `observed`, never `installed`; `installed` equal to
1255
+ * `proven` says nothing about the pin holding (crew#1004).
1256
+ */
1257
+ export type SeatVersion = {
1236
1258
  /** The first non-empty line of the seat's `--version`, home written `~`; `null` when it did not answer. */
1237
1259
  installed: string | null;
1238
- /** The build the seat's governance was proven on (`acp.verified_version`); `null` when it pins none. */
1239
- proven: string | null;
1240
- /** `proven` — the installed build is the pinned one; `unproven` — it is not (governance fails
1241
- * closed); `no_pin` — the seat pins no build. */
1242
- status: 'proven' | 'unproven' | 'no_pin';
1243
- /** ISO-8601 of the reading. */
1260
+ /** ISO-8601 of the `installed` reading. */
1244
1261
  checked_at: string;
1245
1262
  /** How the binary on PATH was installed, from its resolved path: under `node_modules` = `npm`, a
1246
1263
  * Homebrew prefix = `brew`, else `other`; `null` when it is not on PATH. */
1247
1264
  install_source: 'npm' | 'brew' | 'other' | null;
1248
- }
1265
+ } & (
1266
+ // `proven`: the build the seat's governance was proven on (`acp.verified_version`), `null` only
1267
+ // when it pins none. `observed`: the build the pin's check saw, on `different_build` only.
1268
+ | { status: 'no_pin'; proven: null }
1269
+ | { status: 'proven'; proven: string }
1270
+ | { status: 'unproven'; proven: string; why: 'no_answer' | 'invalid_answer' }
1271
+ | { status: 'unproven'; proven: string; why: 'different_build'; observed: string }
1272
+ );
1249
1273
 
1250
1274
  /** `RosterSeat.account` (api-types 0.115.0). */
1251
1275
  export interface SeatAccount {
@@ -1304,7 +1328,10 @@ export type SeatQeReviewer =
1304
1328
  /**
1305
1329
  * One `RosterSeat.issues` entry (api-types 0.115.0). Today's codes: `signed_out`, `qe_blocked`
1306
1330
  * (problems); `quota`, `usage_limit`, `benched`, `codex_worktree`, `host_floor` and `host_floor_unknown`
1307
- * (unreleased, wicked-core#976), `version_unproven`,
1331
+ * (unreleased, wicked-core#976), `version_unproven` (`params.why`: `no_answer` | `different_build` | `invalid_answer`,
1332
+ * api-types 0.131.0 — the same as `RosterSeat.version.why`; `params.observed`, on `different_build`
1333
+ * only: the build the pin's check saw, the same as `RosterSeat.version.observed`; `params.proven`;
1334
+ * `params.installed` when the seat's own `--version` answered),
1308
1335
  * `unchecked` (`params.why`: `no_governance` | `no_host_boundary`), `fence_scoped`,
1309
1336
  * `live_check_failed` (warnings); `opt_in`, `no_qe`, `unverified` (notes). A client must tolerate
1310
1337
  * an unknown code.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-crew-api-types",
3
- "version": "0.130.0",
3
+ "version": "0.131.0",
4
4
  "description": "The wire contract of the wicked-crew daemon's /api/v1 REST surface and /ws CoreEvent frames \u2014 types only, zero runtime",
5
5
  "type": "module",
6
6
  "types": "./index.d.ts",