diff --git a/apps/server/src/routes/rpc/services/maintenance/__tests__/maintenance.test.ts b/apps/server/src/routes/rpc/services/maintenance/__tests__/maintenance.test.ts index b24b23b4..24fa218b 100644 --- a/apps/server/src/routes/rpc/services/maintenance/__tests__/maintenance.test.ts +++ b/apps/server/src/routes/rpc/services/maintenance/__tests__/maintenance.test.ts @@ -887,6 +887,7 @@ describe("MaintenanceService.UpdateMaintenance", () => { { id: String(testMaintenanceToUpdateId), pageComponentIds: ["1"], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -969,6 +970,7 @@ describe("MaintenanceService.UpdateMaintenance", () => { { id: String(testMaintenanceToUpdateId), pageComponentIds: ["99999"], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -985,6 +987,7 @@ describe("MaintenanceService.UpdateMaintenance", () => { String(testPageComponentId), String(testPage2ComponentId), ], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -1019,6 +1022,177 @@ describe("MaintenanceService.UpdateMaintenance", () => { const data = await res.json(); expect(data.message).toContain("Start time (from) must be before end time"); }); + + test("title-only update preserves component associations and pageId", async () => { + const beforeAssociations = await db + .select() + .from(maintenancesToPageComponents) + .where( + eq( + maintenancesToPageComponents.maintenanceId, + testMaintenanceToUpdateId, + ), + ) + .all(); + const beforeRecord = await db + .select() + .from(maintenance) + .where(eq(maintenance.id, testMaintenanceToUpdateId)) + .get(); + + const res = await connectRequest( + "UpdateMaintenance", + { + id: String(testMaintenanceToUpdateId), + title: `${TEST_PREFIX}-title-only`, + }, + { "x-openstatus-key": "1" }, + ); + + expect(res.status).toBe(200); + + const afterAssociations = await db + .select() + .from(maintenancesToPageComponents) + .where( + eq( + maintenancesToPageComponents.maintenanceId, + testMaintenanceToUpdateId, + ), + ) + .all(); + const afterRecord = await db + .select() + .from(maintenance) + .where(eq(maintenance.id, testMaintenanceToUpdateId)) + .get(); + + expect(afterAssociations).toEqual(beforeAssociations); + expect(afterRecord?.pageId).toBe(beforeRecord?.pageId); + + // Restore title + await db + .update(maintenance) + .set({ title: `${TEST_PREFIX}-to-update` }) + .where(eq(maintenance.id, testMaintenanceToUpdateId)); + }); + + test("pageComponentIds ignored when updatePageComponentIds is not set", async () => { + const beforeAssociations = await db + .select() + .from(maintenancesToPageComponents) + .where( + eq( + maintenancesToPageComponents.maintenanceId, + testMaintenanceToUpdateId, + ), + ) + .all(); + + const res = await connectRequest( + "UpdateMaintenance", + { + id: String(testMaintenanceToUpdateId), + pageComponentIds: ["99999"], + }, + { "x-openstatus-key": "1" }, + ); + + expect(res.status).toBe(200); + + const afterAssociations = await db + .select() + .from(maintenancesToPageComponents) + .where( + eq( + maintenancesToPageComponents.maintenanceId, + testMaintenanceToUpdateId, + ), + ) + .all(); + + expect(afterAssociations).toEqual(beforeAssociations); + }); + + test("deprecated pageId field is ignored on update", async () => { + const beforeRecord = await db + .select() + .from(maintenance) + .where(eq(maintenance.id, testMaintenanceToUpdateId)) + .get(); + + const res = await connectRequest( + "UpdateMaintenance", + { + id: String(testMaintenanceToUpdateId), + pageId: "999", + }, + { "x-openstatus-key": "1" }, + ); + + expect(res.status).toBe(200); + + const afterRecord = await db + .select() + .from(maintenance) + .where(eq(maintenance.id, testMaintenanceToUpdateId)) + .get(); + + expect(afterRecord?.pageId).toBe(beforeRecord?.pageId); + }); + + test("clears pageId when removing all components", async () => { + const tempRecord = await db + .insert(maintenance) + .values({ + workspaceId: 1, + pageId: 1, + title: `${TEST_PREFIX}-clear-pageid`, + message: "Temp maintenance for clear test", + from: new Date(Date.now() + 24 * 60 * 60 * 1000), + to: new Date(Date.now() + 25 * 60 * 60 * 1000), + }) + .returning() + .get(); + + await db.insert(maintenancesToPageComponents).values({ + maintenanceId: tempRecord.id, + pageComponentId: testPageComponentId, + }); + + try { + const res = await connectRequest( + "UpdateMaintenance", + { + id: String(tempRecord.id), + pageComponentIds: [], + updatePageComponentIds: true, + }, + { "x-openstatus-key": "1" }, + ); + + expect(res.status).toBe(200); + + const afterRecord = await db + .select() + .from(maintenance) + .where(eq(maintenance.id, tempRecord.id)) + .get(); + expect(afterRecord?.pageId).toBeNull(); + + const afterAssociations = await db + .select() + .from(maintenancesToPageComponents) + .where(eq(maintenancesToPageComponents.maintenanceId, tempRecord.id)) + .all(); + expect(afterAssociations).toHaveLength(0); + } finally { + await db + .delete(maintenancesToPageComponents) + .where(eq(maintenancesToPageComponents.maintenanceId, tempRecord.id)); + await db.delete(maintenance).where(eq(maintenance.id, tempRecord.id)); + } + }); }); describe("MaintenanceService.DeleteMaintenance", () => { diff --git a/apps/server/src/routes/rpc/services/maintenance/index.ts b/apps/server/src/routes/rpc/services/maintenance/index.ts index 5693a06e..6863aad8 100644 --- a/apps/server/src/routes/rpc/services/maintenance/index.ts +++ b/apps/server/src/routes/rpc/services/maintenance/index.ts @@ -377,33 +377,6 @@ export const maintenanceServiceImpl: ServiceImpl = { // Update maintenance and associations in a transaction const updatedMaintenance = await db.transaction(async (tx) => { - // Validate page component IDs - const validatedComponents = await validatePageComponentIds( - req.pageComponentIds, - workspaceId, - tx, - ); - - // Determine effective pageId - let effectivePageId = record.pageId; - if (req.pageId && req.pageId.trim() !== "") { - effectivePageId = Number(req.pageId); - await validatePageExists(effectivePageId, workspaceId, tx); - } - - // Validate that components belong to the same page - if ( - validatedComponents.pageId !== null && - effectivePageId !== null && - validatedComponents.pageId !== effectivePageId - ) { - throw pageIdComponentMismatchError( - String(effectivePageId), - String(validatedComponents.pageId), - ); - } - - // Build update values const updateValues: Record = { updatedAt: new Date(), }; @@ -424,16 +397,21 @@ export const maintenanceServiceImpl: ServiceImpl = { updateValues.to = toDate; } - if (req.pageId && req.pageId.trim() !== "") { - updateValues.pageId = effectivePageId; - } + if (req.updatePageComponentIds) { + const validatedComponents = await validatePageComponentIds( + req.pageComponentIds, + workspaceId, + tx, + ); - // Update page component associations - await updatePageComponentAssociations( - record.id, - validatedComponents.componentIds, - tx, - ); + updateValues.pageId = validatedComponents.pageId; + + await updatePageComponentAssociations( + record.id, + validatedComponents.componentIds, + tx, + ); + } // Update the maintenance const updated = await tx diff --git a/apps/server/src/routes/rpc/services/notification/__tests__/notification.test.ts b/apps/server/src/routes/rpc/services/notification/__tests__/notification.test.ts index 0cd061dc..2053d0db 100644 --- a/apps/server/src/routes/rpc/services/notification/__tests__/notification.test.ts +++ b/apps/server/src/routes/rpc/services/notification/__tests__/notification.test.ts @@ -533,6 +533,7 @@ describe("NotificationService.UpdateNotification", () => { { id: String(testNotificationToUpdateId), monitorIds: ["1"], + updateMonitorIds: true, }, { "x-openstatus-key": "1" }, ); @@ -549,6 +550,7 @@ describe("NotificationService.UpdateNotification", () => { { id: String(testNotificationToUpdateId), monitorIds: [], + updateMonitorIds: true, }, { "x-openstatus-key": "1" }, ); @@ -621,12 +623,81 @@ describe("NotificationService.UpdateNotification", () => { { id: String(testNotificationToUpdateId), monitorIds: ["99999"], + updateMonitorIds: true, }, { "x-openstatus-key": "1" }, ); expect(res.status).toBe(404); }); + + test("name-only update preserves monitor associations", async () => { + const beforeAssociations = await db + .select() + .from(notificationsToMonitors) + .where( + eq(notificationsToMonitors.notificationId, testNotificationToUpdateId), + ) + .all(); + + const res = await connectRequest( + "UpdateNotification", + { + id: String(testNotificationToUpdateId), + name: `${TEST_PREFIX}-name-only`, + }, + { "x-openstatus-key": "1" }, + ); + + expect(res.status).toBe(200); + + const afterAssociations = await db + .select() + .from(notificationsToMonitors) + .where( + eq(notificationsToMonitors.notificationId, testNotificationToUpdateId), + ) + .all(); + + expect(afterAssociations).toEqual(beforeAssociations); + + // Restore name + await db + .update(notification) + .set({ name: `${TEST_PREFIX}-to-update` }) + .where(eq(notification.id, testNotificationToUpdateId)); + }); + + test("monitorIds ignored when updateMonitorIds is not set", async () => { + const beforeAssociations = await db + .select() + .from(notificationsToMonitors) + .where( + eq(notificationsToMonitors.notificationId, testNotificationToUpdateId), + ) + .all(); + + const res = await connectRequest( + "UpdateNotification", + { + id: String(testNotificationToUpdateId), + monitorIds: ["99999"], + }, + { "x-openstatus-key": "1" }, + ); + + expect(res.status).toBe(200); + + const afterAssociations = await db + .select() + .from(notificationsToMonitors) + .where( + eq(notificationsToMonitors.notificationId, testNotificationToUpdateId), + ) + .all(); + + expect(afterAssociations).toEqual(beforeAssociations); + }); }); describe("NotificationService.DeleteNotification", () => { diff --git a/apps/server/src/routes/rpc/services/notification/index.ts b/apps/server/src/routes/rpc/services/notification/index.ts index cb14fe4d..6a5e3669 100644 --- a/apps/server/src/routes/rpc/services/notification/index.ts +++ b/apps/server/src/routes/rpc/services/notification/index.ts @@ -293,14 +293,6 @@ export const notificationServiceImpl: ServiceImpl = // Update notification in a transaction const updatedNotification = await db.transaction(async (tx) => { - // Validate monitor IDs - const validMonitorIds = await validateMonitorIds( - req.monitorIds, - workspaceId, - tx, - ); - - // Build update values const updateValues: Record = { updatedAt: new Date(), }; @@ -340,8 +332,14 @@ export const notificationServiceImpl: ServiceImpl = ); } - // Update monitor associations - await updateMonitorAssociations(record.id, validMonitorIds, tx); + if (req.updateMonitorIds) { + const validMonitorIds = await validateMonitorIds( + req.monitorIds, + workspaceId, + tx, + ); + await updateMonitorAssociations(record.id, validMonitorIds, tx); + } // Update the notification const updated = await tx diff --git a/apps/server/src/routes/rpc/services/status-report/__tests__/status-report.test.ts b/apps/server/src/routes/rpc/services/status-report/__tests__/status-report.test.ts index 2ddb0962..1acf3f9b 100644 --- a/apps/server/src/routes/rpc/services/status-report/__tests__/status-report.test.ts +++ b/apps/server/src/routes/rpc/services/status-report/__tests__/status-report.test.ts @@ -972,6 +972,7 @@ describe("StatusReportService.UpdateStatusReport", () => { { id: String(testStatusReportToUpdateId), pageComponentIds: ["1"], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -1052,6 +1053,7 @@ describe("StatusReportService.UpdateStatusReport", () => { { id: String(testStatusReportToUpdateId), pageComponentIds: ["99999"], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -1068,6 +1070,7 @@ describe("StatusReportService.UpdateStatusReport", () => { String(testPageComponentId), String(testPage2ComponentId), ], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -1094,6 +1097,7 @@ describe("StatusReportService.UpdateStatusReport", () => { { id: String(testStatusReportToUpdateId), pageComponentIds: [String(testPage2ComponentId)], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -1114,6 +1118,7 @@ describe("StatusReportService.UpdateStatusReport", () => { { id: String(testStatusReportToUpdateId), pageComponentIds: [String(testPageComponentId)], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -1144,6 +1149,7 @@ describe("StatusReportService.UpdateStatusReport", () => { { id: String(tempReport.id), pageComponentIds: [], + updatePageComponentIds: true, }, { "x-openstatus-key": "1" }, ); @@ -1165,6 +1171,97 @@ describe("StatusReportService.UpdateStatusReport", () => { await db.delete(statusReport).where(eq(statusReport.id, tempReport.id)); } }); + + test("title-only update preserves component associations and pageId", async () => { + const beforeAssociations = await db + .select() + .from(statusReportsToPageComponents) + .where( + eq( + statusReportsToPageComponents.statusReportId, + testStatusReportToUpdateId, + ), + ) + .all(); + const beforeReport = await db + .select() + .from(statusReport) + .where(eq(statusReport.id, testStatusReportToUpdateId)) + .get(); + + const res = await connectRequest( + "UpdateStatusReport", + { + id: String(testStatusReportToUpdateId), + title: `${TEST_PREFIX}-title-only`, + }, + { "x-openstatus-key": "1" }, + ); + + expect(res.status).toBe(200); + + const afterAssociations = await db + .select() + .from(statusReportsToPageComponents) + .where( + eq( + statusReportsToPageComponents.statusReportId, + testStatusReportToUpdateId, + ), + ) + .all(); + const afterReport = await db + .select() + .from(statusReport) + .where(eq(statusReport.id, testStatusReportToUpdateId)) + .get(); + + expect(afterAssociations).toEqual(beforeAssociations); + expect(afterReport?.pageId).toBe(beforeReport?.pageId); + + // Restore title + await db + .update(statusReport) + .set({ title: `${TEST_PREFIX}-to-update` }) + .where(eq(statusReport.id, testStatusReportToUpdateId)); + }); + + test("pageComponentIds ignored when updatePageComponentIds is not set", async () => { + const beforeAssociations = await db + .select() + .from(statusReportsToPageComponents) + .where( + eq( + statusReportsToPageComponents.statusReportId, + testStatusReportToUpdateId, + ), + ) + .all(); + + const res = await connectRequest( + "UpdateStatusReport", + { + id: String(testStatusReportToUpdateId), + pageComponentIds: ["99999"], + }, + { "x-openstatus-key": "1" }, + ); + + expect(res.status).toBe(200); + + const afterAssociations = await db + .select() + .from(statusReportsToPageComponents) + .where( + eq( + statusReportsToPageComponents.statusReportId, + testStatusReportToUpdateId, + ), + ) + .all(); + + expect(afterAssociations).toEqual(beforeAssociations); + }); }); describe("StatusReportService.DeleteStatusReport", () => { diff --git a/apps/server/src/routes/rpc/services/status-report/index.ts b/apps/server/src/routes/rpc/services/status-report/index.ts index 07db3a9d..4f42bf8e 100644 --- a/apps/server/src/routes/rpc/services/status-report/index.ts +++ b/apps/server/src/routes/rpc/services/status-report/index.ts @@ -372,33 +372,30 @@ export const statusReportServiceImpl: ServiceImpl = // Update report, associations in a transaction const updatedReport = await db.transaction(async (tx) => { - // Validate page component IDs inside transaction to prevent TOCTOU race condition - // Allows empty array to clear associations; ensures all components belong to same page - const validatedComponents = await validatePageComponentIds( - req.pageComponentIds, - workspaceId, - tx, - ); - - // Build update values const updateValues: Record = { updatedAt: new Date(), - // Set pageId from validated components (null if no components) - pageId: validatedComponents.pageId, }; if (req.title !== undefined && req.title !== "") { updateValues.title = req.title; } - // Always update page component associations (empty array clears all) - await updatePageComponentAssociations( - report.id, - validatedComponents.componentIds, - tx, - ); + if (req.updatePageComponentIds) { + const validatedComponents = await validatePageComponentIds( + req.pageComponentIds, + workspaceId, + tx, + ); + + updateValues.pageId = validatedComponents.pageId; + + await updatePageComponentAssociations( + report.id, + validatedComponents.componentIds, + tx, + ); + } - // Update the report const updated = await tx .update(statusReport) .set(updateValues) diff --git a/packages/proto/api/openstatus/maintenance/v1/service.proto b/packages/proto/api/openstatus/maintenance/v1/service.proto index 1503cbd7..f02058c8 100644 --- a/packages/proto/api/openstatus/maintenance/v1/service.proto +++ b/packages/proto/api/openstatus/maintenance/v1/service.proto @@ -128,11 +128,16 @@ message UpdateMaintenanceRequest { // New end time (RFC 3339 format, optional). optional string to = 5 [(buf.validate.field).string.pattern = "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,9})?(Z|[+-]\\d{2}:\\d{2})$"]; - // New page ID (optional). - optional string page_id = 6; + // Deprecated: page_id is now derived from page_component_ids. + optional string page_id = 6 [deprecated = true]; // New list of page component IDs (optional, replaces existing list). repeated string page_component_ids = 7; + + // Set to true to update page component associations. + // When true, page_component_ids replaces the existing list (empty clears all). + // When false or unset, page_component_ids is ignored and existing associations are preserved. + optional bool update_page_component_ids = 8; } // UpdateMaintenanceResponse is the response after updating a maintenance window. diff --git a/packages/proto/api/openstatus/notification/v1/service.proto b/packages/proto/api/openstatus/notification/v1/service.proto index 8c7fb213..cf04fd45 100644 --- a/packages/proto/api/openstatus/notification/v1/service.proto +++ b/packages/proto/api/openstatus/notification/v1/service.proto @@ -108,6 +108,11 @@ message UpdateNotificationRequest { optional NotificationData data = 3; // Updated monitor IDs to associate. repeated string monitor_ids = 4; + + // Set to true to update monitor associations. + // When true, monitor_ids replaces the existing list (empty clears all). + // When false or unset, monitor_ids is ignored and existing associations are preserved. + optional bool update_monitor_ids = 5; } // UpdateNotificationResponse is the response after updating a notification channel. diff --git a/packages/proto/api/openstatus/status_report/v1/service.proto b/packages/proto/api/openstatus/status_report/v1/service.proto index ad7dae99..4152797d 100644 --- a/packages/proto/api/openstatus/status_report/v1/service.proto +++ b/packages/proto/api/openstatus/status_report/v1/service.proto @@ -126,6 +126,11 @@ message UpdateStatusReportRequest { // New list of page component IDs (optional, replaces existing list). repeated string page_component_ids = 3; + + // Set to true to update page component associations. + // When true, page_component_ids replaces the existing list (empty clears all). + // When false or unset, page_component_ids is ignored and existing associations are preserved. + optional bool update_page_component_ids = 4; } // UpdateStatusReportResponse is the response after updating a status report. diff --git a/packages/proto/gen/ts/openstatus/maintenance/v1/service_pb.ts b/packages/proto/gen/ts/openstatus/maintenance/v1/service_pb.ts index aa4aa2aa..6b5ea8e4 100644 --- a/packages/proto/gen/ts/openstatus/maintenance/v1/service_pb.ts +++ b/packages/proto/gen/ts/openstatus/maintenance/v1/service_pb.ts @@ -14,7 +14,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file openstatus/maintenance/v1/service.proto. */ export const file_openstatus_maintenance_v1_service: GenFile = /*@__PURE__*/ - fileDesc("CidvcGVuc3RhdHVzL21haW50ZW5hbmNlL3YxL3NlcnZpY2UucHJvdG8SGW9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEiqAMKGENyZWF0ZU1haW50ZW5hbmNlUmVxdWVzdBIyCgV0aXRsZRgBIAEoCUIjukcWOhQSEkRhdGFiYXNlIE1pZ3JhdGlvbrpIB3IFEAEYgAISGAoHbWVzc2FnZRgCIAEoCUIHukgEcgIQARJ0CgRmcm9tGAMgASgJQma6Rxg6FhIUMjAyNC0wMy0wMVQwMjowMDowMFq6SEhyRjJEXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGR7MSw5fSk/KFp8WystXVxkezJ9OlxkezJ9KSQScgoCdG8YBCABKAlCZrpHGDoWEhQyMDI0LTAzLTAxVDA2OjAwOjAwWrpISHJGMkReXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0oXC5cZHsxLDl9KT8oWnxbKy1dXGR7Mn06XGR7Mn0pJBIYCgdwYWdlX2lkGAUgASgJQge6SARyAhABEhoKEnBhZ2VfY29tcG9uZW50X2lkcxgGIAMoCRITCgZub3RpZnkYByABKAhIAIgBAUIJCgdfbm90aWZ5IlgKGUNyZWF0ZU1haW50ZW5hbmNlUmVzcG9uc2USOwoLbWFpbnRlbmFuY2UYASABKAsyJi5vcGVuc3RhdHVzLm1haW50ZW5hbmNlLnYxLk1haW50ZW5hbmNlIiwKFUdldE1haW50ZW5hbmNlUmVxdWVzdBITCgJpZBgBIAEoCUIHukgEcgIQASJVChZHZXRNYWludGVuYW5jZVJlc3BvbnNlEjsKC21haW50ZW5hbmNlGAEgASgLMiYub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5NYWludGVuYW5jZSKNAQoXTGlzdE1haW50ZW5hbmNlc1JlcXVlc3QSHQoFbGltaXQYASABKAVCCbpIBhoEGGQoAUgAiAEBEhwKBm9mZnNldBgCIAEoBUIHukgEGgIoAEgBiAEBEhQKB3BhZ2VfaWQYAyABKAlIAogBAUIICgZfbGltaXRCCQoHX29mZnNldEIKCghfcGFnZV9pZCJzChhMaXN0TWFpbnRlbmFuY2VzUmVzcG9uc2USQwoMbWFpbnRlbmFuY2VzGAEgAygLMi0ub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5NYWludGVuYW5jZVN1bW1hcnkSEgoKdG90YWxfc2l6ZRgCIAEoBSKHAwoYVXBkYXRlTWFpbnRlbmFuY2VSZXF1ZXN0EhMKAmlkGAEgASgJQge6SARyAhABEh4KBXRpdGxlGAIgASgJQgq6SAdyBRABGIACSACIAQESFAoHbWVzc2FnZRgDIAEoCUgBiAEBEl4KBGZyb20YBCABKAlCS7pISHJGMkReXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0oXC5cZHsxLDl9KT8oWnxbKy1dXGR7Mn06XGR7Mn0pJEgCiAEBElwKAnRvGAUgASgJQku6SEhyRjJEXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGR7MSw5fSk/KFp8WystXVxkezJ9OlxkezJ9KSRIA4gBARIUCgdwYWdlX2lkGAYgASgJSASIAQESGgoScGFnZV9jb21wb25lbnRfaWRzGAcgAygJQggKBl90aXRsZUIKCghfbWVzc2FnZUIHCgVfZnJvbUIFCgNfdG9CCgoIX3BhZ2VfaWQiWAoZVXBkYXRlTWFpbnRlbmFuY2VSZXNwb25zZRI7CgttYWludGVuYW5jZRgBIAEoCzImLm9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEuTWFpbnRlbmFuY2UiLwoYRGVsZXRlTWFpbnRlbmFuY2VSZXF1ZXN0EhMKAmlkGAEgASgJQge6SARyAhABIiwKGURlbGV0ZU1haW50ZW5hbmNlUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCDKTBQoSTWFpbnRlbmFuY2VTZXJ2aWNlEn4KEUNyZWF0ZU1haW50ZW5hbmNlEjMub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5DcmVhdGVNYWludGVuYW5jZVJlcXVlc3QaNC5vcGVuc3RhdHVzLm1haW50ZW5hbmNlLnYxLkNyZWF0ZU1haW50ZW5hbmNlUmVzcG9uc2USegoOR2V0TWFpbnRlbmFuY2USMC5vcGVuc3RhdHVzLm1haW50ZW5hbmNlLnYxLkdldE1haW50ZW5hbmNlUmVxdWVzdBoxLm9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEuR2V0TWFpbnRlbmFuY2VSZXNwb25zZSIDkAIBEoABChBMaXN0TWFpbnRlbmFuY2VzEjIub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5MaXN0TWFpbnRlbmFuY2VzUmVxdWVzdBozLm9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEuTGlzdE1haW50ZW5hbmNlc1Jlc3BvbnNlIgOQAgESfgoRVXBkYXRlTWFpbnRlbmFuY2USMy5vcGVuc3RhdHVzLm1haW50ZW5hbmNlLnYxLlVwZGF0ZU1haW50ZW5hbmNlUmVxdWVzdBo0Lm9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEuVXBkYXRlTWFpbnRlbmFuY2VSZXNwb25zZRJ+ChFEZWxldGVNYWludGVuYW5jZRIzLm9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEuRGVsZXRlTWFpbnRlbmFuY2VSZXF1ZXN0GjQub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5EZWxldGVNYWludGVuYW5jZVJlc3BvbnNlQltaWWdpdGh1Yi5jb20vb3BlbnN0YXR1c2hxL29wZW5zdGF0dXMvcGFja2FnZXMvcHJvdG8vb3BlbnN0YXR1cy9tYWludGVuYW5jZS92MTttYWludGVuYW5jZXYxYgZwcm90bzM", [file_buf_validate_validate, file_gnostic_openapi_v3_annotations, file_openstatus_maintenance_v1_maintenance]); + fileDesc("CidvcGVuc3RhdHVzL21haW50ZW5hbmNlL3YxL3NlcnZpY2UucHJvdG8SGW9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEiqAMKGENyZWF0ZU1haW50ZW5hbmNlUmVxdWVzdBIyCgV0aXRsZRgBIAEoCUIjukcWOhQSEkRhdGFiYXNlIE1pZ3JhdGlvbrpIB3IFEAEYgAISGAoHbWVzc2FnZRgCIAEoCUIHukgEcgIQARJ0CgRmcm9tGAMgASgJQma6Rxg6FhIUMjAyNC0wMy0wMVQwMjowMDowMFq6SEhyRjJEXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGR7MSw5fSk/KFp8WystXVxkezJ9OlxkezJ9KSQScgoCdG8YBCABKAlCZrpHGDoWEhQyMDI0LTAzLTAxVDA2OjAwOjAwWrpISHJGMkReXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0oXC5cZHsxLDl9KT8oWnxbKy1dXGR7Mn06XGR7Mn0pJBIYCgdwYWdlX2lkGAUgASgJQge6SARyAhABEhoKEnBhZ2VfY29tcG9uZW50X2lkcxgGIAMoCRITCgZub3RpZnkYByABKAhIAIgBAUIJCgdfbm90aWZ5IlgKGUNyZWF0ZU1haW50ZW5hbmNlUmVzcG9uc2USOwoLbWFpbnRlbmFuY2UYASABKAsyJi5vcGVuc3RhdHVzLm1haW50ZW5hbmNlLnYxLk1haW50ZW5hbmNlIiwKFUdldE1haW50ZW5hbmNlUmVxdWVzdBITCgJpZBgBIAEoCUIHukgEcgIQASJVChZHZXRNYWludGVuYW5jZVJlc3BvbnNlEjsKC21haW50ZW5hbmNlGAEgASgLMiYub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5NYWludGVuYW5jZSKNAQoXTGlzdE1haW50ZW5hbmNlc1JlcXVlc3QSHQoFbGltaXQYASABKAVCCbpIBhoEGGQoAUgAiAEBEhwKBm9mZnNldBgCIAEoBUIHukgEGgIoAEgBiAEBEhQKB3BhZ2VfaWQYAyABKAlIAogBAUIICgZfbGltaXRCCQoHX29mZnNldEIKCghfcGFnZV9pZCJzChhMaXN0TWFpbnRlbmFuY2VzUmVzcG9uc2USQwoMbWFpbnRlbmFuY2VzGAEgAygLMi0ub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5NYWludGVuYW5jZVN1bW1hcnkSEgoKdG90YWxfc2l6ZRgCIAEoBSLRAwoYVXBkYXRlTWFpbnRlbmFuY2VSZXF1ZXN0EhMKAmlkGAEgASgJQge6SARyAhABEh4KBXRpdGxlGAIgASgJQgq6SAdyBRABGIACSACIAQESFAoHbWVzc2FnZRgDIAEoCUgBiAEBEl4KBGZyb20YBCABKAlCS7pISHJGMkReXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0oXC5cZHsxLDl9KT8oWnxbKy1dXGR7Mn06XGR7Mn0pJEgCiAEBElwKAnRvGAUgASgJQku6SEhyRjJEXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGR7MSw5fSk/KFp8WystXVxkezJ9OlxkezJ9KSRIA4gBARIYCgdwYWdlX2lkGAYgASgJQgIYAUgEiAEBEhoKEnBhZ2VfY29tcG9uZW50X2lkcxgHIAMoCRImChl1cGRhdGVfcGFnZV9jb21wb25lbnRfaWRzGAggASgISAWIAQFCCAoGX3RpdGxlQgoKCF9tZXNzYWdlQgcKBV9mcm9tQgUKA190b0IKCghfcGFnZV9pZEIcChpfdXBkYXRlX3BhZ2VfY29tcG9uZW50X2lkcyJYChlVcGRhdGVNYWludGVuYW5jZVJlc3BvbnNlEjsKC21haW50ZW5hbmNlGAEgASgLMiYub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5NYWludGVuYW5jZSIvChhEZWxldGVNYWludGVuYW5jZVJlcXVlc3QSEwoCaWQYASABKAlCB7pIBHICEAEiLAoZRGVsZXRlTWFpbnRlbmFuY2VSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIMpMFChJNYWludGVuYW5jZVNlcnZpY2USfgoRQ3JlYXRlTWFpbnRlbmFuY2USMy5vcGVuc3RhdHVzLm1haW50ZW5hbmNlLnYxLkNyZWF0ZU1haW50ZW5hbmNlUmVxdWVzdBo0Lm9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEuQ3JlYXRlTWFpbnRlbmFuY2VSZXNwb25zZRJ6Cg5HZXRNYWludGVuYW5jZRIwLm9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEuR2V0TWFpbnRlbmFuY2VSZXF1ZXN0GjEub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5HZXRNYWludGVuYW5jZVJlc3BvbnNlIgOQAgESgAEKEExpc3RNYWludGVuYW5jZXMSMi5vcGVuc3RhdHVzLm1haW50ZW5hbmNlLnYxLkxpc3RNYWludGVuYW5jZXNSZXF1ZXN0GjMub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5MaXN0TWFpbnRlbmFuY2VzUmVzcG9uc2UiA5ACARJ+ChFVcGRhdGVNYWludGVuYW5jZRIzLm9wZW5zdGF0dXMubWFpbnRlbmFuY2UudjEuVXBkYXRlTWFpbnRlbmFuY2VSZXF1ZXN0GjQub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5VcGRhdGVNYWludGVuYW5jZVJlc3BvbnNlEn4KEURlbGV0ZU1haW50ZW5hbmNlEjMub3BlbnN0YXR1cy5tYWludGVuYW5jZS52MS5EZWxldGVNYWludGVuYW5jZVJlcXVlc3QaNC5vcGVuc3RhdHVzLm1haW50ZW5hbmNlLnYxLkRlbGV0ZU1haW50ZW5hbmNlUmVzcG9uc2VCW1pZZ2l0aHViLmNvbS9vcGVuc3RhdHVzaHEvb3BlbnN0YXR1cy9wYWNrYWdlcy9wcm90by9vcGVuc3RhdHVzL21haW50ZW5hbmNlL3YxO21haW50ZW5hbmNldjFiBnByb3RvMw", [file_buf_validate_validate, file_gnostic_openapi_v3_annotations, file_openstatus_maintenance_v1_maintenance]); /** * CreateMaintenanceRequest is the request to create a new maintenance window. @@ -247,9 +247,10 @@ export type UpdateMaintenanceRequest = Message<"openstatus.maintenance.v1.Update to?: string; /** - * New page ID (optional). + * Deprecated: page_id is now derived from page_component_ids. * - * @generated from field: optional string page_id = 6; + * @generated from field: optional string page_id = 6 [deprecated = true]; + * @deprecated */ pageId?: string; @@ -259,6 +260,15 @@ export type UpdateMaintenanceRequest = Message<"openstatus.maintenance.v1.Update * @generated from field: repeated string page_component_ids = 7; */ pageComponentIds: string[]; + + /** + * Set to true to update page component associations. + * When true, page_component_ids replaces the existing list (empty clears all). + * When false or unset, page_component_ids is ignored and existing associations are preserved. + * + * @generated from field: optional bool update_page_component_ids = 8; + */ + updatePageComponentIds?: boolean; }; /** diff --git a/packages/proto/gen/ts/openstatus/notification/v1/service_pb.ts b/packages/proto/gen/ts/openstatus/notification/v1/service_pb.ts index 3c13238c..d0143cb9 100644 --- a/packages/proto/gen/ts/openstatus/notification/v1/service_pb.ts +++ b/packages/proto/gen/ts/openstatus/notification/v1/service_pb.ts @@ -16,7 +16,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file openstatus/notification/v1/service.proto. */ export const file_openstatus_notification_v1_service: GenFile = /*@__PURE__*/ - fileDesc("CihvcGVuc3RhdHVzL25vdGlmaWNhdGlvbi92MS9zZXJ2aWNlLnByb3RvEhpvcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MSLzAQoZQ3JlYXRlTm90aWZpY2F0aW9uUmVxdWVzdBItCgRuYW1lGAEgASgJQh+6RxU6ExIRU2xhY2sgT3BzIENoYW5uZWy6SARyAhABEk4KCHByb3ZpZGVyGAIgASgOMjAub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuTm90aWZpY2F0aW9uUHJvdmlkZXJCCrpIB4IBBBABIAASQgoEZGF0YRgDIAEoCzIsLm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLk5vdGlmaWNhdGlvbkRhdGFCBrpIA8gBARITCgttb25pdG9yX2lkcxgEIAMoCSJcChpDcmVhdGVOb3RpZmljYXRpb25SZXNwb25zZRI+Cgxub3RpZmljYXRpb24YASABKAsyKC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb24iLQoWR2V0Tm90aWZpY2F0aW9uUmVxdWVzdBITCgJpZBgBIAEoCUIHukgEcgIQASJZChdHZXROb3RpZmljYXRpb25SZXNwb25zZRI+Cgxub3RpZmljYXRpb24YASABKAsyKC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb24ibAoYTGlzdE5vdGlmaWNhdGlvbnNSZXF1ZXN0Eh0KBWxpbWl0GAEgASgFQgm6SAYaBBhkKAFIAIgBARIcCgZvZmZzZXQYAiABKAVCB7pIBBoCKABIAYgBAUIICgZfbGltaXRCCQoHX29mZnNldCJ3ChlMaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEkYKDW5vdGlmaWNhdGlvbnMYASADKAsyLy5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb25TdW1tYXJ5EhIKCnRvdGFsX3NpemUYAiABKAUiqwEKGVVwZGF0ZU5vdGlmaWNhdGlvblJlcXVlc3QSEwoCaWQYASABKAlCB7pIBHICEAESEQoEbmFtZRgCIAEoCUgAiAEBEj8KBGRhdGEYAyABKAsyLC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb25EYXRhSAGIAQESEwoLbW9uaXRvcl9pZHMYBCADKAlCBwoFX25hbWVCBwoFX2RhdGEiXAoaVXBkYXRlTm90aWZpY2F0aW9uUmVzcG9uc2USPgoMbm90aWZpY2F0aW9uGAEgASgLMigub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuTm90aWZpY2F0aW9uIjAKGURlbGV0ZU5vdGlmaWNhdGlvblJlcXVlc3QSEwoCaWQYASABKAlCB7pIBHICEAEiLQoaRGVsZXRlTm90aWZpY2F0aW9uUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCKxAQobU2VuZFRlc3ROb3RpZmljYXRpb25SZXF1ZXN0Ek4KCHByb3ZpZGVyGAEgASgOMjAub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuTm90aWZpY2F0aW9uUHJvdmlkZXJCCrpIB4IBBBABIAASQgoEZGF0YRgCIAEoCzIsLm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLk5vdGlmaWNhdGlvbkRhdGFCBrpIA8gBASJdChxTZW5kVGVzdE5vdGlmaWNhdGlvblJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgSGgoNZXJyb3JfbWVzc2FnZRgCIAEoCUgAiAEBQhAKDl9lcnJvcl9tZXNzYWdlIh8KHUNoZWNrTm90aWZpY2F0aW9uTGltaXRSZXF1ZXN0ImEKHkNoZWNrTm90aWZpY2F0aW9uTGltaXRSZXNwb25zZRIVCg1saW1pdF9yZWFjaGVkGAEgASgIEhUKDWN1cnJlbnRfY291bnQYAiABKAUSEQoJbWF4X2NvdW50GAMgASgFMvEJChNOb3RpZmljYXRpb25TZXJ2aWNlEoMBChJDcmVhdGVOb3RpZmljYXRpb24SNS5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5DcmVhdGVOb3RpZmljYXRpb25SZXF1ZXN0GjYub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuQ3JlYXRlTm90aWZpY2F0aW9uUmVzcG9uc2USfwoPR2V0Tm90aWZpY2F0aW9uEjIub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuR2V0Tm90aWZpY2F0aW9uUmVxdWVzdBozLm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLkdldE5vdGlmaWNhdGlvblJlc3BvbnNlIgOQAgEShQEKEUxpc3ROb3RpZmljYXRpb25zEjQub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuTGlzdE5vdGlmaWNhdGlvbnNSZXF1ZXN0GjUub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuTGlzdE5vdGlmaWNhdGlvbnNSZXNwb25zZSIDkAIBEoMBChJVcGRhdGVOb3RpZmljYXRpb24SNS5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5VcGRhdGVOb3RpZmljYXRpb25SZXF1ZXN0GjYub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuVXBkYXRlTm90aWZpY2F0aW9uUmVzcG9uc2USgwEKEkRlbGV0ZU5vdGlmaWNhdGlvbhI1Lm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLkRlbGV0ZU5vdGlmaWNhdGlvblJlcXVlc3QaNi5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5EZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRKnAwoUU2VuZFRlc3ROb3RpZmljYXRpb24SNy5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5TZW5kVGVzdE5vdGlmaWNhdGlvblJlcXVlc3QaOC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5TZW5kVGVzdE5vdGlmaWNhdGlvblJlc3BvbnNlIpsCukeXAhqUAlNlbmRzIGEgdGVzdCBub3RpZmljYXRpb24gdG8gdGhlIHNwZWNpZmllZCBwcm92aWRlciB0byB2ZXJpZnkgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBpcyBjb3JyZWN0LiBUaGlzIGRvZXMgbm90IHJlcXVpcmUgYW4gZXhpc3Rpbmcgbm90aWZpY2F0aW9uIGNoYW5uZWwgLSBqdXN0IHByb3ZpZGUgdGhlIHByb3ZpZGVyIHR5cGUgYW5kIGl0cyBjb25maWd1cmF0aW9uIGRhdGEuIFJldHVybnMgc3VjY2VzcyBzdGF0dXMgYW5kIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHRlc3QgZmFpbGVkLhKUAQoWQ2hlY2tOb3RpZmljYXRpb25MaW1pdBI5Lm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLkNoZWNrTm90aWZpY2F0aW9uTGltaXRSZXF1ZXN0Gjoub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuQ2hlY2tOb3RpZmljYXRpb25MaW1pdFJlc3BvbnNlIgOQAgFCXVpbZ2l0aHViLmNvbS9vcGVuc3RhdHVzaHEvb3BlbnN0YXR1cy9wYWNrYWdlcy9wcm90by9vcGVuc3RhdHVzL25vdGlmaWNhdGlvbi92MTtub3RpZmljYXRpb252MWIGcHJvdG8z", [file_buf_validate_validate, file_gnostic_openapi_v3_annotations, file_openstatus_notification_v1_notification, file_openstatus_notification_v1_providers]); + fileDesc("CihvcGVuc3RhdHVzL25vdGlmaWNhdGlvbi92MS9zZXJ2aWNlLnByb3RvEhpvcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MSLzAQoZQ3JlYXRlTm90aWZpY2F0aW9uUmVxdWVzdBItCgRuYW1lGAEgASgJQh+6RxU6ExIRU2xhY2sgT3BzIENoYW5uZWy6SARyAhABEk4KCHByb3ZpZGVyGAIgASgOMjAub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuTm90aWZpY2F0aW9uUHJvdmlkZXJCCrpIB4IBBBABIAASQgoEZGF0YRgDIAEoCzIsLm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLk5vdGlmaWNhdGlvbkRhdGFCBrpIA8gBARITCgttb25pdG9yX2lkcxgEIAMoCSJcChpDcmVhdGVOb3RpZmljYXRpb25SZXNwb25zZRI+Cgxub3RpZmljYXRpb24YASABKAsyKC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb24iLQoWR2V0Tm90aWZpY2F0aW9uUmVxdWVzdBITCgJpZBgBIAEoCUIHukgEcgIQASJZChdHZXROb3RpZmljYXRpb25SZXNwb25zZRI+Cgxub3RpZmljYXRpb24YASABKAsyKC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb24ibAoYTGlzdE5vdGlmaWNhdGlvbnNSZXF1ZXN0Eh0KBWxpbWl0GAEgASgFQgm6SAYaBBhkKAFIAIgBARIcCgZvZmZzZXQYAiABKAVCB7pIBBoCKABIAYgBAUIICgZfbGltaXRCCQoHX29mZnNldCJ3ChlMaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEkYKDW5vdGlmaWNhdGlvbnMYASADKAsyLy5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb25TdW1tYXJ5EhIKCnRvdGFsX3NpemUYAiABKAUi4wEKGVVwZGF0ZU5vdGlmaWNhdGlvblJlcXVlc3QSEwoCaWQYASABKAlCB7pIBHICEAESEQoEbmFtZRgCIAEoCUgAiAEBEj8KBGRhdGEYAyABKAsyLC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb25EYXRhSAGIAQESEwoLbW9uaXRvcl9pZHMYBCADKAkSHwoSdXBkYXRlX21vbml0b3JfaWRzGAUgASgISAKIAQFCBwoFX25hbWVCBwoFX2RhdGFCFQoTX3VwZGF0ZV9tb25pdG9yX2lkcyJcChpVcGRhdGVOb3RpZmljYXRpb25SZXNwb25zZRI+Cgxub3RpZmljYXRpb24YASABKAsyKC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb24iMAoZRGVsZXRlTm90aWZpY2F0aW9uUmVxdWVzdBITCgJpZBgBIAEoCUIHukgEcgIQASItChpEZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIrEBChtTZW5kVGVzdE5vdGlmaWNhdGlvblJlcXVlc3QSTgoIcHJvdmlkZXIYASABKA4yMC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb25Qcm92aWRlckIKukgHggEEEAEgABJCCgRkYXRhGAIgASgLMiwub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuTm90aWZpY2F0aW9uRGF0YUIGukgDyAEBIl0KHFNlbmRUZXN0Tm90aWZpY2F0aW9uUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIaCg1lcnJvcl9tZXNzYWdlGAIgASgJSACIAQFCEAoOX2Vycm9yX21lc3NhZ2UiHwodQ2hlY2tOb3RpZmljYXRpb25MaW1pdFJlcXVlc3QiYQoeQ2hlY2tOb3RpZmljYXRpb25MaW1pdFJlc3BvbnNlEhUKDWxpbWl0X3JlYWNoZWQYASABKAgSFQoNY3VycmVudF9jb3VudBgCIAEoBRIRCgltYXhfY291bnQYAyABKAUy8QkKE05vdGlmaWNhdGlvblNlcnZpY2USgwEKEkNyZWF0ZU5vdGlmaWNhdGlvbhI1Lm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLkNyZWF0ZU5vdGlmaWNhdGlvblJlcXVlc3QaNi5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5DcmVhdGVOb3RpZmljYXRpb25SZXNwb25zZRJ/Cg9HZXROb3RpZmljYXRpb24SMi5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5HZXROb3RpZmljYXRpb25SZXF1ZXN0GjMub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuR2V0Tm90aWZpY2F0aW9uUmVzcG9uc2UiA5ACARKFAQoRTGlzdE5vdGlmaWNhdGlvbnMSNC5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5MaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QaNS5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5MaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlIgOQAgESgwEKElVwZGF0ZU5vdGlmaWNhdGlvbhI1Lm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLlVwZGF0ZU5vdGlmaWNhdGlvblJlcXVlc3QaNi5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5VcGRhdGVOb3RpZmljYXRpb25SZXNwb25zZRKDAQoSRGVsZXRlTm90aWZpY2F0aW9uEjUub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuRGVsZXRlTm90aWZpY2F0aW9uUmVxdWVzdBo2Lm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLkRlbGV0ZU5vdGlmaWNhdGlvblJlc3BvbnNlEqcDChRTZW5kVGVzdE5vdGlmaWNhdGlvbhI3Lm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLlNlbmRUZXN0Tm90aWZpY2F0aW9uUmVxdWVzdBo4Lm9wZW5zdGF0dXMubm90aWZpY2F0aW9uLnYxLlNlbmRUZXN0Tm90aWZpY2F0aW9uUmVzcG9uc2UimwK6R5cCGpQCU2VuZHMgYSB0ZXN0IG5vdGlmaWNhdGlvbiB0byB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIHRvIHZlcmlmeSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGlzIGNvcnJlY3QuIFRoaXMgZG9lcyBub3QgcmVxdWlyZSBhbiBleGlzdGluZyBub3RpZmljYXRpb24gY2hhbm5lbCAtIGp1c3QgcHJvdmlkZSB0aGUgcHJvdmlkZXIgdHlwZSBhbmQgaXRzIGNvbmZpZ3VyYXRpb24gZGF0YS4gUmV0dXJucyBzdWNjZXNzIHN0YXR1cyBhbmQgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgdGVzdCBmYWlsZWQuEpQBChZDaGVja05vdGlmaWNhdGlvbkxpbWl0Ejkub3BlbnN0YXR1cy5ub3RpZmljYXRpb24udjEuQ2hlY2tOb3RpZmljYXRpb25MaW1pdFJlcXVlc3QaOi5vcGVuc3RhdHVzLm5vdGlmaWNhdGlvbi52MS5DaGVja05vdGlmaWNhdGlvbkxpbWl0UmVzcG9uc2UiA5ACAUJdWltnaXRodWIuY29tL29wZW5zdGF0dXNocS9vcGVuc3RhdHVzL3BhY2thZ2VzL3Byb3RvL29wZW5zdGF0dXMvbm90aWZpY2F0aW9uL3YxO25vdGlmaWNhdGlvbnYxYgZwcm90bzM", [file_buf_validate_validate, file_gnostic_openapi_v3_annotations, file_openstatus_notification_v1_notification, file_openstatus_notification_v1_providers]); /** * CreateNotificationRequest is the request to create a new notification channel. @@ -212,6 +212,15 @@ export type UpdateNotificationRequest = Message<"openstatus.notification.v1.Upda * @generated from field: repeated string monitor_ids = 4; */ monitorIds: string[]; + + /** + * Set to true to update monitor associations. + * When true, monitor_ids replaces the existing list (empty clears all). + * When false or unset, monitor_ids is ignored and existing associations are preserved. + * + * @generated from field: optional bool update_monitor_ids = 5; + */ + updateMonitorIds?: boolean; }; /** diff --git a/packages/proto/gen/ts/openstatus/status_report/v1/service_pb.ts b/packages/proto/gen/ts/openstatus/status_report/v1/service_pb.ts index 8d092e43..b845c602 100644 --- a/packages/proto/gen/ts/openstatus/status_report/v1/service_pb.ts +++ b/packages/proto/gen/ts/openstatus/status_report/v1/service_pb.ts @@ -14,7 +14,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file openstatus/status_report/v1/service.proto. */ export const file_openstatus_status_report_v1_service: GenFile = /*@__PURE__*/ - fileDesc("CilvcGVuc3RhdHVzL3N0YXR1c19yZXBvcnQvdjEvc2VydmljZS5wcm90bxIbb3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxIsUDChlDcmVhdGVTdGF0dXNSZXBvcnRSZXF1ZXN0EjoKBXRpdGxlGAEgASgJQiu6RyE6HxIdQVBJIERlZ3JhZGF0aW9uIEludmVzdGlnYXRpb266SARyAhABEkkKBnN0YXR1cxgCIAEoDjIvLm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5TdGF0dXNSZXBvcnRTdGF0dXNCCLpIBYIBAhABElUKB21lc3NhZ2UYAyABKAlCRLpHOjo4EjZXZSBhcmUgaW52ZXN0aWdhdGluZyByZXBvcnRzIG9mIGluY3JlYXNlZCBBUEkgbGF0ZW5jeS66SARyAhABEnQKBGRhdGUYBCABKAlCZrpHGDoWEhQyMDI0LTAzLTE1VDEwOjMwOjAwWrpISHJGMkReXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0oXC5cZHsxLDl9KT8oWnxbKy1dXGR7Mn06XGR7Mn0pJBIYCgdwYWdlX2lkGAUgASgJQge6SARyAhABEhoKEnBhZ2VfY29tcG9uZW50X2lkcxgGIAMoCRITCgZub3RpZnkYByABKAhIAIgBAUIJCgdfbm90aWZ5Il4KGkNyZWF0ZVN0YXR1c1JlcG9ydFJlc3BvbnNlEkAKDXN0YXR1c19yZXBvcnQYASABKAsyKS5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuU3RhdHVzUmVwb3J0Ii0KFkdldFN0YXR1c1JlcG9ydFJlcXVlc3QSEwoCaWQYASABKAlCB7pIBHICEAEiWwoXR2V0U3RhdHVzUmVwb3J0UmVzcG9uc2USQAoNc3RhdHVzX3JlcG9ydBgBIAEoCzIpLm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5TdGF0dXNSZXBvcnQirwEKGExpc3RTdGF0dXNSZXBvcnRzUmVxdWVzdBIdCgVsaW1pdBgBIAEoBUIJukgGGgQYZCgBSACIAQESHAoGb2Zmc2V0GAIgASgFQge6SAQaAigASAGIAQESQQoIc3RhdHVzZXMYAyADKA4yLy5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuU3RhdHVzUmVwb3J0U3RhdHVzQggKBl9saW1pdEIJCgdfb2Zmc2V0InkKGUxpc3RTdGF0dXNSZXBvcnRzUmVzcG9uc2USSAoOc3RhdHVzX3JlcG9ydHMYASADKAsyMC5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuU3RhdHVzUmVwb3J0U3VtbWFyeRISCgp0b3RhbF9zaXplGAIgASgFImoKGVVwZGF0ZVN0YXR1c1JlcG9ydFJlcXVlc3QSEwoCaWQYASABKAlCB7pIBHICEAESEgoFdGl0bGUYAiABKAlIAIgBARIaChJwYWdlX2NvbXBvbmVudF9pZHMYAyADKAlCCAoGX3RpdGxlIl4KGlVwZGF0ZVN0YXR1c1JlcG9ydFJlc3BvbnNlEkAKDXN0YXR1c19yZXBvcnQYASABKAsyKS5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuU3RhdHVzUmVwb3J0IjAKGURlbGV0ZVN0YXR1c1JlcG9ydFJlcXVlc3QSEwoCaWQYASABKAlCB7pIBHICEAEiLQoaRGVsZXRlU3RhdHVzUmVwb3J0UmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCKvAgocQWRkU3RhdHVzUmVwb3J0VXBkYXRlUmVxdWVzdBIhChBzdGF0dXNfcmVwb3J0X2lkGAEgASgJQge6SARyAhABEkkKBnN0YXR1cxgCIAEoDjIvLm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5TdGF0dXNSZXBvcnRTdGF0dXNCCLpIBYIBAhABEhgKB21lc3NhZ2UYAyABKAlCB7pIBHICEAESXgoEZGF0ZRgEIAEoCUJLukhIckYyRF5cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfTpcZHsyfTpcZHsyfShcLlxkezEsOX0pPyhafFsrLV1cZHsyfTpcZHsyfSkkSACIAQESEwoGbm90aWZ5GAUgASgISAGIAQFCBwoFX2RhdGVCCQoHX25vdGlmeSJhCh1BZGRTdGF0dXNSZXBvcnRVcGRhdGVSZXNwb25zZRJACg1zdGF0dXNfcmVwb3J0GAEgASgLMikub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLlN0YXR1c1JlcG9ydDK/CwoTU3RhdHVzUmVwb3J0U2VydmljZRLOAwoSQ3JlYXRlU3RhdHVzUmVwb3J0EjYub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLkNyZWF0ZVN0YXR1c1JlcG9ydFJlcXVlc3QaNy5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuQ3JlYXRlU3RhdHVzUmVwb3J0UmVzcG9uc2UixgK6R8ICGr8CQ3JlYXRlcyBhIG5ldyBzdGF0dXMgcmVwb3J0IHdpdGggYW4gaW5pdGlhbCB1cGRhdGUgZW50cnkuIFRoZSByZXBvcnQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc3RhdHVzIHBhZ2UgYW5kIG9wdGlvbmFsbHkgc3BlY2lmaWMgcGFnZSBjb21wb25lbnRzLiBBbiBpbml0aWFsIFN0YXR1c1JlcG9ydFVwZGF0ZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgcHJvdmlkZWQgc3RhdHVzLCBtZXNzYWdlLCBhbmQgZGF0ZS4gSWYgbm90aWZ5IGlzIHRydWUsIHN1YnNjcmliZXJzIG9mIHRoZSBhc3NvY2lhdGVkIHBhZ2UgYXJlIG5vdGlmaWVkIGJ5IGVtYWlsLhKBAQoPR2V0U3RhdHVzUmVwb3J0EjMub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLkdldFN0YXR1c1JlcG9ydFJlcXVlc3QaNC5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuR2V0U3RhdHVzUmVwb3J0UmVzcG9uc2UiA5ACARKHAQoRTGlzdFN0YXR1c1JlcG9ydHMSNS5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuTGlzdFN0YXR1c1JlcG9ydHNSZXF1ZXN0GjYub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLkxpc3RTdGF0dXNSZXBvcnRzUmVzcG9uc2UiA5ACARKFAQoSVXBkYXRlU3RhdHVzUmVwb3J0EjYub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLlVwZGF0ZVN0YXR1c1JlcG9ydFJlcXVlc3QaNy5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuVXBkYXRlU3RhdHVzUmVwb3J0UmVzcG9uc2UShQEKEkRlbGV0ZVN0YXR1c1JlcG9ydBI2Lm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5EZWxldGVTdGF0dXNSZXBvcnRSZXF1ZXN0Gjcub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLkRlbGV0ZVN0YXR1c1JlcG9ydFJlc3BvbnNlErgDChVBZGRTdGF0dXNSZXBvcnRVcGRhdGUSOS5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuQWRkU3RhdHVzUmVwb3J0VXBkYXRlUmVxdWVzdBo6Lm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5BZGRTdGF0dXNSZXBvcnRVcGRhdGVSZXNwb25zZSKnArpHowIaoAJBZGRzIGEgbmV3IHVwZGF0ZSBlbnRyeSB0byBhbiBleGlzdGluZyBzdGF0dXMgcmVwb3J0IGFuZCB0cmFuc2l0aW9ucyB0aGUgcmVwb3J0IHRvIHRoZSBzcGVjaWZpZWQgc3RhdHVzLiBTdGF0dXMgcmVwb3J0cyBmb2xsb3cgYSBsaWZlY3ljbGU6IGludmVzdGlnYXRpbmcgLT4gaWRlbnRpZmllZCAtPiBtb25pdG9yaW5nIC0+IHJlc29sdmVkLiBJZiBub3RpZnkgaXMgdHJ1ZSwgc3Vic2NyaWJlcnMgb2YgdGhlIGFzc29jaWF0ZWQgcGFnZSBhcmUgbm90aWZpZWQgYnkgZW1haWwgYWJvdXQgdGhlIHVwZGF0ZS5CXlpcZ2l0aHViLmNvbS9vcGVuc3RhdHVzaHEvb3BlbnN0YXR1cy9wYWNrYWdlcy9wcm90by9vcGVuc3RhdHVzL3N0YXR1c19yZXBvcnQvdjE7c3RhdHVzcmVwb3J0djFiBnByb3RvMw", [file_buf_validate_validate, file_gnostic_openapi_v3_annotations, file_openstatus_status_report_v1_status_report]); + fileDesc("CilvcGVuc3RhdHVzL3N0YXR1c19yZXBvcnQvdjEvc2VydmljZS5wcm90bxIbb3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxIsUDChlDcmVhdGVTdGF0dXNSZXBvcnRSZXF1ZXN0EjoKBXRpdGxlGAEgASgJQiu6RyE6HxIdQVBJIERlZ3JhZGF0aW9uIEludmVzdGlnYXRpb266SARyAhABEkkKBnN0YXR1cxgCIAEoDjIvLm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5TdGF0dXNSZXBvcnRTdGF0dXNCCLpIBYIBAhABElUKB21lc3NhZ2UYAyABKAlCRLpHOjo4EjZXZSBhcmUgaW52ZXN0aWdhdGluZyByZXBvcnRzIG9mIGluY3JlYXNlZCBBUEkgbGF0ZW5jeS66SARyAhABEnQKBGRhdGUYBCABKAlCZrpHGDoWEhQyMDI0LTAzLTE1VDEwOjMwOjAwWrpISHJGMkReXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0oXC5cZHsxLDl9KT8oWnxbKy1dXGR7Mn06XGR7Mn0pJBIYCgdwYWdlX2lkGAUgASgJQge6SARyAhABEhoKEnBhZ2VfY29tcG9uZW50X2lkcxgGIAMoCRITCgZub3RpZnkYByABKAhIAIgBAUIJCgdfbm90aWZ5Il4KGkNyZWF0ZVN0YXR1c1JlcG9ydFJlc3BvbnNlEkAKDXN0YXR1c19yZXBvcnQYASABKAsyKS5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuU3RhdHVzUmVwb3J0Ii0KFkdldFN0YXR1c1JlcG9ydFJlcXVlc3QSEwoCaWQYASABKAlCB7pIBHICEAEiWwoXR2V0U3RhdHVzUmVwb3J0UmVzcG9uc2USQAoNc3RhdHVzX3JlcG9ydBgBIAEoCzIpLm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5TdGF0dXNSZXBvcnQirwEKGExpc3RTdGF0dXNSZXBvcnRzUmVxdWVzdBIdCgVsaW1pdBgBIAEoBUIJukgGGgQYZCgBSACIAQESHAoGb2Zmc2V0GAIgASgFQge6SAQaAigASAGIAQESQQoIc3RhdHVzZXMYAyADKA4yLy5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuU3RhdHVzUmVwb3J0U3RhdHVzQggKBl9saW1pdEIJCgdfb2Zmc2V0InkKGUxpc3RTdGF0dXNSZXBvcnRzUmVzcG9uc2USSAoOc3RhdHVzX3JlcG9ydHMYASADKAsyMC5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuU3RhdHVzUmVwb3J0U3VtbWFyeRISCgp0b3RhbF9zaXplGAIgASgFIrABChlVcGRhdGVTdGF0dXNSZXBvcnRSZXF1ZXN0EhMKAmlkGAEgASgJQge6SARyAhABEhIKBXRpdGxlGAIgASgJSACIAQESGgoScGFnZV9jb21wb25lbnRfaWRzGAMgAygJEiYKGXVwZGF0ZV9wYWdlX2NvbXBvbmVudF9pZHMYBCABKAhIAYgBAUIICgZfdGl0bGVCHAoaX3VwZGF0ZV9wYWdlX2NvbXBvbmVudF9pZHMiXgoaVXBkYXRlU3RhdHVzUmVwb3J0UmVzcG9uc2USQAoNc3RhdHVzX3JlcG9ydBgBIAEoCzIpLm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5TdGF0dXNSZXBvcnQiMAoZRGVsZXRlU3RhdHVzUmVwb3J0UmVxdWVzdBITCgJpZBgBIAEoCUIHukgEcgIQASItChpEZWxldGVTdGF0dXNSZXBvcnRSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIq8CChxBZGRTdGF0dXNSZXBvcnRVcGRhdGVSZXF1ZXN0EiEKEHN0YXR1c19yZXBvcnRfaWQYASABKAlCB7pIBHICEAESSQoGc3RhdHVzGAIgASgOMi8ub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLlN0YXR1c1JlcG9ydFN0YXR1c0IIukgFggECEAESGAoHbWVzc2FnZRgDIAEoCUIHukgEcgIQARJeCgRkYXRlGAQgASgJQku6SEhyRjJEXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGR7MSw5fSk/KFp8WystXVxkezJ9OlxkezJ9KSRIAIgBARITCgZub3RpZnkYBSABKAhIAYgBAUIHCgVfZGF0ZUIJCgdfbm90aWZ5ImEKHUFkZFN0YXR1c1JlcG9ydFVwZGF0ZVJlc3BvbnNlEkAKDXN0YXR1c19yZXBvcnQYASABKAsyKS5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuU3RhdHVzUmVwb3J0Mr8LChNTdGF0dXNSZXBvcnRTZXJ2aWNlEs4DChJDcmVhdGVTdGF0dXNSZXBvcnQSNi5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuQ3JlYXRlU3RhdHVzUmVwb3J0UmVxdWVzdBo3Lm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5DcmVhdGVTdGF0dXNSZXBvcnRSZXNwb25zZSLGArpHwgIavwJDcmVhdGVzIGEgbmV3IHN0YXR1cyByZXBvcnQgd2l0aCBhbiBpbml0aWFsIHVwZGF0ZSBlbnRyeS4gVGhlIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzdGF0dXMgcGFnZSBhbmQgb3B0aW9uYWxseSBzcGVjaWZpYyBwYWdlIGNvbXBvbmVudHMuIEFuIGluaXRpYWwgU3RhdHVzUmVwb3J0VXBkYXRlIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aXRoIHRoZSBwcm92aWRlZCBzdGF0dXMsIG1lc3NhZ2UsIGFuZCBkYXRlLiBJZiBub3RpZnkgaXMgdHJ1ZSwgc3Vic2NyaWJlcnMgb2YgdGhlIGFzc29jaWF0ZWQgcGFnZSBhcmUgbm90aWZpZWQgYnkgZW1haWwuEoEBCg9HZXRTdGF0dXNSZXBvcnQSMy5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuR2V0U3RhdHVzUmVwb3J0UmVxdWVzdBo0Lm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5HZXRTdGF0dXNSZXBvcnRSZXNwb25zZSIDkAIBEocBChFMaXN0U3RhdHVzUmVwb3J0cxI1Lm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5MaXN0U3RhdHVzUmVwb3J0c1JlcXVlc3QaNi5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuTGlzdFN0YXR1c1JlcG9ydHNSZXNwb25zZSIDkAIBEoUBChJVcGRhdGVTdGF0dXNSZXBvcnQSNi5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuVXBkYXRlU3RhdHVzUmVwb3J0UmVxdWVzdBo3Lm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5VcGRhdGVTdGF0dXNSZXBvcnRSZXNwb25zZRKFAQoSRGVsZXRlU3RhdHVzUmVwb3J0EjYub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLkRlbGV0ZVN0YXR1c1JlcG9ydFJlcXVlc3QaNy5vcGVuc3RhdHVzLnN0YXR1c19yZXBvcnQudjEuRGVsZXRlU3RhdHVzUmVwb3J0UmVzcG9uc2USuAMKFUFkZFN0YXR1c1JlcG9ydFVwZGF0ZRI5Lm9wZW5zdGF0dXMuc3RhdHVzX3JlcG9ydC52MS5BZGRTdGF0dXNSZXBvcnRVcGRhdGVSZXF1ZXN0Gjoub3BlbnN0YXR1cy5zdGF0dXNfcmVwb3J0LnYxLkFkZFN0YXR1c1JlcG9ydFVwZGF0ZVJlc3BvbnNlIqcCukejAhqgAkFkZHMgYSBuZXcgdXBkYXRlIGVudHJ5IHRvIGFuIGV4aXN0aW5nIHN0YXR1cyByZXBvcnQgYW5kIHRyYW5zaXRpb25zIHRoZSByZXBvcnQgdG8gdGhlIHNwZWNpZmllZCBzdGF0dXMuIFN0YXR1cyByZXBvcnRzIGZvbGxvdyBhIGxpZmVjeWNsZTogaW52ZXN0aWdhdGluZyAtPiBpZGVudGlmaWVkIC0+IG1vbml0b3JpbmcgLT4gcmVzb2x2ZWQuIElmIG5vdGlmeSBpcyB0cnVlLCBzdWJzY3JpYmVycyBvZiB0aGUgYXNzb2NpYXRlZCBwYWdlIGFyZSBub3RpZmllZCBieSBlbWFpbCBhYm91dCB0aGUgdXBkYXRlLkJeWlxnaXRodWIuY29tL29wZW5zdGF0dXNocS9vcGVuc3RhdHVzL3BhY2thZ2VzL3Byb3RvL29wZW5zdGF0dXMvc3RhdHVzX3JlcG9ydC92MTtzdGF0dXNyZXBvcnR2MWIGcHJvdG8z", [file_buf_validate_validate, file_gnostic_openapi_v3_annotations, file_openstatus_status_report_v1_status_report]); /** * CreateStatusReportRequest is the request to create a new status report. @@ -231,6 +231,15 @@ export type UpdateStatusReportRequest = Message<"openstatus.status_report.v1.Upd * @generated from field: repeated string page_component_ids = 3; */ pageComponentIds: string[]; + + /** + * Set to true to update page component associations. + * When true, page_component_ids replaces the existing list (empty clears all). + * When false or unset, page_component_ids is ignored and existing associations are preserved. + * + * @generated from field: optional bool update_page_component_ids = 4; + */ + updatePageComponentIds?: boolean; }; /**