diff --git a/.secrets.baseline b/.secrets.baseline index 533b3fc4..63351755 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -143,13 +143,22 @@ "line_number": 53 } ], + "api/openapi.yaml": [ + { + "type": "Secret Keyword", + "filename": "api/openapi.yaml", + "hashed_secret": "6b1fe243c0b63c8e43d2545520492f2f5bc19869", + "is_verified": false, + "line_number": 127 + } + ], "docs/guides/API_GUIDE.md": [ { "type": "Secret Keyword", "filename": "docs/guides/API_GUIDE.md", "hashed_secret": "b48cf0140bea12734db05ebcdb012f1d265bed84", "is_verified": false, - "line_number": 63 + "line_number": 65 } ], "docs/guides/DATABASE_MIGRATIONS.md": [ @@ -158,7 +167,7 @@ "filename": "docs/guides/DATABASE_MIGRATIONS.md", "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", "is_verified": false, - "line_number": 217 + "line_number": 223 } ], "docs/guides/ENVIRONMENT_REFERENCE.md": [ @@ -167,7 +176,7 @@ "filename": "docs/guides/ENVIRONMENT_REFERENCE.md", "hashed_secret": "7205a0abf00d1daec13c63ece029057c974795a9", "is_verified": false, - "line_number": 111 + "line_number": 116 } ], "docs/guides/INSTALLATION.md": [ @@ -176,21 +185,21 @@ "filename": "docs/guides/INSTALLATION.md", "hashed_secret": "c99a970222c9f5d73283b8be8021086dd666620b", "is_verified": false, - "line_number": 82 + "line_number": 84 }, { "type": "Basic Auth Credentials", "filename": "docs/guides/INSTALLATION.md", "hashed_secret": "c99a970222c9f5d73283b8be8021086dd666620b", "is_verified": false, - "line_number": 148 + "line_number": 150 }, { "type": "Basic Auth Credentials", "filename": "docs/guides/INSTALLATION.md", "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", "is_verified": false, - "line_number": 381 + "line_number": 383 } ], "docs/guides/PRODUCTION_DEPLOYMENT.md": [ @@ -199,7 +208,7 @@ "filename": "docs/guides/PRODUCTION_DEPLOYMENT.md", "hashed_secret": "1a1d18a6cd33ec395692c25b8e26d90b4de8b5b4", "is_verified": false, - "line_number": 120 + "line_number": 121 } ], "docs/guides/SECRET_ROTATION.md": [ @@ -415,7 +424,7 @@ "filename": "internal/notification/store.go", "hashed_secret": "98292288b8e2ce2aec8675215186a0a33a0c8f7a", "is_verified": false, - "line_number": 258 + "line_number": 264 } ], "internal/notification/store_test.go": [ @@ -460,14 +469,14 @@ "filename": "internal/server/api/server.gen.go", "hashed_secret": "9fd0aaae1a3d0bc789d081307161ea9a821f9dee", "is_verified": false, - "line_number": 3761 + "line_number": 3999 }, { "type": "Secret Keyword", "filename": "internal/server/api/server.gen.go", "hashed_secret": "eca525ee60b3564d9633eb140726685271d52341", "is_verified": false, - "line_number": 3890 + "line_number": 4137 } ], "internal/server/api_scans_test.go": [ @@ -501,7 +510,7 @@ "filename": "internal/server/notifications_handlers.go", "hashed_secret": "44e17306b837162269a410204daaa5ecee4ec22c", "is_verified": false, - "line_number": 242 + "line_number": 292 } ], "internal/ssh/sudo.go": [ @@ -613,7 +622,7 @@ "filename": "specs/frontend/settings.spec.yaml", "hashed_secret": "119c2d04c23cb8e69e813d2185e42c4e105b0d30", "is_verified": false, - "line_number": 263 + "line_number": 278 } ], "specs/system/config.spec.yaml": [ @@ -631,7 +640,7 @@ "filename": "specs/system/os-intelligence.spec.yaml", "hashed_secret": "d2feddab9f573c2d8c1f4c0f92ca8990ebe60b50", "is_verified": false, - "line_number": 178 + "line_number": 186 } ], "specs/system/ssh-connectivity.spec.yaml": [ @@ -665,5 +674,5 @@ } ] }, - "generated_at": "2026-07-07T03:30:20Z" + "generated_at": "2026-07-28T01:05:36Z" } diff --git a/api/openapi.yaml b/api/openapi.yaml index e78b4f7a..1d8ffe11 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -2060,7 +2060,7 @@ paths: required: false schema: type: string - enum: [pending_approval, approved, rejected, dry_run_complete, executing, executed, rolled_back, failed] + enum: [pending_approval, approved, rejected, dry_run_complete, executing, executed, rolled_back, failed, staged, reverted, not_applied, partially_applied] - name: host_id in: query required: false @@ -5744,7 +5744,7 @@ components: rule_id: {type: string} status: type: string - enum: [pending_approval, approved, rejected, dry_run_complete, executing, executed, rolled_back, failed] + enum: [pending_approval, approved, rejected, dry_run_complete, executing, executed, rolled_back, failed, staged, reverted, not_applied, partially_applied] requested_by: {type: string, format: uuid} reviewed_by: {type: string, format: uuid, nullable: true} review_note: {type: string} diff --git a/frontend/src/api/schema.d.ts b/frontend/src/api/schema.d.ts index ddf0d207..33069ce6 100644 --- a/frontend/src/api/schema.d.ts +++ b/frontend/src/api/schema.d.ts @@ -3743,7 +3743,7 @@ export interface components { host_name?: string; rule_id: string; /** @enum {string} */ - status: "pending_approval" | "approved" | "rejected" | "dry_run_complete" | "executing" | "executed" | "rolled_back" | "failed"; + status: "pending_approval" | "approved" | "rejected" | "dry_run_complete" | "executing" | "executed" | "rolled_back" | "failed" | "staged" | "reverted" | "not_applied" | "partially_applied"; /** Format: uuid */ requested_by: string; /** Format: uuid */ @@ -7436,7 +7436,7 @@ export interface operations { listRemediationRequests: { parameters: { query?: { - status?: "pending_approval" | "approved" | "rejected" | "dry_run_complete" | "executing" | "executed" | "rolled_back" | "failed"; + status?: "pending_approval" | "approved" | "rejected" | "dry_run_complete" | "executing" | "executed" | "rolled_back" | "failed" | "staged" | "reverted" | "not_applied" | "partially_applied"; host_id?: string; rule_id?: string; limit?: number; diff --git a/frontend/src/components/hosts/RequestRemediationModal.tsx b/frontend/src/components/hosts/RequestRemediationModal.tsx index 93ead49a..4f25d1f9 100644 --- a/frontend/src/components/hosts/RequestRemediationModal.tsx +++ b/frontend/src/components/hosts/RequestRemediationModal.tsx @@ -109,8 +109,8 @@ export function RequestRemediationModal({

This files a remediation request for review. An approver decides whether the fix is - applied. Applying the fix on the host is an OpenWatch Enterprise feature: the free tier governs the - request and approval only. + applied. Applying a single rule on the host, and rolling it back, are included in + OpenWatch Community. Bulk and automated remediation are OpenWatch Enterprise features.

{mutation.error && ( diff --git a/frontend/src/pages/HostDetailPage.tsx b/frontend/src/pages/HostDetailPage.tsx index 5967f005..8ac3baa4 100644 --- a/frontend/src/pages/HostDetailPage.tsx +++ b/frontend/src/pages/HostDetailPage.tsx @@ -1233,8 +1233,33 @@ const REM_STATUS_STYLE: Record - Fixed + {isStaged ? 'Staged, reboot required' : 'Fixed'} {canRollback && (