wicked-crew 0.15.8 → 0.16.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/api/chat-attachments.d.ts +102 -0
- package/dist/api/chat-attachments.d.ts.map +1 -0
- package/dist/api/chat-attachments.js +438 -0
- package/dist/api/chat-attachments.js.map +1 -0
- package/dist/api/chat-history.d.ts +90 -0
- package/dist/api/chat-history.d.ts.map +1 -0
- package/dist/api/chat-history.js +279 -0
- package/dist/api/chat-history.js.map +1 -0
- package/dist/api/chat-transcripts.d.ts +4 -2
- package/dist/api/chat-transcripts.d.ts.map +1 -1
- package/dist/api/chat-transcripts.js +13 -2
- package/dist/api/chat-transcripts.js.map +1 -1
- package/dist/api/roster-standing.d.ts.map +1 -1
- package/dist/api/roster-standing.js +8 -1
- package/dist/api/roster-standing.js.map +1 -1
- package/dist/api/routes.d.ts +39 -0
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +478 -36
- package/dist/api/routes.js.map +1 -1
- package/dist/api/seat-agents.d.ts +11 -3
- package/dist/api/seat-agents.d.ts.map +1 -1
- package/dist/api/seat-agents.js +2 -0
- package/dist/api/seat-agents.js.map +1 -1
- package/dist/api/seat-bench-trail.d.ts +3 -1
- package/dist/api/seat-bench-trail.d.ts.map +1 -1
- package/dist/api/seat-bench-trail.js +27 -9
- package/dist/api/seat-bench-trail.js.map +1 -1
- package/dist/api/seat-health.d.ts +56 -1
- package/dist/api/seat-health.d.ts.map +1 -1
- package/dist/api/seat-health.js +147 -19
- package/dist/api/seat-health.js.map +1 -1
- package/dist/api/seat-standing.d.ts +11 -0
- package/dist/api/seat-standing.d.ts.map +1 -1
- package/dist/api/seat-standing.js +13 -6
- package/dist/api/seat-standing.js.map +1 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +18 -0
- package/dist/api/server.js.map +1 -1
- package/dist/api/stall-watchdog.d.ts +10 -0
- package/dist/api/stall-watchdog.d.ts.map +1 -1
- package/dist/api/stall-watchdog.js +12 -0
- package/dist/api/stall-watchdog.js.map +1 -1
- package/dist/api/system-snapshot.d.ts +382 -0
- package/dist/api/system-snapshot.d.ts.map +1 -0
- package/dist/api/system-snapshot.js +1164 -0
- package/dist/api/system-snapshot.js.map +1 -0
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +5 -3
- package/dist/core/deliver.js.map +1 -1
- package/dist/editors/registry.d.ts +20 -20
- package/dist/studio/assets/{index-Bhwz-oBW.js → index-BnnXv6Ij.js} +242 -226
- package/dist/studio/assets/index-Ce_RMQzq.css +32 -0
- package/dist/studio/editors/wicked-deck/editor.json +1 -1
- package/dist/studio/editors/wicked-deck/index.html +1 -1
- package/dist/studio/editors/wicked-doc/editor.json +1 -1
- package/dist/studio/editors/wicked-doc/index.html +1 -1
- package/dist/studio/editors/wicked-page/editor.json +1 -1
- package/dist/studio/editors/wicked-page/index.html +1 -1
- package/dist/studio/editors/wicked-video/editor.json +1 -1
- package/dist/studio/editors/wicked-video/index.html +1 -1
- package/dist/studio/index.html +2 -2
- package/dist/studio/testid-inventory.json +569 -88
- package/endpoint-manifest.json +47 -1
- package/package.json +3 -3
- package/dist/studio/assets/index-CmNUtpfw.css +0 -32
|
@@ -34,10 +34,18 @@ export interface RecentBenchWire {
|
|
|
34
34
|
runs: number;
|
|
35
35
|
/** ISO-8601 of the latest bench. */
|
|
36
36
|
last_at: string;
|
|
37
|
-
/** ISO-8601 of when crew stops carrying the bench to new launches (sooner on an ok turn).
|
|
38
|
-
*
|
|
37
|
+
/** ISO-8601 of when crew stops carrying the bench to new launches (sooner on an ok turn). (J4) For a
|
|
38
|
+
* quota bench it is the engine's lift time (`until_source: 'engine'`: the provider's reset time when
|
|
39
|
+
* the refusal stated one, else the engine's backoff) or crew's backoff of 15, 30, then 60 minutes
|
|
40
|
+
* by `strikes` (`'backoff'`); any other kind keeps crew's 30-minute window (`'window'`). */
|
|
39
41
|
lifts_at: string;
|
|
40
|
-
/**
|
|
42
|
+
/** (J4) Where `lifts_at` came from. */
|
|
43
|
+
until_source: 'engine' | 'backoff' | 'window';
|
|
44
|
+
/** (J4) The seat's quota benches in a row with no good turn between (the backoff step); 0 on a
|
|
45
|
+
* non-quota bench. */
|
|
46
|
+
strikes: number;
|
|
47
|
+
/** Who benched it in the run: `worker`, `judge`, or (J4) `reprobe` — its quota bench fell due and
|
|
48
|
+
* it did not answer the engine's re-probe. */
|
|
41
49
|
source: string;
|
|
42
50
|
/** The engine's own reason, verbatim (Technical details). */
|
|
43
51
|
reason: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-agents.d.ts","sourceRoot":"","sources":["../../src/api/seat-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAmC,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B;mDAC+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB;
|
|
1
|
+
{"version":3,"file":"seat-agents.d.ts","sourceRoot":"","sources":["../../src/api/seat-agents.ts"],"names":[],"mappings":"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"}
|
package/dist/api/seat-agents.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-agents.js","sourceRoot":"","sources":["../../src/api/seat-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAIjE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAyC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"seat-agents.js","sourceRoot":"","sources":["../../src/api/seat-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAIjE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAyC,MAAM,oBAAoB,CAAC;AA+B5G,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,QAAQ,EAAE,KAAK,CAAC,KAAK;QACrB,YAAY,EAAE,KAAK,CAAC,WAAW;QAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED;;+DAE+D;AAC/D,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC;AAEtG,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CACjC,KAAsB,EACtB,KAAgF;IAEhF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC3F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,mGAAmG;AAEnG,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,IAA0B,EAAE,MAA+B;IACrF,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrD,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,MAAM,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC;AAyCD,wFAAwF;AACxF,SAAS,gBAAgB,CAAC,CAAa;IACrC,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACjF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;AAC3G,CAAC;AAID,qFAAqF;AACrF,SAAS,eAAe,CAAC,CAAa,EAAE,IAA2B;IACjE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,IAAI,YAAY,EAAE,CAAC;IAChI,CAAC;IACD,kGAAkG;IAClG,4FAA4F;IAC5F,IAAI,CAAC,CAAC,mBAAmB,KAAK,KAAK,IAAI,CAAC,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;QAC1E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,6DAA6D,EAAE,CAAC;IAC9I,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;QACzD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,iEAAiE,EAAE,CAAC;IACpJ,CAAC;IACD,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9I,CAAC;IACD,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,IAAI,wBAAwB,EAAE,CAAC;IACnJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,aAAa,CAAC,CAAa;IACzC,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,CAAC,IAAyB,EAAiB,EAAE;QACzD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YACxD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QACnG,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACrI,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;AACvG,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,UAAU,CAAC,CAAa,EAAE,aAAsB;IAC9D,mGAAmG;IACnG,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAmC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC3G,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3G,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,WAAW,EAAE,oBAAoB;YACjC,MAAM,EAAE,oIAAoI;SAC7I,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAsDD,MAAM,cAAc,GAAkC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC1F,wFAAwF;AACxF,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC;AAErG,4DAA4D;AAC5D,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,IAAa;IACvD,OAAO,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,UAAU,CAAC,CAAc;IACvC,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC;IAC5B,MAAM,MAAM,GACV,OAAO,CAAC,CAAC,gBAAgB,KAAK,QAAQ,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE;QACxE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACtF,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,OAAO,GACX,OAAO,CAAC,CAAC,iBAAiB,KAAK,QAAQ,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE;QAC1E,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACxF,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,QAAuB,EAAE,OAAe,EAAE,SAA0C,EAAE,EAAE,WAA+B,EAAE,EAAE,EAAE;QACtJ,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC;IAEF,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;IACtB,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC7B,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,IAAI,2DAA2D,EAAE,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACzK,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,iFAAiF,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9H,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC;IAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QACnH,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,sBAAsB,IAAI,KAAK,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,wCAAwC,KAAK,CAAC,QAAQ,wBAAwB,EAAE;YAC9J,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;IAED,0FAA0F;IAC1F,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC;QACpE,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,IAAI,uBAAuB,qBAAqB,EAAE,CAAC,CAAC;IACtF,CAAC;SAAM,IAAI,OAAO,CAAC,CAAC,gBAAgB,KAAK,QAAQ,IAAI,CAAC,CAAC,gBAAgB,KAAK,EAAE,EAAE,CAAC;QAC/E,GAAG,CAAC,oBAAoB,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC;IAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,WAAW,KAAK,gBAAgB,EAAE,CAAC;QAC/E,GAAG,CAAC,gBAAgB,EAAE,SAAS,EAAE,GAAG,IAAI,6DAA6D,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACtI,CAAC;IAED,4EAA4E;IAC5E,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;IACtC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;QACrC,0FAA0F;QAC1F,6FAA6F;QAC7F,iGAAiG;QACjG,+FAA+F;QAC/F,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QACpB,MAAM,OAAO,GACX,CAAC,CAAC,GAAG,KAAK,iBAAiB;YACzB,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,uDAAuD,CAAC,CAAC,MAAM,uBAAuB;YAC7G,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,WAAW;gBACrB,CAAC,CAAC,GAAG,IAAI,yEAAyE;gBAClF,CAAC,CAAC,GAAG,IAAI,kGAAkG,CAAC;QAClH,GAAG,CAAC,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE;YAC1C,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,iBAAiB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,kBAAkB,IAAI,4BAA4B,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;IAC5G,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAChG,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,qEAAqE,IAAI,SAAS,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC/I,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACnF,GAAG,CAAC,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,4EAA4E,CAAC,CAAC;IACtH,CAAC;IAED,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,IAAI,EAAE,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,IAAI,CAAC,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACnC,GAAG,CAAC,mBAAmB,EAAE,SAAS,EAAE,GAAG,IAAI,2EAA2E,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3I,CAAC;aAAM,IAAI,CAAC,CAAC,cAAc,KAAK,WAAW,EAAE,CAAC;YAC5C,GAAG,CAAC,mBAAmB,EAAE,SAAS,EAAE,GAAG,IAAI,8FAA8F,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9J,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,KAAK;QAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,2DAA2D,CAAC,CAAC;IACvG,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QAChG,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,kCAAkC,CAAC,CAAC,UAAU,CAAC,WAAW,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACxI,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,IAAI,EAAE,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QAC/D,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,yDAAyD,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1G,CAAC;IAED,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;SACrC,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;QACnE,MAAM,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAChB;SACA,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -9,6 +9,8 @@ export declare const SEAT_BENCH_LIFTED_ACTION = "seat.bench_lifted";
|
|
|
9
9
|
export declare function auditSeatBenchStore(audit: AuditLog): SeatBenchStore;
|
|
10
10
|
/** One trail entry as a bench entry, or `null` when it is not one this module wrote. */
|
|
11
11
|
export declare function benchEntryOf(e: AuditEntry): SeatBenchEntry | null;
|
|
12
|
-
/** The bench entries
|
|
12
|
+
/** The bench entries a live bench may still stand on, in append order (the audit `ts` is never earlier than the bench
|
|
13
|
+
* itself): (J4) a bench lifts at its own time, up to {@link SEAT_BENCH_MAX_MS} out, and the latest
|
|
14
|
+
* quota bench's strikes outlive its lift until a good turn. */
|
|
13
15
|
export declare function readSeatBenchEntries(audit: AuditLog, nowMs?: number): Promise<SeatBenchEntry[]>;
|
|
14
16
|
//# sourceMappingURL=seat-bench-trail.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-bench-trail.d.ts","sourceRoot":"","sources":["../../src/api/seat-bench-trail.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"seat-bench-trail.d.ts","sourceRoot":"","sources":["../../src/api/seat-bench-trail.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAqB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE/F,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAClD,iGAAiG;AACjG,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAI5D,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,cAAc,CAqBnE;AAUD,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,cAAc,GAAG,IAAI,CA2BjE;AAED;;gEAEgE;AAChE,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,SAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAQzG"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// crew#1071: a seat's recent bench, kept on the daemon's audit trail so it survives a restart.
|
|
2
2
|
//
|
|
3
3
|
// `SeatHealthTracker` folds the engine's `seatBenched` frames into an in-memory bench that keeps the
|
|
4
|
-
// seat out of new launches and asks
|
|
4
|
+
// seat out of new launches and asks until its lift time (J4: `benchUntil`). The boot replay re-reads only LIVE
|
|
5
5
|
// runs' events, and a quota failure normally ends its run (cancelled or failed), so after a restart
|
|
6
6
|
// the seat read Ready and the next ask was seated on it alone and got the same 429. Each bench and
|
|
7
7
|
// each early lift is now one audit entry; the boot reads the window's entries back.
|
|
8
|
-
import {
|
|
8
|
+
import { SEAT_BENCH_MAX_MS } from './seat-health.js';
|
|
9
9
|
/** The audit action of a bench the engine recorded in a run. */
|
|
10
10
|
export const SEAT_BENCHED_ACTION = 'seat.benched';
|
|
11
11
|
/** The audit action of a bench lifted before its window ran out (an ok turn, a live sign-in). */
|
|
@@ -17,7 +17,16 @@ export function auditSeatBenchStore(audit) {
|
|
|
17
17
|
benched: (cli, rec) => {
|
|
18
18
|
audit.record(SEAT_BENCHED_ACTION, DAEMON, {
|
|
19
19
|
...(rec.session !== undefined ? { runId: rec.session } : {}),
|
|
20
|
-
detail: {
|
|
20
|
+
detail: {
|
|
21
|
+
cli,
|
|
22
|
+
at: rec.at,
|
|
23
|
+
reason: rec.reason,
|
|
24
|
+
source: rec.source,
|
|
25
|
+
runs: rec.runs,
|
|
26
|
+
...(rec.until !== undefined ? { until: rec.until } : {}),
|
|
27
|
+
...(rec.untilSource !== undefined ? { untilSource: rec.untilSource } : {}),
|
|
28
|
+
...(rec.strikes !== undefined ? { strikes: rec.strikes } : {}),
|
|
29
|
+
},
|
|
21
30
|
});
|
|
22
31
|
},
|
|
23
32
|
lifted: (cli, atMs) => {
|
|
@@ -46,6 +55,9 @@ export function benchEntryOf(e) {
|
|
|
46
55
|
const source = text(d['source']);
|
|
47
56
|
if (reason === undefined || source === undefined)
|
|
48
57
|
return null;
|
|
58
|
+
const until = num(d['until']);
|
|
59
|
+
const untilSource = text(d['untilSource']);
|
|
60
|
+
const strikes = num(d['strikes']);
|
|
49
61
|
return {
|
|
50
62
|
kind: 'benched',
|
|
51
63
|
cli,
|
|
@@ -55,16 +67,22 @@ export function benchEntryOf(e) {
|
|
|
55
67
|
source,
|
|
56
68
|
runs: num(d['runs']) ?? 1,
|
|
57
69
|
...(typeof e.runId === 'string' ? { session: e.runId } : {}),
|
|
70
|
+
...(until !== undefined ? { until } : {}),
|
|
71
|
+
...(untilSource === 'engine' || untilSource === 'backoff' || untilSource === 'window' ? { untilSource } : {}),
|
|
72
|
+
...(strikes !== undefined ? { strikes } : {}),
|
|
58
73
|
},
|
|
59
74
|
};
|
|
60
75
|
}
|
|
61
|
-
/** The bench entries
|
|
76
|
+
/** The bench entries a live bench may still stand on, in append order (the audit `ts` is never earlier than the bench
|
|
77
|
+
* itself): (J4) a bench lifts at its own time, up to {@link SEAT_BENCH_MAX_MS} out, and the latest
|
|
78
|
+
* quota bench's strikes outlive its lift until a good turn. */
|
|
62
79
|
export async function readSeatBenchEntries(audit, nowMs = Date.now()) {
|
|
63
|
-
const since = nowMs -
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
80
|
+
const since = nowMs - SEAT_BENCH_MAX_MS;
|
|
81
|
+
// One read, back in APPEND order (the trail answers newest first): the boot folds the entries in
|
|
82
|
+
// the order the tracker wrote them, so two records of one millisecond keep their real order.
|
|
83
|
+
const entries = (await audit.readAll({ since }))
|
|
84
|
+
.filter((e) => e.action === SEAT_BENCHED_ACTION || e.action === SEAT_BENCH_LIFTED_ACTION)
|
|
85
|
+
.reverse();
|
|
68
86
|
return entries.map(benchEntryOf).filter((e) => e !== null);
|
|
69
87
|
}
|
|
70
88
|
//# sourceMappingURL=seat-bench-trail.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-bench-trail.js","sourceRoot":"","sources":["../../src/api/seat-bench-trail.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,EAAE;AACF,qGAAqG;AACrG
|
|
1
|
+
{"version":3,"file":"seat-bench-trail.js","sourceRoot":"","sources":["../../src/api/seat-bench-trail.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,31 @@ export declare const AUTH_FAILURE_WINDOW_MS: number;
|
|
|
29
29
|
* operator sent there) clears the bench at once.
|
|
30
30
|
*/
|
|
31
31
|
export declare const SEAT_BENCH_WINDOW_MS: number;
|
|
32
|
+
/**
|
|
33
|
+
* (PRODUCT-WORKS J4) A QUOTA bench (`quota_exhausted`, `usage_limit`: a 429, a rate or usage limit)
|
|
34
|
+
* expires on its own clock instead of the fixed window: the engine's `seatBenched.benchedUntilMs`
|
|
35
|
+
* when the frame carries one (the provider's reset time when the refusal stated one, else the
|
|
36
|
+
* engine's own backoff), else a backoff of 15, then 30, then 60 minutes by the seat's consecutive
|
|
37
|
+
* quota benches with no good turn between ({@link quotaBackoffMs}). A copilot benched for quota on
|
|
38
|
+
* the rig was otherwise never re-checked inside a run, and every later review had no distinct judge.
|
|
39
|
+
* Other kinds (`not_logged_in`, `not_installed`, …) keep {@link SEAT_BENCH_WINDOW_MS}.
|
|
40
|
+
*/
|
|
41
|
+
export declare const QUOTA_BACKOFF_MS: readonly number[];
|
|
42
|
+
/** The furthest a bench's lift time may be (a provider reset beyond it is read as it); also how far
|
|
43
|
+
* back the boot reads the bench trail. */
|
|
44
|
+
export declare const SEAT_BENCH_MAX_MS: number;
|
|
45
|
+
/** Whether a bench reason is quota-class: its own clock, not the fixed window. */
|
|
46
|
+
export declare function isQuotaBench(reason: string): boolean;
|
|
47
|
+
/** The backoff of a seat's `strikes`-th quota bench in a row: 15, 30, then 60 minutes. */
|
|
48
|
+
export declare function quotaBackoffMs(strikes: number): number;
|
|
49
|
+
/** Where a bench's lift time came from: the engine's frame (`benchedUntilMs`), crew's own quota
|
|
50
|
+
* backoff, or the fixed window of a non-quota bench. */
|
|
51
|
+
export type BenchUntilSource = 'engine' | 'backoff' | 'window';
|
|
52
|
+
/** When a bench recorded at `at` lifts, and why that time. */
|
|
53
|
+
export declare function benchUntil(at: number, reason: string, strikes: number, engineUntil?: number): {
|
|
54
|
+
until: number;
|
|
55
|
+
source: BenchUntilSource;
|
|
56
|
+
};
|
|
32
57
|
/**
|
|
33
58
|
* How long a seat's last step outcome stands as its live sign-in check on the container floor
|
|
34
59
|
* (`roster-standing.ts`). There the daemon sends no live request of its own: the credential broker
|
|
@@ -59,8 +84,14 @@ export interface SeatLastAnswer {
|
|
|
59
84
|
export interface SeatRecentBench {
|
|
60
85
|
/** ISO-8601 of the bench. */
|
|
61
86
|
at: string;
|
|
62
|
-
/** ISO-8601 of when the seat is eligible again ({@link
|
|
87
|
+
/** ISO-8601 of when the seat is eligible again ({@link benchUntil}: the engine's lift time, the
|
|
88
|
+
* quota backoff, or {@link SEAT_BENCH_WINDOW_MS} after `at`). */
|
|
63
89
|
until: string;
|
|
90
|
+
/** (J4) Where `until` came from. */
|
|
91
|
+
untilSource: BenchUntilSource;
|
|
92
|
+
/** (J4) The seat's consecutive quota benches with no good turn between (1 on the first): the
|
|
93
|
+
* backoff step. 0 on a non-quota bench. */
|
|
94
|
+
strikes: number;
|
|
64
95
|
/** The engine's bench reason, as it persisted it (`quota_exhausted (no success in the run)`). */
|
|
65
96
|
reason: string;
|
|
66
97
|
/** Who benched it in the run: the unit's `worker`, or a `judge`. */
|
|
@@ -93,6 +124,12 @@ export interface SeatBenchRecord {
|
|
|
93
124
|
source: string;
|
|
94
125
|
session?: string;
|
|
95
126
|
runs: number;
|
|
127
|
+
/** (J4) Unix millis of when it lifts ({@link benchUntil}); absent on a record written before. */
|
|
128
|
+
until?: number;
|
|
129
|
+
/** (J4) Where `until` came from; absent on a record written before. */
|
|
130
|
+
untilSource?: BenchUntilSource;
|
|
131
|
+
/** (J4) The quota strikes ({@link SeatRecentBench.strikes}); absent on a record written before. */
|
|
132
|
+
strikes?: number;
|
|
96
133
|
}
|
|
97
134
|
/** One persisted entry read back at boot, oldest first or in any order (it is sorted). */
|
|
98
135
|
export type SeatBenchEntry = {
|
|
@@ -133,6 +170,16 @@ export declare class SeatHealthTracker {
|
|
|
133
170
|
/** cli key → the engine's latest in-run bench of the seat (`seatBenched`), cleared by an ok
|
|
134
171
|
* output or by {@link SEAT_BENCH_WINDOW_MS}. */
|
|
135
172
|
private readonly recentBenches;
|
|
173
|
+
/** (J4) cli key → the seat's quota strikes: how many times in a row it was benched for quota
|
|
174
|
+
* AFTER its previous quota bench had lifted (or failed the engine's re-probe), with no good turn
|
|
175
|
+
* between. Kept after a bench's lift time passes, so the next quota bench backs off for longer;
|
|
176
|
+
* cleared by an ok output, a chat reply, a live sign-in check after the bench, the engine's
|
|
177
|
+
* `seatBenchLifted`, or a bench of another kind. */
|
|
178
|
+
private readonly quotaStrikes;
|
|
179
|
+
/** (J4) cli key → the latest bench or lift time folded for the seat (unix millis). A `seatBenched`
|
|
180
|
+
* frame older than it is a replay (a live run's events re-read at boot, after the trail already
|
|
181
|
+
* restored or lifted the bench) and changes nothing. */
|
|
182
|
+
private readonly benchHighWater;
|
|
136
183
|
/** cli key → the seat's latest step outcome (container-floor live check, {@link lastAnswerFor}). */
|
|
137
184
|
private readonly answers;
|
|
138
185
|
/** Default `since` for seats that have never changed state. */
|
|
@@ -157,6 +204,7 @@ export declare class SeatHealthTracker {
|
|
|
157
204
|
* replaces it. Nothing is re-persisted.
|
|
158
205
|
*/
|
|
159
206
|
hydrateBenches(entries: readonly SeatBenchEntry[], nowMs?: number): void;
|
|
207
|
+
private raiseHighWater;
|
|
160
208
|
/** Drop the seat's bench, and say so to the store when there was one to drop (crew#1071). */
|
|
161
209
|
private liftBench;
|
|
162
210
|
/** Fold one CoreEvent into the map. Safe on every event type; unknown types are ignored. */
|
|
@@ -176,6 +224,13 @@ export declare class SeatHealthTracker {
|
|
|
176
224
|
* out of quota). An ok output does the same through {@link markActive}.
|
|
177
225
|
*/
|
|
178
226
|
clearRecentBench(key: string, atMs?: number): void;
|
|
227
|
+
/**
|
|
228
|
+
* (J4) The seat's live sign-in check answered at `atMs` (an authenticated one-word request): a
|
|
229
|
+
* quota bench that already lifted by its clock leaves strikes behind; a live answer after the
|
|
230
|
+
* seat's latest bench clears them, as an ok turn would. No-op while a bench stands (the roster
|
|
231
|
+
* lifts that one through {@link clearRecentBench}) or when the answer predates the latest bench.
|
|
232
|
+
*/
|
|
233
|
+
clearQuotaStrikesAfterLiveCheck(key: string, atMs: number): void;
|
|
179
234
|
/**
|
|
180
235
|
* Drop the seat's own "no credential" report when it is OLDER than `beforeMs` — the roster calls
|
|
181
236
|
* this when the seat's LIVE sign-in check answered after it (the operator signed in since). A
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-health.d.ts","sourceRoot":"","sources":["../../src/api/seat-health.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EAAE,UAAU,EAAE,CAAC;AA6C3B,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAIpG;
|
|
1
|
+
{"version":3,"file":"seat-health.d.ts","sourceRoot":"","sources":["../../src/api/seat-health.ts"],"names":[],"mappings":"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"}
|
package/dist/api/seat-health.js
CHANGED
|
@@ -80,6 +80,9 @@ export function isSessionDeath(fallbackKind, reason) {
|
|
|
80
80
|
return false;
|
|
81
81
|
return SESSION_DEATH_CAUSES.some((c) => reason.startsWith(c));
|
|
82
82
|
}
|
|
83
|
+
function num(v) {
|
|
84
|
+
return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
|
|
85
|
+
}
|
|
83
86
|
function str(v) {
|
|
84
87
|
return typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
85
88
|
}
|
|
@@ -148,6 +151,44 @@ export const AUTH_FAILURE_WINDOW_MS = 30 * 60 * 1000;
|
|
|
148
151
|
* operator sent there) clears the bench at once.
|
|
149
152
|
*/
|
|
150
153
|
export const SEAT_BENCH_WINDOW_MS = 30 * 60 * 1000;
|
|
154
|
+
/**
|
|
155
|
+
* (PRODUCT-WORKS J4) A QUOTA bench (`quota_exhausted`, `usage_limit`: a 429, a rate or usage limit)
|
|
156
|
+
* expires on its own clock instead of the fixed window: the engine's `seatBenched.benchedUntilMs`
|
|
157
|
+
* when the frame carries one (the provider's reset time when the refusal stated one, else the
|
|
158
|
+
* engine's own backoff), else a backoff of 15, then 30, then 60 minutes by the seat's consecutive
|
|
159
|
+
* quota benches with no good turn between ({@link quotaBackoffMs}). A copilot benched for quota on
|
|
160
|
+
* the rig was otherwise never re-checked inside a run, and every later review had no distinct judge.
|
|
161
|
+
* Other kinds (`not_logged_in`, `not_installed`, …) keep {@link SEAT_BENCH_WINDOW_MS}.
|
|
162
|
+
*/
|
|
163
|
+
export const QUOTA_BACKOFF_MS = Object.freeze([15, 30, 60].map((m) => m * 60 * 1000));
|
|
164
|
+
/** The furthest a bench's lift time may be (a provider reset beyond it is read as it); also how far
|
|
165
|
+
* back the boot reads the bench trail. */
|
|
166
|
+
export const SEAT_BENCH_MAX_MS = 7 * 24 * 60 * 60 * 1000;
|
|
167
|
+
/** Whether a bench reason is quota-class: its own clock, not the fixed window. */
|
|
168
|
+
export function isQuotaBench(reason) {
|
|
169
|
+
return /quota_exhausted|usage_limit/.test(reason);
|
|
170
|
+
}
|
|
171
|
+
/** The backoff of a seat's `strikes`-th quota bench in a row: 15, 30, then 60 minutes. */
|
|
172
|
+
export function quotaBackoffMs(strikes) {
|
|
173
|
+
const i = Math.min(Math.max(1, Math.floor(strikes)), QUOTA_BACKOFF_MS.length) - 1;
|
|
174
|
+
return QUOTA_BACKOFF_MS[i];
|
|
175
|
+
}
|
|
176
|
+
/** When a bench recorded at `at` lifts, and why that time. */
|
|
177
|
+
export function benchUntil(at, reason, strikes, engineUntil) {
|
|
178
|
+
// The engine's time is per RUN (each run starts its own backoff at 15 minutes); crew's strikes
|
|
179
|
+
// span runs. The later of the two wins, so a seat that keeps failing run after run backs off
|
|
180
|
+
// for longer even when every engine frame says 15 minutes, and a stated reset is never cut short.
|
|
181
|
+
const engine = engineUntil !== undefined && Number.isFinite(engineUntil) && engineUntil > at
|
|
182
|
+
? Math.min(engineUntil, at + SEAT_BENCH_MAX_MS)
|
|
183
|
+
: undefined;
|
|
184
|
+
if (isQuotaBench(reason)) {
|
|
185
|
+
const backoff = at + quotaBackoffMs(strikes);
|
|
186
|
+
return engine !== undefined && engine > backoff ? { until: engine, source: 'engine' } : { until: backoff, source: 'backoff' };
|
|
187
|
+
}
|
|
188
|
+
if (engine !== undefined)
|
|
189
|
+
return { until: engine, source: 'engine' };
|
|
190
|
+
return { until: at + SEAT_BENCH_WINDOW_MS, source: 'window' };
|
|
191
|
+
}
|
|
151
192
|
/**
|
|
152
193
|
* How long a seat's last step outcome stands as its live sign-in check on the container floor
|
|
153
194
|
* (`roster-standing.ts`). There the daemon sends no live request of its own: the credential broker
|
|
@@ -173,6 +214,16 @@ export class SeatHealthTracker {
|
|
|
173
214
|
/** cli key → the engine's latest in-run bench of the seat (`seatBenched`), cleared by an ok
|
|
174
215
|
* output or by {@link SEAT_BENCH_WINDOW_MS}. */
|
|
175
216
|
recentBenches = new Map();
|
|
217
|
+
/** (J4) cli key → the seat's quota strikes: how many times in a row it was benched for quota
|
|
218
|
+
* AFTER its previous quota bench had lifted (or failed the engine's re-probe), with no good turn
|
|
219
|
+
* between. Kept after a bench's lift time passes, so the next quota bench backs off for longer;
|
|
220
|
+
* cleared by an ok output, a chat reply, a live sign-in check after the bench, the engine's
|
|
221
|
+
* `seatBenchLifted`, or a bench of another kind. */
|
|
222
|
+
quotaStrikes = new Map();
|
|
223
|
+
/** (J4) cli key → the latest bench or lift time folded for the seat (unix millis). A `seatBenched`
|
|
224
|
+
* frame older than it is a replay (a live run's events re-read at boot, after the trail already
|
|
225
|
+
* restored or lifted the bench) and changes nothing. */
|
|
226
|
+
benchHighWater = new Map();
|
|
176
227
|
/** cli key → the seat's latest step outcome (container-floor live check, {@link lastAnswerFor}). */
|
|
177
228
|
answers = new Map();
|
|
178
229
|
/** Default `since` for seats that have never changed state. */
|
|
@@ -193,32 +244,56 @@ export class SeatHealthTracker {
|
|
|
193
244
|
* replaces it. Nothing is re-persisted.
|
|
194
245
|
*/
|
|
195
246
|
hydrateBenches(entries, nowMs = Date.now()) {
|
|
196
|
-
|
|
197
|
-
|
|
247
|
+
// (J4) Folded in the trail's APPEND order — the order the tracker wrote them, each record the
|
|
248
|
+
// tracker's whole verdict at the time (lift time, strikes) — so the last one per seat stands.
|
|
249
|
+
// Two records stamped the same millisecond keep their real order (codex on #1138).
|
|
250
|
+
for (const e of entries) {
|
|
198
251
|
if (e.kind === 'lifted') {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
252
|
+
this.recentBenches.delete(e.cli);
|
|
253
|
+
this.quotaStrikes.delete(e.cli);
|
|
254
|
+
this.raiseHighWater(e.cli, e.at);
|
|
202
255
|
continue;
|
|
203
256
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
257
|
+
// A record from before J4 carries no lift time (the window it was written under) and no
|
|
258
|
+
// strikes: one strike if it is a quota bench.
|
|
259
|
+
const quota = isQuotaBench(e.rec.reason);
|
|
260
|
+
const { until, source: untilSource } = e.rec.until !== undefined
|
|
261
|
+
? { until: e.rec.until, source: e.rec.untilSource ?? 'engine' }
|
|
262
|
+
: { until: e.rec.at + SEAT_BENCH_WINDOW_MS, source: 'window' };
|
|
263
|
+
const strikes = e.rec.strikes ?? (quota ? 1 : 0);
|
|
264
|
+
if (strikes > 0)
|
|
265
|
+
this.quotaStrikes.set(e.cli, strikes);
|
|
266
|
+
else
|
|
267
|
+
this.quotaStrikes.delete(e.cli);
|
|
268
|
+
this.raiseHighWater(e.cli, e.rec.at);
|
|
209
269
|
this.recentBenches.set(e.cli, {
|
|
210
270
|
at: e.rec.at,
|
|
271
|
+
until,
|
|
272
|
+
untilSource,
|
|
273
|
+
strikes,
|
|
211
274
|
reason: e.rec.reason,
|
|
212
275
|
source: e.rec.source,
|
|
213
276
|
runs: Math.max(1, e.rec.runs),
|
|
214
277
|
...(e.rec.session !== undefined ? { session: e.rec.session } : {}),
|
|
215
278
|
});
|
|
216
279
|
}
|
|
280
|
+
for (const [cli, rec] of [...this.recentBenches])
|
|
281
|
+
if (nowMs >= rec.until)
|
|
282
|
+
this.recentBenches.delete(cli);
|
|
283
|
+
}
|
|
284
|
+
raiseHighWater(cli, atMs) {
|
|
285
|
+
const cur = this.benchHighWater.get(cli);
|
|
286
|
+
if (cur === undefined || atMs > cur)
|
|
287
|
+
this.benchHighWater.set(cli, atMs);
|
|
217
288
|
}
|
|
218
289
|
/** Drop the seat's bench, and say so to the store when there was one to drop (crew#1071). */
|
|
219
290
|
liftBench(key, atMs) {
|
|
220
|
-
|
|
291
|
+
const had = this.recentBenches.delete(key);
|
|
292
|
+
const struck = this.quotaStrikes.delete(key);
|
|
293
|
+
if (had || struck) {
|
|
294
|
+
this.raiseHighWater(key, atMs);
|
|
221
295
|
this.benchStore?.lifted(key, atMs);
|
|
296
|
+
}
|
|
222
297
|
}
|
|
223
298
|
/** Fold one CoreEvent into the map. Safe on every event type; unknown types are ignored. */
|
|
224
299
|
ingest(event) {
|
|
@@ -351,23 +426,50 @@ export class SeatHealthTracker {
|
|
|
351
426
|
const cli = str(event.cli);
|
|
352
427
|
const reason = str(event.reason);
|
|
353
428
|
const source = str(event.source);
|
|
354
|
-
// Only the engine's IN-RUN benches are carried: a `worker` or `judge` refusal
|
|
429
|
+
// Only the engine's IN-RUN benches are carried: a `worker` or `judge` refusal, or (J4) a
|
|
430
|
+
// `reprobe` — a seat whose quota bench fell due and did not answer its re-probe. A launcher
|
|
355
431
|
// bench is crew's own reading, and a frame with no (or an unknown) source is malformed —
|
|
356
432
|
// neither may bench a seat for the window.
|
|
357
|
-
if (cli === undefined || reason === undefined || (source !== 'worker' && source !== 'judge'))
|
|
433
|
+
if (cli === undefined || reason === undefined || (source !== 'worker' && source !== 'judge' && source !== 'reprobe'))
|
|
434
|
+
return;
|
|
435
|
+
// (J4) A frame older than the seat's latest bench or lift is a replay (a live run's events
|
|
436
|
+
// re-read at boot after the trail restored or lifted the bench): it changes nothing.
|
|
437
|
+
const highWater = this.benchHighWater.get(cli);
|
|
438
|
+
if (highWater !== undefined && at < highWater)
|
|
358
439
|
return;
|
|
359
440
|
// A3: a bench that lands while the last one is still active counts one more run (the same
|
|
360
441
|
// run benching twice — its worker, then its judge — counts once).
|
|
361
442
|
const prev = this.recentBenches.get(cli);
|
|
362
|
-
const active = prev !== undefined && at
|
|
443
|
+
const active = prev !== undefined && at < prev.until;
|
|
363
444
|
// The same frame folded twice (a replayed log entry after the live frame, or a boot
|
|
364
445
|
// replay of a live run after the trail already restored its bench) changes nothing.
|
|
365
446
|
const repeat = prev !== undefined && prev.at === at && prev.session === session && prev.reason === reason;
|
|
366
447
|
if (!repeat) {
|
|
367
|
-
const
|
|
368
|
-
const
|
|
448
|
+
const sameRun = active && session !== undefined && session === prev.session;
|
|
449
|
+
const runs = !active ? 1 : sameRun ? prev.runs : prev.runs + 1;
|
|
450
|
+
// (J4) The backoff steps up when the seat is benched for quota again AFTER its last quota
|
|
451
|
+
// bench lifted (it was given another chance and failed), or when it failed the engine's
|
|
452
|
+
// re-probe. Benches that land while one stands (concurrent runs, a run's worker then its
|
|
453
|
+
// judge) are the same episode: one step. A bench of another kind resets the steps.
|
|
454
|
+
const quota = isQuotaBench(reason);
|
|
455
|
+
const held = this.quotaStrikes.get(cli) ?? 0;
|
|
456
|
+
const strikes = !quota ? 0 : active && prev.strikes > 0 && source !== 'reprobe' ? prev.strikes : held + 1;
|
|
457
|
+
if (strikes > 0)
|
|
458
|
+
this.quotaStrikes.set(cli, strikes);
|
|
459
|
+
else
|
|
460
|
+
this.quotaStrikes.delete(cli);
|
|
461
|
+
const engineUntil = num(event.benchedUntilMs);
|
|
462
|
+
const next = benchUntil(at, reason, strikes, engineUntil);
|
|
463
|
+
// An active bench's lift time only moves later: a second frame with a shorter clock (a
|
|
464
|
+
// judge with no stated reset beside a worker's 3-hour reset) does not cut it short.
|
|
465
|
+
const { until, source: untilSource } = active && prev.until > next.until ? { until: prev.until, source: prev.untilSource } : next;
|
|
466
|
+
this.raiseHighWater(cli, at);
|
|
467
|
+
const rec = { at, until, untilSource, strikes, reason, source, runs, ...(session !== undefined ? { session } : {}) };
|
|
369
468
|
this.recentBenches.set(cli, rec);
|
|
370
|
-
|
|
469
|
+
// A frame whose bench already lifted by the wall clock (a late replay) is not written to
|
|
470
|
+
// the trail: it would only be read back as lifted.
|
|
471
|
+
if (until > Date.now())
|
|
472
|
+
this.benchStore?.benched(cli, rec);
|
|
371
473
|
}
|
|
372
474
|
this.stampError(cli, at);
|
|
373
475
|
// The run moves its units OFF the benched seat: the refusing unit fails over (a
|
|
@@ -384,6 +486,14 @@ export class SeatHealthTracker {
|
|
|
384
486
|
}
|
|
385
487
|
return;
|
|
386
488
|
}
|
|
489
|
+
case 'seatBenchLifted': {
|
|
490
|
+
// (J4) The engine re-probed a seat whose quota bench fell due and the seat answered: it is
|
|
491
|
+
// back on that run's roster, and crew stops keeping it out of new launches too.
|
|
492
|
+
const cli = str(event.cli);
|
|
493
|
+
if (cli !== undefined)
|
|
494
|
+
this.liftBench(cli, at);
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
387
497
|
case 'acpFallback': {
|
|
388
498
|
const cliKey = str(event.cliKey);
|
|
389
499
|
const fallbackKind = str(event.fallbackKind);
|
|
@@ -477,6 +587,20 @@ export class SeatHealthTracker {
|
|
|
477
587
|
clearRecentBench(key, atMs = Date.now()) {
|
|
478
588
|
this.liftBench(key, atMs);
|
|
479
589
|
}
|
|
590
|
+
/**
|
|
591
|
+
* (J4) The seat's live sign-in check answered at `atMs` (an authenticated one-word request): a
|
|
592
|
+
* quota bench that already lifted by its clock leaves strikes behind; a live answer after the
|
|
593
|
+
* seat's latest bench clears them, as an ok turn would. No-op while a bench stands (the roster
|
|
594
|
+
* lifts that one through {@link clearRecentBench}) or when the answer predates the latest bench.
|
|
595
|
+
*/
|
|
596
|
+
clearQuotaStrikesAfterLiveCheck(key, atMs) {
|
|
597
|
+
if (this.recentBenches.has(key) || !this.quotaStrikes.has(key))
|
|
598
|
+
return;
|
|
599
|
+
const latest = this.benchHighWater.get(key);
|
|
600
|
+
if (latest !== undefined && atMs <= latest)
|
|
601
|
+
return;
|
|
602
|
+
this.liftBench(key, atMs);
|
|
603
|
+
}
|
|
480
604
|
/**
|
|
481
605
|
* Drop the seat's own "no credential" report when it is OLDER than `beforeMs` — the roster calls
|
|
482
606
|
* this when the seat's LIVE sign-in check answered after it (the operator signed in since). A
|
|
@@ -541,13 +665,17 @@ export class SeatHealthTracker {
|
|
|
541
665
|
const rec = this.recentBenches.get(key);
|
|
542
666
|
if (rec === undefined)
|
|
543
667
|
return null;
|
|
544
|
-
if (nowMs
|
|
668
|
+
if (nowMs >= rec.until) {
|
|
669
|
+
// Lifted by its clock: its strikes stay, so a seat that is still out of quota backs off
|
|
670
|
+
// for longer on its next bench.
|
|
545
671
|
this.recentBenches.delete(key);
|
|
546
672
|
return null;
|
|
547
673
|
}
|
|
548
674
|
return {
|
|
549
675
|
at: new Date(rec.at).toISOString(),
|
|
550
|
-
until: new Date(rec.
|
|
676
|
+
until: new Date(rec.until).toISOString(),
|
|
677
|
+
untilSource: rec.untilSource,
|
|
678
|
+
strikes: rec.strikes,
|
|
551
679
|
reason: rec.reason,
|
|
552
680
|
source: rec.source,
|
|
553
681
|
...(rec.session !== undefined ? { run: rec.session } : {}),
|