@overdeck/contracts 0.49.1 → 0.50.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/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"],
@@ -6539,7 +6799,7 @@ const COMPOSER_COMMAND_MANIFEST = [
6539
6799
  "id": "pan-handoff",
6540
6800
  "path": ["handoff"],
6541
6801
  "display": "/pan handoff",
6542
- "description": "Conversation handoff that spawns a new conversation; omit <conv> (or pass \"self\") to hand off the conversation you are in; trailing text becomes the focus — MAX 500 characters. Very large source conversations are auto-degraded (truncated smart summary → heuristic → focus-only) and still hand off without aborting.",
6802
+ "description": "Conversation handoff that spawns a new conversation; omit <conv> (or pass \"self\") to hand off the conversation you are in; trailing text becomes the focus — MAX 10000 characters (keep it short; long briefs belong in a file the focus points at). Very large source conversations are auto-degraded (truncated smart summary → heuristic → focus-only) and still hand off without aborting.",
6543
6803
  "args": [{
6544
6804
  "name": "conv",
6545
6805
  "required": false,
@@ -6580,6 +6840,12 @@ const COMPOSER_COMMAND_MANIFEST = [
6580
6840
  "required": true,
6581
6841
  "valueHint": "id"
6582
6842
  },
6843
+ {
6844
+ "flags": "--title <title>",
6845
+ "description": "Title for the new conversation; defaults to \"Handoff: <focus>\" (first ~70 chars) or \"Handoff: <source title>\" without focus",
6846
+ "required": true,
6847
+ "valueHint": "title"
6848
+ },
6583
6849
  {
6584
6850
  "flags": "--author <author>",
6585
6851
  "description": "Who authors the handoff doc: external (default) or source",
@@ -7181,6 +7447,48 @@ const COMPOSER_COMMAND_MANIFEST = [
7181
7447
  "aliases": [],
7182
7448
  "category": "Lifecycle"
7183
7449
  },
7450
+ {
7451
+ "id": "pan-swarm-dispatch",
7452
+ "path": ["swarm", "dispatch"],
7453
+ "display": "/pan swarm dispatch",
7454
+ "description": "Run one gated swarm dispatch pass",
7455
+ "args": [{
7456
+ "name": "id",
7457
+ "required": true,
7458
+ "variadic": false
7459
+ }],
7460
+ "options": [{
7461
+ "flags": "--json",
7462
+ "description": "Print structured dispatch results",
7463
+ "required": false,
7464
+ "valueHint": null
7465
+ }],
7466
+ "aliases": [],
7467
+ "category": "Lifecycle"
7468
+ },
7469
+ {
7470
+ "id": "pan-swarm-merge",
7471
+ "path": ["swarm", "merge"],
7472
+ "display": "/pan swarm merge",
7473
+ "description": "Verify and merge one completed swarm slot",
7474
+ "args": [{
7475
+ "name": "id",
7476
+ "required": true,
7477
+ "variadic": false
7478
+ }, {
7479
+ "name": "slotIndex",
7480
+ "required": true,
7481
+ "variadic": false
7482
+ }],
7483
+ "options": [{
7484
+ "flags": "--json",
7485
+ "description": "Print structured merge results",
7486
+ "required": false,
7487
+ "valueHint": null
7488
+ }],
7489
+ "aliases": [],
7490
+ "category": "Lifecycle"
7491
+ },
7184
7492
  {
7185
7493
  "id": "pan-swarm-recover",
7186
7494
  "path": ["swarm", "recover"],
@@ -7197,9 +7505,14 @@ const COMPOSER_COMMAND_MANIFEST = [
7197
7505
  }],
7198
7506
  "options": [{
7199
7507
  "flags": "--action <action>",
7200
- "description": "Recovery action: retry, drop, or handoff",
7508
+ "description": "Recovery action: retry, drop, handoff, or reclaim",
7201
7509
  "required": true,
7202
7510
  "valueHint": "action"
7511
+ }, {
7512
+ "flags": "--operator",
7513
+ "description": "Override the three-intervention limit for this failure class",
7514
+ "required": false,
7515
+ "valueHint": null
7203
7516
  }],
7204
7517
  "aliases": [],
7205
7518
  "category": "Lifecycle"
@@ -7247,7 +7560,36 @@ const COMPOSER_COMMAND_MANIFEST = [
7247
7560
  "required": true,
7248
7561
  "variadic": false
7249
7562
  }],
7250
- "options": [],
7563
+ "options": [{
7564
+ "flags": "--json",
7565
+ "description": "Print structured status including foreman, hold, and interventions",
7566
+ "required": false,
7567
+ "valueHint": null
7568
+ }],
7569
+ "aliases": [],
7570
+ "category": "Lifecycle"
7571
+ },
7572
+ {
7573
+ "id": "pan-swarm-wait",
7574
+ "path": ["swarm", "wait"],
7575
+ "display": "/pan swarm wait",
7576
+ "description": "Wait for a swarm slot, foreman, or hold state transition",
7577
+ "args": [{
7578
+ "name": "id",
7579
+ "required": true,
7580
+ "variadic": false
7581
+ }],
7582
+ "options": [{
7583
+ "flags": "--timeout <seconds>",
7584
+ "description": "Maximum wait in seconds",
7585
+ "required": true,
7586
+ "valueHint": "seconds"
7587
+ }, {
7588
+ "flags": "--json",
7589
+ "description": "Print the structured status delta",
7590
+ "required": false,
7591
+ "valueHint": null
7592
+ }],
7251
7593
  "aliases": [],
7252
7594
  "category": "Lifecycle"
7253
7595
  },
@@ -7518,6 +7860,49 @@ const COMPOSER_COMMAND_MANIFEST = [
7518
7860
  "aliases": [],
7519
7861
  "category": "Lifecycle"
7520
7862
  },
7863
+ {
7864
+ "id": "pan-task-reopen",
7865
+ "path": ["task", "reopen"],
7866
+ "display": "/pan task reopen",
7867
+ "description": "",
7868
+ "args": [{
7869
+ "name": "issue",
7870
+ "required": true,
7871
+ "variadic": false
7872
+ }, {
7873
+ "name": "item",
7874
+ "required": true,
7875
+ "variadic": false
7876
+ }],
7877
+ "options": [
7878
+ {
7879
+ "flags": "--reason <text>",
7880
+ "description": "Reason for the status change",
7881
+ "required": true,
7882
+ "valueHint": "text"
7883
+ },
7884
+ {
7885
+ "flags": "--expected-sequence <n>",
7886
+ "description": "Require the current task sequence",
7887
+ "required": true,
7888
+ "valueHint": "n"
7889
+ },
7890
+ {
7891
+ "flags": "--force",
7892
+ "description": "Override a non-terminal transition or claim owner; requires --reason",
7893
+ "required": false,
7894
+ "valueHint": null
7895
+ },
7896
+ {
7897
+ "flags": "--json",
7898
+ "description": "Print JSON",
7899
+ "required": false,
7900
+ "valueHint": null
7901
+ }
7902
+ ],
7903
+ "aliases": [],
7904
+ "category": "Lifecycle"
7905
+ },
7521
7906
  {
7522
7907
  "id": "pan-task-cancel",
7523
7908
  "path": ["task", "cancel"],
@@ -10999,6 +11384,20 @@ const COMPOSER_COMMAND_MANIFEST = [
10999
11384
  "aliases": [],
11000
11385
  "category": "Conversation"
11001
11386
  },
11387
+ {
11388
+ "id": "pan-conversations-heal",
11389
+ "path": ["conversations", "heal"],
11390
+ "display": "/pan conversations heal",
11391
+ "description": "Clear stale fork/spawn failure state for a live conversation",
11392
+ "args": [{
11393
+ "name": "query",
11394
+ "required": true,
11395
+ "variadic": false
11396
+ }],
11397
+ "options": [],
11398
+ "aliases": [],
11399
+ "category": "Conversation"
11400
+ },
11002
11401
  {
11003
11402
  "id": "pan-conversations-current",
11004
11403
  "path": ["conversations", "current"],
@@ -12173,11 +12572,27 @@ const COMPOSER_COMMAND_MANIFEST = [
12173
12572
  "description": "Disable agent auto-resume on restart (opt out of the default-on auto-resume)",
12174
12573
  "required": false,
12175
12574
  "valueHint": null
12575
+ },
12576
+ {
12577
+ "flags": "--now",
12578
+ "description": "Skip the operator-approval wait: approve everything already waiting, then restart the dashboard immediately",
12579
+ "required": false,
12580
+ "valueHint": null
12176
12581
  }
12177
12582
  ],
12178
12583
  "aliases": [],
12179
12584
  "category": "Core"
12180
12585
  },
12586
+ {
12587
+ "id": "pan-restart-approve",
12588
+ "path": ["restart", "approve"],
12589
+ "display": "/pan restart approve",
12590
+ "description": "Approve every dashboard restart request that is waiting for the operator",
12591
+ "args": [],
12592
+ "options": [],
12593
+ "aliases": [],
12594
+ "category": "Core"
12595
+ },
12181
12596
  {
12182
12597
  "id": "pan-project",
12183
12598
  "path": ["project"],
@@ -13213,6 +13628,10 @@ exports.PlanSubitemStatusChangedEvent = PlanSubitemStatusChangedEvent;
13213
13628
  exports.PlanningFailedEvent = PlanningFailedEvent;
13214
13629
  exports.PlanningStartedEvent = PlanningStartedEvent;
13215
13630
  exports.PlanningSyncEvent = PlanningSyncEvent;
13631
+ exports.ProjectCiHeadObservedEvent = ProjectCiHeadObservedEvent;
13632
+ exports.ProjectCiSnapshot = ProjectCiSnapshot;
13633
+ exports.ProjectCiSuite = ProjectCiSuite;
13634
+ exports.ProjectCiSuiteObservedEvent = ProjectCiSuiteObservedEvent;
13216
13635
  exports.ProjectContextLayerRecord = ProjectContextLayerRecord;
13217
13636
  exports.ProjectContextLayerTarget = ProjectContextLayerTarget;
13218
13637
  exports.ProjectSessionTree = ProjectSessionTree;
@@ -13235,6 +13654,11 @@ exports.ResolveFilePathExistsResult = ResolveFilePathExistsResult;
13235
13654
  exports.ResolveFilePathExistsRpc = ResolveFilePathExistsRpc;
13236
13655
  exports.ResourceStats = ResourceStats;
13237
13656
  exports.ResourcesUpdatedEvent = ResourcesUpdatedEvent;
13657
+ exports.RestartGateChangedEvent = RestartGateChangedEvent;
13658
+ exports.RestartGateKind = RestartGateKind;
13659
+ exports.RestartGateOutcome = RestartGateOutcome;
13660
+ exports.RestartGateRequest = RestartGateRequest;
13661
+ exports.RestartGateSnapshot = RestartGateSnapshot;
13238
13662
  exports.ReviewApprovedEvent = ReviewApprovedEvent;
13239
13663
  exports.ReviewCoordinatorDiedEvent = ReviewCoordinatorDiedEvent;
13240
13664
  exports.ReviewCoordinatorStartedEvent = ReviewCoordinatorStartedEvent;
@@ -13332,6 +13756,7 @@ exports.applyEvent = applyEvent;
13332
13756
  exports.applyEvents = applyEvents;
13333
13757
  exports.compareIssueIds = compareIssueIds;
13334
13758
  exports.decodeFlywheelStats = decodeFlywheelStats;
13759
+ exports.deriveProjectCi = deriveProjectCi;
13335
13760
  exports.encodeFlywheelStats = encodeFlywheelStats;
13336
13761
  exports.getHarness = getHarness;
13337
13762
  exports.getHarnessBehavior = getHarnessBehavior;