@overdeck/contracts 0.49.0 → 0.49.2

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/index.cjs CHANGED
@@ -435,6 +435,72 @@ const EmbedProgressSnapshot = effect.Schema.Struct({
435
435
  error: effect.Schema.optional(effect.Schema.String),
436
436
  timestamp: effect.Schema.String
437
437
  });
438
+ const ProjectCiSuite = effect.Schema.Struct({
439
+ status: effect.Schema.String,
440
+ conclusion: effect.Schema.NullOr(effect.Schema.String),
441
+ htmlUrl: effect.Schema.optional(effect.Schema.String),
442
+ /** GitHub's suite/run update time, used to reject delayed same-SHA events. */
443
+ observedAt: effect.Schema.optional(effect.Schema.String)
444
+ });
445
+ const ProjectCiSnapshot = effect.Schema.Struct({
446
+ projectKey: effect.Schema.String,
447
+ repo: effect.Schema.String,
448
+ branch: effect.Schema.String,
449
+ headSha: effect.Schema.String,
450
+ /** suiteId → suite. Only GitHub Actions suites ever appear here. */
451
+ suites: effect.Schema.Record(effect.Schema.String, ProjectCiSuite),
452
+ /** Newest `observedAt` folded into this record. */
453
+ updatedAt: effect.Schema.String
454
+ });
455
+ /** What kind of process asked for the voluntary dashboard restart. */
456
+ const RestartGateKind = effect.Schema.Literals([
457
+ "deploy",
458
+ "reload",
459
+ "restart"
460
+ ]);
461
+ /**
462
+ * One live restart request. `requesterId` is stable for a single requester
463
+ * invocation (e.g. `deploy:PAN-3724:<pid>`), so a re-poll refreshes the same
464
+ * row instead of adding another.
465
+ */
466
+ const RestartGateRequest = effect.Schema.Struct({
467
+ requesterId: effect.Schema.String,
468
+ kind: RestartGateKind,
469
+ reason: effect.Schema.String,
470
+ builtSha: effect.Schema.optional(effect.Schema.String),
471
+ requestedAt: effect.Schema.String
472
+ });
473
+ /**
474
+ * How the last approval cycle ended, when the ending is worth telling the
475
+ * operator about (PAN-3731). Present only inside the brief window after it
476
+ * happened, so the banner can explain a click that restarted nothing.
477
+ *
478
+ * `pruned-unclaimed` — an approved epoch expired with nobody left to perform
479
+ * the restart: every requester died before claiming, or a claimant lapsed and
480
+ * the rest gave up. Either way nothing was restarted.
481
+ */
482
+ const RestartGateOutcome = effect.Schema.Struct({
483
+ type: effect.Schema.Literals(["pruned-unclaimed"]),
484
+ at: effect.Schema.String
485
+ });
486
+ /**
487
+ * The operator-facing view of the restart gate — identical to the body of
488
+ * `GET /api/restart-gate`, so the banner and the CLI read the same shape.
489
+ *
490
+ * `idle` no live requests; `pending` requests are waiting for approval;
491
+ * `approved` the operator approved an epoch that nobody has claimed yet;
492
+ * `claimed` one requester holds the exclusive right to perform the restart.
493
+ */
494
+ const RestartGateSnapshot = effect.Schema.Struct({
495
+ status: effect.Schema.Literals([
496
+ "idle",
497
+ "pending",
498
+ "approved",
499
+ "claimed"
500
+ ]),
501
+ pending: effect.Schema.Array(RestartGateRequest),
502
+ lastOutcome: effect.Schema.optional(RestartGateOutcome)
503
+ });
438
504
  const DashboardSnapshot = effect.Schema.Struct({
439
505
  sequence: SequenceNumber,
440
506
  agents: effect.Schema.Array(AgentSnapshot),
@@ -450,6 +516,8 @@ const DashboardSnapshot = effect.Schema.Struct({
450
516
  enrichStats: effect.Schema.optional(effect.Schema.NullOr(EnrichStatsSnapshot)),
451
517
  enrichProgressBySessionId: effect.Schema.optional(effect.Schema.Record(effect.Schema.String, EnrichProgressSnapshot)),
452
518
  embedProgressBySessionId: effect.Schema.optional(effect.Schema.Record(effect.Schema.String, EmbedProgressSnapshot)),
519
+ ciByProjectKey: effect.Schema.optional(effect.Schema.Record(effect.Schema.String, ProjectCiSnapshot)),
520
+ restartGate: effect.Schema.optional(RestartGateSnapshot),
453
521
  timestamp: effect.Schema.String
454
522
  });
455
523
  const WorkspaceDetail = effect.Schema.Struct({
@@ -1173,6 +1241,76 @@ const BeadsFreshnessChangedEvent = effect.Schema.Struct({
1173
1241
  lastSyncedAt: effect.Schema.String
1174
1242
  })
1175
1243
  });
1244
+ /**
1245
+ * One GitHub Actions check suite observed on a project's default branch
1246
+ * (PAN-3537).
1247
+ *
1248
+ * Emitted by the `check_suite` webhook handler for live updates, only after an
1249
+ * independent branch-head lookup verifies the payload SHA is still current.
1250
+ * `suiteId` is the check suite id — for GitHub Actions that is one suite per
1251
+ * workflow run. The webhook payload does not carry `htmlUrl`.
1252
+ *
1253
+ * Boot and periodic repair use `project.ci_head_observed`, which replaces the
1254
+ * complete projection after pagination. Both events feed
1255
+ * `ReadModelState.ciByProjectKey`, a disposable cache rebuilt from REST on every
1256
+ * boot — there is no durable CI store.
1257
+ */
1258
+ const ProjectCiSuiteObservedEvent = effect.Schema.Struct({
1259
+ type: effect.Schema.Literal("project.ci_suite_observed"),
1260
+ sequence: SequenceNumber,
1261
+ timestamp: effect.Schema.String,
1262
+ payload: effect.Schema.Struct({
1263
+ projectKey: effect.Schema.String,
1264
+ repo: effect.Schema.String,
1265
+ branch: effect.Schema.String,
1266
+ headSha: effect.Schema.String,
1267
+ suiteId: effect.Schema.String,
1268
+ status: effect.Schema.String,
1269
+ conclusion: effect.Schema.NullOr(effect.Schema.String),
1270
+ htmlUrl: effect.Schema.optional(effect.Schema.String),
1271
+ observedAt: effect.Schema.String,
1272
+ /** True only after the emitter verified headSha against the branch head. */
1273
+ authoritativeHead: effect.Schema.optional(effect.Schema.Boolean)
1274
+ })
1275
+ });
1276
+ /**
1277
+ * Complete GitHub Actions projection for the verified default-branch head.
1278
+ * The REST seed/repair emits one event after paginating every run and verifying
1279
+ * the branch head a second time. An empty suites record explicitly clears stale
1280
+ * CI when the current commit has no Actions runs.
1281
+ */
1282
+ const ProjectCiHeadObservedEvent = effect.Schema.Struct({
1283
+ type: effect.Schema.Literal("project.ci_head_observed"),
1284
+ sequence: SequenceNumber,
1285
+ timestamp: effect.Schema.String,
1286
+ payload: effect.Schema.Struct({
1287
+ projectKey: effect.Schema.String,
1288
+ repo: effect.Schema.String,
1289
+ branch: effect.Schema.String,
1290
+ headSha: effect.Schema.String,
1291
+ suites: effect.Schema.Record(effect.Schema.String, ProjectCiSuite),
1292
+ observedAt: effect.Schema.String
1293
+ })
1294
+ });
1295
+ /**
1296
+ * The restart gate changed (PAN-3729).
1297
+ *
1298
+ * The payload is the COMPLETE gate projection, not a delta, so the reducer is a
1299
+ * plain replace and no ordering logic is needed. Emitted by the gate writer
1300
+ * (`src/dashboard/server/services/restart-gate.ts`) on every mutation and on
1301
+ * every sweep tick that drops an expired request, so the approval banner clears
1302
+ * itself when a requester dies without polling again.
1303
+ *
1304
+ * The gate is runtime-plane state (like `~/.overdeck/dashboard-restarting.json`),
1305
+ * so this event is emitted in-memory only — it is never persisted to the event
1306
+ * log and never replayed at boot.
1307
+ */
1308
+ const RestartGateChangedEvent = effect.Schema.Struct({
1309
+ type: effect.Schema.Literal("restart_gate.changed"),
1310
+ sequence: SequenceNumber,
1311
+ timestamp: effect.Schema.String,
1312
+ payload: RestartGateSnapshot
1313
+ });
1176
1314
  /** Replaces socket.io `agents:changed` (event: 'started') */
1177
1315
  const AgentStartedEvent = effect.Schema.Struct({
1178
1316
  type: effect.Schema.Literal("agent.started"),
@@ -2441,6 +2579,9 @@ const SweepRecommendationEvent = effect.Schema.Struct({
2441
2579
  const DomainEvent = effect.Schema.Union([
2442
2580
  SystemHeartbeatEvent,
2443
2581
  BeadsFreshnessChangedEvent,
2582
+ ProjectCiSuiteObservedEvent,
2583
+ ProjectCiHeadObservedEvent,
2584
+ RestartGateChangedEvent,
2444
2585
  AgentCreatedEvent,
2445
2586
  AgentEnrichmentChangedEvent,
2446
2587
  AgentStartedEvent,
@@ -3509,6 +3650,8 @@ const INITIAL_READ_MODEL_STATE = {
3509
3650
  enrichStats: null,
3510
3651
  enrichProgressBySessionId: {},
3511
3652
  embedProgressBySessionId: {},
3653
+ ciByProjectKey: {},
3654
+ restartGate: null,
3512
3655
  agentIdBySessionId: {},
3513
3656
  dashboardLifecycle: {
3514
3657
  active: false,
@@ -3634,6 +3777,8 @@ function syncSnapshot(state, snapshot) {
3634
3777
  enrichStats: snapshot.enrichStats ?? null,
3635
3778
  enrichProgressBySessionId: snapshot.enrichProgressBySessionId ?? {},
3636
3779
  embedProgressBySessionId: snapshot.embedProgressBySessionId ?? {},
3780
+ ciByProjectKey: snapshot.ciByProjectKey ?? state.ciByProjectKey,
3781
+ restartGate: snapshot.restartGate ?? state.restartGate,
3637
3782
  agentIdBySessionId
3638
3783
  };
3639
3784
  }
@@ -3974,6 +4119,97 @@ function applyEvent(state, event) {
3974
4119
  ...state,
3975
4120
  sequence: Math.max(state.sequence, event.sequence)
3976
4121
  };
4122
+ case "project.ci_suite_observed": {
4123
+ const p = event.payload;
4124
+ const existing = state.ciByProjectKey[p.projectKey];
4125
+ const suite = {
4126
+ status: p.status,
4127
+ conclusion: p.conclusion,
4128
+ htmlUrl: p.htmlUrl,
4129
+ observedAt: p.observedAt
4130
+ };
4131
+ let next;
4132
+ if (!existing) {
4133
+ if (p.authoritativeHead !== true) return {
4134
+ ...state,
4135
+ sequence: Math.max(state.sequence, event.sequence)
4136
+ };
4137
+ next = {
4138
+ projectKey: p.projectKey,
4139
+ repo: p.repo,
4140
+ branch: p.branch,
4141
+ headSha: p.headSha,
4142
+ suites: { [p.suiteId]: suite },
4143
+ updatedAt: p.observedAt
4144
+ };
4145
+ } else if (existing.headSha === p.headSha) {
4146
+ const existingSuite = existing.suites[p.suiteId];
4147
+ const existingSuiteObservedAt = existingSuite?.observedAt ?? existing.updatedAt;
4148
+ if (existingSuite && p.observedAt < existingSuiteObservedAt) return {
4149
+ ...state,
4150
+ sequence: Math.max(state.sequence, event.sequence)
4151
+ };
4152
+ next = {
4153
+ ...existing,
4154
+ suites: {
4155
+ ...existing.suites,
4156
+ [p.suiteId]: suite
4157
+ },
4158
+ updatedAt: p.observedAt > existing.updatedAt ? p.observedAt : existing.updatedAt
4159
+ };
4160
+ } else if (p.authoritativeHead === true && p.observedAt >= existing.updatedAt) next = {
4161
+ projectKey: p.projectKey,
4162
+ repo: p.repo,
4163
+ branch: p.branch,
4164
+ headSha: p.headSha,
4165
+ suites: { [p.suiteId]: suite },
4166
+ updatedAt: p.observedAt
4167
+ };
4168
+ else return {
4169
+ ...state,
4170
+ sequence: Math.max(state.sequence, event.sequence)
4171
+ };
4172
+ return {
4173
+ ...state,
4174
+ sequence: Math.max(state.sequence, event.sequence),
4175
+ ciByProjectKey: {
4176
+ ...state.ciByProjectKey,
4177
+ [p.projectKey]: next
4178
+ }
4179
+ };
4180
+ }
4181
+ case "project.ci_head_observed": {
4182
+ const p = event.payload;
4183
+ const existing = state.ciByProjectKey[p.projectKey];
4184
+ if (existing && p.observedAt < existing.updatedAt) return {
4185
+ ...state,
4186
+ sequence: Math.max(state.sequence, event.sequence)
4187
+ };
4188
+ return {
4189
+ ...state,
4190
+ sequence: Math.max(state.sequence, event.sequence),
4191
+ ciByProjectKey: {
4192
+ ...state.ciByProjectKey,
4193
+ [p.projectKey]: {
4194
+ projectKey: p.projectKey,
4195
+ repo: p.repo,
4196
+ branch: p.branch,
4197
+ headSha: p.headSha,
4198
+ suites: p.suites,
4199
+ updatedAt: p.observedAt
4200
+ }
4201
+ }
4202
+ };
4203
+ }
4204
+ case "restart_gate.changed": return {
4205
+ ...state,
4206
+ sequence: Math.max(state.sequence, event.sequence),
4207
+ restartGate: {
4208
+ status: event.payload.status,
4209
+ pending: event.payload.pending,
4210
+ ...event.payload.lastOutcome === void 0 ? {} : { lastOutcome: event.payload.lastOutcome }
4211
+ }
4212
+ };
3977
4213
  case "resources.updated": return {
3978
4214
  ...state,
3979
4215
  sequence: Math.max(state.sequence, event.sequence),
@@ -4822,6 +5058,29 @@ function applyEvents(state, events) {
4822
5058
  return events.reduce(applyEvent, state);
4823
5059
  }
4824
5060
  //#endregion
5061
+ //#region src/project-ci.ts
5062
+ /** Conclusions that mean the suite failed. Mirrors FAILING_CHECK_CONCLUSIONS
5063
+ * in src/lib/webhook-handlers.ts:196. */
5064
+ const FAILED = new Set([
5065
+ "failure",
5066
+ "timed_out",
5067
+ "cancelled",
5068
+ "action_required",
5069
+ "startup_failure",
5070
+ "stale"
5071
+ ]);
5072
+ function deriveProjectCi(record) {
5073
+ const suites = Object.values(record.suites);
5074
+ const total = suites.length;
5075
+ const completed = suites.filter((s) => s.status === "completed").length;
5076
+ return {
5077
+ state: suites.some((s) => s.conclusion != null && FAILED.has(s.conclusion.toLowerCase())) ? "failure" : suites.some((s) => s.status === "in_progress") ? "in_progress" : completed < total || total === 0 ? "queued" : "success",
5078
+ completed,
5079
+ total,
5080
+ href: (total === 1 ? suites[0] : void 0)?.htmlUrl ?? `https://github.com/${record.repo}/commit/${record.headSha}/checks`
5081
+ };
5082
+ }
5083
+ //#endregion
4825
5084
  //#region src/flywheel-stats.ts
4826
5085
  const FlywheelStatsCriterionStatus = effect.Schema.Literals([
4827
5086
  "green",
@@ -5565,6 +5824,7 @@ const TELEMETRY_PROPERTY_DOMAINS = {
5565
5824
  "deacon",
5566
5825
  "sessions",
5567
5826
  "awaiting-merge",
5827
+ "workspace-new",
5568
5828
  "workspace"
5569
5829
  ],
5570
5830
  decision_subject: ["agent", "conversation"],
@@ -7181,6 +7441,48 @@ const COMPOSER_COMMAND_MANIFEST = [
7181
7441
  "aliases": [],
7182
7442
  "category": "Lifecycle"
7183
7443
  },
7444
+ {
7445
+ "id": "pan-swarm-dispatch",
7446
+ "path": ["swarm", "dispatch"],
7447
+ "display": "/pan swarm dispatch",
7448
+ "description": "Run one gated swarm dispatch pass",
7449
+ "args": [{
7450
+ "name": "id",
7451
+ "required": true,
7452
+ "variadic": false
7453
+ }],
7454
+ "options": [{
7455
+ "flags": "--json",
7456
+ "description": "Print structured dispatch results",
7457
+ "required": false,
7458
+ "valueHint": null
7459
+ }],
7460
+ "aliases": [],
7461
+ "category": "Lifecycle"
7462
+ },
7463
+ {
7464
+ "id": "pan-swarm-merge",
7465
+ "path": ["swarm", "merge"],
7466
+ "display": "/pan swarm merge",
7467
+ "description": "Verify and merge one completed swarm slot",
7468
+ "args": [{
7469
+ "name": "id",
7470
+ "required": true,
7471
+ "variadic": false
7472
+ }, {
7473
+ "name": "slotIndex",
7474
+ "required": true,
7475
+ "variadic": false
7476
+ }],
7477
+ "options": [{
7478
+ "flags": "--json",
7479
+ "description": "Print structured merge results",
7480
+ "required": false,
7481
+ "valueHint": null
7482
+ }],
7483
+ "aliases": [],
7484
+ "category": "Lifecycle"
7485
+ },
7184
7486
  {
7185
7487
  "id": "pan-swarm-recover",
7186
7488
  "path": ["swarm", "recover"],
@@ -7197,9 +7499,14 @@ const COMPOSER_COMMAND_MANIFEST = [
7197
7499
  }],
7198
7500
  "options": [{
7199
7501
  "flags": "--action <action>",
7200
- "description": "Recovery action: retry, drop, or handoff",
7502
+ "description": "Recovery action: retry, drop, handoff, or reclaim",
7201
7503
  "required": true,
7202
7504
  "valueHint": "action"
7505
+ }, {
7506
+ "flags": "--operator",
7507
+ "description": "Override the three-intervention limit for this failure class",
7508
+ "required": false,
7509
+ "valueHint": null
7203
7510
  }],
7204
7511
  "aliases": [],
7205
7512
  "category": "Lifecycle"
@@ -7247,7 +7554,36 @@ const COMPOSER_COMMAND_MANIFEST = [
7247
7554
  "required": true,
7248
7555
  "variadic": false
7249
7556
  }],
7250
- "options": [],
7557
+ "options": [{
7558
+ "flags": "--json",
7559
+ "description": "Print structured status including foreman, hold, and interventions",
7560
+ "required": false,
7561
+ "valueHint": null
7562
+ }],
7563
+ "aliases": [],
7564
+ "category": "Lifecycle"
7565
+ },
7566
+ {
7567
+ "id": "pan-swarm-wait",
7568
+ "path": ["swarm", "wait"],
7569
+ "display": "/pan swarm wait",
7570
+ "description": "Wait for a swarm slot, foreman, or hold state transition",
7571
+ "args": [{
7572
+ "name": "id",
7573
+ "required": true,
7574
+ "variadic": false
7575
+ }],
7576
+ "options": [{
7577
+ "flags": "--timeout <seconds>",
7578
+ "description": "Maximum wait in seconds",
7579
+ "required": true,
7580
+ "valueHint": "seconds"
7581
+ }, {
7582
+ "flags": "--json",
7583
+ "description": "Print the structured status delta",
7584
+ "required": false,
7585
+ "valueHint": null
7586
+ }],
7251
7587
  "aliases": [],
7252
7588
  "category": "Lifecycle"
7253
7589
  },
@@ -7518,6 +7854,49 @@ const COMPOSER_COMMAND_MANIFEST = [
7518
7854
  "aliases": [],
7519
7855
  "category": "Lifecycle"
7520
7856
  },
7857
+ {
7858
+ "id": "pan-task-reopen",
7859
+ "path": ["task", "reopen"],
7860
+ "display": "/pan task reopen",
7861
+ "description": "",
7862
+ "args": [{
7863
+ "name": "issue",
7864
+ "required": true,
7865
+ "variadic": false
7866
+ }, {
7867
+ "name": "item",
7868
+ "required": true,
7869
+ "variadic": false
7870
+ }],
7871
+ "options": [
7872
+ {
7873
+ "flags": "--reason <text>",
7874
+ "description": "Reason for the status change",
7875
+ "required": true,
7876
+ "valueHint": "text"
7877
+ },
7878
+ {
7879
+ "flags": "--expected-sequence <n>",
7880
+ "description": "Require the current task sequence",
7881
+ "required": true,
7882
+ "valueHint": "n"
7883
+ },
7884
+ {
7885
+ "flags": "--force",
7886
+ "description": "Override a non-terminal transition or claim owner; requires --reason",
7887
+ "required": false,
7888
+ "valueHint": null
7889
+ },
7890
+ {
7891
+ "flags": "--json",
7892
+ "description": "Print JSON",
7893
+ "required": false,
7894
+ "valueHint": null
7895
+ }
7896
+ ],
7897
+ "aliases": [],
7898
+ "category": "Lifecycle"
7899
+ },
7521
7900
  {
7522
7901
  "id": "pan-task-cancel",
7523
7902
  "path": ["task", "cancel"],
@@ -10999,6 +11378,20 @@ const COMPOSER_COMMAND_MANIFEST = [
10999
11378
  "aliases": [],
11000
11379
  "category": "Conversation"
11001
11380
  },
11381
+ {
11382
+ "id": "pan-conversations-heal",
11383
+ "path": ["conversations", "heal"],
11384
+ "display": "/pan conversations heal",
11385
+ "description": "Clear stale fork/spawn failure state for a live conversation",
11386
+ "args": [{
11387
+ "name": "query",
11388
+ "required": true,
11389
+ "variadic": false
11390
+ }],
11391
+ "options": [],
11392
+ "aliases": [],
11393
+ "category": "Conversation"
11394
+ },
11002
11395
  {
11003
11396
  "id": "pan-conversations-current",
11004
11397
  "path": ["conversations", "current"],
@@ -12173,11 +12566,27 @@ const COMPOSER_COMMAND_MANIFEST = [
12173
12566
  "description": "Disable agent auto-resume on restart (opt out of the default-on auto-resume)",
12174
12567
  "required": false,
12175
12568
  "valueHint": null
12569
+ },
12570
+ {
12571
+ "flags": "--now",
12572
+ "description": "Skip the operator-approval wait: approve everything already waiting, then restart the dashboard immediately",
12573
+ "required": false,
12574
+ "valueHint": null
12176
12575
  }
12177
12576
  ],
12178
12577
  "aliases": [],
12179
12578
  "category": "Core"
12180
12579
  },
12580
+ {
12581
+ "id": "pan-restart-approve",
12582
+ "path": ["restart", "approve"],
12583
+ "display": "/pan restart approve",
12584
+ "description": "Approve every dashboard restart request that is waiting for the operator",
12585
+ "args": [],
12586
+ "options": [],
12587
+ "aliases": [],
12588
+ "category": "Core"
12589
+ },
12181
12590
  {
12182
12591
  "id": "pan-project",
12183
12592
  "path": ["project"],
@@ -13213,6 +13622,10 @@ exports.PlanSubitemStatusChangedEvent = PlanSubitemStatusChangedEvent;
13213
13622
  exports.PlanningFailedEvent = PlanningFailedEvent;
13214
13623
  exports.PlanningStartedEvent = PlanningStartedEvent;
13215
13624
  exports.PlanningSyncEvent = PlanningSyncEvent;
13625
+ exports.ProjectCiHeadObservedEvent = ProjectCiHeadObservedEvent;
13626
+ exports.ProjectCiSnapshot = ProjectCiSnapshot;
13627
+ exports.ProjectCiSuite = ProjectCiSuite;
13628
+ exports.ProjectCiSuiteObservedEvent = ProjectCiSuiteObservedEvent;
13216
13629
  exports.ProjectContextLayerRecord = ProjectContextLayerRecord;
13217
13630
  exports.ProjectContextLayerTarget = ProjectContextLayerTarget;
13218
13631
  exports.ProjectSessionTree = ProjectSessionTree;
@@ -13235,6 +13648,11 @@ exports.ResolveFilePathExistsResult = ResolveFilePathExistsResult;
13235
13648
  exports.ResolveFilePathExistsRpc = ResolveFilePathExistsRpc;
13236
13649
  exports.ResourceStats = ResourceStats;
13237
13650
  exports.ResourcesUpdatedEvent = ResourcesUpdatedEvent;
13651
+ exports.RestartGateChangedEvent = RestartGateChangedEvent;
13652
+ exports.RestartGateKind = RestartGateKind;
13653
+ exports.RestartGateOutcome = RestartGateOutcome;
13654
+ exports.RestartGateRequest = RestartGateRequest;
13655
+ exports.RestartGateSnapshot = RestartGateSnapshot;
13238
13656
  exports.ReviewApprovedEvent = ReviewApprovedEvent;
13239
13657
  exports.ReviewCoordinatorDiedEvent = ReviewCoordinatorDiedEvent;
13240
13658
  exports.ReviewCoordinatorStartedEvent = ReviewCoordinatorStartedEvent;
@@ -13332,6 +13750,7 @@ exports.applyEvent = applyEvent;
13332
13750
  exports.applyEvents = applyEvents;
13333
13751
  exports.compareIssueIds = compareIssueIds;
13334
13752
  exports.decodeFlywheelStats = decodeFlywheelStats;
13753
+ exports.deriveProjectCi = deriveProjectCi;
13335
13754
  exports.encodeFlywheelStats = encodeFlywheelStats;
13336
13755
  exports.getHarness = getHarness;
13337
13756
  exports.getHarnessBehavior = getHarnessBehavior;