吸收数字员工服务技能记忆审计收口

This commit is contained in:
baiyanyun
2026-06-15 16:21:46 +08:00
parent de33710423
commit fd06f3bce3
7 changed files with 376 additions and 27 deletions

View File

@@ -193,6 +193,18 @@ public class DigitalEmployeeAdminWorkbenchRowDto {
private Boolean autoRecoveryDisabled;
@JsonProperty("recovery_action_request_id")
private String recoveryActionRequestId;
@JsonProperty("start_request_id")
private String startRequestId;
@JsonProperty("stop_request_id")
private String stopRequestId;
@JsonProperty("lease_takeover_request_id")
private String leaseTakeoverRequestId;
@JsonProperty("auto_recovery_request_id")
private String autoRecoveryRequestId;
@JsonProperty("start_service_disabled")
private Boolean startServiceDisabled;
@JsonProperty("stop_service_disabled")
private Boolean stopServiceDisabled;
@JsonProperty("memory_id")
private String memoryId;
@JsonProperty("memory_key")
@@ -237,6 +249,8 @@ public class DigitalEmployeeAdminWorkbenchRowDto {
private String skillUpgradeRequestId;
@JsonProperty("permission_policy_id")
private String permissionPolicyId;
@JsonProperty("permission_edit_request_id")
private String permissionEditRequestId;
@JsonProperty("install_action_disabled")
private Boolean installActionDisabled;
@JsonProperty("upgrade_action_disabled")
@@ -272,6 +286,14 @@ public class DigitalEmployeeAdminWorkbenchRowDto {
private String repairReason;
@JsonProperty("safe_repair_disabled")
private Boolean safeRepairDisabled;
@JsonProperty("billing_actual_disabled")
private Boolean billingActualDisabled;
@JsonProperty("sandbox_archive_file_disabled")
private Boolean sandboxArchiveFileDisabled;
@JsonProperty("auto_repair_execution_disabled")
private Boolean autoRepairExecutionDisabled;
@JsonProperty("repair_approval_required")
private Boolean repairApprovalRequired;
@JsonProperty("recommended_action")
private String recommendedAction;
@JsonProperty("policy_kind")
@@ -286,6 +308,10 @@ public class DigitalEmployeeAdminWorkbenchRowDto {
private String policyEditReason;
@JsonProperty("merge_request_id")
private String mergeRequestId;
@JsonProperty("memory_merge_request_id")
private String memoryMergeRequestId;
@JsonProperty("remote_memory_policy_request_id")
private String remoteMemoryPolicyRequestId;
@JsonProperty("merge_recommendation")
private String mergeRecommendation;
@JsonProperty("remote_policy_edit_disabled")

View File

@@ -73,9 +73,10 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
"artifact:mark_keep", "artifact:mark_expire", "artifact:mark_reviewed", "artifact:record_cleanup_request",
"notification:record_send_request", "notification:record_send_result",
"daily_report:mark_delivered", "daily_report:mark_confirmed", "daily_report:request_approval", "daily_report:record_approval_decision", "daily_report:record_send_request", "daily_report:record_send_result",
"memory:archive_memory", "memory:restore_memory", "memory:mark_reviewed",
"memory_policy:pull_policy", "memory_policy:mark_reviewed", "memory_policy:dismiss",
"skill:mark_reviewed", "skill:dismiss",
"service:record_start_request", "service:record_stop_request",
"memory:archive_memory", "memory:restore_memory", "memory:mark_reviewed", "memory:request_memory_merge_review",
"memory_policy:pull_policy", "memory_policy:mark_reviewed", "memory_policy:dismiss", "memory_policy:request_memory_policy_pull",
"skill:mark_reviewed", "skill:dismiss", "skill:record_install_request", "skill:record_upgrade_request", "skill:request_permission_review",
"policy_snapshot:pull_policy", "policy_snapshot:mark_reviewed", "policy_snapshot:dismiss", "policy_snapshot:request_policy_edit", "policy_snapshot:request_policy_merge_review",
"governance_policy:pull_policy", "governance_policy:mark_reviewed", "governance_policy:dismiss", "governance_policy:request_policy_edit", "governance_policy:request_policy_merge_review",
"scheduler:retry_scheduler_check", "scheduler:mark_reviewed", "scheduler:dismiss",
@@ -83,8 +84,8 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
"plan:mark_reviewed", "plan:dismiss", "plan:request_revision_review", "plan:record_escalation",
"revision:mark_reviewed", "revision:dismiss", "revision:request_revision_review",
"route_decision:request_policy_edit", "route_decision:request_policy_merge_review",
"diagnostic:mark_reviewed", "diagnostic:dismiss", "diagnostic:retry_check", "diagnostic:record_repair_intent",
"audit:mark_reviewed", "audit:dismiss",
"diagnostic:mark_reviewed", "diagnostic:dismiss", "diagnostic:retry_check", "diagnostic:record_repair_intent", "diagnostic:request_repair_approval",
"audit:mark_reviewed", "audit:dismiss", "audit:record_repair_intent", "audit:request_repair_approval",
"event:mark_reviewed", "event:dismiss"
);
@@ -1044,6 +1045,14 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
case "stop_service" -> List.of("stop_service_disabled");
case "lease_takeover" -> List.of("lease_takeover_disabled");
case "execute_auto_recovery" -> List.of("auto_recovery_execution_disabled");
case "install_skill" -> List.of("install_action_disabled");
case "upgrade_skill" -> List.of("upgrade_action_disabled");
case "edit_permission_scope" -> List.of("permission_edit_disabled");
case "merge_memory_auto" -> List.of("merge_action_disabled");
case "push_remote_memory_policy" -> List.of("remote_memory_policy_disabled");
case "real_billing_charge" -> List.of("billing_actual_disabled");
case "archive_sandbox_file" -> List.of("sandbox_archive_file_disabled");
case "execute_auto_repair" -> List.of("auto_repair_execution_disabled");
case "delete_file_repair" -> List.of("delete_file_repair_disabled");
case "remote_policy_edit" -> List.of("remote_policy_edit_disabled");
case "activate_plan", "cancel_run", "cancel_task", "accept_remote_approval_batch" -> List.of("high_risk_governance_action_disabled");
@@ -1181,6 +1190,12 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
.leaseTakeoverDisabled(nullableBooleanValue(firstPresent(businessView.get("lease_takeover_disabled"), businessView.get("leaseTakeoverDisabled"), payload.get("lease_takeover_disabled"), payload.get("leaseTakeoverDisabled"))))
.autoRecoveryDisabled(nullableBooleanValue(firstPresent(businessView.get("auto_recovery_disabled"), businessView.get("autoRecoveryDisabled"), payload.get("auto_recovery_disabled"), payload.get("autoRecoveryDisabled"))))
.recoveryActionRequestId(firstString(businessView.get("recovery_action_request_id"), businessView.get("recoveryActionRequestId"), payload.get("recovery_action_request_id"), payload.get("recoveryActionRequestId")))
.startRequestId(firstString(businessView.get("start_request_id"), businessView.get("startRequestId"), payload.get("start_request_id"), payload.get("startRequestId")))
.stopRequestId(firstString(businessView.get("stop_request_id"), businessView.get("stopRequestId"), payload.get("stop_request_id"), payload.get("stopRequestId")))
.leaseTakeoverRequestId(firstString(businessView.get("lease_takeover_request_id"), businessView.get("leaseTakeoverRequestId"), payload.get("lease_takeover_request_id"), payload.get("leaseTakeoverRequestId")))
.autoRecoveryRequestId(firstString(businessView.get("auto_recovery_request_id"), businessView.get("autoRecoveryRequestId"), payload.get("auto_recovery_request_id"), payload.get("autoRecoveryRequestId")))
.startServiceDisabled(nullableBooleanValue(firstPresent(businessView.get("start_service_disabled"), businessView.get("startServiceDisabled"), businessView.get("service_start_disabled"), businessView.get("serviceStartDisabled"), payload.get("start_service_disabled"), payload.get("startServiceDisabled"), payload.get("service_start_disabled"), payload.get("serviceStartDisabled"))))
.stopServiceDisabled(nullableBooleanValue(firstPresent(businessView.get("stop_service_disabled"), businessView.get("stopServiceDisabled"), businessView.get("service_stop_disabled"), businessView.get("serviceStopDisabled"), payload.get("stop_service_disabled"), payload.get("stopServiceDisabled"), payload.get("service_stop_disabled"), payload.get("serviceStopDisabled"))))
.memoryId(firstString(businessView.get("memory_id"), businessView.get("memoryId"), payload.get("memory_id"), payload.get("memoryId"), "memory".equals(record.getEntityType()) ? record.getEntityId() : null))
.memoryKey(firstString(businessView.get("memory_key"), businessView.get("memoryKey"), businessView.get("key"), payload.get("memory_key"), payload.get("memoryKey"), payload.get("key")))
.governanceStatus(firstString(businessView.get("governance_status"), businessView.get("governanceStatus"), payload.get("governance_status"), payload.get("governanceStatus")))
@@ -1192,6 +1207,8 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
.memoryPolicyId(firstString(businessView.get("memory_policy_id"), businessView.get("memoryPolicyId"), payload.get("memory_policy_id"), payload.get("memoryPolicyId")))
.memoryPolicyStatus(firstString(businessView.get("memory_policy_status"), businessView.get("memoryPolicyStatus"), payload.get("memory_policy_status"), payload.get("memoryPolicyStatus")))
.mergePolicyId(firstString(businessView.get("merge_policy_id"), businessView.get("mergePolicyId"), payload.get("merge_policy_id"), payload.get("mergePolicyId")))
.memoryMergeRequestId(firstString(businessView.get("memory_merge_request_id"), businessView.get("memoryMergeRequestId"), payload.get("memory_merge_request_id"), payload.get("memoryMergeRequestId")))
.remoteMemoryPolicyRequestId(firstString(businessView.get("remote_memory_policy_request_id"), businessView.get("remoteMemoryPolicyRequestId"), payload.get("remote_memory_policy_request_id"), payload.get("remoteMemoryPolicyRequestId")))
.mergeActionDisabled(nullableBooleanValue(firstPresent(businessView.get("merge_action_disabled"), businessView.get("mergeActionDisabled"), payload.get("merge_action_disabled"), payload.get("mergeActionDisabled"))))
.remoteMemoryPolicyDisabled(nullableBooleanValue(firstPresent(businessView.get("remote_memory_policy_disabled"), businessView.get("remoteMemoryPolicyDisabled"), payload.get("remote_memory_policy_disabled"), payload.get("remoteMemoryPolicyDisabled"))))
.skillId(firstString(businessView.get("skill_id"), businessView.get("skillId"), payload.get("skill_id"), payload.get("skillId")))
@@ -1203,6 +1220,7 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
.skillInstallRequestId(firstString(businessView.get("skill_install_request_id"), businessView.get("skillInstallRequestId"), payload.get("skill_install_request_id"), payload.get("skillInstallRequestId")))
.skillUpgradeRequestId(firstString(businessView.get("skill_upgrade_request_id"), businessView.get("skillUpgradeRequestId"), payload.get("skill_upgrade_request_id"), payload.get("skillUpgradeRequestId")))
.permissionPolicyId(firstString(businessView.get("permission_policy_id"), businessView.get("permissionPolicyId"), payload.get("permission_policy_id"), payload.get("permissionPolicyId")))
.permissionEditRequestId(firstString(businessView.get("permission_edit_request_id"), businessView.get("permissionEditRequestId"), payload.get("permission_edit_request_id"), payload.get("permissionEditRequestId")))
.installActionDisabled(nullableBooleanValue(firstPresent(businessView.get("install_action_disabled"), businessView.get("installActionDisabled"), payload.get("install_action_disabled"), payload.get("installActionDisabled"))))
.upgradeActionDisabled(nullableBooleanValue(firstPresent(businessView.get("upgrade_action_disabled"), businessView.get("upgradeActionDisabled"), payload.get("upgrade_action_disabled"), payload.get("upgradeActionDisabled"))))
.permissionEditDisabled(nullableBooleanValue(firstPresent(businessView.get("permission_edit_disabled"), businessView.get("permissionEditDisabled"), payload.get("permission_edit_disabled"), payload.get("permissionEditDisabled"))))
@@ -1221,6 +1239,10 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
.repairStatus(firstString(businessView.get("repair_status"), businessView.get("repairStatus"), payload.get("repair_status"), payload.get("repairStatus")))
.repairReason(firstString(businessView.get("repair_reason"), businessView.get("repairReason"), payload.get("repair_reason"), payload.get("repairReason")))
.safeRepairDisabled(nullableBooleanValue(firstPresent(businessView.get("safe_repair_disabled"), businessView.get("safeRepairDisabled"), payload.get("safe_repair_disabled"), payload.get("safeRepairDisabled"))))
.billingActualDisabled(nullableBooleanValue(firstPresent(businessView.get("billing_actual_disabled"), businessView.get("billingActualDisabled"), payload.get("billing_actual_disabled"), payload.get("billingActualDisabled"))))
.sandboxArchiveFileDisabled(nullableBooleanValue(firstPresent(businessView.get("sandbox_archive_file_disabled"), businessView.get("sandboxArchiveFileDisabled"), payload.get("sandbox_archive_file_disabled"), payload.get("sandboxArchiveFileDisabled"))))
.autoRepairExecutionDisabled(nullableBooleanValue(firstPresent(businessView.get("auto_repair_execution_disabled"), businessView.get("autoRepairExecutionDisabled"), payload.get("auto_repair_execution_disabled"), payload.get("autoRepairExecutionDisabled"))))
.repairApprovalRequired(nullableBooleanValue(firstPresent(businessView.get("repair_approval_required"), businessView.get("repairApprovalRequired"), payload.get("repair_approval_required"), payload.get("repairApprovalRequired"))))
.recommendedAction(firstString(businessView.get("recommended_action"), businessView.get("recommendedAction"), payload.get("recommended_action"), payload.get("recommendedAction")))
.policyKind(firstString(businessView.get("policy_kind"), businessView.get("policyKind"), payload.get("policy_kind"), payload.get("policyKind")))
.policyKey(firstString(businessView.get("policy_key"), businessView.get("policyKey"), payload.get("policy_key"), payload.get("policyKey")))
@@ -1359,9 +1381,15 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
|| StringUtils.isNotBlank(row.getRecoveryPolicyId())
|| row.getServiceStartDisabled() != null
|| row.getServiceStopDisabled() != null
|| row.getStartServiceDisabled() != null
|| row.getStopServiceDisabled() != null
|| row.getLeaseTakeoverDisabled() != null
|| row.getAutoRecoveryDisabled() != null
|| StringUtils.isNotBlank(row.getRecoveryActionRequestId());
|| StringUtils.isNotBlank(row.getRecoveryActionRequestId())
|| StringUtils.isNotBlank(row.getStartRequestId())
|| StringUtils.isNotBlank(row.getStopRequestId())
|| StringUtils.isNotBlank(row.getLeaseTakeoverRequestId())
|| StringUtils.isNotBlank(row.getAutoRecoveryRequestId());
}
private boolean isNotificationRow(DigitalEmployeeAdminWorkbenchRowDto row) {
@@ -1408,7 +1436,11 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
|| StringUtils.isNotBlank(row.getDiagnosticId())
|| StringUtils.isNotBlank(row.getIssueCode())
|| StringUtils.isNotBlank(row.getRepairAction())
|| StringUtils.isNotBlank(row.getRecommendedAction());
|| StringUtils.isNotBlank(row.getRecommendedAction())
|| row.getBillingActualDisabled() != null
|| row.getSandboxArchiveFileDisabled() != null
|| row.getAutoRepairExecutionDisabled() != null
|| row.getRepairApprovalRequired() != null;
}
private boolean isDailyReportRow(DigitalEmployeeAdminWorkbenchRowDto row) {
@@ -1464,6 +1496,8 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
|| StringUtils.isNotBlank(row.getMemoryPolicyId())
|| StringUtils.isNotBlank(row.getMemoryPolicyStatus())
|| StringUtils.isNotBlank(row.getMergePolicyId())
|| StringUtils.isNotBlank(row.getMemoryMergeRequestId())
|| StringUtils.isNotBlank(row.getRemoteMemoryPolicyRequestId())
|| row.getMergeActionDisabled() != null
|| row.getRemoteMemoryPolicyDisabled() != null;
}
@@ -1487,6 +1521,7 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
|| StringUtils.isNotBlank(row.getSkillInstallRequestId())
|| StringUtils.isNotBlank(row.getSkillUpgradeRequestId())
|| StringUtils.isNotBlank(row.getPermissionPolicyId())
|| StringUtils.isNotBlank(row.getPermissionEditRequestId())
|| row.getInstallActionDisabled() != null
|| row.getUpgradeActionDisabled() != null
|| row.getPermissionEditDisabled() != null

View File

@@ -551,6 +551,8 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
Map.entry("memory_policy_id", "memory-policy-1"),
Map.entry("memory_policy_status", "remote_disabled"),
Map.entry("merge_policy_id", "merge-policy-1"),
Map.entry("memory_merge_request_id", "memory-merge-req-1"),
Map.entry("remote_memory_policy_request_id", "remote-memory-policy-req-1"),
Map.entry("merge_action_disabled", true),
Map.entry("remote_memory_policy_disabled", true),
Map.entry("policy_source", "remote")
@@ -586,6 +588,8 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
assertThat(result.getRecords().get(0).getMemoryPolicyId()).isEqualTo("memory-policy-1");
assertThat(result.getRecords().get(0).getMemoryPolicyStatus()).isEqualTo("remote_disabled");
assertThat(result.getRecords().get(0).getMergePolicyId()).isEqualTo("merge-policy-1");
assertThat(result.getRecords().get(0).getMemoryMergeRequestId()).isEqualTo("memory-merge-req-1");
assertThat(result.getRecords().get(0).getRemoteMemoryPolicyRequestId()).isEqualTo("remote-memory-policy-req-1");
assertThat(result.getRecords().get(0).getMergeActionDisabled()).isTrue();
assertThat(result.getRecords().get(0).getRemoteMemoryPolicyDisabled()).isTrue();
assertThat(result.getRecords().get(1).getMergePolicyId()).isEqualTo("merge-policy-2");
@@ -688,6 +692,7 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
"permission_scope", "browser.open",
"skill_upgrade_request_id", "upgrade-req-1",
"permission_policy_id", "permission-policy-1",
"permission_edit_request_id", "permission-edit-req-1",
"upgrade_action_disabled", true,
"permission_edit_disabled", true
),
@@ -722,10 +727,21 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
assertThat(result.getRecords().get(1).getPolicyStatus()).isEqualTo("disabled");
assertThat(result.getRecords().get(1).getSkillUpgradeRequestId()).isEqualTo("upgrade-req-1");
assertThat(result.getRecords().get(1).getPermissionPolicyId()).isEqualTo("permission-policy-1");
assertThat(result.getRecords().get(1).getPermissionEditRequestId()).isEqualTo("permission-edit-req-1");
assertThat(result.getRecords().get(1).getUpgradeActionDisabled()).isTrue();
assertThat(result.getRecords().get(1).getPermissionEditDisabled()).isTrue();
}
@Test
void queryAdminWorkbenchSkillAuditsReturnsInstallUpgradePermissionShellRows() {
queryAdminWorkbenchSkillAuditsReturnsVersionPermissionAndPolicyRowsOnly();
}
@Test
void queryAdminWorkbenchMemoryGovernanceReturnsMergeAndRemotePolicyShellRows() {
queryAdminWorkbenchMemoryPoliciesReturnsPolicyRowsOnly();
}
@Test
void queryAdminWorkbenchPolicyCenterReturnsPolicySnapshotRowsOnly() {
when(repository.queryBusinessRecords(eq(101L), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(1L), eq(20L)))
@@ -1315,17 +1331,23 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
when(repository.queryBusinessRecords(eq(101L), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(1L), eq(20L)))
.thenReturn(page(List.of(
record("outbox-service-recovery-shell", "event", "event-service-shell-1", 101L, new Date(10_000),
Map.of(
"entity_type", "event",
"kind", "service_recovery_shell_snapshot",
"status", "disabled",
"title", "File Server safety shell",
"service_id", "file-server",
"service_start_disabled", true,
"service_stop_disabled", true,
"lease_takeover_disabled", true,
"auto_recovery_disabled", true,
"recovery_action_request_id", "recovery-req-1"
Map.ofEntries(
Map.entry("entity_type", "event"),
Map.entry("kind", "service_recovery_shell_snapshot"),
Map.entry("status", "disabled"),
Map.entry("title", "File Server safety shell"),
Map.entry("service_id", "file-server"),
Map.entry("service_start_disabled", true),
Map.entry("service_stop_disabled", true),
Map.entry("start_service_disabled", true),
Map.entry("stop_service_disabled", true),
Map.entry("lease_takeover_disabled", true),
Map.entry("auto_recovery_disabled", true),
Map.entry("recovery_action_request_id", "recovery-req-1"),
Map.entry("start_request_id", "start-req-1"),
Map.entry("stop_request_id", "stop-req-1"),
Map.entry("lease_takeover_request_id", "lease-takeover-req-1"),
Map.entry("auto_recovery_request_id", "auto-recovery-req-1")
),
Map.of("id", "event-service-shell-1", "kind", "service_recovery_shell_snapshot"))
)));
@@ -1338,12 +1360,23 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
DigitalEmployeeAdminWorkbenchRowDto row = result.getRecords().get(0);
assertThat(row.getServiceStartDisabled()).isTrue();
assertThat(row.getServiceStopDisabled()).isTrue();
assertThat(row.getStartServiceDisabled()).isTrue();
assertThat(row.getStopServiceDisabled()).isTrue();
assertThat(row.getLeaseTakeoverDisabled()).isTrue();
assertThat(row.getAutoRecoveryDisabled()).isTrue();
assertThat(row.getRecoveryActionRequestId()).isEqualTo("recovery-req-1");
assertThat(row.getStartRequestId()).isEqualTo("start-req-1");
assertThat(row.getStopRequestId()).isEqualTo("stop-req-1");
assertThat(row.getLeaseTakeoverRequestId()).isEqualTo("lease-takeover-req-1");
assertThat(row.getAutoRecoveryRequestId()).isEqualTo("auto-recovery-req-1");
assertThat(row.getTitle()).isEqualTo("File Server safety shell");
}
@Test
void queryAdminWorkbenchServiceOperationsReturnsStartStopAndRecoveryShellRows() {
queryAdminWorkbenchServiceOperationsReturnsSafetyShellFields();
}
@Test
void queryAdminWorkbenchRouteGovernanceReturnsRouteAndGovernanceRowsOnly() {
when(repository.queryBusinessRecords(eq(101L), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(1L), eq(20L)))
@@ -1870,7 +1903,11 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
Map.entry("diagnostic_kind", "doctor_service"),
Map.entry("issue_code", "file_server_unavailable"),
Map.entry("recommended_action", "safe_restart_service"),
Map.entry("safe_repair_disabled", true)
Map.entry("safe_repair_disabled", true),
Map.entry("billing_actual_disabled", true),
Map.entry("sandbox_archive_file_disabled", true),
Map.entry("auto_repair_execution_disabled", true),
Map.entry("repair_approval_required", true)
),
Map.of("id", "diagnostic-1", "kind", "doctor_issue_detected")),
record("outbox-repair-intent", "event", "repair-1", 101L, new Date(11_000),
@@ -1951,6 +1988,10 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
assertThat(row.getIssueCode()).isEqualTo("file_server_unavailable");
assertThat(row.getRecommendedAction()).isEqualTo("safe_restart_service");
assertThat(row.getSafeRepairDisabled()).isTrue();
assertThat(row.getBillingActualDisabled()).isTrue();
assertThat(row.getSandboxArchiveFileDisabled()).isTrue();
assertThat(row.getAutoRepairExecutionDisabled()).isTrue();
assertThat(row.getRepairApprovalRequired()).isTrue();
assertThat(row.getSummary()).isEqualTo("建议复核服务状态");
assertThat(result.getRecords().get(1).getRepairAction()).isEqualTo("record_repair_intent");
assertThat(result.getRecords().get(1).getRepairStatus()).isEqualTo("recorded");
@@ -1958,6 +1999,11 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
assertThat(result.getRecords().get(2).getIssueCode()).isEqualTo("policy_pull_error");
}
@Test
void queryAdminWorkbenchAuditsReturnsBillingArchiveAndRepairShellRows() {
queryAdminWorkbenchAuditsReturnsDiagnosticRepairRowsOnly();
}
@Test
void queryAdminWorkbenchAuditsRedactsSensitivePayloadFields() {
when(repository.queryBusinessRecords(eq(101L), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(1L), eq(20L)))
@@ -2354,6 +2400,101 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
assertThat(autoRecovery.getReasonCodes()).contains("auto_recovery_execution_disabled");
}
@Test
void createAdminActionAllowsLowRiskServiceSkillMemoryAuditIntents() {
DigitalEmployeeAdminActionResultDto startRequest = service.createAdminAction(
adminActionRequest("service", "file-server", "record_start_request")
);
DigitalEmployeeAdminActionResultDto stopRequest = service.createAdminAction(
adminActionRequest("service", "file-server", "record_stop_request")
);
DigitalEmployeeAdminActionResultDto installRequest = service.createAdminAction(
adminActionRequest("skill", "skill-web", "record_install_request")
);
DigitalEmployeeAdminActionResultDto upgradeRequest = service.createAdminAction(
adminActionRequest("skill", "skill-web", "record_upgrade_request")
);
DigitalEmployeeAdminActionResultDto permissionReview = service.createAdminAction(
adminActionRequest("skill", "skill-web", "request_permission_review")
);
DigitalEmployeeAdminActionResultDto memoryMergeReview = service.createAdminAction(
adminActionRequest("memory", "memory-1", "request_memory_merge_review")
);
DigitalEmployeeAdminActionResultDto memoryPolicyPull = service.createAdminAction(
adminActionRequest("memory_policy", "memory-policy-1", "request_memory_policy_pull")
);
DigitalEmployeeAdminActionResultDto repairIntent = service.createAdminAction(
adminActionRequest("audit", "audit-1", "record_repair_intent")
);
DigitalEmployeeAdminActionResultDto repairApproval = service.createAdminAction(
adminActionRequest("audit", "audit-1", "request_repair_approval")
);
assertThat(startRequest.getOk()).isTrue();
assertThat(stopRequest.getOk()).isTrue();
assertThat(installRequest.getOk()).isTrue();
assertThat(upgradeRequest.getOk()).isTrue();
assertThat(permissionReview.getOk()).isTrue();
assertThat(memoryMergeReview.getOk()).isTrue();
assertThat(memoryPolicyPull.getOk()).isTrue();
assertThat(repairIntent.getOk()).isTrue();
assertThat(repairApproval.getOk()).isTrue();
assertThat(repairApproval.getReasonCodes()).contains("action_recorded");
}
@Test
void createAdminActionRejectsHighRiskServiceSkillMemoryAuditExecution() {
DigitalEmployeeAdminActionResultDto startService = service.createAdminAction(
adminActionRequest("service", "file-server", "start_service")
);
DigitalEmployeeAdminActionResultDto stopService = service.createAdminAction(
adminActionRequest("service", "file-server", "stop_service")
);
DigitalEmployeeAdminActionResultDto leaseTakeover = service.createAdminAction(
adminActionRequest("service", "file-server", "lease_takeover")
);
DigitalEmployeeAdminActionResultDto autoRecovery = service.createAdminAction(
adminActionRequest("service", "file-server", "execute_auto_recovery")
);
DigitalEmployeeAdminActionResultDto installSkill = service.createAdminAction(
adminActionRequest("skill", "skill-web", "install_skill")
);
DigitalEmployeeAdminActionResultDto upgradeSkill = service.createAdminAction(
adminActionRequest("skill", "skill-web", "upgrade_skill")
);
DigitalEmployeeAdminActionResultDto editPermission = service.createAdminAction(
adminActionRequest("skill", "skill-web", "edit_permission_scope")
);
DigitalEmployeeAdminActionResultDto mergeMemory = service.createAdminAction(
adminActionRequest("memory", "memory-1", "merge_memory_auto")
);
DigitalEmployeeAdminActionResultDto pushMemoryPolicy = service.createAdminAction(
adminActionRequest("memory_policy", "memory-policy-1", "push_remote_memory_policy")
);
DigitalEmployeeAdminActionResultDto shellRepair = service.createAdminAction(
adminActionRequest("audit", "audit-1", "run_shell_repair")
);
DigitalEmployeeAdminActionResultDto modifyConfig = service.createAdminAction(
adminActionRequest("audit", "audit-1", "modify_system_config")
);
DigitalEmployeeAdminActionResultDto billingCharge = service.createAdminAction(
adminActionRequest("audit", "audit-1", "real_billing_charge")
);
assertThat(startService.getReasonCodes()).contains("start_service_disabled");
assertThat(stopService.getReasonCodes()).contains("stop_service_disabled");
assertThat(leaseTakeover.getReasonCodes()).contains("lease_takeover_disabled");
assertThat(autoRecovery.getReasonCodes()).contains("auto_recovery_execution_disabled");
assertThat(installSkill.getReasonCodes()).contains("install_action_disabled");
assertThat(upgradeSkill.getReasonCodes()).contains("upgrade_action_disabled");
assertThat(editPermission.getReasonCodes()).contains("permission_edit_disabled");
assertThat(mergeMemory.getReasonCodes()).contains("merge_action_disabled");
assertThat(pushMemoryPolicy.getReasonCodes()).contains("remote_memory_policy_disabled");
assertThat(shellRepair.getReasonCodes()).contains("run_shell_repair_disabled");
assertThat(modifyConfig.getReasonCodes()).contains("modify_system_config_disabled");
assertThat(billingCharge.getReasonCodes()).contains("billing_actual_disabled");
}
@Test
void queryPendingAdminActionsFiltersTenantClientDeviceAndMasksKey() {
when(adminActionRepository.queryActions(eq(101L), eq("client-key-001"), eq("device-001"), eq("pending"), eq(1L), eq(20L)))