@overdeck/contracts 0.45.21 → 0.45.23

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
@@ -835,6 +835,299 @@ const ExtractionProviderConfig = effect.Schema.Struct({
835
835
  fallbackChain: effect.Schema.Array(ExtractionProviderTarget)
836
836
  });
837
837
  //#endregion
838
+ //#region src/system-health.ts
839
+ /**
840
+ * Shared V2 system-health contract. Domain measurements use null for unavailable
841
+ * evidence, unknown enum values decode to safe unavailable/unknown states, and
842
+ * the legacy summary is a compatibility projection from the accepted V2 snapshot.
843
+ */
844
+ const HealthStateValue = effect.Schema.Literals([
845
+ "measuring",
846
+ "healthy",
847
+ "warning",
848
+ "critical",
849
+ "unavailable"
850
+ ]);
851
+ const HealthState = effect.Schema.String.pipe(effect.Schema.decodeTo(HealthStateValue, {
852
+ decode: effect.SchemaGetter.transform((value) => HealthStateValue.literals.includes(value) ? value : "unavailable"),
853
+ encode: effect.SchemaGetter.transform((value) => value)
854
+ }));
855
+ const HealthReason = effect.Schema.Struct({
856
+ code: effect.Schema.String,
857
+ domain: effect.Schema.Literals([
858
+ "host",
859
+ "admission",
860
+ "agent",
861
+ "service"
862
+ ]),
863
+ severity: effect.Schema.Literals([
864
+ "info",
865
+ "warning",
866
+ "critical"
867
+ ]),
868
+ message: effect.Schema.String,
869
+ metric: effect.Schema.optional(effect.Schema.String),
870
+ observed: effect.Schema.optional(effect.Schema.Number),
871
+ threshold: effect.Schema.optional(effect.Schema.Number)
872
+ });
873
+ const HostPlatform = effect.Schema.String.pipe(effect.Schema.decodeTo(effect.Schema.Literals([
874
+ "linux",
875
+ "darwin",
876
+ "unsupported"
877
+ ]), {
878
+ decode: effect.SchemaGetter.transform((value) => value === "linux" || value === "darwin" || value === "unsupported" ? value : "unsupported"),
879
+ encode: effect.SchemaGetter.transform((value) => value)
880
+ }));
881
+ /**
882
+ * Accepted host metrics. Null means that the platform collector could not
883
+ * produce that signal; it must never be interpreted as a measured zero.
884
+ */
885
+ const HostHealthMetrics = effect.Schema.Struct({
886
+ cpuPercent: effect.Schema.NullOr(effect.Schema.Number),
887
+ loadAverage1m: effect.Schema.NullOr(effect.Schema.Number),
888
+ loadPerCore1m: effect.Schema.NullOr(effect.Schema.Number),
889
+ totalMemoryBytes: effect.Schema.NullOr(effect.Schema.Number),
890
+ usedMemoryBytes: effect.Schema.NullOr(effect.Schema.Number),
891
+ availableMemoryBytes: effect.Schema.NullOr(effect.Schema.Number),
892
+ memoryUsedPercent: effect.Schema.NullOr(effect.Schema.Number),
893
+ memoryPressureSomeAvg10: effect.Schema.NullOr(effect.Schema.Number),
894
+ memoryPressureFullAvg10: effect.Schema.NullOr(effect.Schema.Number),
895
+ memoryPressureFreePercent: effect.Schema.NullOr(effect.Schema.Number),
896
+ swapTotalBytes: effect.Schema.NullOr(effect.Schema.Number),
897
+ swapUsedBytes: effect.Schema.NullOr(effect.Schema.Number),
898
+ swapUsedPercent: effect.Schema.NullOr(effect.Schema.Number),
899
+ swapActivityBytesPerMinute: effect.Schema.NullOr(effect.Schema.Number),
900
+ committedMemoryBytes: effect.Schema.NullOr(effect.Schema.Number),
901
+ commitLimitBytes: effect.Schema.NullOr(effect.Schema.Number),
902
+ virtualCommitmentPercent: effect.Schema.NullOr(effect.Schema.Number)
903
+ });
904
+ const AdmissionState = effect.Schema.String.pipe(effect.Schema.decodeTo(effect.Schema.Literals([
905
+ "open",
906
+ "soft",
907
+ "blocked",
908
+ "unavailable"
909
+ ]), {
910
+ decode: effect.SchemaGetter.transform((value) => value === "open" || value === "soft" || value === "blocked" || value === "unavailable" ? value : "unavailable"),
911
+ encode: effect.SchemaGetter.transform((value) => value)
912
+ }));
913
+ const AgentHealthStatus = effect.Schema.String.pipe(effect.Schema.decodeTo(effect.Schema.Literals([
914
+ "healthy",
915
+ "idle",
916
+ "waiting",
917
+ "warning",
918
+ "stalled",
919
+ "wedged",
920
+ "dead",
921
+ "unavailable"
922
+ ]), {
923
+ decode: effect.SchemaGetter.transform((value) => value === "healthy" || value === "idle" || value === "waiting" || value === "warning" || value === "stalled" || value === "wedged" || value === "dead" || value === "unavailable" ? value : "unavailable"),
924
+ encode: effect.SchemaGetter.transform((value) => value)
925
+ }));
926
+ const AgentHealthKind = effect.Schema.String.pipe(effect.Schema.decodeTo(effect.Schema.Literals([
927
+ "work",
928
+ "planning",
929
+ "specialist",
930
+ "conversation",
931
+ "other"
932
+ ]), {
933
+ decode: effect.SchemaGetter.transform((value) => value === "work" || value === "planning" || value === "specialist" || value === "conversation" || value === "other" ? value : "other"),
934
+ encode: effect.SchemaGetter.transform((value) => value)
935
+ }));
936
+ const SpecialistLifecycle = effect.Schema.String.pipe(effect.Schema.decodeTo(effect.Schema.Literals([
937
+ "active",
938
+ "warm",
939
+ "orphaned",
940
+ "unknown"
941
+ ]), {
942
+ decode: effect.SchemaGetter.transform((value) => value === "active" || value === "warm" || value === "orphaned" || value === "unknown" ? value : "unknown"),
943
+ encode: effect.SchemaGetter.transform((value) => value)
944
+ }));
945
+ const AgentHealthSnapshot = effect.Schema.Struct({
946
+ id: effect.Schema.String,
947
+ issueId: effect.Schema.optional(effect.Schema.String),
948
+ role: effect.Schema.optional(effect.Schema.String),
949
+ kind: effect.Schema.optional(AgentHealthKind),
950
+ status: AgentHealthStatus,
951
+ lifecycle: effect.Schema.optional(SpecialistLifecycle),
952
+ tmuxActive: effect.Schema.optional(effect.Schema.Boolean),
953
+ memoryBytes: effect.Schema.optional(effect.Schema.Number),
954
+ memoryGb: effect.Schema.optional(effect.Schema.Number),
955
+ cpuPercent: effect.Schema.optional(effect.Schema.Number),
956
+ currentIssue: effect.Schema.optional(effect.Schema.String),
957
+ lastActivityAt: effect.Schema.optional(effect.Schema.String),
958
+ consecutiveFailures: effect.Schema.optional(effect.Schema.Number),
959
+ killCount: effect.Schema.optional(effect.Schema.Number),
960
+ contextPercent: effect.Schema.optional(effect.Schema.NullOr(effect.Schema.Number)),
961
+ reasons: effect.Schema.Array(HealthReason)
962
+ });
963
+ const ServiceHealthStatus = effect.Schema.String.pipe(effect.Schema.decodeTo(effect.Schema.Literals([
964
+ "running",
965
+ "not_configured",
966
+ "degraded",
967
+ "stopped",
968
+ "unavailable"
969
+ ]), {
970
+ decode: effect.SchemaGetter.transform((value) => value === "running" || value === "not_configured" || value === "degraded" || value === "stopped" || value === "unavailable" ? value : "unavailable"),
971
+ encode: effect.SchemaGetter.transform((value) => value)
972
+ }));
973
+ const ServiceHealthSnapshot = effect.Schema.Struct({
974
+ id: effect.Schema.String,
975
+ label: effect.Schema.optional(effect.Schema.String),
976
+ required: effect.Schema.optional(effect.Schema.Boolean),
977
+ status: ServiceHealthStatus,
978
+ message: effect.Schema.String,
979
+ reasons: effect.Schema.Array(HealthReason)
980
+ });
981
+ const SystemHealthConsumer = effect.Schema.Struct({
982
+ id: effect.Schema.String,
983
+ label: effect.Schema.String,
984
+ type: effect.Schema.Literals([
985
+ "agent",
986
+ "specialist",
987
+ "container"
988
+ ]),
989
+ memoryBytes: effect.Schema.Number,
990
+ memoryGb: effect.Schema.Number,
991
+ cpuPercent: effect.Schema.optional(effect.Schema.Number),
992
+ issueId: effect.Schema.optional(effect.Schema.String),
993
+ currentIssue: effect.Schema.optional(effect.Schema.String),
994
+ leaked: effect.Schema.optional(effect.Schema.Boolean),
995
+ killTarget: effect.Schema.optional(effect.Schema.Struct({
996
+ kind: effect.Schema.Literals([
997
+ "agent",
998
+ "specialist",
999
+ "container"
1000
+ ]),
1001
+ agentId: effect.Schema.optional(effect.Schema.String),
1002
+ containerId: effect.Schema.optional(effect.Schema.String),
1003
+ projectKey: effect.Schema.optional(effect.Schema.String),
1004
+ issueId: effect.Schema.optional(effect.Schema.String),
1005
+ specialistType: effect.Schema.optional(effect.Schema.String)
1006
+ }))
1007
+ });
1008
+ const LegacyWebhookRelaySummary = effect.Schema.Struct({
1009
+ configured: effect.Schema.Boolean,
1010
+ running: effect.Schema.Boolean,
1011
+ status: effect.Schema.Literals([
1012
+ "not_configured",
1013
+ "running",
1014
+ "stopped",
1015
+ "unknown"
1016
+ ]),
1017
+ message: effect.Schema.String
1018
+ });
1019
+ /** Compatibility fields retained for one release cycle. */
1020
+ const LegacySystemHealthSummary = effect.Schema.Struct({
1021
+ cpuPercent: effect.Schema.Number,
1022
+ loadAverage1m: effect.Schema.Number,
1023
+ loadPerCore1m: effect.Schema.Number,
1024
+ totalMemoryBytes: effect.Schema.Number,
1025
+ usedMemoryBytes: effect.Schema.Number,
1026
+ availableMemoryBytes: effect.Schema.Number,
1027
+ memoryUsedPercent: effect.Schema.Number,
1028
+ swapTotalBytes: effect.Schema.Number,
1029
+ swapUsedBytes: effect.Schema.Number,
1030
+ swapUsedPercent: effect.Schema.Number,
1031
+ committedMemoryBytes: effect.Schema.Number,
1032
+ commitLimitBytes: effect.Schema.Number,
1033
+ overcommitPercent: effect.Schema.Number,
1034
+ agentCount: effect.Schema.Number,
1035
+ workAgentCount: effect.Schema.Number,
1036
+ planningAgentCount: effect.Schema.Number,
1037
+ specialistSessionCount: effect.Schema.Number,
1038
+ leakedSpecialistCount: effect.Schema.Number,
1039
+ containerCount: effect.Schema.Number,
1040
+ containerMemoryBytes: effect.Schema.Number,
1041
+ overdeckMemoryBytes: effect.Schema.Number,
1042
+ overdeckMemoryPercent: effect.Schema.Number,
1043
+ smeeRelay: LegacyWebhookRelaySummary
1044
+ });
1045
+ const SystemHealthSnapshot = effect.Schema.Struct({
1046
+ version: effect.Schema.Literal(2),
1047
+ state: HealthState,
1048
+ updatedAt: effect.Schema.String,
1049
+ nextPollMs: effect.Schema.Number,
1050
+ host: effect.Schema.Struct({
1051
+ state: HealthState,
1052
+ platform: HostPlatform,
1053
+ reasons: effect.Schema.Array(HealthReason),
1054
+ metrics: HostHealthMetrics
1055
+ }),
1056
+ admission: effect.Schema.Struct({
1057
+ state: AdmissionState,
1058
+ availableMemoryBytes: effect.Schema.NullOr(effect.Schema.Number),
1059
+ admittedWorkAgentCount: effect.Schema.Number,
1060
+ reasons: effect.Schema.Array(HealthReason)
1061
+ }),
1062
+ agents: effect.Schema.Array(AgentHealthSnapshot),
1063
+ services: effect.Schema.Array(ServiceHealthSnapshot),
1064
+ topConsumers: effect.Schema.Array(SystemHealthConsumer),
1065
+ summary: LegacySystemHealthSummary
1066
+ });
1067
+ function isWorkAgent(agent) {
1068
+ return agent.kind === "work" || agent.role === "work";
1069
+ }
1070
+ function isPlanningAgent(agent) {
1071
+ return agent.kind === "planning" || agent.role === "plan" || agent.role === "planning";
1072
+ }
1073
+ function isSpecialistAgent(agent) {
1074
+ return agent.kind === "specialist" || agent.role === "review" || agent.role?.startsWith("review-") === true || agent.role === "test" || agent.role === "ship";
1075
+ }
1076
+ function projectWebhookRelay(services) {
1077
+ const relay = services.find((service) => service.id === "smee-relay" || service.id === "webhook-relay");
1078
+ if (!relay) return {
1079
+ configured: false,
1080
+ running: false,
1081
+ status: "unknown",
1082
+ message: "Webhook relay health is unavailable."
1083
+ };
1084
+ const status = relay.status === "running" || relay.status === "not_configured" || relay.status === "stopped" ? relay.status : "unknown";
1085
+ return {
1086
+ configured: relay.status !== "not_configured",
1087
+ running: relay.status === "running",
1088
+ status,
1089
+ message: relay.message
1090
+ };
1091
+ }
1092
+ /**
1093
+ * Projects the V2 domains into the legacy summary without recollecting state.
1094
+ * Diagnostic-only swap and virtual-commitment values remain visible here but
1095
+ * do not participate in V2 health-state evaluation.
1096
+ */
1097
+ function projectLegacySystemHealthSummary(snapshot) {
1098
+ const metrics = snapshot.host.metrics;
1099
+ const agentMemoryBytes = snapshot.agents.reduce((total, agent) => total + (agent.memoryBytes ?? 0), 0);
1100
+ const containers = snapshot.topConsumers.filter((consumer) => consumer.type === "container");
1101
+ const containerMemoryBytes = containers.reduce((total, consumer) => total + consumer.memoryBytes, 0);
1102
+ const overdeckMemoryBytes = agentMemoryBytes + containerMemoryBytes;
1103
+ const totalMemoryBytes = metrics.totalMemoryBytes ?? 0;
1104
+ return {
1105
+ cpuPercent: metrics.cpuPercent ?? 0,
1106
+ loadAverage1m: metrics.loadAverage1m ?? 0,
1107
+ loadPerCore1m: metrics.loadPerCore1m ?? 0,
1108
+ totalMemoryBytes,
1109
+ usedMemoryBytes: metrics.usedMemoryBytes ?? 0,
1110
+ availableMemoryBytes: metrics.availableMemoryBytes ?? 0,
1111
+ memoryUsedPercent: metrics.memoryUsedPercent ?? 0,
1112
+ swapTotalBytes: metrics.swapTotalBytes ?? 0,
1113
+ swapUsedBytes: metrics.swapUsedBytes ?? 0,
1114
+ swapUsedPercent: metrics.swapUsedPercent ?? 0,
1115
+ committedMemoryBytes: metrics.committedMemoryBytes ?? 0,
1116
+ commitLimitBytes: metrics.commitLimitBytes ?? 0,
1117
+ overcommitPercent: metrics.virtualCommitmentPercent ?? 0,
1118
+ agentCount: snapshot.agents.length,
1119
+ workAgentCount: snapshot.agents.filter(isWorkAgent).length,
1120
+ planningAgentCount: snapshot.agents.filter(isPlanningAgent).length,
1121
+ specialistSessionCount: snapshot.agents.filter(isSpecialistAgent).length,
1122
+ leakedSpecialistCount: snapshot.agents.filter((agent) => isSpecialistAgent(agent) && agent.lifecycle === "orphaned").length,
1123
+ containerCount: containers.length,
1124
+ containerMemoryBytes,
1125
+ overdeckMemoryBytes,
1126
+ overdeckMemoryPercent: totalMemoryBytes > 0 ? Math.round(overdeckMemoryBytes / totalMemoryBytes * 1e3) / 10 : 0,
1127
+ smeeRelay: projectWebhookRelay(snapshot.services)
1128
+ };
1129
+ }
1130
+ //#endregion
838
1131
  //#region src/events.ts
839
1132
  /** App-level liveness frame for the /ws/rpc domain-events stream. */
840
1133
  const SystemHeartbeatEvent = effect.Schema.Struct({
@@ -1516,7 +1809,13 @@ const SystemHealthSeverityChangedEvent = effect.Schema.Struct({
1516
1809
  previousSeverity: effect.Schema.String,
1517
1810
  severity: effect.Schema.String,
1518
1811
  reasons: effect.Schema.Array(effect.Schema.String),
1519
- leakedSpecialistCount: effect.Schema.Number
1812
+ leakedSpecialistCount: effect.Schema.Number,
1813
+ version: effect.Schema.optional(effect.Schema.Literal(2)),
1814
+ transitionVersion: effect.Schema.optional(effect.Schema.Number),
1815
+ previousState: effect.Schema.optional(HealthState),
1816
+ state: effect.Schema.optional(HealthState),
1817
+ reasonCodes: effect.Schema.optional(effect.Schema.Array(effect.Schema.String)),
1818
+ acceptedAt: effect.Schema.optional(effect.Schema.String)
1520
1819
  })
1521
1820
  });
1522
1821
  /** Replaces socket.io `issues:snapshot` */
@@ -4609,11 +4908,42 @@ const HygieneReport = effect.Schema.Struct({
4609
4908
  const OVERDECK_DASHBOARD_PROTOCOL_VERSION = 1;
4610
4909
  const OVERDECK_AGENT_PROTOCOL_VERSION = 1;
4611
4910
  //#endregion
4911
+ //#region src/deploy.ts
4912
+ const DeployStalenessSnapshot = effect.Schema.Struct({
4913
+ status: effect.Schema.Literals([
4914
+ "fresh",
4915
+ "stale",
4916
+ "unknown"
4917
+ ]),
4918
+ buildCommit: effect.Schema.NullOr(effect.Schema.String),
4919
+ originMainSha: effect.Schema.NullOr(effect.Schema.String),
4920
+ behindTotal: effect.Schema.NullOr(effect.Schema.Number),
4921
+ behindBuildInputs: effect.Schema.NullOr(effect.Schema.Number),
4922
+ originMainLastCommitAt: effect.Schema.NullOr(effect.Schema.Number),
4923
+ originMainLastBuildInputCommitAt: effect.Schema.NullOr(effect.Schema.Number),
4924
+ computedAt: effect.Schema.Number,
4925
+ reason: effect.Schema.optional(effect.Schema.String)
4926
+ });
4927
+ //#endregion
4928
+ //#region src/issue-sort.ts
4929
+ const collator = new Intl.Collator("en", {
4930
+ numeric: true,
4931
+ sensitivity: "base"
4932
+ });
4933
+ /**
4934
+ * Compares issue identifiers numerically within their prefix, so PAN-532 sorts
4935
+ * before PAN-2822. Every issue-id sort should use this comparator (PAN-2831).
4936
+ */
4937
+ function compareIssueIds(a, b) {
4938
+ return collator.compare(a, b);
4939
+ }
4940
+ //#endregion
4612
4941
  exports.Activity = Activity;
4613
4942
  exports.ActivityDetailedEvent = ActivityDetailedEvent;
4614
4943
  exports.ActivityEntryEvent = ActivityEntryEvent;
4615
4944
  exports.ActivityTtsEvent = ActivityTtsEvent;
4616
4945
  exports.ActivityUpdatedEvent = ActivityUpdatedEvent;
4946
+ exports.AdmissionState = AdmissionState;
4617
4947
  exports.AgentActivityChangedEvent = AgentActivityChangedEvent;
4618
4948
  exports.AgentChannelReply = AgentChannelReply;
4619
4949
  exports.AgentChannelReplyEvent = AgentChannelReplyEvent;
@@ -4622,6 +4952,9 @@ exports.AgentContextSaturationChangedEvent = AgentContextSaturationChangedEvent;
4622
4952
  exports.AgentCreatedEvent = AgentCreatedEvent;
4623
4953
  exports.AgentCurrentIssueSetEvent = AgentCurrentIssueSetEvent;
4624
4954
  exports.AgentEnrichmentChangedEvent = AgentEnrichmentChangedEvent;
4955
+ exports.AgentHealthKind = AgentHealthKind;
4956
+ exports.AgentHealthSnapshot = AgentHealthSnapshot;
4957
+ exports.AgentHealthStatus = AgentHealthStatus;
4625
4958
  exports.AgentHeartbeatDeadEvent = AgentHeartbeatDeadEvent;
4626
4959
  exports.AgentId = AgentId;
4627
4960
  exports.AgentMessageReceivedEvent = AgentMessageReceivedEvent;
@@ -4707,6 +5040,7 @@ exports.DashboardLifecycleFailedEvent = DashboardLifecycleFailedEvent;
4707
5040
  exports.DashboardLifecycleStartedEvent = DashboardLifecycleStartedEvent;
4708
5041
  exports.DashboardSnapshot = DashboardSnapshot;
4709
5042
  exports.DeepWipeRpc = DeepWipeRpc;
5043
+ exports.DeployStalenessSnapshot = DeployStalenessSnapshot;
4710
5044
  exports.DiscoveredSessionSnapshot = DiscoveredSessionSnapshot;
4711
5045
  exports.DomainEvent = DomainEvent;
4712
5046
  exports.EDITORS = EDITORS;
@@ -4760,6 +5094,10 @@ exports.GetSnapshotRpc = GetSnapshotRpc;
4760
5094
  exports.GetWorkspaceDetailRpc = GetWorkspaceDetailRpc;
4761
5095
  exports.GlobalContextLayerRecord = GlobalContextLayerRecord;
4762
5096
  exports.GlobalContextLayerTarget = GlobalContextLayerTarget;
5097
+ exports.HealthReason = HealthReason;
5098
+ exports.HealthState = HealthState;
5099
+ exports.HostHealthMetrics = HostHealthMetrics;
5100
+ exports.HostPlatform = HostPlatform;
4763
5101
  exports.HygieneFinding = HygieneFinding;
4764
5102
  exports.HygienePullRequest = HygienePullRequest;
4765
5103
  exports.HygieneReport = HygieneReport;
@@ -4769,6 +5107,8 @@ exports.IssueStatusChangedEvent = IssueStatusChangedEvent;
4769
5107
  exports.IssueTransitionedEvent = IssueTransitionedEvent;
4770
5108
  exports.IssuesSnapshotEvent = IssuesSnapshotEvent;
4771
5109
  exports.IssuesUpdatedEvent = IssuesUpdatedEvent;
5110
+ exports.LegacySystemHealthSummary = LegacySystemHealthSummary;
5111
+ exports.LegacyWebhookRelaySummary = LegacyWebhookRelaySummary;
4772
5112
  exports.ListDiscoveredSessionsRpc = ListDiscoveredSessionsRpc;
4773
5113
  exports.ListSessionsFeedRpc = ListSessionsFeedRpc;
4774
5114
  exports.MAX_CHANNEL_REPLY_ARTIFACT_LABEL_LENGTH = MAX_CHANNEL_REPLY_ARTIFACT_LABEL_LENGTH;
@@ -4850,6 +5190,8 @@ exports.ScanStartedEvent = ScanStartedEvent;
4850
5190
  exports.SearchConversationsRpc = SearchConversationsRpc;
4851
5191
  exports.SendTerminalInputRpc = SendTerminalInputRpc;
4852
5192
  exports.SequenceNumber = SequenceNumber;
5193
+ exports.ServiceHealthSnapshot = ServiceHealthSnapshot;
5194
+ exports.ServiceHealthStatus = ServiceHealthStatus;
4853
5195
  exports.SessionNode = SessionNode;
4854
5196
  exports.SessionNodePresence = SessionNodePresence;
4855
5197
  exports.SessionNodeType = SessionNodeType;
@@ -4861,6 +5203,7 @@ exports.ShadowInferenceUpdateEvent = ShadowInferenceUpdateEvent;
4861
5203
  exports.ShellOpenInEditorRpc = ShellOpenInEditorRpc;
4862
5204
  exports.SpecialistCompletedEvent = SpecialistCompletedEvent;
4863
5205
  exports.SpecialistFailedEvent = SpecialistFailedEvent;
5206
+ exports.SpecialistLifecycle = SpecialistLifecycle;
4864
5207
  exports.SpecialistStartedEvent = SpecialistStartedEvent;
4865
5208
  exports.StartAgentRpc = StartAgentRpc;
4866
5209
  exports.StartPlanningRpc = StartPlanningRpc;
@@ -4872,7 +5215,9 @@ exports.SubscribeIssueEventsRpc = SubscribeIssueEventsRpc;
4872
5215
  exports.SubscribeProjectSessionTreeRpc = SubscribeProjectSessionTreeRpc;
4873
5216
  exports.SubscribeTerminalRpc = SubscribeTerminalRpc;
4874
5217
  exports.SubstrateBugFiledEvent = SubstrateBugFiledEvent;
5218
+ exports.SystemHealthConsumer = SystemHealthConsumer;
4875
5219
  exports.SystemHealthSeverityChangedEvent = SystemHealthSeverityChangedEvent;
5220
+ exports.SystemHealthSnapshot = SystemHealthSnapshot;
4876
5221
  exports.SystemHeartbeatEvent = SystemHeartbeatEvent;
4877
5222
  exports.TerminalCloseRpc = TerminalCloseRpc;
4878
5223
  exports.TerminalOpenRpc = TerminalOpenRpc;
@@ -4902,6 +5247,7 @@ exports.WorkspaceDetail = WorkspaceDetail;
4902
5247
  exports.WorkspaceWipeStartedEvent = WorkspaceWipeStartedEvent;
4903
5248
  exports.applyEvent = applyEvent;
4904
5249
  exports.applyEvents = applyEvents;
5250
+ exports.compareIssueIds = compareIssueIds;
4905
5251
  exports.decodeFlywheelStats = decodeFlywheelStats;
4906
5252
  exports.encodeFlywheelStats = encodeFlywheelStats;
4907
5253
  exports.getHarness = getHarness;
@@ -4913,6 +5259,7 @@ exports.isChannelReplyKind = isChannelReplyKind;
4913
5259
  exports.isTerminalTurnDiffSummaryStatus = isTerminalTurnDiffSummaryStatus;
4914
5260
  exports.normalizeChannelReplyPayload = normalizeChannelReplyPayload;
4915
5261
  exports.omitTurnDiffSummariesForAgent = omitTurnDiffSummariesForAgent;
5262
+ exports.projectLegacySystemHealthSummary = projectLegacySystemHealthSummary;
4916
5263
  exports.syncSnapshot = syncSnapshot;
4917
5264
  exports.trimMemoryObservations = trimMemoryObservations;
4918
5265
  exports.trimTurnDiffSummaries = trimTurnDiffSummaries;